文章目录
- AC算法
- AC
- A2C
- A3C
AC算法
我们之前讲过基于价值的强化学习,我们也讲过基于策略的强化学习,这节课所讲的AC系列算法就是同时使用了这两种方法包含有:AC——Actor Critic、A2C——Advantage Actor Critic、A3C——Asynchronous Advantage Actor Critic。
AC
Actor-Critic算法分为两部分,Actor用的是policy gradient,它可以在连续动作空间内选择合适的动作,Critic用的是Q-learning,它可以解决离散动作空间的问题。除了这个,又因为Actor只能在一个回合之后进行更新,导致学习效率较慢,Critic的加入就可以使用TD方法实现单步更新。这样两种算法相辅相成就形成了我们的Actor-Critic。
Actor输出每个Action的概率,有多少个Action就有多少个输出。Critic 基于 Actor 输出的行为评判得分, Actor 再根据 Critic 的评分修改选行为的概率。这是两个神经网络。因此策略梯度可以写成:
g = E [ ∑ t = 0 ∞ ψ t ∇ θ l o g π θ ( a t ∣ s t ) ] \begin{align} g=E[\sum_{t=0}^\infty \psi_t \nabla_\theta logπ_\theta (a_t|s_t)] \end{align} g=E[t=0∑∞ψt∇θlogπθ(at∣st)]
公式里的π指的就是Actor的策略, ψ \psi ψ指的就是Critic,评估Actor策略的好坏,它可以表示成很多种形式:
(1) ∑ t = 0 ∞ r t \sum\limits_{t=0}^\infty r_t t=0∑∞rt:一个轨迹中的Reward相加;
(2) ∑ t = t ′ ∞ r t ′ \sum\limits_{t=t’}^\infty r_{t’} t=t′∑∞rt′:动作后的Reward(从该动作往后算,可以看成前期的对后面没有影响);
(3) ∑ t = t ′ ∞ r t ′ − b ( s t ) \sum\limits_{t=t’}^\infty r_{t’}-b(s_t) t=t′∑∞rt′−b(st):动作后的总汇报相加后的Reward减去一个baseline;
(4) Q π ( s t , a t ) Q^π(s_t,a_t) Qπ(st,at):用行为价值函数Q计算;
(5) A π ( s t , a t ) A^π(s_t,a_t) Aπ(st,at):用优势函数A计算;
(6) r t + γ V π ( s t + 1 ) − V π ( s t + 1 ) r_t+\gamma V^π(s_{t+1})-V^π(s_{t+1}) rt+γVπ(st+1)−Vπ(st+1):用TD-error,计算新的状态价值减去原本的状态价值;
前三个都是直接应用轨迹的回报累计回报,这样计算出来的策略梯度不会存在偏差,但是因为需要累计多步的回报,所以方差会很大。
后三个是利用动作价值函数,优势函数和TD偏差代替累计回报,其优点是方差小,但是三种方法中都用到了逼近方法,因此计算出来的策略梯度都存在偏差。这三种方法是以牺牲偏差来换取小的方差。
算法结构图如下:
AC算法流程:
输入:策略 π θ ( a t ∣ s t ) π_\theta (a_t|s_t) πθ(at∣st)、参数化状态 V ( s , ω ) V(s,\omega) V(s,ω);
对Actor网络参数 θ \theta θ以及Critic网络参数 ω \omega ω初始化;
开始循环:
利用当前策略 π θ ( a t ∣ s t ) π_\theta (a_t|s_t) πθ(at∣st)对 ( s t , r t , s t + 1 ) (s_t,r_t,s_{t+1}) (st,rt,st+1)采样;
计算行为值函数,并进行更新( Q = r + γ V ( s t + 1 ) Q=r+\gamma V(s_{t+1}) Q=r+γV(st+1))
δ = Q − V ( s t , ω ) \delta=Q-V(s_t,\omega) δ=Q−V(st,ω)
ω ← ω + α ω δ ∇ ω V ( s , ω ) \omega \leftarrow \omega+\alpha^\omega\delta\nabla_\omega V(s,\omega) ω←ω+αωδ∇ωV(s,ω)(critic网络参数更新)
θ ← θ + α θ δ ∇ θ l o g π \theta\leftarrow\theta+\alpha^\theta\delta\nabla_\theta logπ θ←θ+αθδ∇θlogπ(actor网络参数更新)
A2C
A2C即Advantage Actor-Critic此算法的出现是为了应对AC方法高方差的问题,为什么会有这个问题呢,是因为一个动作轨迹中假如所有的动作回报都为正的这并不代表所有动作都是好的,他可能只是个次优的动作。因此我们采用引入基线的方式来解决这个问题,基线函数的特点是能在不改变策略梯度的同时降低其方差。这里的基线baseline一般由 V ( s t ) V(s_t) V(st)来代替,原来的Q值就变成了:
Q = Q ( s t , a t ) − V ( s t ) = r t + γ V ( s t + 1 ) − V ( s t ) \begin{align} Q=Q(s_t,a_t)-V(s_t)=r_t+\gamma V(s_{t+1})-V(s_t) \end{align} Q=Q(st,at)−V(st)=rt+γV(st+1)−V(st)
A3C
A3C即Asynchronous Advantage Actor Critic,在讲DQN算法时我们讲过神经网络训练时,需要的数据是独立同分布的,否则Agent很容易学习到一种固定的策略,DQN采用的是经验回放机制解决这个问题的,但这种机制存在两个问题:
(1)Agent每次交互的时候都需要更多的内存和计算;
(2)经验回放机制要求 Agent 采用离策略(off-policy)方法来进行学习,而同样的条件下,离线策略算法不如在线策略算法稳定;
打破数据的相关性,经历回放并非是唯一方法。另一种为异步的方法,通过在多个环境实例中并行地执行多个智能体,由于探索的随机性,所以产生的数据是各不相同的。并行的交互采样和训练。在异步方法中,同时启动多个线程,智能体将在多个线程中同时进行环境交互。
A3C算法就是采用多线程进行训练,采用几个独立的副本网络去单独学习训练,然后将学到的神经网络参数上传到全局的网络,全局的网络再适时的将最新的参数分发给各个副本网络,使其拥有最新的知识。通过多个副本独立训练打破了数据的相关性。A3C网络结构如图:
A3C算法价值模型采用多步回报的估计方法,这个方法可以减小模型的偏差,权重计算公式为:
∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t ) \begin{align} \sum_{i=1}^n \gamma^{i-1}r_{t+1}+v(s_{t+n})-v(s_t) \end{align} i=1∑nγi−1rt+1+v(st+n)−v(st)
为提高算法的探索能力,通过增大目标函数中策略的熵,增加概率分布的随机性。策略梯度的公式如下:
∇ θ J ( θ ) = 1 T ∑ t T ∇ θ l o g π ( a t ∣ s t ; θ ) ( ∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t ) ) + β ∇ θ H ( π ( s t ; θ ) ) \begin{align} \nabla_\theta J(\theta)=\frac 1T \sum_{t}^T \nabla_\theta logπ(a_t|s_t;\theta)(\sum_{i=1}^n \gamma^{i-1}r_{t+1}+v(s_{t+n})-v(s_t))+\beta \nabla_\theta H(π(s_t;\theta)) \end{align} ∇θJ(θ)=T1t∑T∇θlogπ(at∣st;θ)(i=1∑nγi−1rt+1+v(st+n)−v(st))+β∇θH(π(st;θ))
A3C算法流程(单一线程):
输入
T ← \leftarrow ← 0
全局和副本策略模型参数: θ , θ ′ \theta,\theta’ θ,θ′
全局和副本价值模型参数: θ v , θ v ′ \theta_v,\theta’_v θv,θv′
全局和副本梯度: d θ , d θ v d\theta,d\theta_v dθ,dθv
开始
循环直到 T > T m a x T>T_{max} T>Tmax
将梯度清零: d θ ← 0 , d θ v ← 0 d\theta \leftarrow0,d\theta_v \leftarrow0 dθ←0,dθv←0
同步模型参数: θ ′ ← θ , θ v ′ ← θ v \theta’\leftarrow\theta,\theta’_v\leftarrow\theta_v θ′←θ,θv′←θv
用策略模型 π ( a t ∣ s t ; θ ′ ) π(a_t|s_t;\theta’) π(at∣st;θ′)完成一回合训练,获得数据{ s 0 , a 0 , r 0 , ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ s_0,a_0,r_0,······ s0,a0,r0,⋅⋅⋅⋅⋅⋅}
T ← T + n T \leftarrow T+n T←T+n
计算每一个回合价值
R = { 0 , 到达终点状态 v ( s t ; θ v ′ ) , 未到达终点状态 R = \begin{cases} 0, & \text{到达终点状态} \\ v(s_t;\theta’_v), & \text{未到达终点状态} \\ \end{cases} R={0,v(st;θv′),到达终点状态未到达终点状态
For i ∈ i\in i∈{n-1,0}do
R ← r i + γ R R\leftarrow r_i+\gamma R R←ri+γR
d θ ← d θ + ∇ θ ′ l o g π ( a t ∣ s t ; θ ′ ) ( R − V ( s i , θ v ′ ) ) d\theta\leftarrow d\theta+\nabla_{\theta’} logπ(a_t|s_t;\theta’)(R-V(s_i,\theta’_v)) dθ←dθ+∇θ′logπ(at∣st;θ′)(R−V(si,θv′))
d θ v ← d θ v + ∇ θ v ′ ( R − V ( s i , θ v ′ ) ) 2 d\theta_v\leftarrow d\theta_v+\nabla_{\theta’_v}(R-V(s_i,\theta’_v))^2 dθv←dθv+∇θv′(R−V(si,θv′))2
End For
异步更新 θ , θ v \theta,\theta_v θ,θv, θ ← d θ , θ v ← d θ v \theta\leftarrow d\theta,\theta_v\leftarrow d\theta_v θ←dθ,θv←dθv