1.4 Actor-Critic Method
Actor-Critic方法把价值学习和策略学习结合起来。
Value Network and Policy Network
离散状态下状态价值函数可以写成:
\(V_{\pi}(s) = \sum_{a} \pi(a|s) \cdot Q_{\pi}(s,a).\)
但是其中策略函数\(\pi(a|s)\)和动作价值函数\(Q_{\pi}(s,a)\)都不知道,可以分别用两个神经网络进行近似,这两个神经网络分别称为策略网络和价值网络,在表述形式上里面分别添加了一个\(\theta\)和\(w\)参数,表示的是神经网络的参数。
策略网络控制agent运动,是actor,相当于是运动员;价值网络不控制agent运动,它负责给agent打分,是critic,相当于裁判。
分别看一下这两个神经网络
策略网络actor
策略网络actor,它只有一个输入state,输出是所有action的概率分布。
价值网络critic
价值网络critic,有两个输入,分别是state和action;输出是一个标量,表示的是对actor的打分。
同时学习一个策略和一个值函数就是actor-critic方法。
Train the Neural Networks
训练\(\pi\)网络是提高actor的平均分,即让状态价值函数V函数的值更大;让价值网络q来当裁判,给actor的表现打分,更新它的参数\(w\)是为了让它打分越来越精准。通过两个网络,让运动员的得分越来越高,裁判的打分越来越精准。
- 通过以下五个步骤来对\(\theta\)和\(w\)参数进行更新
- Observe the state\(s_t\).
- Randomly sample action\(\alpha_t\)according to\(\pi(\cdot|s_t; \theta_t)\).
- Perform\(a_t\)and observe new state\(s_{t+1}\)and reward\(r_t\).
- Update\(w\)(in value network) using temporal difference (TD).
- Update\(\theta\)(in policy network) using policy gradient.
Update value network q using TD
使用时间差分TD算法更新价值网络q,让裁判打分更准
损失函数是预测q和target\(y_t\)之间差的平方
- 使用策略梯度算法更新策略网络\(\pi\),让运动员得分更高
- 下图中的V是状态价值函数,相当于运动员所有动作的平均分
- 策略梯度是状态价值函数V关于\(\theta\)的导数
- 定义g是\(\log \pi\)对\(\theta\)的导数乘以q,这里q是裁判的打分
- 策略梯度等于对函数g求期望,消掉动作A。
- g函数是策略梯度的无偏估计,用g函数代替策略梯度
- 然后使用随机梯度上升算法来更新\(\theta\)的值。
ChatGPT:补充梯度的概念
在数学和计算机科学中,梯度是一个向量,表示一个多元函数在某一点上的变化率和变化的方向。对于一个具有多个输入变量的函数,梯度给出了该函数对每个输入变量的偏导数。
考虑一个函数\(f(x_1, x_2, \ldots, x_n)\),其梯度记为\(\boldsymbol{\nabla} f\)或者\(\frac{\partial f}{\partial \mathbf{x}}\),其中\(\boldsymbol{\nabla}\)是 nabla 符号,表示梯度运算,\(\mathbf{x} = [x_1, x_2, \ldots, x_n]\)是输入变量的向量。梯度是一个向量,其每个分量是函数对相应输入变量的偏导数。
\(\boldsymbol{\nabla} f = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right]\)
梯度的方向是函数在某一点上变化最快的方向,而梯度的模(长度)表示变化率。如果梯度的模较大,意味着函数在该点的变化较为剧烈。
在优化问题中,梯度的使用很常见。梯度下降算法就是一种基于梯度的优化方法,通过迭代更新参数,使得目标函数逐渐趋向最小值。梯度上升算法则是类似的优化方法,用于最大化目标函数。
总的来说,梯度是一个重要的数学概念,特别在优化、机器学习 和深度学习等领域有广泛的应用。
整个Actor-Critic Method的框图
整个算法的流程共有9步,这里是前5步,主要复习以下TD 目标。
\(r_t + \gamma \cdot q_{t+1}\)是TD target,时间差分算法里面的(TD目标表示了在当前时刻 t的奖励\(r_t\)加上未来奖励的折扣。这个目标被用于更新值函数,通过比较当前值函数的估计和这个目标,可以调整值函数的参数以逐渐提高估计的准确性。)
Actor-Critic算法流程:更新价值网络(critic)是梯度下降,更新策略网络(actor)是梯度上升。
上面第9步中用\(q_t\)更新,也可以用\(\delta_t\)来更新。两种方法都是对的。
Summary
总结一下Actor-Critic方法中Actor和 Critic的作用
在训练中,agent是被策略网络控制的,价值网络打分提供反馈;训练后,agent还是被策略网络控制,但此时价值网络(critic)就没用了。
怎样训练两个网络:
策略网络是策略梯度来训练。用 梯度上升,让状态价值函数V的值增加,这就意味着运动员的平均分提高。
价值网络是用TD算法来训练。TD算法要用到价值网络的预测\(q_t\)(价值网络对期望回报的估计)以及TD target(也是对期望回报的估计,由于它用到真实的奖励\(r_t\),所以它的估计比\(q_t\)更靠谱,\(y_t\)作为TD target,相当于监督学习中的标签),对损失函数关于价值网络函数的参数\(w\)求导得到梯度,然后用 梯度下降,让估计\(q_t\)更接近TD target 也就是\(y_t\)。
为什么用损失函数对\(w\)求导?ChatGPT的回答:
在机器学习中,使用损失函数对模型参数(例如权重\(w\))求导的目的是通过梯度下降或其他优化算法来更新模型参数,以最小化或最大化损失函数。这是因为损失函数衡量了模型在训练数据上的性能,我们的目标是使模型在训练数据上表现得越好越好。
考虑一个典型的机器学习问题,其中我们有输入特征 (X) 和对应的目标变量 (Y),我们的模型通过一些参数 (w) 进行参数化,表示为\(Y = f(X; w)\)。我们的目标是找到最优的参数 (w),使得模型预测的 (Y) 与真实的目标 (Y) 之间的差距最小。
这个差距通常通过损失函数(也叫目标函数)来定义,表示为\(L(Y, f(X; w))\)。梯度下降的思想是沿着损失函数下降最快的方向更新参数,直至找到使损失最小化的参数。
为了更新参数,我们需要计算损失函数关于参数 (w) 的梯度(导数)。梯度是一个向量,其中每个分量表示损失函数关于相应参数的偏导数。通过梯度下降,我们按照梯度的反方向更新参数,使得损失函数逐渐减小。
具体来说,对于参数 (w),我们使用链式法则计算损失函数关于 (w) 的梯度,并使用这个梯度来更新 (w)。这个过程反复进行,直到达到停止条件(例如达到最大迭代次数或梯度变化很小)。
总之,使用损失函数对参数 (w) 求导的目的是优化模型,使其在训练数据上的性能达到最优。
书
策略梯度方法用策略梯度\(\boldsymbol{\nabla}_{\boldsymbol{\theta}}J(\boldsymbol{\theta})\)更新策略网络参数\(\boldsymbol{\theta}\), 从而增大目标函数。前面推导出策略梯度\(\boldsymbol{\nabla}_{\boldsymbol{\theta}}J(\boldsymbol{\theta})\)的无偏估计,即下面的随机梯度:
\(\boldsymbol{g}(s,a;\boldsymbol{\theta}) \triangleq Q_{\pi}(s,a) \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a\|s;\boldsymbol{\theta}).\)
但是其中的动作价值函数\(Q_{\pi}\)是未知的,导致无法直接计算\(\boldsymbol{g}(s,a;\boldsymbol{\theta})\)。上一节的 REINFORCE 用实际观测的回报近似\(Q_{\pi}\), 本节的 actor-critic 方法用神经网络近似\(Q_{\pi}\)。
价值网络
Actor-critic 方法用一个神经网络近似动作价值函数\(Q_{\pi}(s,a)\), 这个神经网络叫做“价值网络", 记为\(q(s,a;\boldsymbol{w})\),其中的\(\boldsymbol{w}\)表示神经网络中可训练的参数。价值网络的输入是状态\(s\), 输出是每个动作的价值。动作空间\(A\)中有多少种动作,那么价值网络的输出就是多少维的向量,向量每个元素对应一个动作。举个例子,动作空间是\(A=\{左,右,上\}\),
\(q(s, 左; w) = 219, \quad q(s, 右; w) = -73, \quad q(s, 上; w) = 580.\)
神经网络的结构见图 7.2。
虽然价值网络\(q(s,a;\boldsymbol{w})\)与之前学的 DQN 有相同的结构,但是两者的意义不同,训练算法也不同。
- 价值网络是对动作价值函数\(Q_{\pi}(s,a)\)的近似。而 DQN 则是对最优动作价值函数\(Q^*(s,a)\)的近似。
- 对价值网络的训练使用的是 SARSA 算法,它属于同策略,不能用经验回放。对 DQN的训练使用的是 Q 学习算法,它属于异策略,可以用经验回放。
算法推导
Actor-critic 翻译成“演员一评委”方法。策略网络\(\pi(a|s;\boldsymbol{\theta})\)相当于演员,它基于状态\(s\)做出动作\(a\)。价值网络\(q(s,a;\boldsymbol{w})\)相当于评委,它给演员的表现打分,评价在状态\(s\)的情况下做出动作\(a\)的好坏程度。策略网络(演员)和价值网络(评委)的关系如图7.3所示。
读者可能会对图 7.3 感到不解:为什么不直接把奖励\(R\)反馈给策略网络 (演员),而要用价值网络 (评委) 这样一个中介呢?原因是这样的:策略学习的目标函数\(J(\boldsymbol{\theta})\)是回报\(U\)的期望,而不是奖励\(R\)的期望;注意回报\(U\)和奖励\(R\)的区别。虽然能观测到当前的奖励\(R\),但是它对策略网络是毫无意义的;训练策略网络(演员)需要的是回报\(U\),而不是奖励\(R\)。价值网络 (评委) 能够估算出回报\(U\)的期望,因此能帮助训练策略网络 (演员)。
训练策略网络 (演员)
策略网络 (演员) 想要改进自己的演技,但是演员自己不知道什么样的表演才算更好,所以需要价值网络(评委) 的帮助。在演员做出动作\(a\)之后,评委会打一个分数\(\hat{q} \triangleq q(s,a;\boldsymbol{w})\),并把分数反馈给演员,帮助演员做出改进。演员利用当前状态\(s\), 自己的动作\(a\), 以及评委的打分\(\hat{q}\), 计算近似策略梯度,然后更新自己的参数\(\boldsymbol{\theta}\)(相当于改变自己的技术)。通过这种方式,演员的表现越来越受评委的好评,于是演员的获得的评分\(\hat{q}\)越来越高。
训练策略网络的基本想法是用策略梯度\(\boldsymbol{\nabla}_{\boldsymbol{\theta}}J(\boldsymbol{\theta})\)的近似来更新参数\(\boldsymbol{\theta}\)。之前我们推导过策略梯度的无偏估计:
\(g(s,a;\theta) \triangleq Q_{\pi}(s,a) \cdot \nabla_{\theta} \ln \pi(a \mid s; \theta).\)
价值网络\(q(s,a;\boldsymbol{w})\)是对动作价值函数\(Q_{\pi}(s,a)\)的近似,所以把上面公式中的\(Q_{\pi}\)替换成价值网络,得到近似策略梯度:
\(\widehat{g}\left(s,a;\theta\right) \quad \triangleq \quad \underbrace{q(s,a;w)}_{\text{评委的打分}} \cdot \nabla_{\theta} \ln \pi(a \mid s; \theta).\)
最后做梯度上升更新策略网络的参数:
\(\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \beta \cdot \hat{\boldsymbol{g}}(s,a;\boldsymbol{\theta}).\)
注: 用上述方式更新参数之后,会让评委打出的分数越来越高,原因是这样的。状态价值函数\(V_{\pi}(s)\)可以近似成为:
\(v(s; \theta) = \mathbb{E}_{A \sim \pi(\cdot | s; \theta)} \left[ q(s, A; w) \right].\)
因此可以将\(v(s;\boldsymbol{\theta})\)看做评委打分的均值。不难证明,公式 (7.11) 中定义的近似策略梯度\(\hat{\boldsymbol{g}}(s,a;\boldsymbol{\theta})\)的期望等于\(v(s;\boldsymbol{\theta})\)关于\(\boldsymbol{\theta}\)的梯度:
\(\nabla_{\theta v}(s; \theta) = \mathbb{E}_{A \sim \pi(\cdot \mid s; \theta)} \left[ \widehat{g}(s, A; \theta) \right].\)
因此,用公式 7.12 中的梯度上升更新\(\boldsymbol{\theta}\),会让\(v(s;\boldsymbol{\theta})\)变大,也就是让评委打分的均值更高。
训练价值网络(评委)
通过以上分析,我们不难发现上述训练策略网络(演员)的方法不是真正让演员表现更好,只是让演员更迎合评委的喜好而已。因此,评委的水平也很重要,只有当评委的打分\(\hat{q}\)真正反映出动作价值\(Q_{\pi}\),演员的水平才能真正提高。初始的时候,价值网络的参数\(\boldsymbol{w}\)是随机的,也就是说评委的打分是瞎猜。可以用 SARSA 算法更新\(\boldsymbol{w}\),提高评委的水平。每次从环境中观测到一个奖励\(r\),把\(r\)看做是真相,用\(r\)来校准评委的打分\(q(s,a;\boldsymbol{w})\)。
第5.1 节已经推导过 SARSA 算法,现在我们再回顾一下。在\(t\)时刻,价值网络输出\(\hat{q}_t = q(s_t,a_t;\boldsymbol{w})\),
它是对动作价值函数\(Q_{\pi}(s_t,a_t)\)的估计。在\(t+1\)时刻,实际观测到\(r_t,s_{t+1},a_{t+1}\), 于是可以计算 TD 目标
\(\hat{y}_t = r_t + \gamma \cdot q(s_{t+1},a_{t+1};\boldsymbol{w})\),
它也是对动作价值函数\(Q_{\pi}(s_t,a_t)\)的估计。由于\(\hat{y}_t\)部分基于实际观测到的奖励\(r_t\),我们认为\(\hat{y}_t\)比\(q(s_t,a_t;\boldsymbol{w})\)更接近事实真相。所以把\(\hat{y}_t\)固定住,鼓励\(q(s_t,a_t;\boldsymbol{w})\)去接近\(\hat{y}_t\)。
SARSA 算法具体这样更新价值网络参数\(\boldsymbol{w}\)。定义损失函数:
\(L(\boldsymbol{w}) \triangleq \frac{1}{2} [q(s_t,a_t;\boldsymbol{w}) - \hat{y}_t]^2.\)
设\(\hat{q}_t \triangleq q(s_t,a_t;\boldsymbol{w})\)。损失函数的梯度是:
\(\boldsymbol{\nabla}_{\boldsymbol{w}}L(\boldsymbol{w}) = (\hat{q}_t - \hat{y}_t) \cdot \boldsymbol{\nabla}_{\boldsymbol{w}}q(s_t,a_t;\boldsymbol{w}).\)
做一轮梯度下降更新\(\boldsymbol{w}\):
\(\boldsymbol{w} \leftarrow \boldsymbol{w} - \alpha \cdot \boldsymbol{\nabla}_{\boldsymbol{w}}L(\boldsymbol{w}).\)
这样更新\(\boldsymbol{w}\)可以让\(q(s_t,a_t;\boldsymbol{w})\)更接近\(\hat{y}_t\)。可以这样理解 SARSA: 用观测到的奖励\(r\)来“校准”评委的打分\(q(s_t,a_t;\boldsymbol{w})\)。
训练流程
下面概括 actor-critic 训练流程。设当前策略网络参数是\(\boldsymbol{\theta}_{\text{now}}\),价值网络参数是\(\boldsymbol{w}_{\text{now}}\)。
执行下面的步骤,将参数更新成\(\boldsymbol{\theta}_{\text{new}}\)和\(\boldsymbol{w}_{\text{new}}\):
- 观测到当前状态\(s_t\),根据策略网络做决策\(a_t \sim \pi(\cdot|s_t; \boldsymbol{\theta}_{\text{now}})\), 并让智能体执行动作\(a_t\)。
- 从环境中观测到奖励\(r_t\)和新的状态\(s_{t+1}\)。
- 根据策略网络做决策\(\tilde{a}_{t+1} \sim \pi(\cdot|s_{t+1}; \boldsymbol{\theta}_{\text{now}})\),但不让智能体执行动作\(\tilde{a}_{t+1}\)。
- 让价值网络给\((s_t, a_t)\)打分:\(\hat{q}_t = q(s_t, a_t; \boldsymbol{w}_{\text{now}})\)和\(\hat{q}_{t+1} = q(s_{t+1}, \tilde{a}_{t+1}; \boldsymbol{w}_{\text{now}})\).
- 计算 TD 目标和 TD 误差:\(\hat{y}_t = r_t + \gamma \cdot \hat{q}_{t+1}\)和\(\delta_t = \hat{q}_t - \hat{y}_t\).
- 更新价值网络:\(\boldsymbol{w}_{\text{new}} \leftarrow \boldsymbol{w}_{\text{now}} - \alpha \cdot \delta_t \cdot \boldsymbol{\nabla}_{\boldsymbol{w}}q(s_t, a_t; \boldsymbol{w}_{\text{now}})\).
- 更新策略网络:\(\boldsymbol{\theta}_{\text{new}} \leftarrow \boldsymbol{\theta}_{\text{now}} + \beta \cdot \hat{q}_t \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a_t \| s_t; \boldsymbol{\theta}_{\text{now}})\).
用目标网络改进训练
第 6.2 节讨论了 Q 学习中的自举及其危害,以及用目标网络 (target network) 缓解自举造成的偏差。SARSA 算法中也存在自举一一即用价值网络自己的估值\(\hat{q}_{t+1}\)去更新价值网络自己;我们同样可以用目标网络计算 TD 目标,从而缓解偏差。把目标网络记作\(q(s,a;\boldsymbol{w}^-)\),它的结构与价值网络相同,但是参数不同。使用目标网络计算 TD 目标,那么 actor-critic 的训练就变成了:
- 观测到当前状态\(s_t\),根据策略网络做决策\(a_t \sim \pi(\cdot|s_t; \boldsymbol{\theta}_{\text{now}})\), 并让智能体执行动作\(a_t\).
- 从环境中观测到奖励\(r_t\)和新的状态\(s_{t+1}\).
- 根据策略网络做决策\(\tilde{a}_{t+1} \sim \pi(\cdot|s_{t+1}; \boldsymbol{\theta}_{\text{now}})\),但是不让智能体执行动作\(\tilde{a}_{t+1}\).
- 让价值网络给\((s_t, a_t)\)打分:\(\hat{q}_t = q(s_t, a_t; \boldsymbol{w}_{\text{now}})\).
- 让目标网络给\((s_{t+1}, \tilde{a}_{t+1})\)打分:\(\hat{q}_{t+1}^- = q(s_{t+1}, \tilde{a}_{t+1}; \boldsymbol{w}_{\text{now}}^-)\).
- 计算 TD 目标和 TD 误差:\(\hat{y}_t^- = r_t + \gamma \cdot \hat{q}_{t+1}^-\)和\(\delta_t = \hat{q}_t - \hat{y}_t^-\).
- 更新价值网络:\(\boldsymbol{w}_{\text{new}} \leftarrow \boldsymbol{w}_{\text{now}} - \alpha \cdot \delta_t \cdot \boldsymbol{\nabla}_{\boldsymbol{w}}q(s_t, a_t; \boldsymbol{w}_{\text{now}})\).
- 更新策略网络:\(\boldsymbol{\theta}_{\text{new}} \leftarrow \boldsymbol{\theta}_{\text{now}} + \beta \cdot \hat{q}_t \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a_t \| s_t; \boldsymbol{\theta}_{\text{now}})\).
- 设\(\tau \in (0,1)\)是需要手动调整的超参数。做加权平均更新目标网络的参数:\(\boldsymbol{w}_{\text{new}}^- \leftarrow \tau \cdot \boldsymbol{w}_{\text{new}} + (1-\tau) \cdot \boldsymbol{w}_{\text{now}}^-\).
本章总结
- 可以用神经网络\(\pi(a|s;\boldsymbol{\theta})\)近似策略函数。策略学习的目标函数是\(J(\boldsymbol{\theta}) = \mathbb{E}_S[V_{\pi}(S)]\), 它的值越大,意味着策略越好。
- 策略梯度指的是\(J(\boldsymbol{\theta})\)关于策略参数\(\boldsymbol{\theta}\)的梯度。策略梯度定理将策略梯度表示成\(\boldsymbol{g}(s,a;\boldsymbol{\theta}) \triangleq Q_{\pi}(s,a) \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a|s;\boldsymbol{\theta})\) 的期望。
- REINFORCE 算法用实际观测的回报\(u\)近似 \(Q_{\pi}(s,a)\), 从而把 \(\boldsymbol{g}(s,a;\boldsymbol{\theta})\) 近似成 \(\tilde{\boldsymbol{g}}(s,a;\boldsymbol{\theta}) \triangleq u \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a|s;\boldsymbol{\theta})\). REINFORCE 算法做梯度上升更新策略网络:\(\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \beta \cdot \tilde{\boldsymbol{g}}(s,a;\boldsymbol{\theta})\)
- Actor-critic 用价值网络 \(q(s,a;\boldsymbol{w})\) 近似 \(Q_{\pi}(s,a)\), 从而把 \(\boldsymbol{g}(s,a;\boldsymbol{\theta})\) 近似成 \(\hat{\boldsymbol{g}}(s,a;\boldsymbol{\theta}) \triangleq q(s,a;\boldsymbol{w}) \cdot \boldsymbol{\nabla}_{\boldsymbol{\theta}}\ln\pi(a|s;\boldsymbol{\theta})\). Actor-critic 用 SARSA 算法更新价值网络\(q\), 用梯度上升更新策略网络 \(\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \beta \cdot \hat{\boldsymbol{g}}(s,a;\boldsymbol{\theta})\).