7-AC

248 阅读3分钟

相关代码已开源至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使得概率有正有负,他的梯度如下:

1Nn=1Nt=0TnγtRtθlnπθ(AtSt)\frac{1}{N}\sum_{n=1}^N\sum_{t=0}^{T_n} \gamma^t R_t \nabla_\theta\ln \pi_\theta(A_{t}|S_{t})

引入critic的Q-Net来估计GtG_t,所以梯度变成了

1Nn=1Nt=0TnQ(St,At)θlnπθ(AtnStn)\frac{1}{N}\sum_{n=1}^N\sum_{t=0}^{T_n} Q(S_t,A_t) \nabla_\theta\ln \pi_\theta(A_t^n|S_t^n)。对于QQ可以用TD errors训练。对于π\pi用梯度上升训练。

此外,上面的QQ也可以变成VV

还记得REINFORCE里因为是on-policy所以采样一条episode只更新一次,否则训练效果容易不好。但这里不存在这个问题,因为函数Q/VQ/V估计期望累积收益不再是蒙特卡洛的框架,因此他是off-policy了。

进一步,把REINFORCE里的baseline也加入进来,这样梯度变成了

1Nn=1Nt=1Tn(Qπθ(Stn,Atn)Vπθ(Stn))lnp(AtnStn,θ)\frac{1}{N} \sum_{n=1}^N\sum_{t=1}^{T_n} (Q^{\pi_\theta}(S_t^n, A_t^n) - V^{\pi_\theta}(S_t^n)) \nabla \ln p(A_t^n|S_t^n,\theta)

如何实现?分别训练QQVV吗,这样两个网络可能误差会很大。其实只需要训练一个网络。把QVQ-V看作AA。你可以直接用一个整体AA来代替。但这居然不是A2C。真正的A2C的处理如下:因为Q(s,a)=E[r+V(s)]Q(s, a)=E[r+V(s')],如果不考虑期望了,直接认为Q(s,a)=r+V(s)Q(s,a)=r+V(s')

那么梯度那个式子里的小括号就变成了rtn+Vπθ(st+1n)Vπθ(stn)r_t^n+V^{\pi_\theta}(s_{t+1}^n)-V^{\pi_\theta}(s_t^n)。这样也就不需要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。