Review of Gradient Descent
我们已经得到了 Policy gradient 一个最基本的形式,我们定义了目标函数
并得到了优化目标的梯度
其中 R(τ) 有两项优化:
我们可以通过梯度下降法来最大化目标函数
Note: 因为我们的任务是最大化,所以这里的 η 需要是一个负值
Actor-Critic
我们考虑上述的做法,事实上,
一个简单的想法是,我们用一个神经网络来进行估计,计算某一状态 s 下采用某一动作 a 的期望收益。该如何去设计这个网络呢?这个想法在之前的 DQN 中事实上已经被提到了,我们可以直接用 DQN 中使用的
这样,我们使用 Q 网络作为 Critic 来计算值函数,用 π 网络作为 Actor 来计算采取动作的分布,我们就得到了 Actor-Critic 算法:
A2C
在前文中我们提到,为了照顾到未被采样的动作,我们在实际训练时需要对值函数减去一个 bias ,使得最终 Q 的期望为 0 。一个简单的想法是,我们可以直接再训练一个状态值函数,作为这个 bias,其定义恰好是满足要求的,即
但是这样带来的问题是需要训练两个网络,开销大不说,本身网络就是作为 sampling 的一个替代,两个网络更加增大了方差,如果能把这两个网络并成一个就好了。我们可以发现,在 dueling DQN 中,把 Q 拆分为 V 和 A 两个网络的思想恰好可以为这里所用,我们考虑
在这里,可以进行一个不太严谨的操作,就是把这个期望拿掉,这样就有
虽然引入了一个去掉期望带来的方差,但是考虑到训练两个网络或者只是简单的用 sampling 本身也会有巨大的方差,所以这一操作也是可以被接受的(而且实验结果确实这样设计效果是最好的)。
于是我们就有了一个优势值版本的 A2C 算法如下:
在实际上进行实现时,V 和 π 两个函数都需要输入 s ,对于他们的预处理的信息提取(比如 CNN )是可以分享的,因此可以共享前半部分网络结构。
此外,另一个 trick 是可以对 π 的网络额外加一个 entropy 的正则项,这样可以增大 actor 进行探索的概率,方便模型学到更多知识。
A3C
A2C 虽然对模型进行了一定的改良,但是还是没有解决 policy gradient 的一个根本问题:训练的太慢。既然一台机器慢,那么多用几台机器一起算呢?A3C 的主要工作就是在 A2C 的基础上加入了一个异步并行训练的操作。
算法的核心思想就是,在服务器上储存一组模型,接下来,对于每一个 labor,不停的从服务器复制当前最新版本的参数,本地计算出梯度,然后把梯度回传给服务器。服务器每收到一组梯度,就更新到当前最新版本的参数上。虽然可能这个梯度不是在当前版本的参数上算出来的,但是因为不会隔太远,且数据量大大的增加了,所以最终还是可以有效提升模型的性能。
Conclusion
这一篇文章中,我们对第一章提出的 policy gradient 的两种优化技巧进一步优化,使用 Q 网络来代替 sampling 得到了 Actor-Critic,使用优势函数解决 b 的问题得到了 A2C,最后提出分布式的异步算法 A3C。但这显然还不是尽头,虽然 A3C 解决了数据量太少的问题,但是仍然没有解决数据利用效率太低的问题。作为一个 on-policy 的算法,每个数据只能使用一次,实在是过于浪费了,有没有办法把他转变为一个 off-policy 的算法呢?有没有办法把之前采集的训练数据也用在最新版的参数上呢?我们可以用 Important Sampling 来解决这个问题,这也是下一章 PPO 将会介绍的内容。