RL策略梯度方法之(四): Asynchronous Advantage Actor-Critic(A3C)

本专栏按照 https://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html 顺序进行总结 。


文章目录

  • 原理解析
  • 算法实现
    • 总体流程
    • 代码实现


A 3 C \color{red}A3C A3C :[ paper | code ]


原理解析

在A3C中,critic 学习值函数,同时多个 actor 并行训练,并不时地与全局参数同步。因此,A3C可以很好地用于并行训练。

  • 服务器的每个核都是一个线程,也就是一个平行世界,同样的一个程序,在平行世界里同时运行,可以成倍数的提升运行速度。每个线程中的运行结果反馈给主网络,同时从主网络获取最新的参数更新,这样就将多个线程结合在一起,同时进一步减弱了事件的相关性,利于程序的收敛。

以 state-value 函数为例,状态值的损失函数是最小均方误差: J v ( w ) = ( G t − V w ( s ) ) 2 J_v(w) = (G_t - V_w(s))^2 Jv(w)=(GtVw(s))2,梯度下降可以用来寻找最优的 w w w。此状态值函数用作策略梯度更新的基线。

接下来,看一下A3C 的实现流程图:
RL策略梯度方法之(四): Asynchronous Advantage Actor-Critic(A3C)_第1张图片

可以看到,我们有一个主网络,还有许多Worker(主网络和每个线程中的网络结构相同,均为AC结构,唯一不同点在于主网络不需要进行训练,仅用于存储AC结构的参数。)。A3C主要有两个操作,一个是pull,一个是push:
pull:把主网络的参数直接赋予Worker中的网络
push:使用各Worker中的梯度,对主网络的参数进行更新

算法实现

总体流程

以下是算法的整体流程:

  1. 全局参数 θ \theta θ w w w,相同的 特定线程的参数 θ ′ \theta' θ w ′ w' w
  2. 初始化时间步: t = 1 t=1 t=1
  3. T ≤ T M A X T \le T_{MAX} TTMAX
    (1). 重置梯度 d θ = 0 , d w = 0 d\theta =0, dw=0 dθ=0,dw=0
    (2). 使用全局参数同步特定线程的参数 θ ′ = θ \theta' = \theta θ=θ w ′ = w w' = w w=w
    (3). t s t a r t = t t_{start}=t tstart=t,采样一个初始状态 s t s_t st
    (4). s t ! = s_t != st!= TERMINAL    & &     t − t start ≤ t max \ \ \&\& \ \ \ t - t_\text{start} \leq t_\text{max}   &&   ttstarttmax):
    \quad ① 取动作: A t ∼ π θ ′ ( A t ∣ S t ) A_t \sim \pi_{\theta'}(A_t \vert S_t) Atπθ(AtSt),从环境中获得奖励 R t R_t Rt 和 下一个状态 s t + 1 s_{t+1} st+1
    \quad ② 更新 t = t + 1 t=t+1 t=t+1 T = T + 1 T=T+1 T=T+1
    (5). 初始化 保存return估计 的变量
    \quad R = { 0 if  s t  is TERMINAL V w ′ ( s t ) otherwise R = \begin{cases} 0 & \text{if } s_t \text{ is TERMINAL} \\ V_{w'}(s_t) & \text{otherwise} \end{cases} R={0Vw(st)if st is TERMINALotherwise
    (6). 对于 i = t − 1 , … , t start i = t-1, \dots, t_\text{start} i=t1,,tstart
    \quad R ← γ R + R i R \leftarrow \gamma R + R_i RγR+Ri,这里 R R R G i G_i Gi 的一个 MC 度量
    \quad ② 累加梯度关于 θ ′ \theta' θ d θ ← d θ + ∇ θ ′ log ⁡ π θ ′ ( a i ∣ s i ) ( R − V w ′ ( s i ) ) d\theta \leftarrow d\theta + \nabla_{\theta'} \log \pi_{\theta'}(a_i \vert s_i)(R - V_{w'}(s_i)) dθdθ+θlogπθ(aisi)(RVw(si))
    \qquad 累加梯度关于 w ′ w' w d w ← d w + 2 ( R − V w ′ ( s i ) ) ∇ w ′ ( R − V w ′ ( s i ) ) dw \leftarrow dw + 2 (R - V_{w'}(s_i)) \nabla_{w'} (R - V_{w'}(s_i)) dwdw+2(RVw(si))w(RVw(si))
    (7). 使用 d θ , d w \mathrm{d}\theta, \mathrm{d}w dθ,dw 异步更新 θ , w \theta, w θ,w

算法流程图如下:
RL策略梯度方法之(四): Asynchronous Advantage Actor-Critic(A3C)_第2张图片
RL策略梯度方法之(四): Asynchronous Advantage Actor-Critic(A3C)_第3张图片

RL策略梯度方法之(四): Asynchronous Advantage Actor-Critic(A3C)_第4张图片

A3C允许在多个agent的训练中并行进行。梯度积累步骤(6.2)可以看作是对基于mini-batch的随机梯度更新的并行改善: w w w θ \theta θ 的值分别在每个训练线程的方向上进行一点独立的修正。

代码实现

https://github.com/MorvanZhou/pytorch-A3C

你可能感兴趣的:(强化学习,RL,基础算法,强化学习)