强化学习基础巩固(六)——演员-评论员算法(AC)

之前的章节复习了基于值函数的方法(DQN)和基于策略的方法(REINFORCE),其中基于值函数的方法只学习一个价值函数,而基于策略的方法只学习一个策略函数。那么,一个很自然的问题是,有没有什么方法既学习价值函数,又学习策略函数呢?答案就是 Actor-Critic。Actor-Critic 是囊括一系列算法的整体架构,目前很多高效的前沿算法都属于 Actor-Critic 算法,本章接下来将会介绍一种最简单的 Actor-Critic 算法。需要明确的是,Actor-Critic 算法本质上是基于策略的算法,因为这一系列算法的目标都是优化一个带参数的策略,只是会额外学习价值函数,从而帮助策略函数更好地学习。

演员-评论员算法AC

在 REINFORCE 算法中,目标函数的梯度中有一项轨迹回报,用于指导策略的更新。REINFORCE 算法用蒙特卡洛方法来估计,能不能考虑拟合一个值函数来指导策略进行学习呢?这正是 Actor-Critic 算法所做的。在策略梯度中,可以把梯度写成下面这个更加一般的形式:

g=E[t=0Tψtθlogπθ(atst)]g = \mathbb{E}\left [\sum^T_{t=0} \psi_t \nabla_\theta \log \pi_\theta(a_t|s_t)\right]

其中,ψt\psi_t可以有很多种形式:

  1. t=0Tγtrt\sum^T_{t'=0}\gamma^{t'}r_{t'}:即整条轨迹的总回报
  2. t=0Tγttrt\sum^T_{t'=0}\gamma^{t'-t}r_{t'}:即执行ata_t之后的回报
  3. t=0Tγttrtb(st)\sum^T_{t'=0}\gamma^{t'-t}r_{t'}-b(s_t):即增加了基线优化,让奖励有正有负。
  4. Qπθ(st,at)Q^{\pi_\theta}(s_t,a_t):动作价值函数
  5. Aπθ(st,at)A^{\pi_\theta}(s_t,a_t):优势函数
  6. rt+γVπθ(st+1)Vπθ(st)r_t+\gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t):时序差分残差

REINFORCE 通过蒙特卡洛采样的方法对策略梯度的估计是无偏的,但是方差非常大。我们可以用形式3引入基线函数b(st)b(s_t)来减小方差。此外,我们也可以采用 Actor-Critic 算法估计一个动作价值函数QQ,代替蒙特卡洛采样得到的回报,这便是形式4。这个时候,我们可以把状态价值函数VV作为基线,从QQ函数减去这个VV函数则得到了AA函数,我们称之为优势函数,这便是形式5。更进一步,我们可以利用等式Q=r+γVQ=r+\gamma V得到形式6。
本节重点介绍形式6,即通过时序差分残差ψt=rt+γVπ(st+1)Vπ(st)\psi_t=r_t+\gamma V^\pi(s_{t+1})-V^\pi(s_t)来指导策略梯度进行学习。事实上,用QQ值或者VV值本质上也是用奖励来进行指导,但是用神经网络进行估计的方法可以减小方差、提高鲁棒性。除此之外,REINFORCE 算法基于蒙特卡洛采样,只能在序列结束后进行更新,这同时也要求任务具有有限的步数,而 Actor-Critic 算法则可以在每一步之后都进行更新,并且不对任务的步数做限制。
我们将 Actor-Critic 分为两个部分:Actor(策略网络)和 Critic(价值网络)。

  • Actor 要做的是与环境交互,并在 Critic 价值函数的指导下用策略梯度学习一个更好的策略。
  • Critic 要做的是通过 Actor 与环境交互收集的数据学习一个价值函数,这个价值函数会用于判断在当前状态什么动作是好的,什么动作不是好的,进而帮助 Actor 进行策略更新。

Actor 的更新采用策略梯度的原则,那 Critic 如何更新呢?我们将 Critic 价值网络表示为VωV_\omega,参数为ω\omega。于是,我们可以采取时序差分残差的学习方式,对于单个数据定义如下价值函数的损失函数:

L(ω)=12(r+γVω(st+1)Vω(st))2\mathcal{L}(\omega) = \frac{1}{2}(r+\gamma V_\omega(s_{t+1})-V_\omega(s_t))^2

与 DQN 中一样,我们采取类似于目标网络的方法,将上式中r+γVω(st+1)r+\gamma V_\omega(s_{t+1})作为时序差分目标,不会产生梯度来更新价值函数。因此,价值函数的梯度为:

ωL(ω)=(r+γVω(st+1)Vω(st))ωVω(st)\nabla_\omega\mathcal{L}(\omega) = -(r+\gamma V_\omega(s_{t+1})-V_\omega(s_t))\nabla_\omega V_\omega(s_t)

然后使用梯度下降方法来更新 Critic 价值网络参数即可。

Actor-Critic 算法的具体流程如下:

  • 初始化策略网络参数θ\theta,价值网络参数ω\omega
  • for 序列 e=1Ee=1\rightarrow E do :
    • 用当前策略πθ\pi_\theta采样轨迹{s1,a1,r1,s2,a2,r2,}\{s_1,a_1,r_1,s_2,a_2,r_2,\dots\}
    • 为每一步数据计算: δt=rt+γVω(st+1)Vω(st)\delta_t = r_t+\gamma V_\omega(s_{t+1})-V_\omega(s_t)
    • 更新价值参数ω=ω+αωtδtωVω(st)\omega = \omega+\alpha_\omega\sum_t \delta_t \nabla_\omega V_\omega(s_t)
    • 更新策略参数θ=θ+αθtδtθlogπθ(atst)\theta = \theta + \alpha_\theta \sum_t \delta_t\nabla_\theta \log \pi_\theta(a_t|s_t)
  • end for

优势演员-评论员算法A2C

如果把ψt\psi_t定义为形式5,即Aπθ(st,at)A^{\pi_\theta}(s_t,a_t),即为优势演员-评论员算法A2C。如果我们这么实现,有一个缺点,即我们需要估计两个网络————Q网络和V网络,估计不准的风险就变成原来的两倍。所以我们何不只估计一个网络呢?事实上,在演员-评论员算法中,我们可以只估计网络 V,并利用VV的值来表示QQ的值,Qπ(stn,atn)Q_\pi(s^n_t,a^n_t)可以写成rtn+Vπ(st+1n)r^n_t+V_\pi(s^n_{t+1})的期望值,即

Qπ(stn,atn)=E[rtn+Vπ(st+1n)]Q_\pi(s^n_t,a^n_t) = \mathbb{E}[r^n_t+V_\pi(s^n_{t+1})]

在状态ss采取动作aa,我们会得到奖励rr,进入状态st+1s_{t+1}。但是我们会得到什么样的奖励rr,进入什么样的状态st+1s_{t+1},这件事本身是有随机性的。所以要把rtn+Vπ(st+1n)r^n_t+V_\pi(s^n_{t+1})取期望值才会等于Q函数的值。但我们现在把取期望值去掉,即

Qπ(stn,atn)=rtn+Vπ(st+1n)Q_\pi(s^n_t,a^n_t) = r^n_t+V_\pi(s^n_{t+1})

我们就可以把Q函数的值用rtn+Vπ(st+1n)r^n_t+V_\pi(s^n_{t+1})取代,可得

rtn+Vπ(st+1n)Vπ(stn)r^n_t+V_\pi(s^n_{t+1}) - V_\pi(s^n_t)

把取期望值去掉的好处就是我们不需要估计QQ了,只需要估计VV。但与此同时我们会引入一个随机的参数rrrr是有随机性的,它是一个随机变量,但是rr相较于累积奖励 GG是一个较小的值,因为它是某一个步骤得到的奖励,而GG是所有未来会得到的奖励的总和,GG的方差比较大。rr虽然也有一些方差,但它的方差比GG的要小。所以把原来方差比较大的GG换成方差比较小的rr也是合理的。

Q:为什么我们可以直接把取期望值去掉?
A:原始的异步优势演员-评论员算法的论文尝试了各种方法,最后发现这个方法最好。当然有人可能会有疑问,说不定估计QQVV也可以估计得很好,但实际做实验的时候,最后结果就是这个方法最好,所以后来大家都使用了这个方法。

优势演员-评论员算法的流程如下图所示,我们有一个π\pi,有个初始的演员与环境交互,先收集资料。在策略梯度方法里收集资料以后,就来更新策略。但是在演员-评论员算法里面,我们不是直接使用那些资料来更新策略。我们先用这些资料去估计价值函数,可以用时序差分方法或蒙特卡洛方法来估计价值函数。接下来,我们再基于价值函数,使用下式更新

g=E[t=0T(rtn+Vπ(st+1n)Vπ(stn))θlogπθ(atst)]g = \mathbb{E}\left [\sum^T_{t=0} (r^n_t+V_\pi(s^n_{t+1}) - V_\pi(s^n_t)) \nabla_\theta \log \pi_\theta(a_t|s_t)\right]

有了新的π\pi以后,再与环境交互,收集新的资料,去估计价值函数。再用新的价值函数更新策略,更新演员。整个优势演员-评论员算法就是这么运作的。

优势评论员-评论员算法流程

异步优势演员-评论员算法A3C

异步优势演员-评论员算法的运作流程,如图所示,异步优势演员-评论员算法一开始有一个全局网络(global network)。全局网络包含策略网络和价值网络,这两个网络是绑定(tie)在一起的,它们的前几个层会被绑在一起。 假设全局网络的参数是θ1\theta_1,我们使用多个进程,每个进程用一张 CPU 去跑。比如我们有 8 个进程,则至少 8 张 CPU。每一个进程在工作前都会把全局网络的参数复制过来。接下来演员就与环境交互,每一个演员与环境交互的时候,都要收集到比较多样的数据。例如,如果是走迷宫,可能每一个演员起始的位置都会不一样,这样它们才能够收集到比较多样的数据。每一个演员与环境交互完之后,我们就会计算出梯度。计算出梯度以后,要用梯度去更新参数。我们就计算一下梯度,用梯度去更新全局网络的参数。就是这个进程算出梯度以后,就把梯度传回给中央的控制中心,中央的控制中心就会用这个梯度去更新原来的参数。
注意,A3C使用了平行探索的方法,所有的演员都是平行跑的,每一个演员各做各的,不管彼此。所以每个演员都是去要了一个参数以后,做完就把参数传回去。当第一个进程做完想要把参数传回去的时候,本来它要的参数是θ1\theta_1,等它要把梯度传回去的时候,可能别人已经把原来的参数覆盖掉,变成θ2\theta_2了。但是没有关系,它一样会把这个梯度就覆盖过去。

异步评论员-评论员算法流程

Q&A

Q:实现演员-评论员算法的时候有哪些技巧?
A:

  1. 预估两个网络:一个是价值网络;另外一个是策略网络。价值网络的输入是一个状态,输出是一个标签;策略网络的输入是一个状态,输出是一个动作的分布。这两个网络中,演员和评论员的输入都是状态,所以它们前面几层是可以共享的。例如,玩雅达利游戏时,输入都是图片。输入的图片都非常复杂,且比较大,通常前期我们都会用一些卷积神经网络来处理这些图片,把图片抽象成深层次的特征,这些网络对演员与评论员网络来说是可以共用的。我们可以让演员与评论员的前面几层共用同一组参数,这一组参数可能是卷积神经网络中的参数。先把输入的像素变成比较高维度的特征信息,然后输入演员网络决定要采取什么样的动作,评论员网络使用价值函数计算期望奖励。
  2. 探索机制:其目的是对策略π\pi的输出分布进行限制,从而使得分布的熵不要太小,即希望不同的动作被采用的概率平均一些。这样在测试的时候,智能体才会多尝试各种不同的动作,才会对环境进行充分探索,从而得到比较好的结果。

强化学习基础巩固(六)——演员-评论员算法(AC)
http://dufolk.github.io/2025/03/04/rl-6/
作者
Dufolk
发布于
2025年3月4日
许可协议