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\)参数进行更新
  1. Observe the state\(s_t\).
  2. Randomly sample action\(\alpha_t\)according to\(\pi(\cdot|s_t; \theta_t)\).
  3. Perform\(a_t\)and observe new state\(s_{t+1}\)and reward\(r_t\).
  4. Update\(w\)(in value network) using temporal difference (TD).
  5. 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}}\):

  1. 观测到当前状态\(s_t\),根据策略网络做决策\(a_t \sim \pi(\cdot|s_t; \boldsymbol{\theta}_{\text{now}})\), 并让智能体执行动作\(a_t\)
  2. 从环境中观测到奖励\(r_t\)和新的状态\(s_{t+1}\)
  3. 根据策略网络做决策\(\tilde{a}_{t+1} \sim \pi(\cdot|s_{t+1}; \boldsymbol{\theta}_{\text{now}})\),但不让智能体执行动作\(\tilde{a}_{t+1}\)
  4. 让价值网络给\((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}})\).
  5. 计算 TD 目标和 TD 误差:\(\hat{y}_t = r_t + \gamma \cdot \hat{q}_{t+1}\)\(\delta_t = \hat{q}_t - \hat{y}_t\).
  6. 更新价值网络:\(\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}})\).
  7. 更新策略网络:\(\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 的训练就变成了:

  1. 观测到当前状态\(s_t\),根据策略网络做决策\(a_t \sim \pi(\cdot|s_t; \boldsymbol{\theta}_{\text{now}})\), 并让智能体执行动作\(a_t\).
  2. 从环境中观测到奖励\(r_t\)和新的状态\(s_{t+1}\).
  3. 根据策略网络做决策\(\tilde{a}_{t+1} \sim \pi(\cdot|s_{t+1}; \boldsymbol{\theta}_{\text{now}})\),但是不让智能体执行动作\(\tilde{a}_{t+1}\).
  4. 让价值网络给\((s_t, a_t)\)打分:\(\hat{q}_t = q(s_t, a_t; \boldsymbol{w}_{\text{now}})\).
  5. 让目标网络给\((s_{t+1}, \tilde{a}_{t+1})\)打分:\(\hat{q}_{t+1}^- = q(s_{t+1}, \tilde{a}_{t+1}; \boldsymbol{w}_{\text{now}}^-)\).
  6. 计算 TD 目标和 TD 误差:\(\hat{y}_t^- = r_t + \gamma \cdot \hat{q}_{t+1}^-\)\(\delta_t = \hat{q}_t - \hat{y}_t^-\).
  7. 更新价值网络:\(\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}})\).
  8. 更新策略网络:\(\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}})\).
  9. \(\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})\).

1.4 Actor-Critic Method
http://binbo-zappy.github.io/2024/12/04/DRL-王树森/1-4-Actor-Critic-Method/
作者
Binbo
发布于
2024年12月4日
许可协议