上一篇对Actor-Critic算法的学习,了解Actor-Critic的流程,但由于普通的Actor-Critic难以收敛,需要一些其他的优化。而Asynchronous Advantage Actor-Critic(A3C)就是其中较好的优化算法。
为了打破数据之间的相关性,DQN和DDPG的方法都利用了经验回放的技巧。然而,打破数据的相关性,经验回放并非是唯一的方法。另外一种方法是异步的方法。比如,学习下棋,总是和同一个人下,期望提高棋艺,但到一定程度就难以提高了,此时最好的方法就是另寻高手切磋。
A3C的思路也是如此,它利用多线程的方法,同时在多个线程里面分别与环境进行交互学习,每个线程都把学习的成果汇总起来,整理保存在一个公共的地方。并且,定期从公共的地方把大家的齐心学习的成果拿回来,指导自己和环境后面的学习交互。
这样,A3C避免了经验回放相关性过强的问题,同时做到了异步并发的学习模型。
相比Actor-Critic,A3C的优化主要有3点,分别是异步训练框架,网络结构优化,Critic评估点的优化。其中异步训练框架是最大的优化。
可见,公共部分的网络模型就是我们要学习的模型,而线程里的网络模型主要是用于和环境交互使用的,这些线程里的模型可以帮助线程更好的和环境交互,拿到高质量的数据帮助模型更快收敛。
A ( S , t ) = R + γ V ( S ′ ) − V ( S ) A\left(S,t\right)=R+\gamma V\left(S^{\prime}\right)-V\left(S\right) A(S,t)=R+γV(S′)−V(S)
其中 V ( S ) V\left(S\right) V(S)的值通过Critic网络来学习得到。
在A3C中,采样更进一步,使用了N步采样,以加速收敛。则A3C中的优势函数表达为:
A ( S , t ) = R t + γ R t + 1 + ⋯ + γ n − 1 R t + n − 1 + γ n V ( S ′ ) − V ( S ) A\left(S,t\right)=R_t+\gamma R_{t+1}+\dots +\gamma^{n-1}R_{t+n-1}+\gamma^nV(S^\prime)-V(S) A(S,t)=Rt+γRt+1+⋯+γn−1Rt+n−1+γnV(S′)−V(S)
对于Actor和Critic的损失函数部分,和Actor-Critic基本相同。有一个小的优化点就是在Actor-Critic策略函数的损失函数中,加入了策略π的熵项,系数为c, 即策略参数的梯度更新和Actor-Critic相比变成了这样:
θ = θ + α ▽ θ log π θ ( s t , a t ) A ( S , t ) + c ▽ θ H ( π ( S t , θ ) ) \theta = \theta + \alpha\bigtriangledown_\theta\log\pi_\theta\left(s_t,a_t\right)A\left(S,t \right) +c\bigtriangledown_\theta H(\pi(S_t,\theta)) θ=θ+α▽θlogπθ(st,at)A(S,t)+c▽θH(π(St,θ))
由于A3C是异步多线程的,这里给出任意一个线程的算法流程。
输入: 公共部分的A3C神经网络结构,对应参数 θ \theta θ, w w w,本线程的A3C神经网络结构,对应参数 θ ′ \theta^\prime θ′, w ′ w^\prime w′,全局共享的迭代轮数 T T T,全局最大迭代次数 T m a x T_{max} Tmax,线程内单次迭代时间序列最大长度 T l o c a l T_{local} Tlocal,状态特征维度 n n n,动作集 A A A,步长 α \alpha α, β \beta β,熵系数 c c c,衰减因子 γ \gamma γ
输出: 公共部分的A3C神经网络参数 θ \theta θ, w w w
1. 更新时间序列 t = 1 t=1 t=1
2. 重置Actor和Critic的梯度更新量: d θ ← 0 , d w ← 0 d\theta\leftarrow 0,dw\leftarrow 0 dθ←0,dw←0
3. 从公共部分的A3C神经网络同步参数到本线程的神经网络: θ ′ = θ \theta^\prime=\theta θ′=θ, w ′ = w w^\prime =w w′=w
4. t s t a r t = t t_{start}=t tstart=t,初始化状态 s t s_t st
5. 基于策略 π ( a t ∣ s t ; θ ) \pi(a_t\mid s_t;\theta) π(at∣st;θ)选择动作 a t a_t at
6. 执行动作 a t a_t at得到奖励 r t r_t rt和新状态 s t + 1 s_{t+1} st+1
7. t ← t + 1 , T ← T + 1 t\leftarrow t+1, T\leftarrow T+1 t←t+1,T←T+1
8. 如果 s t s_t st是终止状态,或 t − t s t a r t = = t l o c a l t-t_{start}==t_{local} t−tstart==tlocal,则进入步骤9,否则回到步骤5
9. 计算最后一个时间序列位置 s t s_t st的 Q ( s , t ) Q(s,t) Q(s,t):
Q ( s , t ) = { 0 t e r m i n a l s t a t e V ( s t , w ′ ) n o n e t e r m i n a l s t a t e , b o o t s t r a p p i n g Q(s,t)= \begin{cases} 0 & terminal\ state \\ V(s_t,w^\prime) & none\ terminal\ state, bootstrapping\end{cases} Q(s,t)={0V(st,w′)terminal statenone terminal state,bootstrapping
10. for i ∈ ( t − 1 , t − 2 , … , t s t a r t ) i \in (t-1,t-2,\dots,t_{start}) i∈(t−1,t−2,…,tstart)
a) 计算每个时刻的 Q ( s , i ) Q(s,i) Q(s,i): Q ( s , i ) = r i + γ Q ( s , i + 1 ) Q(s,i)=r_i+\gamma Q(s,i+1) Q(s,i)=ri+γQ(s,i+1)
b) 累计Actor的本地梯度更新:
d θ = d θ + ▽ θ ′ log π θ ′ ( s i , a i ) ( Q ( s , i ) − V ( S i , w ′ ) ) + c ▽ θ ′ H ( π ( s i , θ ′ ) ) d\theta = d\theta + \bigtriangledown_{\theta^\prime}\log\pi_{\theta^\prime}\left(s_i,a_i\right)(Q\left(s,i \right)-V(S_i,w^\prime) )+c\bigtriangledown_{\theta^\prime}H(\pi(s_i,\theta^\prime)) dθ=dθ+▽θ′logπθ′(si,ai)(Q(s,i)−V(Si,w′))+c▽θ′H(π(si,θ′))
c) 累计Critic的本地梯度更新:
d w ← d w + ∂ ( Q ( s , i ) − V ( S i , w ′ ) ) 2 ∂ w ′ dw\leftarrow dw+\frac{\partial(Q(s,i)-V(S_i,w^\prime))^2}{\partial w^\prime} dw←dw+∂w′∂(Q(s,i)−V(Si,w′))2
11. 更新全局神经网络的模型参数:
θ = θ − α d θ , w = w − β d w \theta=\theta-\alpha d\theta,w=w-\beta dw θ=θ−αdθ,w=w−βdw
12. 如果 T > T m a x T>T_{max} T>Tmax,则算法结束,输出公共部分的A3C神经网络参数 θ \theta θ, w w w,否则进入步骤3
笔记参考刘建平Pinard博客