Actor-Critic(A2C A3C)
1、首先要搞清楚什么是actor-critic算法,它是怎么来的?
Actor-critic算法是一种policy based的on policy的model-free算法。和value based的DQN算法有着本质的不同。policy based算法是将policy参数化π(a∣s,θ)=Pr{At=a∣St=s,θt=θ} 用它估计的价值函数用 v^(s,w) 表示。这里需要主义,参数化表示的价值函数都是连续函数是可以求梯度的!针对policy based强化学习问题,我们的目标依然是最大化回报,即:最大化 E[∑t=0HR(st)∣πθ]
我们可以用 τ 表示一组状态-动作序列 s0,u0,⋯,sH,uH, G(τ)=∑t=0HR(st,ut), 表示轨迹 τ 的回报,P(τ;θ) 表示轨迹 τ 出现的概率; 则强化学习的目标函数可表示为:
U(θ)=E(t=0∑HG(st,ut);πθ)=τ∑P(τ;θ)G(τ)(9.1.1)
则我们的目标就是:maxθU(θ)=maxθ∑τP(τ;θ)R(τ) ,根据gradient ascent方法有:θnew=θold+α∇θU(θ)
这里需要说明,虽然该目标函数不是连续的但是在数学上它是可以写成如下形式的(具体证明没有找到):
∇θU(θ)=∇θτ∑P(τ;θ)G(τ)=τ∑∇θP(τ;θ)G(τ)=τ∑P(τ;θ)P(τ;θ)∇θP(τ;θ)G(τ)=τ∑P(τ;θ)P(τ;θ)∇θP(τ;θ)G(τ)=τ∑P(τ;θ)∇θlnP(τ;θ)G(τ)=E[ ∇θlnP(τ;θ)G(τ) ](9.1.2)
由此可以得到:
∇θU(θ)≈g^=m1i=1∑m∇θlnP(τ;θ)G(τ)(9.1.3)
这个公式中 ∇θlogP(τ;θ) 就是目标函数变化最快的方向,G(τ) 可以看作更新的幅度
对于 ∇θlogP(τ;θ) 这一项,通过数学上的一些技巧可以证明它和环境的动态特性是无关的!
∇θlnP(τ(i);θ)=∇θln⎣⎢⎢⎡t=0∏Hdynamics model P(st+1(i)∣st(i),ut(i))⋅policy πθ(ut(i)∣st(i))⎦⎥⎥⎤=∇θ[t=0∑HlnP(st+1(i)∣st(i),ut(i))+t=0∑Hlnπθ(ut(i)∣st(i))]=∇θt=0∑Hlnπθ(ut(i)∣st(i))=t=0∑Hno dynamics model required!! ∇θlnπθ(ut(i)∣st(i))(9.1.4)
再考虑上折扣率就有:
∇θU(θ)=E[ ∇θlnP(τ;θ)G(τ) ]=E[ t=0∑Hγt ∇θlnπθ(ut(i)∣st(i))G(τ) ](9.1.5)
所以更新的就可以采用以下形式:
θt+1←θt+αγtGt∇lnπ(At∣St;θ),t=0,1,…(9.1.6)
这就是policy based的gradient算法,其中比较经典的是REINFORCE算法。

该算法需要生成一幕完整的序列,是基于MC的算法,因此它的方差比较大。又因为用到了随机梯度的方法所以有时容易陷入局部最优解。
为了解决这个问题,引入了基线 b(s) 这个概念!则有:
E[γ′(Gt−B(St))∇lnπ(At∣Si;θ)]=E[γ′Gt∇lnπ(At∣St;θ)](9.1.7)
相关证明以及引入基线后确实能减小方差的证明此处略去。
上式左边可以做出如下改动:
E[γ′(Gt−B(St))∇lnπ(At∣Si;θ)]=E[Ψt ∇lnπ(At∣Si;θ)](9.1.8)
其中当 Ψt=A(at,st)=γt[qπ(St,At)−vπ(St)] 时(注意:此处的价值函数都是在参数化了策略之后得到的,在代码中价值函数是CNN的输出)就是典型的actor-critic算法。其中 Ψt 是critic,∇lnπ(At∣Si;θ) 是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实现》肖智清