Actor-Critic(A2C A3CA2C \ A3C

1、首先要搞清楚什么是actor-critic算法,它是怎么来的?

Actor-critic算法是一种policy based的on policy的model-free算法。和value based的DQN算法有着本质的不同。policy based算法是将policy参数化π(as,θ)=Pr{At=aSt=s,θt=θ}\pi(a | s, \boldsymbol{\theta})=\operatorname{Pr}\left\{A_{t}=a | S_{t}=s, \boldsymbol{\theta}_{t}=\boldsymbol{\theta}\right\} 用它估计的价值函数用 v^(s,w)\hat{v}(s, \mathbf{w}) 表示。这里需要主义,参数化表示的价值函数都是连续函数是可以求梯度的!针对policy based强化学习问题,我们的目标依然是最大化回报,即:最大化 E[t=0HR(st)πθ]E\left[\sum_{t=0}^{H} R\left(s_{t}\right) | \pi_{\theta}\right]

我们可以用 τ\tau 表示一组状态-动作序列 s0,u0,,sH,uH,s_{0}, u_{0}, \cdots, s_{H}, u_{H}, G(τ)=t=0HR(st,ut),G(\tau)=\sum_{t=0}^{H} R\left(s_{t}, u_{t}\right), 表示轨迹 τ\tau 的回报,P(τ;θ)P(\tau ; \theta) 表示轨迹 τ\tau 出现的概率; 则强化学习的目标函数可表示为:
U(θ)=E(t=0HG(st,ut);πθ)=τP(τ;θ)G(τ)(9.1.1) \begin{aligned}U(\theta)=E\left(\sum_{t=0}^{H} G\left(s_{t}, u_{t}\right) ; \pi_{\theta}\right)=\sum_{\tau} P(\tau ; \theta) G(\tau)\end{aligned}\tag{9.1.1}
则我们的目标就是:maxθU(θ)=maxθτP(τ;θ)R(τ)\max _{\theta} U(\theta)=\max _{\theta} \sum_{\tau} P(\tau ; \theta) R(\tau) ,根据gradient ascent方法有:θnew=θold+αθU(θ)\theta_{n e w}=\theta_{o l d}+\alpha \nabla_{\theta} U(\theta)

这里需要说明,虽然该目标函数不是连续的但是在数学上它是可以写成如下形式的(具体证明没有找到):
θU(θ)=θτP(τ;θ)G(τ)=τθP(τ;θ)G(τ)=τP(τ;θ)P(τ;θ)θP(τ;θ)G(τ)=τP(τ;θ)θP(τ;θ)P(τ;θ)G(τ)=τP(τ;θ)θlnP(τ;θ)G(τ)=E[ θlnP(τ;θ)G(τ) ](9.1.2) \begin{aligned}\nabla_{\theta} U(\theta) &=\nabla_{\theta} \sum_{\tau} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} \nabla_{\theta} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} \frac{P(\tau ; \theta)}{P(\tau ; \theta)} \nabla_{\theta} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} P(\tau ; \theta) \frac{\nabla_{\theta} P(\tau ; \theta)}{P(\tau ; \theta)} G(\tau) \\&=\sum_{\tau} P(\tau ; \theta) \nabla_{\theta} \ln P(\tau ; \theta) G(\tau)\\&=E \left[\ \nabla_{\theta} \ln P(\tau ; \theta) G(\tau) \ \right]\end{aligned}\tag{9.1.2}
由此可以得到:
θU(θ)g^=1mi=1mθlnP(τ;θ)G(τ)(9.1.3) \begin{aligned}\nabla_{\theta} U(\theta) \approx \hat{g}=\frac{1}{m} \sum_{i=1}^{m} \nabla_{\theta} \ln P(\tau ; \theta) G(\tau)\end{aligned}\tag{9.1.3}
这个公式中 θlogP(τ;θ)\nabla_{\theta} \log P(\tau ; \theta) 就是目标函数变化最快的方向,G(τ)G(\tau) 可以看作更新的幅度

对于 θlogP(τ;θ)\nabla_{\theta} \log P(\tau ; \theta) 这一项,通过数学上的一些技巧可以证明它和环境的动态特性是无关的!
θlnP(τ(i);θ)=θln[t=0HP(st+1(i)st(i),ut(i))dynamics model πθ(ut(i)st(i))policy ]=θ[t=0HlnP(st+1(i)st(i),ut(i))+t=0Hlnπθ(ut(i)st(i))]=θt=0Hlnπθ(ut(i)st(i))=t=0Hθlnπθ(ut(i)st(i))no dynamics model required!! (9.1.4) \begin{aligned}\nabla_{\theta} \ln P\left(\tau^{(i)} ; \theta\right) &=\nabla_{\theta} \ln \left[\prod_{t=0}^{H} \underbrace{P\left(s_{t+1}^{(i)} | s_{t}^{(i)}, u_{t}^{(i)}\right)}_{\text {dynamics model }} \cdot \underbrace{\pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)}_{\text {policy }}\right] \\&=\nabla_{\theta}\left[\sum_{t=0}^{H} \ln P\left(s_{t+1}^{(i)} | s_{t}^{(i)}, u_{t}^{(i)}\right)+\sum_{t=0}^{H} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)\right] \\&=\nabla_{\theta} \sum_{t=0}^{H} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right) \\&=\sum_{t=0}^{H} \underbrace{\nabla_{\theta} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)}_{\text {no dynamics model required!! }}\end{aligned}\tag{9.1.4}
再考虑上折扣率就有:
θU(θ)=E[ θlnP(τ;θ)G(τ) ]=E[ t=0Hγt θlnπθ(ut(i)st(i))G(τ) ](9.1.5) \begin{aligned}\nabla_{\theta} U(\theta) &=E \left[\ \nabla_{\theta} \ln P(\tau ; \theta) G(\tau) \ \right]\\&= E \left[\ \sum_{t=0}^{H} \gamma^t \ \nabla_{\theta} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right) G(\tau) \ \right]\end{aligned}\tag{9.1.5}
所以更新的就可以采用以下形式:
θt+1θt+αγtGtlnπ(AtSt;θ),t=0,1,(9.1.6) \begin{aligned}\boldsymbol{\theta}_{t+1} \leftarrow \boldsymbol{\theta}_{t}+\alpha \gamma^{t} G_{t} \nabla \ln \pi\left(A_{t} | S_{t} ; \boldsymbol{\theta}\right), \quad t=0,1, \ldots\end{aligned}\tag{9.1.6}
这就是policy based的gradient算法,其中比较经典的是REINFORCE算法。

Actor-Critic

该算法需要生成一幕完整的序列,是基于MC的算法,因此它的方差比较大。又因为用到了随机梯度的方法所以有时容易陷入局部最优解。

为了解决这个问题,引入了基线 b(s)b(s) 这个概念!则有:
E[γ(GtB(St))lnπ(AtSi;θ)]=E[γGtlnπ(AtSt;θ)](9.1.7) \begin{aligned}\mathrm{E}\left[\gamma^{\prime}\left(G_{t}-B\left(S_{t}\right)\right) \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]=\mathrm{E}\left[\gamma^{\prime} G_{t} \nabla \ln \pi\left(A_{t} | S_{t} ; \mathbf{\theta}\right)\right]\end{aligned}\tag{9.1.7}
相关证明以及引入基线后确实能减小方差的证明此处略去。

上式左边可以做出如下改动:
E[γ(GtB(St))lnπ(AtSi;θ)]=E[Ψt lnπ(AtSi;θ)](9.1.8) \begin{aligned}\mathrm{E}\left[\gamma^{\prime}\left(G_{t}-B\left(S_{t}\right)\right) \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]= \mathrm{E}\left[ \Psi_t \ \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]\end{aligned}\tag{9.1.8}
其中当 Ψt=A(at,st)=γt[qπ(St,At)vπ(St)]\Psi_{t}= A(a_t, s_t) = \gamma^{t}\left[q_{\pi}\left(S_{t}, A_{t}\right)-v_{\pi}\left(S_{t}\right)\right] 时(注意:此处的价值函数都是在参数化了策略之后得到的,在代码中价值函数是CNN的输出)就是典型的actor-critic算法。其中 Ψt\Psi_t 是critic,lnπ(AtSi;θ)\nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right) 是actor。这里需要强调,因为critic中用价值函数来估计了回报,这种基于其他估计来更新自己的估计的方法正是自举法的体现,并且只有用到了bootstrapping方法的才是actor-critic算法,因此即使将REINFORCE算法中的基线用价值函数替代也不算是actor-critic。也正因为actor-critic算法采用了bootstrapping,所以引入了偏差但是能减小方差。

2、Actor-critic的一些特点

actor和critic是用同一个神经网络训练的但是最后的全连接层不同。当使用A3C(asynchronous advantage actor critic)时利用多线程的技巧,让多个agent同时做exploration,累计gradient,在一个episode结束后用整个轨迹来进行更新,这么做可以取代DQN中的experience replay。因为使用了多线程,不同线程中的actor-learner学到的经验关联性不高因此可以避免使用experience replay但仍能有一个比较稳定的学习过程。并且由于摆脱了experience replay的束缚,asynchronous的思想可以用到on-policy的算法上比如SARSA;其次开多线程可以加快学习的速度。

参考资料

知乎专栏
《强化学习原理与python实现》肖智清

相关文章: