本文是强化学习入门系列的第七篇,介绍一种结合了策略梯度和时序差分的算法——Actor-Critic即演员评论家算法。
Actor-Critic即演员-评论家算法。分为两部分,Actor基于概率选动作(不用Epsilon-greedy了),Critic基于Actor的动作进行打分,Actor再根据Critic的得分修改选择动作的概率。
我们知道状态价值函数如下:
V π ( s , a ) = ∑ a π ( a ∣ s ) Q π ( s , a ) V_{\pi}(s,a)=\sum_a\pi(a|s)Q_{\pi}(s,a) Vπ(s,a)=a∑π(a∣s)Qπ(s,a)
策略函数 π \pi π 以及动作价值函数 Q π Q_{\pi} Qπ 可以分别用两个神经网络来表示,也是分别对应Actor与Critic。
对于Actor,用神经网络(即策略网络) π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ) 来近似策略函数 π ( a ∣ s ) \pi(a|s) π(a∣s), θ \theta θ 是决定策略的参数。Actor的目标是选出最优的策略,使得状态价值函数最大。更新方法采用Policy-Gradient。然而在更新过程中 Q π Q_{\pi} Qπ 的值Actor是不知道的,所以需要Critic来更新这一值。
对于Critic,用神经网络(即价值网络 ) q ( s , a ; ω ) q(s,a;\omega) q(s,a;ω) 来近似价值函数 Q θ ( s , a ) Q_{\theta}(s,a) Qθ(s,a), ω \omega ω 是神经网络的参数。Critic的目标对Actor选出的动作打分,然后作为Actor的监督信号,指导Actor更新参数。更新方法采用时序差分(TD)方法。其实本质上就是在更新q-function。
我们来看看具体如何训练。实际上,这两个网络是同时训练的。步骤如下:
在参数更新上,我们知道Actor在初始状态 s t s_t st 下,基于随机策略 θ \theta θ 选择了一个动作 a t a_t at,进入到了下一状态 s t + 1 s_{t+1} st+1,得到了环境的奖励 r t r_t rt。在Q-function中,我们知道需要用 Q-估计 减去 Q-当前 来得到误差,但是 Q-估计 的值并不知道下一状态 s t + 1 s_{t+1} st+1 选的动作 a t + 1 a_{t+1} at+1 具体是哪个,所以 a t + 1 a_{t+1} at+1 通过随机采样得到 a ^ t + 1 \hat{a}_{t+1} a^t+1,近似的 Q-估计为 r t + γ ( q ( s t + 1 , a ^ t + 1 ; ω ) ) r_t+\gamma(q(s_{t+1},\hat{a}_{t+1};\omega)) rt+γ(q(st+1,a^t+1;ω)),Critic的TD-error就可以表示为:
δ t = q ( s t , a t ; ω ) − ( r t + γ ( q ( s t + 1 , a ^ t + 1 ; ω ) ) ) \delta_t =q(s_t,a_t;\omega)-(r_t+\gamma(q(s_{t+1},\hat{a}_{t+1};\omega))) δt=q(st,at;ω)−(rt+γ(q(st+1,a^t+1;ω)))
再利用梯度下降来更新参数 ω \omega ω, α \alpha α 是学习率,如下:
l o s s = 1 2 [ q ( s t , a t ; ω ) − ( r t + γ ( q ( s t + 1 , a ^ t + 1 ; ω ) ) ) ] 2 ω t + 1 = ω t − α ⋅ ∂ l o s s ∂ ω ∣ ω = ω t = ω t − α ⋅ δ t ⋅ ∂ q ( s t , a t ; ω ) ∂ ω ∣ ω = ω t loss=\dfrac{1}{2}[q(s_t,a_t;\omega)-(r_t+\gamma(q(s_{t+1},\hat{a}_{t+1};\omega)))]^2 \\ \begin{aligned} \omega_{t+1}=&\omega_t - \alpha\cdot\dfrac{\partial loss}{\partial \omega} |_{\omega=\omega_t} \\=&\omega_t - \alpha\cdot\delta_t \cdot\dfrac{\partial q(s_t,a_t;\omega)}{\partial \omega} |_{\omega=\omega_t} \end{aligned} loss=21[q(st,at;ω)−(rt+γ(q(st+1,a^t+1;ω)))]2ωt+1==ωt−α⋅∂ω∂loss∣ω=ωtωt−α⋅δt⋅∂ω∂q(st,at;ω)∣ω=ωt
然后回到Actor的更新上,基于策略梯度,我们知道采用的是梯度上升来更新参数, β \beta β 是学习率,如下:
θ t + 1 = θ t + β ⋅ δ t ⋅ ∂ ln π ( a ∣ s ; θ ) ∂ θ ∣ θ = θ t \theta_{t+1}=\theta_t+ \beta\cdot\delta_t\cdot\dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta} |_{\theta=\theta_t} θt+1=θt+β⋅δt⋅∂θ∂lnπ(a∣s;θ)∣θ=θt
至此,算法就完成一次更新。值得注意的是,在这样的一次算法更新中,只执行了一次动作即 a t a_t at, a ^ t + 1 \hat{a}_{t+1} a^t+1 只是采样用来估计Q值,并不执行。
Actor的前身是策略梯度,它基于随机性策略输出一个动作,Critic作为评委,对这个动作进行打分,将得分作为监督信号返回给Actor,Actor借此更新策略。Critic的前身是Q-learning这样的时序差分方法,能进行单步更新。 Critic 通过学习环境和奖励之间的关系,能看到现在所处状态的潜在奖励,这样使得AC可以单步更新,更有效率。
但是,AC也有缺点,Actor-Critic 的两个神经网络,每次都是在连续状态中更新参数,每次参数更新前后都存在相关性,导致神经网络只能片面的看待问题,甚至可能学不到东西。为了解决这一问题,Google DeepMind提出了叫DDPG的算法,解决了这一问题。我们将在下一篇文章中详细介绍这一算法。
参考