文章目录
1.本章内容概要
这一章我们介绍些新的东西。
到目前为止,几乎我们介绍的所有方法都是基于值函数的,即首先通过交互学习到动作值函数,然后基于学到的值函数指导决策。这一章,我们考虑直接学习一个参数化的策略,从而绕过值函数直接决策。这里我们仍然需要值函数,但只用来指导策略参数的学习,而不用来选择动作。
我们使用符号 θ ∈ R d ′ \boldsymbol{\theta} \in \mathbb{R}^{d^{\prime}} θ∈Rd′表示策略的参数向量。在时刻t,在当前参数向量 θ \boldsymbol{\theta} θ和状态 s \boldsymbol{s} s的前提下,动作选择的概率表示为: π ( a ∣ s , θ ) = Pr { A t = a ∣ S t = s , θ t = θ } \pi(a | s, \boldsymbol{\theta})=\operatorname{Pr}\left\{A_{t}=a | S_{t}=s, \boldsymbol{\theta}_{t}=\boldsymbol{\theta}\right\} π(a∣s,θ)=Pr{At=a∣St=s,θt=θ}。如果某个方法同时也用到了值函数,那么值函数的参数则仍用向量 w ∈ R d \mathbf{w} \in \mathbb{R}^{d} w∈Rd表示,值函数仍用 v ^ ( s , w ) \hat{v}(s, \mathbf{w}) v^(s,w)表示。
这一章,我们基于标量性能函数 J ( θ ) J(\boldsymbol{\theta}) J(θ)的关于策略参数的梯度来学习策略的参数,这些方法需要尽可能最大化性能函数,所以通常更新公式为: θ t + 1 = θ t + α ∇ J ( θ t ) ^ \boldsymbol{\theta}_{t+1}=\boldsymbol{\theta}_{t}+\alpha \widehat{\nabla J\left(\boldsymbol{\theta}_{t}\right)} θt+1=θt+α∇J(θt) ,其中 ∇ J ( θ t ^ ) ∈ R d ′ \widehat{\nabla J\left(\boldsymbol{\theta}_{t}\right.} ) \in \mathbb{R}^{d^{\prime}} ∇J(θt )∈Rd′是由样本得到的随机向量。
所有基于这种思路的方法,我们叫做策略梯度方法(policy gradient methods),无论这个过程中是否也引入了值函数以辅助。那些同时学习策略参数和值函数参数的方法通常叫做actor-critic方法,actor是学习到的策略,critic是学习到的值函数(通常是状态值函数)。本章中,我们首先处理episodic情形,这时性能指标定义为起始状态在当前参数化策略下的值;对于continuing情形,我们则采用平均回报率(第十章)作为性能指标。最后我们给出一些算法。
2. 策略拟合器与它的优势
在策略梯度方法中,策略可以用任何方式参数化,只要保证 π ( a ∣ s , θ ) \pi(a | s, \boldsymbol{\theta}) π(a∣s,θ)关于参数 θ \boldsymbol{\theta} θ对于任意 s ∈ S , a ∈ A ( s ) , s \in \mathcal{S}, a \in \mathcal{A}(s), s∈S,a∈A(s), θ ∈ R d ′ \boldsymbol{\theta} \in \mathbb{R}^{d^{\prime}} θ∈Rd′都可微,且偏导数向量的值是有限的就行。实践中,为了保证探索,我们要求策略永远也不会变成确定性的,也就是对于所有 s ∈ S , a ∈ A ( s ) , s \in \mathcal{S}, a \in \mathcal{A}(s), s∈S,a∈A(s), θ ∈ R d ′ \boldsymbol{\theta} \in \mathbb{R}^{d^{\prime}} θ∈Rd′, π ( a ∣ s , θ ) ∈ ( 0 , 1 ) \pi(a | s, \boldsymbol{\theta}) \in(0,1) π(a∣s,θ)∈(0,1)。这一节,我们介绍最常用的离散动作空间的参数化方法,并分析相对基于动作值的方法的优势。值得注意的是,策略梯度方法还能处理连续动作空间的情形,我们在第8小节中介绍。
如果动作空间是离散的,且不是特别大,那么我们可以用标量函数 h ( s , a , θ ) ∈ R h(s, a, \boldsymbol{\theta}) \in \mathbb{R} h(s,a,θ)∈R表示状态动作对偏好(preferences)。在状态s下,具有最高偏好的动作获得最高的选择概率,例如采用soft-max形式的概率归一化方法:
π ( a ∣ s , θ ) ≐ e h ( s , a , θ ) ∑ b e h ( s , b , θ ) \pi(a | s, \boldsymbol{\theta}) \doteq \frac{e^{h(s, a, \boldsymbol{\theta})}}{\sum_{b} e^{h(s, b, \boldsymbol{\theta})}} π(a∣s,θ)≐∑beh(s,b,θ)eh(s,a,θ)
我们把这种策略参数化方法叫做动作偏好soft-max(soft-max in action preferences)。
动作偏好可以用任意方式参数化,例如使用深度人工神经网络ANN,或者简单地使用线性方程:
h
(
s
,
a
,
θ
)
=
θ
⊤
x
(
s
,
a
)
h(s, a, \boldsymbol{\theta})=\boldsymbol{\theta}^{\top} \mathbf{x}(s, a)
h(s,a,θ)=θ⊤x(s,a)。其中,
x
(
s
,
a
)
∈
R
d
′
\mathbf{x}(s, a) \in \mathbb{R}^{d^{\prime}}
x(s,a)∈Rd′是特征向量,可以用第九章介绍的任何方法计算。
动作偏好soft-max中,策略会逐渐趋于确定,相比于 ε \varepsilon ε -greedy总有一个大小为 ε \varepsilon ε的选择随机动作的概率而言,这显然是更好的。如果我们基于动作值函数,采用soft-max概率选择动作,那么策略就不会趋于确定,而是使得动作值趋于各自的真实值,导致非最优策略的选择概率无法衰减到0。如果soft-max分布中包含一个温度参数(模拟退火的思想),使之逐渐衰减,那么基于动作值和soft-max的方法也能逐渐收敛于确定策略,但是这个衰减率与初值都比较难以决定。但是直接用动作偏好soft-max就不会有这些问题,它们与值函数无关,且倾向于选择最优策略。如果最优策略本身就是确定性的,那么动作偏好soft-max方法也会收敛于确定。
动作偏好soft-max第二个优势是,它允许以任意概率选择动作,最优策略可以是随机的。例如在不完全信息的扑克游戏中,最优玩法往往需要以不同的概率做不同的动作,而基于动作值的方法没法自然地做到这点,而动作偏好soft-max则可以。
example 13.1 Short corridor with switched actions
每个step的回报都是-1,在三个非终止状态上,我们可以选择left和right两个动作,对于第一个状态,right就是移动到第二个状态,left则保持原地不动;对于第二个状态,right实际上则移动到左边的第一个状态,left反之移动到右边的第三个状态。我们假设所有的状态的特征完全一样,状态动作对特征则表示为: x ( s , right ) = [ 1 , 0 ] ⊤ \mathbf{x}(s, \text { right })=[1,0]^{\top} x(s, right )=[1,0]⊤和 x ( s , l e f t ) = [ 0 , 1 ] ⊤ \mathbf{x}(s, left)=[0,1]^{\top} x(s,left)=[0,1]⊤。对于动作值方法,只有两种策略:以 1 − ε / 2 1-\varepsilon / 2 1−ε/2的概率选择left,以 ε / 2 \varepsilon / 2 ε/2的概率选择right;或者反过来,如果固定 ε = 0.1 \varepsilon=0.1 ε=0.1,则对于起始状态而言,这两种策略得到的值分别为-44和-82,都非常不好。但是如果使用动作偏好soft-max方法,则可以得到选择right的概率为0.59,此时起始状态的值为-11.6,远远好于基于值函数的方法。
当policy的参数化形式比值函数的参数化形式简单时,基于policy的方法效果就会表现得更好。
第三个优势则是,参数化策略的方法可以更容易地引入策略形式的先验知识,这点也是很重要的。
3. 策略梯度理论
除了上小节介绍的三个实践方面的优势,策略梯度还具有理论上的优势。在策略梯度方法中,策略(动作选择概率)的变化更加平滑稳定,而对于值函数方法,则可能由于小的值变化就导致很大的策略变化(小的变化使某个动作的值恰好变为最大了)。因此策略梯度方法对收敛性的保证要好很多。
episodic和continuing情形下的性能指标 J ( θ ) J(\boldsymbol{\theta}) J(θ)是不一样的,因此我们需要分别处理。但是我们尽可能使主要的理论讨论包含在一个框架下。
在这个部分我们主要针对episodic情形,使用起始状态的值作为性能指标: J ( θ ) ≐ v π θ ( s 0 ) J(\boldsymbol{\theta}) \doteq v_{\pi_{\boldsymbol{\theta}}}\left(s_{0}\right) J(θ)≐vπθ(s0),其中 v π θ v_{\pi_{\boldsymbol{\theta}}} vπθ是针对策略 π θ \pi_{\boldsymbol{\theta}} πθ的真实值函数,而策略由参数向量 θ \boldsymbol{\theta} θ决定,我们假设折扣因子 γ = 1 \gamma=1 γ=1。
使用函数拟合器,如何能确保调整参数后的策略确实提升了呢?性能指标既和动作选择相关,也和这些动作下状态的分布相关,而这些都受到参数的影响。给定一个状态,策略参数对动作、回报的影响,可以使用相对直接的方式从参数出发计算,但是策略对状态分布的影响确是环境的函数,通常是无法知道的。那么既然梯度依赖于策略改变对状态分布的未知影响,我们如何估计性能指标的梯度呢?
幸运的是,这是有理论上的结果的。策略梯度理论(policy gradient theorem)回答了上述问题,证明了性能指标的关于策略参数的梯度与状态分布的导数无关。对于episodic情形,策略梯度理论给出结论: ∇ J ( θ ) ∝ ∑ s μ ( s ) ∑ a q π ( s , a ) ∇ π ( a ∣ s , θ ) \nabla J(\boldsymbol{\theta}) \propto \sum_{s} \mu(s) \sum_{a} q_{\pi}(s, a) \nabla \pi(a | s, \boldsymbol{\theta}) ∇J(θ)∝∑sμ(s)∑aqπ(s,a)∇π(a∣s,θ),这个正比关系的比例系数是episode的平均长度,而在continuing情形是则是1(也就是相等)。下表给出了episodic情形的证明:
Proof of the Policy Gradient Theorem (episodic case)
通过初等积分和重排各项,我们可以基于第一原理证明策略梯度理论。以下所有的 π \pi π都是 θ \boldsymbol{\theta} θ的函数,我们省略了参数 θ \boldsymbol{\theta} θ。首先,状态值函数的梯度可以改写为:
∇ v π ( s ) = ∇ [ ∑ a π ( a ∣ s ) q π ( s , a ) ] , for all s ∈ S = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∇ q π ( s , a ) ] (product rule of calculus) = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∑ s ′ , r ∇ p ( s ′ , r ∣ s , a ) ( r + v π ( s ′ ) ) ] = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∑ s ′ p ( s ′ ∣ s , a ) ∇ v π ( s ′ ) ] = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∑ s ′ p ( s ′ ∣ s , a ) ∑ a ′ [ ∇ π ( a ′ ∣ s ′ ) q π ( s ′ , a ′ ) + π ( a ′ ∣ s ′ ) ∑ s ′ ′ p ( s ′ ′ ∣ s ′ , a ′ ) ∇ v π ( s ′ ′ ) ] ] = ∑ x ∈ S ∑ k = 0 ∞ Pr ( s → x , k , π ) ∑ a ∇ π ( a ∣ x ) q π ( x , a ) \begin{aligned} \nabla v_{\pi}(s) &=\nabla\left[\sum_{a} \pi(a | s) q_{\pi}(s, a)\right], \quad \text { for all } s \in \mathcal{S} \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \nabla q_{\pi}(s, a)\right] \text { (product rule of calculus) } \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \sum_{s^\prime, r}\nabla p\left(s^{\prime}, r | s, a\right)\left(r+v_{\pi}\left(s^{\prime}\right)\right)\right] \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \nabla v_{\pi}\left(s^{\prime}\right)\right] \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \sum_{a^{\prime}}\left[\nabla \pi\left(a^{\prime} | s^{\prime}\right) q_{\pi}\left(s^{\prime}, a^{\prime}\right)+\pi\left(a^{\prime} | s^{\prime}\right) \sum_{s^{\prime \prime}} p\left(s^{\prime \prime} | s^{\prime}, a^{\prime}\right) \nabla v_{\pi}\left(s^{\prime \prime}\right)\right]\right] \\ &=\sum_{x \in \mathcal{S}} \sum_{k=0}^{\infty} \operatorname{Pr}(s \rightarrow x, k, \pi) \sum_{a} \nabla \pi(a | x) q_{\pi}(x, a) \end{aligned} ∇vπ(s)=∇[a∑π(a∣s)qπ(s,a)], for all s∈S=a∑[∇π(a∣s)qπ(s,a)+π(a∣s)∇qπ(s,a)] (product rule of calculus) =a∑⎣⎡∇π(a∣s)qπ(s,a)+π(a∣s)s′,r∑∇p(s′,r∣s,a)(r+vπ(s′))⎦⎤=a∑[∇π(a∣s)qπ(s,a)+π(a∣s)s′∑p(s′∣s,a)∇vπ(s′)]=a∑[∇π(a∣s)qπ(s,a)+π(a∣s)s′∑p(s′∣s,a)a′∑[∇π(a′∣s′)qπ(s′,a′)+π(a′∣s′)s′′∑p(s′′∣s′,a′)∇vπ(s′′)]]=x∈S∑k=0∑∞Pr(s→x,k,π)a∑∇π(a∣x)qπ(x,a)
迭代展开后, Pr ( s → x , k , π ) \operatorname{Pr}(s \rightarrow x, k, \pi) Pr(s→x,k,π)表示在策略 π \pi π下从状态s在k步内转移到状态x的概率,因而我们有:
∇ J ( θ ) = ∇ v π ( s 0 ) = ∑ s ( ∑ k = 0 ∞ Pr ( s 0 → s , k , π ) ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) = ∑ s η ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) = ∑ s ′ η ( s ′ ) ∑ s η ( s ) ∑ s ′ η ( s ′ ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) = ∑ s ′ η ( s ′ ) ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) ∝ ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) \begin{aligned} \nabla J(\boldsymbol{\theta}) &=\nabla v_{\pi}\left(s_{0}\right) \\ &=\sum_{s}\left(\sum_{k=0}^{\infty} \operatorname{Pr}\left(s_{0} \rightarrow s, k, \pi\right)\right) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \\ &=\sum_{s} \eta(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \\ &=\sum_{s^{\prime}} \eta\left(s^{\prime}\right) \sum_{s} \frac{\eta(s)}{\sum_{s^{\prime}} \eta\left(s^{\prime}\right)} \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \\ &=\sum_{s^{\prime}} \eta\left(s^{\prime}\right) \sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \\ & \propto \sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \end{aligned} ∇J(θ)=∇vπ(s0)=s∑(k=0∑∞Pr(s0→s,k,π))a∑∇π(a∣s)qπ(s,a)=s∑η(s)a∑∇π(a∣s)qπ(s,a)=s′∑η(s′)s∑∑s′η(s′)η(s)a∑∇π(a∣s)qπ(s,a)=s′∑η(s′)s∑μ(s)a∑∇π(a∣s)qπ(s,a)∝s∑μ(s)a∑∇π(a∣s)qπ(s,a)
4. REINFORCE: Monte Carlo策略梯度
我们这里给出第一个策略梯度算法。根据策略梯度理论,有:
∇
J
(
θ
)
∝
∑
s
μ
(
s
)
∑
a
q
π
(
s
,
a
)
∇
π
(
a
∣
s
,
θ
)
=
E
π
[
∑
a
q
π
(
S
t
,
a
)
∇
π
(
a
∣
S
t
,
θ
)
]
\begin{aligned} \nabla J(\boldsymbol{\theta}) & \propto \sum_{s} \mu(s) \sum_{a} q_{\pi}(s, a) \nabla \pi(a | s, \boldsymbol{\theta}) \\ &=\mathbb{E}_{\pi}\left[\sum_{a} q_{\pi}\left(S_{t}, a\right) \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right)\right] \end{aligned}
∇J(θ)∝s∑μ(s)a∑qπ(s,a)∇π(a∣s,θ)=Eπ[a∑qπ(St,a)∇π(a∣St,θ)]
有了这个期望形式,我们就能基于采样结合梯度来更新参数了:
θ
t
+
1
≐
θ
t
+
α
∑
a
q
^
(
S
t
,
a
,
w
)
∇
π
(
a
∣
S
t
,
θ
)
\boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha \sum_{a} \hat{q}\left(S_{t}, a, \mathbf{w}\right) \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right)
θt+1≐θt+α∑aq^(St,a,w)∇π(a∣St,θ)
这个算法叫做all-actions算法,因为需要考虑所有的动作,这是很有前途的算法,还需要更多的研究,我们这里不过多关注,我们现在只关心经典的REINFORCE算法(Willams, 1992)。该算法在时刻t只利用动作 A t A_t At。我们在上式基础上继续推导,有:
∇ J ( θ ) = E π [ ∑ a π ( a ∣ S t , θ ) q π ( S t , a ) ∇ π ( a ∣ S t , θ ) π ( a ∣ S t , θ ) ] = E π [ q π ( S t , A t ) ∇ π ( A t ∣ S t , θ ) π ( A t ∣ S t , θ ) ] = E π [ G t ∇ π ( A t ∣ S t , θ ) π ( A t ∣ S t , θ ) ] , (because E π [ G t ∣ S t , A t ] = q π ( S t , A t ) ) \begin{aligned} \nabla J(\boldsymbol{\theta}) &=\mathbb{E}_{\pi}\left[\sum_{a} \pi\left(a | S_{t}, \boldsymbol{\theta}\right) q_{\pi}\left(S_{t}, a\right) \frac{\nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(a | S_{t}, \boldsymbol{\theta}\right)}\right] \\ &=\mathbb{E}_{\pi}\left[q_{\pi}\left(S_{t}, A_{t}\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}\right] \\ &=\mathbb{E}_{\pi}\left[G_{t} \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}\right], & \text { (because } \mathbb{E}_{\pi}\left[G_{t} | S_{t}, A_{t}\right]=q_{\pi}\left(S_{t}, A_{t}\right) ) \end{aligned} ∇J(θ)=Eπ[a∑π(a∣St,θ)qπ(St,a)π(a∣St,θ)∇π(a∣St,θ)]=Eπ[qπ(St,At)π(At∣St,θ)∇π(At∣St,θ)]=Eπ[Gtπ(At∣St,θ)∇π(At∣St,θ)], (because Eπ[Gt∣St,At]=qπ(St,At))
其中第二步把求和吸收到了期望中。然后我们据此就可以得到REINFORCE算法了:
θ t + 1 ≐ θ t + α G t ∇ π ( A t ∣ S t , θ t ) π ( A t ∣ S t , θ t ) \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha G_{t} \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} θt+1≐θt+αGtπ(At∣St,θt)∇π(At∣St,θt)
在这个算法中,每个增量都是和标量 G t G_t Gt和梯度向量的乘积成比例的,动作选择概率的梯度还需要被实际选择动作的概率除。这个式子具有可解释性,其中乘以 G t G_t Gt表明我们希望得到更大的回报,除以动作选择概率表示平衡因为这个动作选择频率过高导致的参数修正次数过多。
因为REINFORCE使用了
G
t
G_t
Gt,所以必须等到episode结尾才能计算,因此REINFORCE方法可以说是一种MC方法,只对episodic情形适用。以下算法伪代码也显示了这一点。
注意到,伪代码中最后一行使用了ln函数,这是REINFORCE中的更新公式更简洁的写法,因为:
∇
ln
x
=
∇
x
x
\nabla \ln x=\frac{\nabla x}{x}
∇lnx=x∇x。我们把这个向量叫做资格向量(eligibility vector)。注意最后一行还多了个
γ
t
\gamma^{t}
γt,这是因为我们前面推导的时候都默认
γ
=
1
\gamma=1
γ=1了,这里我们添了回来。
对于example 13.1,下图给出了REINFORCE算法的效果。
作为一个随机梯度方法,REINFORCE算法在理论上有很好的收敛性保证,通过构造,一个episode中更新的期望就是向着性能指标的方向的,为了保证向着性能指标的提升,必须设置足够小的
α
\alpha
α,并逐渐衰减,这样能保证收敛到一个局部最优。然而,REINFORCE也存在方差大的问题,且学习速度很慢。
5. 带有baseline的REINFORCE
上一节中的策略梯度理论可以泛化到(动作值-baseline)的形式。
∇ J ( θ ) ∝ ∑ s μ ( s ) ∑ a ( q π ( s , a ) − b ( s ) ) ∇ π ( a ∣ s , θ ) \nabla J(\boldsymbol{\theta}) \propto \sum_{s} \mu(s) \sum_{a}\left(q_{\pi}(s, a)-b(s)\right) \nabla \pi(a | s, \boldsymbol{\theta}) ∇J(θ)∝∑sμ(s)∑a(qπ(s,a)−b(s))∇π(a∣s,θ)
baseline可以是任意函数,甚至随机变量都行,只要它不随着动作a变化就行,上述方程之所有有效是因为:
∑ a b ( s ) ∇ π ( a ∣ s , θ ) = b ( s ) ∇ ∑ a π ( a ∣ s , θ ) = b ( s ) ∇ 1 = 0 \sum_{a} b(s) \nabla \pi(a | s, \boldsymbol{\theta})=b(s) \nabla \sum_{a} \pi(a | s, \boldsymbol{\theta})=b(s) \nabla 1=0 ∑ab(s)∇π(a∣s,θ)=b(s)∇∑aπ(a∣s,θ)=b(s)∇1=0
带有baseline的更新公式仿上导出:
θ
t
+
1
≐
θ
t
+
α
(
G
t
−
b
(
S
t
)
)
∇
π
(
A
t
∣
S
t
,
θ
t
)
π
(
A
t
∣
S
t
,
θ
t
)
\boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha\left(G_{t}-b\left(S_{t}\right)\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}
θt+1≐θt+α(Gt−b(St))π(At∣St,θt)∇π(At∣St,θt)
这就是带有baseline的REINFORCE算法。因为baseline可以设置为0,因此这是原始REINFORCE算法的严格泛化。添加的baseline使得更新的期望不变,但是却可以极大影响方差。我们在第二章中给过这样的例子,但是那时我们使用了一个数字,对于完整的MDP,则我们需要使用状态的一个函数,有些状态下所有动作的值都很大,那么就需要一个大的baseline值,反之则需要一个小的。
一个自然的选择是用状态值的估计作为baseline,也就是 v ^ ( S t , w ) \hat{v}\left(S_{t}, \mathbf{w}\right) v^(St,w)。因为REINFORCE算法是类似于MC的,所以我们估计这个值函数也采用MC方法与之匹配。完整的伪代码如下:
这个算法有两个步长参数,
α
θ
\alpha^{\boldsymbol{\theta}}
αθ和
α
w
\alpha^{\mathbf{w}}
αw。选择
α
w
\alpha^{\mathbf{w}}
αw参数是比较容易的,我们有一些选择原则,例如对于线性情形,
α
w
=
0.1
/
E
[
∥
∇
v
^
(
S
t
,
w
)
∥
μ
2
]
\alpha^{\mathrm{w}}=0.1 / \mathbb{E}\left[\left\|\nabla \hat{v}\left(S_{t}, \mathrm{w}\right)\right\|_{\mu}^{2}\right]
αw=0.1/E[∥∇v^(St,w)∥μ2];另一个参数就比较难设置,它和回报的变化范围以及策略参数有关。
下图给出了添加baseline后,在13.1问题中算法效果的改善情况,这里用的值函数是: v ^ ( s , w ) = w \hat{v}(s, \mathbf{w})=w v^(s,w)=w,值函数就是一个确定的标量,无论对于哪个状态。
6. Actor-Critic方法
虽然带有baseline的REINFORCE方法既学习了策略也学习了值函数,但是这不是一个actor-critic算法,因为这里的值函数只当作baseline,而不是一个critic,没有利用它进行bootstrap。因此带有baseline的REINFORCE方法没有引入bias,也没有对拟合器质量的渐进依赖。正如我们看到的,bootstrapping引入的bias以及对状态表征的依赖通常是有益的,因为其降低了方差并加快了学习速度。带有baseline的REINFORCE方法是无偏的,因此会渐进地趋向局部最优,但是和MC方法一样,它学习很慢,且不方便在线实现,也不方便用到continuing类任务中,但是引入TD则可以一定程度上解决这些问题,通过多step方法我们也可以灵活地选择bootstrap的程度。我们的解决方法就是,采用actor-critic方法,并在critic中使用bootstrapping。
首先考虑one-step的actor-critic方法。这些方法是完全在线,且增量实现的,也避免了资格迹的复杂计算,实际上也是资格迹方法的特例。one-step actor-critic方法替换了REINFORCE方法中的 G t G_t Gt,同时保留了baseline:
θ t + 1 ≐ θ t + α ( G t : t + 1 − v ^ ( S t , w ) ) ∇ π ( A t ∣ S t , θ t ) π ( A t ∣ S t , θ t ) = θ t + α ( R t + 1 + γ v ^ ( S t + 1 , w ) − v ^ ( S t , w ) ) ∇ π ( A t ∣ S t , θ t ) π ( A t ∣ S t , θ t ) = θ t + α δ t ∇ π ( A t ∣ S t , θ t ) π ( A t ∣ S t , θ t ) \begin{aligned} \boldsymbol{\theta}_{t+1} & \doteq \boldsymbol{\theta}_{t}+\alpha\left(G_{t : t+1}-\hat{v}\left(S_{t}, \mathbf{w}\right)\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} \\ &=\boldsymbol{\theta}_{t}+\alpha\left(R_{t+1}+\gamma \hat{v}\left(S_{t+1}, \mathbf{w}\right)-\hat{v}\left(S_{t}, \mathbf{w}\right)\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} \\ &=\boldsymbol{\theta}_{t}+\alpha \delta_{t} \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} \end{aligned} θt+1≐θt+α(Gt:t+1−v^(St,w))π(At∣St,θt)∇π(At∣St,θt)=θt+α(Rt+1+γv^(St+1,w)−v^(St,w))π(At∣St,θt)∇π(At∣St,θt)=θt+αδtπ(At∣St,θt)∇π(At∣St,θt)
自然地,状态值函数的学习方法可以选择半梯度TD(0)。其算法伪代码如下:
以上算法泛化到forward view的n-step方法,进而泛化到
λ
\lambda
λ-return算法是很直接的,把
G
t
:
t
+
1
G_{t:t+1}
Gt:t+1替换为
G
t
:
t
+
n
G_{t:t+n}
Gt:t+n或者
G
t
λ
G_{t}^{\lambda}
Gtλ就行了。改造backward view式的算法也是直接的,我们仿照上一章的方法,直接对actor和critic分别使用资格迹就行,伪代码如下:
7. 连续问题的策略梯度
正如我们在第十章中讨论的,我们重新定义性能指标,即采用平均回报:
J
(
θ
)
≐
r
(
π
)
≐
lim
h
→
∞
1
h
∑
t
=
1
h
E
[
R
t
∣
S
0
,
A
0
:
t
−
1
∼
π
]
=
lim
t
→
∞
E
[
R
t
∣
S
0
,
A
0
:
t
−
1
∼
π
]
=
∑
s
μ
(
s
)
∑
a
π
(
a
∣
s
)
∑
s
′
,
r
p
(
s
′
,
r
∣
s
,
a
)
r
\begin{aligned} J(\boldsymbol{\theta}) \doteq r(\pi) & \doteq \lim _{h \rightarrow \infty} \frac{1}{h} \sum_{t=1}^{h} \mathbb{E}\left[R_{t} | S_{0}, A_{0 : t-1} \sim \pi\right] \\ &=\lim _{t \rightarrow \infty} \mathbb{E}\left[R_{t} | S_{0}, A_{0 : t-1} \sim \pi\right] \\ &=\sum_{s} \mu(s) \sum_{a} \pi(a | s) \sum_{s^{\prime}, r} p\left(s^{\prime}, r | s, a\right) r \end{aligned}
J(θ)≐r(π)≐h→∞limh1t=1∑hE[Rt∣S0,A0:t−1∼π]=t→∞limE[Rt∣S0,A0:t−1∼π]=s∑μ(s)a∑π(a∣s)s′,r∑p(s′,r∣s,a)r
其中
μ
\mu
μ是策略
π
\pi
π下的稳定分布,定义为:
μ
(
s
)
≐
lim
t
→
∞
Pr
{
S
t
=
s
∣
A
0
:
t
∼
π
}
\mu(s) \doteq \lim _{t \rightarrow \infty} \operatorname{Pr}\left\{S_{t}=s | A_{0 : t} \sim \pi\right\}
μ(s)≐limt→∞Pr{St=s∣A0:t∼π},该分布独立于起始状态
S
0
S_0
S0,其还满足
∑
s
μ
(
s
)
∑
a
π
(
a
∣
s
,
θ
)
p
(
s
′
∣
s
,
a
)
=
μ
(
s
′
)
,
\sum_{s} \mu(s) \sum_{a} \pi(a | s, \boldsymbol{\theta}) p\left(s^{\prime} | s, a\right)=\mu\left(s^{\prime}\right),
∑sμ(s)∑aπ(a∣s,θ)p(s′∣s,a)=μ(s′), for all
s
′
∈
S
s^{\prime} \in \mathcal{S}
s′∈S。
完整的,backward view的continuing情形的actor-critic算法如下:
自然地,在continuing情形,我们采用差分形式的值定义:
v
π
(
s
)
≐
E
π
[
G
t
∣
S
t
=
s
]
v_{\pi}(s) \doteq \mathbb{E}_{\pi}\left[G_{t} | S_{t}=s\right]
vπ(s)≐Eπ[Gt∣St=s]
q
π
(
s
,
a
)
≐
E
π
[
G
t
∣
S
t
=
s
,
A
t
=
a
]
q_{\pi}(s, a) \doteq\mathbb{E}_{\pi}\left[G_{t} | S_{t}=s, A_{t}=a\right]
qπ(s,a)≐Eπ[Gt∣St=s,At=a]
G
t
≐
R
t
+
1
−
r
(
π
)
+
R
t
+
2
−
r
(
π
)
+
R
t
+
3
−
r
(
π
)
+
⋯
G_{t} \doteq R_{t+1}-r(\pi)+R_{t+2}-r(\pi)+R_{t+3}-r(\pi)+\cdots
Gt≐Rt+1−r(π)+Rt+2−r(π)+Rt+3−r(π)+⋯
此时,策略梯度定理还是成立的,证明如下:
Proof of the Policy Gradient Theorem (continuing case)
我们和之前的证明一样,省略标记带学习的参数 θ \boldsymbol{\theta} θ。
状态值函数的梯度可以写成:
∇ v π ( s ) = ∇ [ ∑ a π ( a ∣ s ) q π ( s , a ) ] , for all s ∈ S = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∇ q π ( s , a ) ] (product rule of calculus) = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∇ q π ( s ′ , r ∣ s , a ) ( r − r ( θ ) + v π ( s ′ ) ) ] = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) [ − ∇ r ( θ ) + ∑ s ′ p ( s ′ ∣ s , a ) ∇ v π ( s ′ ) ] ] \begin{aligned} \nabla v_{\pi}(s) &=\nabla\left[\sum_{a} \pi(a | s) q_{\pi}(s, a)\right], \quad \text { for all } s \in \mathcal{S} \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \nabla q_{\pi}(s, a)\right] \quad \text { (product rule of calculus) } \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \nabla q_{\pi}\left(s^{\prime}, r | s, a\right)\left(r-r(\boldsymbol{\theta})+v_{\pi}\left(s^{\prime}\right)\right)\right] \\ &=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s)\left[-\nabla r(\boldsymbol{\theta})+\sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \nabla v_{\pi}\left(s^{\prime}\right)\right]\right] \end{aligned} ∇vπ(s)=∇[a∑π(a∣s)qπ(s,a)], for all s∈S=a∑[∇π(a∣s)qπ(s,a)+π(a∣s)∇qπ(s,a)] (product rule of calculus) =a∑[∇π(a∣s)qπ(s,a)+π(a∣s)∇qπ(s′,r∣s,a)(r−r(θ)+vπ(s′))]=a∑[∇π(a∣s)qπ(s,a)+π(a∣s)[−∇r(θ)+s′∑p(s′∣s,a)∇vπ(s′)]]
变换一下,可以得到:
∇ r ( θ ) = ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∑ s ′ p ( s ′ ∣ s , a ) ∇ v π ( s ′ ) ] − ∇ v π ( s ) \nabla r(\boldsymbol{\theta})=\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \nabla v_{\pi}\left(s^{\prime}\right)\right]-\nabla v_{\pi}(s) ∇r(θ)=∑a[∇π(a∣s)qπ(s,a)+π(a∣s)∑s′p(s′∣s,a)∇vπ(s′)]−∇vπ(s)
左侧就相当于 ∇ J ( θ ) \nabla J(\boldsymbol{\theta}) ∇J(θ),且不依赖s,因此右侧也不依赖s,所以可以对变量s求和,有:
∇ J ( θ ) = ∑ s μ ( s ) ( ∑ a [ ∇ π ( a ∣ s ) q π ( s , a ) + π ( a ∣ s ) ∑ s ′ p ( s ′ ∣ s , a ) ∇ v π ( s ′ ) ] − ∇ v π ( s ) ) = ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) + ∑ s μ ( s ) ∑ a π ( a ∣ s ) ∑ s ′ p ( s ′ ∣ s , a ) ∇ v π ( s ′ ) − ∑ s μ ( s ) ∇ v π ( s ) = ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) + ∑ s ′ ∑ s μ ( s ) ∑ a π ( a ∣ s ) p ( s ′ ∣ s , a ) ⏟ μ ( s ′ ) ∇ v π ( s ′ ) − ∑ s μ ( s ) ∇ v π ( s ) = ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) + ∑ s ′ μ ( s ′ ) ∇ v π ( s ′ ) − ∑ s μ ( s ) ∇ v π ( s ) = ∑ s μ ( s ) ∑ a ∇ π ( a ∣ s ) q π ( s , a ) . \begin{aligned} \nabla J(\boldsymbol{\theta})=& \sum_{s} \mu(s)\left(\sum_{a}\left[\nabla \pi(a | s) q_{\pi}(s, a)+\pi(a | s) \sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \nabla v_{\pi}\left(s^{\prime}\right)\right]-\nabla v_{\pi}(s)\right) \\=& \sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) \\ & \quad+\sum_{s} \mu(s) \sum_{a} \pi(a | s) \sum_{s^{\prime}} p\left(s^{\prime} | s, a\right) \nabla v_{\pi}\left(s^{\prime}\right)-\sum_{s} \mu(s) \nabla v_{\pi}(s) \\=&\sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a)+\sum_{s^{\prime}} \underbrace{\sum_{s} \mu(s) \sum_{a} \pi(a | s) p\left(s^{\prime} | s, a\right)}_{\mu\left(s^{\prime}\right)} \nabla v_{\pi}\left(s^{\prime}\right)-\sum_{s} \mu(s) \nabla v_{\pi}(s) \\=&\sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a)+\sum_{s^{\prime}} \mu\left(s^{\prime}\right) \nabla v_{\pi}\left(s^{\prime}\right)-\sum_{s} \mu(s) \nabla v_{\pi}(s) \\=&\sum_{s} \mu(s) \sum_{a} \nabla \pi(a | s) q_{\pi}(s, a) . \quad \end{aligned} ∇J(θ)=====s∑μ(s)(a∑[∇π(a∣s)qπ(s,a)+π(a∣s)s′∑p(s′∣s,a)∇vπ(s′)]−∇vπ(s))s∑μ(s)a∑∇π(a∣s)qπ(s,a)+s∑μ(s)a∑π(a∣s)s′∑p(s′∣s,a)∇vπ(s′)−s∑μ(s)∇vπ(s)s∑μ(s)a∑∇π(a∣s)qπ(s,a)+s′∑μ(s′) s∑μ(s)a∑π(a∣s)p(s′∣s,a)∇vπ(s′)−s∑μ(s)∇vπ(s)s∑μ(s)a∑∇π(a∣s)qπ(s,a)+s′∑μ(s′)∇vπ(s′)−s∑μ(s)∇vπ(s)s∑μ(s)a∑∇π(a∣s)qπ(s,a).
8. 连续动作的策略参数化
基于策略的方法提供了处理大动作空间的有效途径,即使是那种连续的有无穷多动作的空间都能处理,此时我们计算动作选择概率的分布。例如,动作集合可能是一个实数,从高斯分布上选择,其概率密度函数为:
p ( x ) ≐ 1 σ 2 π exp ( − ( x − μ ) 2 2 σ 2 ) p(x) \doteq \frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right) p(x)≐σ2π1exp(−2σ2(x−μ)2)
典型的,选择不同参数时可以画出不同密度曲线(注意密度不是概率),如下:
我们可以对任意x区间积分,得到落入该区间的概率。
为了构造参数化的策略,我们把策略定义为正态密度函数(关于实数动作值a的),其方差和均值则用拟合器估计,那么我们有:
π ( a ∣ s , θ ) ≐ 1 σ ( s , θ ) 2 π exp ( − ( a − μ ( s , θ ) ) 2 2 σ ( s , θ ) 2 ) \pi(a | s, \boldsymbol{\theta}) \doteq \frac{1}{\sigma(s, \boldsymbol{\theta}) \sqrt{2 \pi}} \exp \left(-\frac{(a-\mu(s, \boldsymbol{\theta}))^{2}}{2 \sigma(s, \boldsymbol{\theta})^{2}}\right) π(a∣s,θ)≐σ(s,θ)2π1exp(−2σ(s,θ)2(a−μ(s,θ))2)
其中, μ : S × R d ′ → R \mu : \mathcal{S} \times \mathbb{R}^{d^{\prime}} \rightarrow \mathbb{R} μ:S×Rd′→R 和 σ : S × R d ′ → R + \sigma : \mathcal{S} \times \mathbb{R}^{d^{\prime}} \rightarrow \mathbb{R}^{+} σ:S×Rd′→R+是两个参数化拟合器。我们现在把参数合并成一个向量: θ = [ θ μ , θ σ ] ⊤ \boldsymbol{\theta}=\left[\boldsymbol{\theta}_{\mu}, \boldsymbol{\theta}_{\sigma}\right]^{\top} θ=[θμ,θσ]⊤,均值的估计采用线性函数,方差的估计采用线性函数的指数(保证为正数),于是有:
μ
(
s
,
θ
)
≐
θ
μ
⊤
x
μ
(
s
)
\mu(s, \boldsymbol{\theta}) \doteq \boldsymbol{\theta}_{\mu}^{\top} \mathbf{x}_{\mu}(s) \quad
μ(s,θ)≐θμ⊤xμ(s)
σ
(
s
,
θ
)
≐
exp
(
θ
σ
⊤
x
σ
(
s
)
)
\sigma(s, \boldsymbol{\theta}) \doteq \exp \left(\boldsymbol{\theta}_{\sigma}^{\top} \mathbf{x}_{\sigma}(s)\right)
σ(s,θ)≐exp(θσ⊤xσ(s))
在此基础上,我们之前介绍的所有方法都能应用了。
可以证明,高斯策略参数的资格向量有如下两个部分:
∇
ln
π
(
a
∣
s
,
θ
μ
)
=
∇
π
(
a
∣
s
,
θ
μ
)
π
(
a
∣
s
,
θ
)
=
1
σ
(
s
,
θ
)
2
(
a
−
μ
(
s
,
θ
)
)
x
μ
(
s
)
\nabla \ln \pi\left(a | s, \boldsymbol{\theta}_{\mu}\right)=\frac{\nabla \pi\left(a | s, \boldsymbol{\theta}_{\mu}\right)}{\pi(a | s, \boldsymbol{\theta})}=\frac{1}{\sigma(s, \boldsymbol{\theta})^{2}}(a-\mu(s, \boldsymbol{\theta})) \mathbf{x}_{\mu}(s)
∇lnπ(a∣s,θμ)=π(a∣s,θ)∇π(a∣s,θμ)=σ(s,θ)21(a−μ(s,θ))xμ(s)
∇
ln
π
(
a
∣
s
,
θ
σ
)
=
∇
π
(
a
∣
s
,
θ
σ
)
π
(
a
∣
s
,
θ
)
=
(
(
a
−
μ
(
s
,
θ
)
)
2
σ
(
s
,
θ
)
2
−
1
)
x
σ
(
s
)
\nabla \ln \pi\left(a | s, \boldsymbol{\theta}_{\sigma}\right)=\frac{\nabla \pi\left(a | s, \boldsymbol{\theta}_{\sigma}\right)}{\pi(a | s, \boldsymbol{\theta})}=\left(\frac{(a-\mu(s, \boldsymbol{\theta}))^{2}}{\sigma(s, \boldsymbol{\theta})^{2}}-1\right) \mathbf{x}_{\sigma}(s)
∇lnπ(a∣s,θσ)=π(a∣s,θ)∇π(a∣s,θσ)=(σ(s,θ)2(a−μ(s,θ))2−1)xσ(s)
选择动作时,我们对密度函数求导,找到顶点就行了。
9. 总结
在这章之前,我们都是聚焦于动作值方法,意味着我们需要先学习动作值,然后利用它们选择动作。在这章中,另一方面,我们直接把策略参数化,然后直接去学习策略的参数,从而绕过动作值。特别地,我们这里介绍了策略梯度方法,利用性能指标梯度的估计值进行SGD更新。
学习和存储策略参数有很多优势,可以学习采取某个动作的概率,可以在保证探索的同时,渐进地学到确定性的策略,还可以自然地处理连续动作空间问题。所有这些优点对于 ε \varepsilon ε -greedy方法往往都不具有。有些时候,策略梯度的拟合器比值函数的拟合器要简单,学习起来更快。
参数化策略方法与值函数类方法相比,还具有理论上的优势,也就是所谓策略梯度定理,给出了策略参数如何影响性能指标,同时还保证了性能指标不受状态分布影响。这个定理为策略梯度方法奠定了理论基础。
而REINFORCE算法则由策略梯度定理导出,添加状态值函数作为baseline,还能很好地降低方差,且没有引入偏差。使用状态值函数进行bootstrapping,引入了偏差,但是由于TD方法相比于MC方法方差低且收敛快,因此产生了融合策略梯度与值函数的actor-critic方法。
总之,策略梯度方法与值函数方法相比,具有独特的优势和弱点,虽然其在理论上的可理解性差一些,但是目前是让人激动且正在繁荣发展的方向。
参考文献
[1].(张文知乎)https://zhuanlan.zhihu.com/c_1060499676423471104