跳转至

第九章 演员-评论员算法

关键词

  • 优势演员-评论员(advantage actor-critic,A2C)算法:一种改进的演员-评论员(actor-critic)算法。

  • 异步优势演员-评论员(asynchronous advantage actor-critic,A3C)算法:一种改进的演员-评论员算法,通过异步的操作,实现强化学习模型训练的加速。

  • 路径衍生策略梯度(pathwise derivative policy gradient):一种使用Q学习来求解连续动作的算法,也是一种演员-评论员算法。其会对演员提供价值最大的动作,而不仅仅是提供某一个动作的好坏程度。

习题

9-1 完整的优势演员-评论员算法的工作流程是怎样的?

在传统的方法中,我们有一个策略 \(\pi\) 以及一个初始的演员与环境交互、收集数据以及反馈。通过每一步得到的反馈,我们进一步更新我们的策略 \(\pi\) ,通常我们使用的更新方式是策略梯度。但是对于演员-评论员算法,我们不是直接使用每一步得到的数据和反馈进行策略 \(\pi\) 的更新,而是使用这些数据和反馈进行价值函数的估计,这里我们通常使用的算法包括时序差分和蒙特卡洛等算法以及基于它们的优化算法。接下来我们再基于价值函数来更新策略,公式如下:

\[ \nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}\left(r_{t}^{n}+V_{\pi}\left(s_{t+1}^{n}\right)-V_{\pi}\left(s_{t}^{n}\right)\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) \]

其中 \(r_{t}^{n}+V_{\pi}\left(s_{t+1}^{n}\right)-V_{\pi}\left(s_{t}^{n}\right)\) 为优势函数。我们通过以上方法得到新的策略后,再与环境交互,然后重复预估价值函数的操作,用价值函数来更新我们的策略。以上的整个方法我们称为优势演员-评论员算法。

9-2 在实现演员-评论员算法的时候有哪些技巧?

(1)预估两个网络:一个是价值网络;另外一个是策略网络。价值网络的输入是一个状态,输出是一个标签;策略网络的输入是一个状态,输出是一个动作的分布。这两个网络中,演员和评论员的输入都是状态,所以它们前面几层是可以共享的。例如,玩雅达利游戏时,输入都是图片。输入的图片都非常复杂,且比较大,通常前期我们都会用一些卷积神经网络来处理这些图片,把图片抽象成深层次的特征,这些网络对演员与评论员网络来说是可以共用的。我们可以让演员与评论员的前面几层共用同一组参数,这一组参数可能是卷积神经网络中的参数。先把输入的像素变成比较高维度的特征信息,然后输入演员网络决定要采取什么样的动作,评论员网络使用价值函数计算期望奖励。

(2)探索机制:其目的是对策略 \(\pi\) 的输出分布进行限制,从而使得分布的熵不要太小,即希望不同的动作被采用的概率平均一些。这样在测试的时候,智能体才会多尝试各种不同的动作,才会对环境进行充分探索,从而得到比较好的结果。

9-3 异步优势演员-评论员算法在训练时有很多的进程进行异步的工作,最后再将他们所获得的“结果”集合到一起。那么其具体是如何运作的呢?

异步优势演员-评论员算法,即算法一开始会有一个全局网络,其包含策略部分和价值部分。假设它的参数是 \(\theta_1\),假设对于每一个演员都用一个CPU训练,每一个演员工作前都会将全局网络的参数复制进来。然后演员与环境进行交互,每一个演员与环境交互后,都会计算出梯度并且更新全局网络的参数。这里要注意的是,所有的演员都是并行运行的。所以每个演员都是在全局网络复制了参数以后,执行完再把参数传回去。所以当第一个演员执行完想要把参数传回去的时候,本来它要的参数是 \(\theta_1\),等它把梯度传回去的时候,可能原来的参数已经被覆盖,变成 \(\theta_2\) 了。

9-4 对比经典的Q学习算法,路径衍生策略梯度有哪些改进之处?

(1)把 \(Q(s,a)\) 换成了 \(\pi\)。经典的Q学习算法是用 \(Q(s,a)\) 来决定在状态 \(s_t\) 产生哪一个动作 \(a_{t}\) ,路径衍生策略梯度是直接用 \(\pi\) 来决定。面对前者,我们需要解决最大值的问题,现在的路径衍生策略梯度直接训练了一个演员网络。其输入状态 \(s_t\) 就会告诉我们应该采取哪一个动作 \(a_{t}\)。综上,经典的Q学习算法输入状态 \(s_t\),采取哪一个动作 \(a_t\)\(Q(s,a)\) 决定的,在路径衍生策略梯度里面,我们会直接用 \(\pi\) 来决定。

(2)经典的Q学习算法计算在 \(s_{i+1}\) 下对应的策略采取的动作 \(a\) 得到的Q值,我们会采取让 \(\hat{Q}\) 最大的动作 \(a\)。现在的路径衍生策略梯度因为我们不需要再求解决最大化的问题,所以我们直接把状态 \(s_{i+1}\) 代入策略 \(\pi\) 中,就会得到在状态 \(s_{i+1}\) 下,哪一个动作会带给我们最大的Q值,就执行这个动作。在Q函数中,有两个Q网络,一个是真正的Q网络,另外一个是目标Q网络。实际上在执行时,也会有两个演员网络,一个真正要学习的演员网络 \(\pi\) 和一个目标演员网络 \(\hat{\pi}\)

(3)经典的Q学习算法只需要学习Q函数,路径衍生策略梯度需要多学习一个策略 \(\pi\),其目的在于最大化Q函数,希望得到的演员可以让Q函数的输出尽可能的大,这与生成对抗网络里面的生成器的概念类似。

(4)与原来的Q函数一样,我们要把目标Q网络取代掉,路径衍生策略梯度中也要把目标策略取代掉。

面试题

9-1 友善的面试官:请简述一下异步优势演员-评论员算法(A3C),另外A3C是同策略还是异策略的模型呀?

A3C是异步优势演员-评论员算法,其中,评论员学习价值函数,同时有多个演员并行训练并且不时与全局参数同步。A3C旨在并行训练,是同策略算法。

9-2 友善的面试官:请问演员-评论员算法有何优点呢?

(1)相比以价值函数为中心的算法,演员-评论员算法应用了策略梯度的技巧,这能让它在连续动作或者高维动作空间中选取合适的动作,而Q学习做这件事会很困难。

(2)相比单纯策略梯度,演员-评论员算法应用了Q学习或其他策略评估的做法,使得演员-评论员算法能进行单步更新而不是回合更新,比单纯的策略梯度的效率要高。

9-3 友善的面试官:请问异步优势演员-评论员算法具体是如何异步更新的?

下面是异步优势演员-评论员算法的大纲,由于其为异步多线程算法,我们只对其中某一单线程进行分析。

(1)定义全局参数 \(\theta\)\(w\) 以及特定线程参数 \(\theta'\)\(w'\)

(2)初始化时间步 \(t=1\)

(3)当 \(T \leqslant T_{\mathrm{max}}\):

  • 重置梯度:\(\mathrm{d} \theta = 0\) 并且 \(\mathrm{d}w = 0\)

  • 将特定于线程的参数与全局参数同步:\(\theta' = \theta\) 以及 \(w'=w\)

  • \(t_{\mathrm{start}} =t\) 并且随机采样一个初始状态 \(s_t\)
  • 当 (\(s_t!=\) 终止状态)并且\(t−t_{\mathrm{start}} \leqslant t_{\mathrm{max}}\)
    • 根据当前线程的策略选择当前执行的动作 \(a_t\sim\pi_{\theta'}(a_t|s_t)\),执行动作后接收奖励 \(r_t\) 然后转移到下一个状态 \(s_{t+1}\)
    • 更新 \(t\) 以及 \(T\)\(t=t+1\) 并且 \(T=T+1\)
  • 初始化保存累积奖励估计值的变量。
  • 对于 \(i=t_1, \dots ,t_{\mathrm{start}}\):
    • \(r \gets \gamma r+r_i\);这里的 \(r\)\(G_i\) 的蒙特卡洛估计。
    • 累积关于参数 \(\theta'\) 的梯度:\(\mathrm{d} \theta \gets \mathrm{d}\theta + \nabla_{\theta'} \mathrm{log} \pi_{\theta'}(a_i|s_i)(r−V_{w'}(s_i))\)
    • 累积关于参数 \(w'\) 的梯度:\(\mathrm{d}w \gets \mathrm{d}w+ \mathrm{\partial} (r-V_{w'}(s_i))^2 / \mathrm{\partial} w'\)
  • 分别使用 \(\mathrm{d}\theta\) 以及 \(\mathrm{d}w\) 异步更新 \(\theta\) 以及 \(w\)

9-4 友善的面试官:演员-评论员算法中,演员和评论员两者的区别是什么?

演员是策略模块,输出动作;评论员是判别器,用来计算价值函数。

9-5 友善的面试官:演员-评论员算法框架中的评论员起了什么作用?

评论员衡量当前决策的好坏。结合策略模块,当评论员判别某个动作的选择是有益的时候,策略就更新参数以增大该动作出现的概率,反之减小该动作出现的概率。

9-6 友善的面试官:简述异步优势演员-评论员算法的优势函数。

优势函数的计算公式为 \(A(s,a)=Q(s,a)-V(s)=r+\gamma V(s')-V(s)\) ,其可以定量地表示选择动作 \(a\) 的优势。即当动作 \(a\) 低于价值函数的平均值的时候,优势函数为负值;反之为正值。其是一个标量,具体来说:

(1)如果 \(A(s,a)>0\) ,梯度被推向正方向;

(2)如果 \(A(s,a)<0\) ,即我们的动作比该状态下的平均值还差,则梯度被推向反方向。

这样就需要两个价值函数,所以可以使用时序差分方法做误差估计:\(A(s,a)=r+\gamma V(s')-V(s)\)