Actor-Critic
AC算法框架被广泛应用于实际强化学习算法中,该框架集成了值函数估计算法和策略搜索算法,是解决实际问题时最常考虑的框架。大家众所周知的Alphago便用了AC框架。而且在强化学习领域最受欢迎的A3C算法,DDPG算法,PPO算法等都是AC框架。
1.1 策略梯度
随机策略梯度的计算公式为:
∇ θ J ( π θ ) = E s ρ π , a π θ [ ∇ θ log π θ ( a ∣ s ) Q π ( s , a ) ] \nabla_{\theta}J\left(\pi_{\theta}\right)=E_{s~\rho^{\pi},a~\pi_{\theta}}\left[\nabla_{\theta}\log\pi_{\theta}\left(a|s\right)Q^{\pi}\left(s,a\right)\right] ∇θJ(πθ)=Es ρπ,a πθ[∇θlogπθ(a∣s)Qπ(s,a)]
利用经验平均估计策略的梯度:
∇ θ U ( θ ) ≈ g ^ = 1 m ∑ i = 1 m ∇ θ log P ( τ ; θ ) R ( τ ) \nabla_{\theta} U(\theta) \approx \hat{g}=\frac{1}{m} \sum_{i=1}^{m} \nabla_{\theta} \log P(\tau ; \theta) R(\tau) ∇θU(θ)≈g^=m1∑i=1m∇θlogP(τ;θ)R(τ)
其中第一项
∇
θ
log
P
(
τ
;
θ
)
\nabla_{\theta}\log P\left(\tau ;\theta\right)
∇θlogP(τ;θ) 是轨迹
τ
\tau
τ的概率随参数
θ
\theta
θ变化最大的方向,即最陡的方向。参数在该方向进行更新时,若沿着正方向,则该轨迹
τ
\tau
τ的概率会变大,而沿着负方向进行更新时,该轨迹
τ
\tau
τ的概率会变小。
再看第二项
R
(
τ
)
R\left(\tau\right)
R(τ),该项控制了参数更新的方向和步长。
R
(
τ
)
R\left(\tau\right)
R(τ)为正且越大则参数更新后该轨迹的概率越;
R
(
τ
)
R\left(\tau\right)
R(τ)为负,则降低该轨迹的概率,抑制该轨迹的发生。
因此,策略梯度从直观上进行理解时,我们发现策略梯度会增加高回报路径的概率,减小低回报路径的概率。
1.2 Actor-Critic框架引出
从策略梯度的直观解释我们可以看到,轨迹回报 R(
τ
\tau
τ) 就像是一个评价器(Critic)。也就是说,策略的参数调整幅度由轨迹回报 R(
τ
\tau
τ) 进行评价。可以将 R(
τ
\tau
τ) 进行推广而不影响策略梯度大小的计算。根据Shulman的博士论文,在保持策略梯度不变的情况下,策略梯度可写为:
g = E [ ∑ t = 0 ∞ Ψ t ∇ θ log π θ ( a t ∣ s t ) ] g=\mathbb{E}\left[\sum_{t=0}^{\infty} \Psi_{t} \nabla_{\theta} \log \pi_{\theta}\left(a_{t} | s_{t}\right)\right] g=E[∑t=0∞Ψt∇θlogπθ(at∣st)]
在上式中,
π
θ
(
a
t
∣
s
t
)
\pi_{\theta}\left(a_{t} | s_{t}\right)
πθ(at∣st)称为Actor,
Ψ
t
\Psi_t
Ψt 称为Critic,因此上式是一个广义的AC框架。
Actor为策略函数,经常用神经网络来表示,因此称为策略网络。
Critic为评价函数,对于大部分问题,
Ψ
t
\Psi_t
Ψt 也常常用神经网络进行逼近, 参数为
w
w
w,因此Critic又称为评价网络。
Ψ t \Psi_t Ψt 可以是下列任何一个:
-
Σ t = 0 ∞ r t \Sigma_{t=0}^{\infty}r_t Σt=0∞rt 轨迹的总回报,
-
Σ t ′ = t ∞ r t ′ \Sigma_{t'=t}^{\infty}r_{t'} Σt′=t∞rt′ 动作后的回报
-
Σ t ′ = t ∞ r t ′ − b \Sigma_{t'=t}^{\infty}r_{t'}-b Σt′=t∞rt′−b 加入基线的形式
-
Q π ( s t , a t ) \ Q^{\pi}\left(s_t,a_t\right) Qπ(st,at) 状态-行为值函数
-
A π ( s t , a t ) \ A^{\pi}\left(s_t,a_t\right) Aπ(st,at) 优势函数
-
δ ( t ) = R t + 1 + γ V ( S t + 1 ) − V ( S t ) \delta(t)=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_{t}\right) δ(t)=Rt+1+γV(St+1)−V(St)或
δ ( t ) = R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) \delta(t)=R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right)-Q\left(S_{t}, A_{t}\right) δ(t)=Rt+1+γQ(St+1,At+1)−Q(St,At):TD误差
我们分析一下这六个可选的评价函数。
1–3:直接应用轨迹的累积回报,由此计算出来的策略梯度不存在偏差,但是由于需要累积多步的回报,因此方差会很大。
4–6: 利用动作值函数,优势函数和TD误差代替累积回报,其优点是方差小,但是这三种方法中都用到了逼近方法,因此计算出来的策略梯度都存在偏差。这三种方法以牺牲偏差来换取小的方差。当 Ψ t \varPsi_t Ψt 取4—6时,为经典的AC方法。
对于Critic本身的模型参数 w w w,一般都是使用均方误差损失函数来做做迭代更新。如果我们使用的是最简单的线性Q函数,比如 Q ( s , a , w ) = ϕ ( s , a ) T w Q(s, a, w)=\phi(s, a)^{T} w Q(s,a,w)=ϕ(s,a)Tw,则Critic本身的模型参数 w w w的更新公式可以表示为:
δ
=
R
t
+
1
+
γ
Q
(
S
t
+
1
,
A
t
+
1
)
−
Q
(
S
t
,
A
t
)
\delta=R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right)-Q\left(S_{t}, A_{t}\right)
δ=Rt+1+γQ(St+1,At+1)−Q(St,At)
w
=
w
+
β
δ
ϕ
(
s
,
a
)
w=w+\beta \delta \phi(s, a)
w=w+βδϕ(s,a)
通过对均方误差损失函数求导可以很容易的得到上式。当然实际应用中,我们一般不使用线性Q函数,而使用神经网络表示状态和Q值的关系。
1.3 Actor-Critic算法流程
这里给一个Actor-Critic算法的流程总结,评估点基于TD误差,Critic使用神经网络来计算TD误差并更新网络参数,Actor也使用神经网络来更新网络参数。
算法输入:迭代轮数
T
T
T,状态特征维度
n
n
n, 动作集
A
A
A, 步长
α
\alpha
α,
β
\beta
β,衰减因子
γ
\gamma
γ, 探索率
ϵ
\epsilon
ϵ, Critic网络结构和Actor网络结构。
输出:Actor 网络参数
θ
θ
θ, Critic网络参数
w
w
w
-
随机初始化所有的状态和动作对应的价值 Q Q Q
-
for i i i from 1 to T T T,进行迭代
a) 初始化 S S S为当前状态序列的第一个状态, 拿到其特征向量 ϕ ( S ) \phi(S) ϕ(S)b) 在Actor网络中使用 ϕ ( S ) \phi(S) ϕ(S)作为输入,输出动作 A A A,基于动作 A A A得到新的状态 S ′ S^{\prime} S′,反馈 R R R。
c) 在Critic网络中分别使用 ϕ ( S ) \phi(S) ϕ(S), ϕ ( S ′ ) \phi(S^{\prime}) ϕ(S′)作为输入,得到Q值输出 V ( S ) V(S) V(S), V ( S ′ ) V\left(S^{\prime}\right) V(S′)
d) 计算TD误差 δ = R + γ V ( S ′ ) − V ( S ) \delta=R+\gamma V\left(S^{\prime}\right)-V(S) δ=R+γV(S′)−V(S)
e) 使用均方差损失函数 ∑ ( R + γ V ( S ′ ) − V ( S , w ) ) 2 \sum\left(R+\gamma V\left(S^{\prime}\right)-V(S, w)\right)^{2} ∑(R+γV(S′)−V(S,w))2作Critic网络参数 w w w的梯度更新
f) 更新Actor网络参数 θ θ θ:
θ ← θ + α δ ∇ θ log π ( A t ∣ S t , θ ) \theta\gets\theta+\alpha\delta\nabla_{\theta}\log\pi\left(A_t|S_t,\theta\right) θ←θ+αδ∇θlogπ(At∣St,θ)
对于Actor的分值函数
∇
θ
log
π
(
A
t
∣
S
t
,
θ
)
\nabla_{\theta}\log\pi\left(A_t|S_t,\theta\right)
∇θlogπ(At∣St,θ),可以选择softmax或者高斯分值函数。
上述Actor-Critic算法已经是一个很好的算法框架,但是离实际应用还比较远。主要原因是这里有两个神经网络,都需要梯度更新,而且互相依赖。
1.4 Actor-Critic算法小结
基本版的Actor-Critic算法虽然思路很好,但是由于难收敛的原因,还需要做改进。
目前改进的比较好的有两个经典算法,一个是DDPG算法,使用了双Actor神经网络和双Critic神经网络的方法来改善收敛性。另一个是A3C算法,使用了多线程的方式,一个主线程负责更新Actor和Critic的参数,多个辅线程负责分别和环境交互,得到梯度更新值,汇总更新主线程的参数。而所有的辅线程会定期从主线程更新网络参数。这些辅线程起到了类似DQN中经验回放的作用,但是效果更好。
1.5 A3C算法
众所周知,当利用神经网络逼近行为值函数的时候,神经网络往往不稳定。这是因为在监督学习中,对神经网络进行训练时,假设数据都是独立同分布的。而直接利用强化学习的数据对使用神经网络进行逼近的值函数进行训练时,数据之间存在着很强的时间相关性,这是导致神经网络训练不稳定的最主要原因。
为了打破数据之间的相关性,DQN和DDPG的方法都利用了经验回放的技巧。然而,打破数据的相关性,经验回放并非是唯一的方法。另外一种方法是异步的方法。
所谓异步的方法是指数据并非同时产生,A3C的方法便是其中表现非常优异的异步强化学习算法。
A3C全称为 Asynchronous Advantage Actor-Critic,中文名字是异步优势动作评价算法。因为该算法的前三个单词的首字母都是A,所以简写为A3C。
A3C的基本框架还是AC框架,只是它不在利用单个线程,而是利用多个线程。每个线程相当于一个智能体在随机探索,多个智能体共同探索,并行计算策略梯度,维持一个总的更新量。A3C的并行机制与谷歌的DPPO是一致的。
参考文献:
[1]https://zhuanlan.zhihu.com/p/29486661
[2]https://www.cnblogs.com/pinard/p/10272023.html