相关代码已开源至github:github.com/sdycodes/RL…
AC和A2C
前面分别介绍了PolicyGradient(REINFORCE和PPO)以及DQN算法。这两个分别是policy-based(actor)和value-based(critic)算法。actor的意思是输出一个动作分布,critic输出的是value。这两个算法各有缺陷。actor算法对期望累积收益的估计是蒙特卡洛的。必须采样一个episode。这样估计虽然无偏,但是求和的方差会很大。而critic算法使用TD误差来自举估计,这样虽然方差会小,但可能有偏。如何结合两类算法的优势?这就是actor-critic算法。注意,actor-critic虽然按理说应该是指最naive的Q-AC,不过更多把他看成一种框架,对期望累积收益估计方法不局限于Q,也可以是V、也可以是A、可以是TD-errors。TD-errors的这个其本质就是A2C,所以你说A2C是一种AC也是对的。
最naive的Q-AC算法就是从REINFORCE来的,甚至还没有增加baseline使得概率有正有负,他的梯度如下:
。
引入critic的Q-Net来估计,所以梯度变成了
。对于可以用TD errors训练。对于用梯度上升训练。
此外,上面的也可以变成。
还记得REINFORCE里因为是on-policy所以采样一条episode只更新一次,否则训练效果容易不好。但这里不存在这个问题,因为函数估计期望累积收益不再是蒙特卡洛的框架,因此他是off-policy了。
进一步,把REINFORCE里的baseline也加入进来,这样梯度变成了
如何实现?分别训练和吗,这样两个网络可能误差会很大。其实只需要训练一个网络。把看作。你可以直接用一个整体来代替。但这居然不是A2C。真正的A2C的处理如下:因为,如果不考虑期望了,直接认为。
那么梯度那个式子里的小括号就变成了。这样也就不需要estimate Q-network,只需要V-network。而小括号里其实是td-errors,这就是A2C。
trick:Q和P有些参数可以共享。
A3C:Asynchronous advantage actor-critic
asynchronous:异步,全局的network可以输出policy和V。每个work copy global的参数,然后和环境交互收数据,计算更新,传回给global,让global更新。
应当明确,不能简单认为A3C是A2C的多线程升级版。因为A2C也可以多线程。只不过他是同步的,所以实现上多线程只有加速的作用。这段历史是先在2016年提出了A3C,当时认为异步可以打破样本关联性看起来会让模型更好,但后来发现同步的A2C的效果也和A3C差不多,就写了个博客,但这个贡献实在够不上论文所以其实没发表。
DDPG也是2016年提出的,他从DQN改进而来,但也可以看作是AC架构。因为同时具有actor和critic。