强化学习笔记系列目录
第一章 强化学习基本概念
第二章 贝尔曼方程
第三章 贝尔曼最优方程
第四章 值迭代和策略迭代
第五章 强化学习实例分析:GridWorld
第六章 蒙特卡洛方法
第七章 Robbins-Monro算法
第八章 多臂老虎机
第九章 强化学习实例分析:CartPole
第十章 时序差分法
第十一章 值函数近似【DQN】
第十二章 基于强化学习DQN的股票预测
第十三章 策略梯度方法
第十四章 Actor-Critic 方法
文章目录
- 强化学习笔记系列目录
- 一、基本思想
- 二、Advantage Actor-Critic (A2C)
- 1 基线策略
- 2 A2C算法
- 三、A3C
- 参考资料
本文主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门.
上一章,在 策略梯度方法 中我们介绍了策略梯度的基本思想,以及最重要的策略梯度定理,并且介绍了一个利用策略梯度求最优策略的算法——REINFORCE.本文继续介绍基于策略梯度的其他算法——Actor-Critic算法【A2C,A3C等】.
一、基本思想
我们知道用于最大化 J ( θ ) J(\theta) J(θ) 的梯度上升算法为
θ t + 1 = θ t + α ∇ θ J ( θ t ) = θ t + α E [ ∇ θ ln π ( A ∣ S , θ t ) q π ( S , A ) ] , (1) \begin{aligned} \theta_{t+1} &= \theta_{t} + \alpha \nabla_{\theta} J(\theta_{t})\\ &= \theta_{t} + \alpha \mathbb{E} \left[ \nabla_{\theta} \ln \pi(A | S, \theta_{t}) q_{\pi}(S, A) \right], \end{aligned} \tag{1} θt+1=θt+α∇θJ(θt)=θt+αE[∇θlnπ(A∣S,θt)qπ(S,A)],(1)
其中 α > 0 \alpha > 0 α>0 是一个常数学习率。由于上式中的真实梯度未知(期望不好直接获得),我们可以用随机梯度替代真实梯度,以获得以下算法:
θ t + 1 = θ t + α ∇ θ ln π ( a t ∣ s t , θ t ) q t ( s t , a t ) , (2) \theta_{t+1} = \theta_{t} + \alpha \nabla_{\theta} \ln \pi(a_{t} | s_{t}, \theta_{t}) q_{t}(s_{t}, a_{t}), \tag{2} θt+1=θt+α∇θlnπ(at∣st,θt)qt(st,at),(2)
其中 q t ( s t , a t ) q_{t}(s_{t}, a_{t}) qt(st,at) 是 q π ( s t , a t ) q_{\pi}(s_{t}, a_{t}) qπ(st,at) 的一个近似值。在前面介绍的 REINFORCE 算法中,我们是通过蒙特卡洛方法来进行采样,每次需要根据一个策略采集一条完整的轨迹,并计算这条轨迹上的回报。我们也指出这种采样方式的方差比较大,学习效率也比较低。我们可以借鉴时序差分学习的思想,使用动态规划方法来提高采样效率,即从状态 s 开始的总回报可以通过当前动作的即时奖励 r ( s , a , s ′ ) r(s,a,s') r(s,a,s′) 和下一个状态 s ′ s' s′的值函数来近似估计。
Actor-Critic算法是一种结合策略梯度和时序差分学习的强化学习方法,其中:
- 演员是指策略函数 π θ \pi_\theta πθ,即学习一个策略以得到尽可能高的回报。
- 评论员是指值函数( v ( s ) v(s) v(s)或 q ( s , a ) q(s,a) q(s,a)),对当前策略的值函数进行估计,即评估演员的好坏。借助于价值函数,演员-评论员算法可以进行单步参数更新,不需要等到回合结束才进行更新。
Actor-Critic算法示意图如下(图源1):
最简单的actor-critic算法的流程如下面的伪代码所示(图源2):
其中:
- Actor同REINFORCE算法中策略更新步骤一样,根据采样,更新参数 θ \theta θ.
- Critic对应于通过Sarsa算法执行的动作值值更新步骤,动作值函数由一个参数化的函数 q ( s , a , w ) q(s, a, w) q(s,a,w)表示.
- 可以看到这个算法和REINFORCE算法的唯一区别就是将对 q q q值的估计,由蒙特卡洛方法,换成了TD方法.
该actor-critic算法有时被称为Q actor-critic(QAC)。尽管它很简单,但QAC揭示了actor-critic方法的核心思想,它可以扩展为许多高级算法.
二、Advantage Actor-Critic (A2C)
1 基线策略
策略梯度一个有趣的性质是加入额外的基线函数,梯度期望是不变的,也就是说:
E S ∼ η , A ∼ π [ ∇ θ ln π ( A ∣ S , θ t ) q π ( S , A ) ] = E S ∼ η , A ∼ π [ ∇ θ ln π ( A ∣ S , θ t ) ( q π ( S , A ) − b ( S ) ) ] , \mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) q_\pi(S, A) \right] = \mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) (q_\pi(S, A) - b(S)) \right], ES∼η,A∼π[∇θlnπ(A∣S,θt)qπ(S,A)]=ES∼η,A∼π[∇θlnπ(A∣S,θt)(qπ(S,A)−b(S))],
其中,基线函数 b ( S ) b(S) b(S) 是关于 S S S 的标量函数。上面等式成立当且仅当
E S ∼ η , A ∼ π [ ∇ θ ln π ( A ∣ S , θ t ) b ( S ) ] = 0. \mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) b(S) \right] = 0. ES∼η,A∼π[∇θlnπ(A∣S,θt)b(S)]=0.
该等式成立是因为:
E S ∼ η , A ∼ π [ ∇ θ ln π ( A ∣ S , θ t ) b ( S ) ] = ∑ s ∈ S η ( s ) ∑ a ∈ A π ( a ∣ s , θ t ) ∇ θ ln π ( a ∣ s , θ t ) b ( s ) = ∑ s ∈ S η ( s ) ∑ a ∈ A ∇ θ π ( a ∣ s , θ t ) b ( s ) = ∑ s ∈ S η ( s ) b ( s ) ∑ a ∈ A ∇ θ π ( a ∣ s , θ t ) = ∑ s ∈ S η ( s ) b ( s ) ∇ θ ∑ a ∈ A π ( a ∣ s , θ t ) = ∑ s ∈ S η ( s ) b ( s ) ∇ θ 1 = 0. \begin{aligned} \mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) b(S) \right] &= \sum_{s \in \mathcal{S}} \eta(s) \sum_{a \in \mathcal{A}} \pi(a|s, \theta_t) \nabla_\theta \ln \pi(a|s, \theta_t) b(s) \\ &= \sum_{s \in \mathcal{S}} \eta(s) \sum_{a \in \mathcal{A}} \nabla_\theta \pi(a|s, \theta_t) b(s) \\ & = \sum_{s \in \mathcal{S}} \eta(s) b(s) \sum_{a \in \mathcal{A}} \nabla_\theta \pi(a|s, \theta_t) \\ & = \sum_{s \in \mathcal{S}} \eta(s) b(s) \nabla_\theta \sum_{a \in \mathcal{A}} \pi(a|s, \theta_t)\\ & = \sum_{s \in \mathcal{S}} \eta(s) b(s) \nabla_\theta 1 = 0. \end{aligned} ES∼η,A∼π[∇θlnπ(A∣S,θt)b(S)]=s∈S∑η(s)a∈A∑π(a∣s,θt)∇θlnπ(a∣s,θt)b(s)=s∈S∑η(s)a∈A∑∇θπ(a∣s,θt)b(s)=s∈S∑η(s)b(s)a∈A∑∇θπ(a∣s,θt)=s∈S∑η(s)b(s)∇θa∈A∑π(a∣s,θt)=s∈S∑η(s)b(s)∇θ1=0.
基线函数有什么用呢?引入基线函数可以减少使用样本逼近真实梯度时的近似方差。我们令
X ( S , A ) ≐ ∇ θ ln π ( A ∣ S , θ t ) [ q π ( S , A ) − b ( S ) ] . X(S, A) \doteq \nabla_\theta \ln \pi(A|S, \theta_t) [q_\pi(S, A) - b(S)]. X(S,A)≐∇θlnπ(A∣S,θt)[qπ(S,A)−b(S)].
我们知道真实梯度是 E [ X ( S , A ) ] \mathbb{E}[X(S, A)] E[X(S,A)]。但是这个期望不好求,在REINFORCE算法和QAC算法中,我们都是采样来近似这个期望。由于我们需要使用一个随机样本 x x x 来逼近 E [ X ] \mathbb{E}[X] E[X],我们希望方差 var ( X ) \operatorname{var}(X) var(X) 越小越好。原因如下:
- 如果 var ( X ) \operatorname{var}(X) var(X) 接近零(样本都在期望值附近波动),那么任何样本 x x x 都可以比较准确地逼近 E [ X ] \mathbb{E}[X] E[X].
- 相反,如果 var ( X ) \operatorname{var}(X) var(X) 很大,则样本值可能会与 E [ X ] \mathbb{E}[X] E[X] 相差很远,也就是说方差大,样本离期望(均值)的波动更大.
因为刚刚我们证明了 E [ X ] \mathbb{E}[X] E[X] 对加入基线函数是不变的,但方差 var ( X ) \operatorname{var}(X) var(X) 并非如此。所以我们需要设计一个好的基线函数以最小化 var ( X ) \operatorname{var}(X) var(X)。在 REINFORCE 和 QAC 算法中,我们设定 b = 0 b = 0 b=0,但这并是一个好的基线函数。事实上,最小化 var ( X ) \operatorname{var}(X) var(X) 的最优基线函数是
b ∗ ( s ) = E A ∼ π [ ∥ ∇ θ ln π ( A ∣ s , θ t ) ∥ 2 q π ( s , A ) ] E A ∼ π [ ∥ ∇ θ ln π ( A ∣ s , θ t ) ∥ 2 ] , s ∈ S . b^*(s) = \frac{\mathbb{E}_{A \sim \pi} \left[ \|\nabla_\theta \ln \pi(A|s, \theta_t)\|^2 q_\pi(s, A) \right]}{\mathbb{E}_{A \sim \pi} \left[ \|\nabla_\theta \ln \pi(A|s, \theta_t)\|^2 \right]}, \quad s \in \mathcal{S}. b∗(s)=EA∼π[∥∇θlnπ(A∣s,θt)∥2]EA∼π[∥∇θlnπ(A∣s,θt)∥2qπ(s,A)],s∈S.
证明见参考资料2的第10章.尽管上式给出的基线函数是最优的,但它过于复杂在实际中无法使用。如果去掉公式中的权重 ∥ ∇ θ ln π ( A ∣ s , θ t ) ∥ 2 \|\nabla_\theta \ln \pi(A|s, \theta_t)\|^2 ∥∇θlnπ(A∣s,θt)∥2,我们可以得到一个具有简洁表达式的次优基线函数:
b † ( s ) = E A ∼ π [ q π ( s , A ) ] = v π ( s ) , s ∈ S . b^\dagger(s) = \mathbb{E}_{A \sim \pi} [q_\pi(s, A)] = v_\pi(s), \quad s \in \mathcal{S}. b†(s)=EA∼π[qπ(s,A)]=vπ(s),s∈S.
可以发现,这个次优基线函数即为状态值函数!
2 A2C算法
当 b ( s ) = v π ( s ) b(s) = v_\pi(s) b(s)=vπ(s) 时,梯度上升算法(1)变为
θ t + 1 = θ t + α E [ ∇ θ ln π ( A ∣ S , θ t ) [ q π ( S , A ) − v π ( S ) ] ] = θ t + α E [ ∇ θ ln π ( A ∣ S , θ t ) δ π ( S , A ) ] . (3) \begin{aligned} \theta_{t+1} &= \theta_t + \alpha \mathbb{E} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) [q_\pi(S, A) - v_\pi(S)] \right]\\ &= \theta_t + \alpha \mathbb{E} \left[ \nabla_\theta \ln \pi(A|S, \theta_t) \delta_\pi(S, A) \right]. \end{aligned} \tag{3} θt+1=θt+αE[∇θlnπ(A∣S,θt)[qπ(S,A)−vπ(S)]]=θt+αE[∇θlnπ(A∣S,θt)δπ(S,A)].(3)
其中,
δ π ( S , A ) ≐ q π ( S , A ) − v π ( S ) \delta_\pi(S, A) \doteq q_\pi(S, A) - v_\pi(S) δπ(S,A)≐qπ(S,A)−vπ(S)
被称为优势函数,它反映了一个动作相对于其他动作的优势。更具体地,注意到
v π ( s ) = ∑ a ∈ A π ( a ∣ s ) q π ( s , a ) v_\pi(s) = \sum_{a \in \mathcal{A}} \pi(a|s) q_\pi(s, a) vπ(s)=a∈A∑π(a∣s)qπ(s,a)
是动作值的均值。如果 δ π ( s , a ) > 0 \delta_\pi(s, a) > 0 δπ(s,a)>0,则意味着相应的动作具有高于均值的价值。
公式 (3) 的随机版本是
θ t + 1 = θ t + α ∇ θ ln π ( a t ∣ s t , θ t ) [ q t ( s t , a t ) − v t ( s t ) ] = θ t + α ∇ θ ln π ( a t ∣ s t , θ t ) δ t ( s t , a t ) , (4) \begin{aligned} \theta_{t+1} &= \theta_t + \alpha \nabla_\theta \ln \pi(a_t|s_t, \theta_t) [q_t(s_t, a_t) - v_t(s_t)]\\ &=\theta_t + \alpha \nabla_\theta \ln \pi(a_t|s_t, \theta_t) \delta_t(s_t, a_t), \end{aligned} \tag{4} θt+1=θt+α∇θlnπ(at∣st,θt)[qt(st,at)−vt(st)]=θt+α∇θlnπ(at∣st,θt)δt(st,at),(4)
其中, s t , a t s_t, a_t st,at 是时刻 t t t 的 S , A S, A S,A 的样本。 q t ( s t , a t ) q_t(s_t, a_t) qt(st,at) 和 v t ( s t ) v_t(s_t) vt(st) 分别是 q π ( s t , a t ) q_\pi(s_t, a_t) qπ(st,at) 和 v π ( s t ) v_\pi(s_t) vπ(st) 的近似值。公式 (4) 中的算法根据 q t q_t qt 相对于 v t v_t vt 的相对值更新策略,而不是 q t q_t qt 的绝对值。这在直觉上是合理的,因为当我们尝试在一个状态上选择一个动作时,我们只关心相对于其他动作具有最大价值的动作。
- 如果 q t ( s t , a t ) q_t(s_t, a_t) qt(st,at) 和 v t ( s t ) v_t(s_t) vt(st) 是通过蒙特卡洛学习估计的,那么公式 (4) 中的算法被称为带基线的 REINFORCE算法.
- 如果 q t ( s t , a t ) q_t(s_t, a_t) qt(st,at) 和 v t ( s t ) v_t(s_t) vt(st) 是通过 TD 学习估计的,则该算法通常称为Avantage Actor-Critic(A2C).
A2C 算法的伪代码如下所示(图源2):
需要注意的是,此实现中的优势函数是通过 TD Error
(什么是TD Error可以参考我的这篇博客:强化学习:时序差分法)近似的:
q t ( s t , a t ) − v t ( s t ) ≈ r t + 1 + γ v t ( s t + 1 ) − v t ( s t ) . (5) q_t(s_t, a_t) - v_t(s_t) \approx r_{t+1} + \gamma v_t(s_{t+1}) - v_t(s_t). \tag{5} qt(st,at)−vt(st)≈rt+1+γvt(st+1)−vt(st).(5)
该近似是合理的,因为
q π ( s t , a t ) − v π ( s t ) = E [ R t + 1 + γ v π ( S t + 1 ) − v π ( S t ) ∣ S t = s t , A t = a t ] , (6) q_\pi(s_t, a_t) - v_\pi(s_t) = \mathbb{E} \left[ R_{t+1} + \gamma v_\pi(S_{t+1}) - v_\pi(S_t) \bigg| S_t = s_t, A_t = a_t \right],\tag{6} qπ(st,at)−vπ(st)=E[Rt+1+γvπ(St+1)−vπ(St) St=st,At=at],(6)
该公式根据 q π ( s t , a t ) q_\pi(s_t, a_t) qπ(st,at) 的定义(动作值函数的贝尔曼方程)是成立的。所以公式(5)相当于公式(6)的一个采样样本来近似期望。
使用 TD Error
近似优势函数一个好处是我们只需要使用一个神经网络来表示 v π ( s ) v_\pi(s) vπ(s)。否则,如果 δ t = q t ( s t , a t ) − v t ( s t ) \delta_t = q_t(s_t, a_t) - v_t(s_t) δt=qt(st,at)−vt(st),则我们需要维护两个网络来表示 v π ( s ) v_\pi(s) vπ(s) 和 q π ( s , a ) q_\pi(s, a) qπ(s,a)。当我们使用 TD Error
时,该算法可能也被称为 TD Actor Critic
.此外,值得注意的是,策略 π ( θ ) \pi(\theta) π(θ) 是随机的,因此具有探索性。
三、A3C
下面介绍异步优势动作评价(Asynchronous Advantage Actor Critic,A3C)算法,本质是异步的A2C方法.
A3C算法示意图如下,其思想非常像分布式学习和联邦学习:
- 维护一个全局网络,全局网络包含策略网络和价值网络.
- 有多个进程(或者说worker),每一个进程在工作前都会把全局网络的参数复制过来。
- 接下来演员就与环境交互,每一个演员与环境交互的时候,都要收集到比较多样的数据。例如,如果是走迷宫,可能每一个演员起始的位置都不一样,这样它们能够收集到比较多样的数据。
- 每一个演员与环境交互完之后,我们就会计算出梯度。计算出梯度以后,要用梯度去更新参数。
- 就是这个进程算出梯度以后,就把梯度传回给中央的控制中心,中央的控制中心就会用这个梯度去更新原来的参数。
注意,A3C使用了平行探索的方法,所有的演员都是平行跑的,每一个演员各做各的,不管彼此。所以每个演员都是去要了一个参数以后,做完就把梯度传回去。当第一个进程做完想要把梯度传回去的时候,本来它是根据 θ 1 \theta_1 θ1求得的梯度,等它要把梯度传回去的时候,可能别人已经把原来的参数覆盖掉,网络已经变成 θ 2 \theta_2 θ2了。但是没有关系,我们利用这个梯度在 θ 2 \theta_2 θ2的基础上进行更新。
下图是A3C的对比实验3:
可以看到A3C效率确实会高很多!
参考资料
王琦,杨毅远,江季,Easy RL:强化学习教程,人民邮电出版社,https://github.com/datawhalechina/easy-rl. ↩︎
Zhao, S… Mathematical Foundations of Reinforcement Learning. Springer Nature Press and Tsinghua University Press. ↩︎ ↩︎ ↩︎
Volodymyr Mnih et al. Asynchronous Methods for Deep Reinforcement Learning. NIPS 2016. ↩︎