浅谈强化学习中的策略梯度算法

本文将主要介绍基于策略梯度的强化学习算法。这里我们假设读者对强化学习的基本原理有一定了解。

使用梯度进行估计或优化的方法可见于诸多领域,如凸优化和机器学习领域。在强化学习中,我们可以使用梯度来估计某个策略的价值函数或者直接估计策略。本文中我们仅讨论后一种情况。

策略梯度法

强化学习的目标是最大化长期回报的期望,于是目标可以写作:

π=argmaxπEτπ(τ)[r(τ)] π ∗ = arg ⁡ max π E τ ∼ π ( τ ) [ r ( τ ) ]
其中 τ τ 表示一条交互得到的轨迹, r(τ) r ( τ ) 表示这条轨迹的总体回报。假设我们用 J(θ) J ( θ ) 表示总体的目标函数,将期望回报展开,可以得到:
J(θ)=Eτπθ(τ)[r(τ)]=τπθ(τ)πθ(τ)r(τ)dτ J ( θ ) = E τ ∼ π θ ( τ ) [ r ( τ ) ] = ∫ τ ∼ π θ ( τ ) π θ ( τ ) r ( τ ) d τ
我们要通过调整策略参数 θ θ 来最大化上述目标函数,一个自然的想法是对 θ θ 求导,然后进行梯度上升:
θJ(θ)=τπθ(τ)θπθ(τ)r(τ)dτ ∇ θ J ( θ ) = ∫ τ ∼ π θ ( τ ) ∇ θ π θ ( τ ) r ( τ ) d τ
这个公式并不能直接估计,因为有个积分号。我们对其做一个变换,由于
xlogy=1yxy i.e. θπθ(τ)=πθ(τ)θlogπθ(τ) ∇ x log ⁡ y = 1 y ∇ x y  i.e.  ∇ θ π θ ( τ ) = π θ ( τ ) ∇ θ log ⁡ π θ ( τ )
那么
θJ(θ)=τπθ(τ)πθ(τ)θlogπθ(τ)r(τ)dτ=Eτπθ(τ)[θlogπθ(τ)r(τ)] ∇ θ J ( θ ) = ∫ τ ∼ π θ ( τ ) π θ ( τ ) ∇ θ log ⁡ π θ ( τ ) r ( τ ) d τ = E τ ∼ π θ ( τ ) [ ∇ θ log ⁡ π θ ( τ ) r ( τ ) ]

到这里,虽然看起来可以对梯度进行估计,但还是有不易计算的部分,我们对其进行进一步拆解:假设 τ={s0,a0,s1,a1,,sT,aT} τ = { s 0 , a 0 , s 1 , a 1 , … , s T , a T }
θlogπθ(τ)=θlog[p(s0)t=0Tπθ(at|st)p(st+1|st,at)]=θ[logp(s0)+t=0Tlogπθ(at|st)+t=0Tlogp(st+1|st,at)]=t=0Tθlogπθ(at|st) ∇ θ log ⁡ π θ ( τ ) = ∇ θ log ⁡ [ p ( s 0 ) ∏ t = 0 T π θ ( a t | s t ) p ( s t + 1 | s t , a t ) ] = ∇ θ [ log ⁡ p ( s 0 ) + ∑ t = 0 T log ⁡ π θ ( a t | s t ) + ∑ t = 0 T log ⁡ p ( s t + 1 | s t , a t ) ] = ∑ t = 0 T ∇ θ log ⁡ π θ ( a t | s t )

将结果代入对目标函数梯度的估计:
θJ(θ)=Eτπθ(τ)[t=0Tθlogπθ(at|st)t=0Tr(st,at)]=1Ni=1N[t=0Tθlogπθ(ai,t|si,t)t=0Tr(si,t,ai,t)] ∇ θ J ( θ ) = E τ ∼ π θ ( τ ) [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t | s t ) ∑ t = 0 T r ( s t , a t ) ] = 1 N ∑ i = 1 N [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a i , t | s i , t ) ∑ t = 0 T r ( s i , t , a i , t ) ]
完成了对梯度的估计,我们便可以对参数进行更新:
θ=θ+αθJ(θ)ˆ θ ′ = θ + α ∇ θ J ( θ ) ^

我们可以假设

J(θ)=vπθ(s0) J ( θ ) = v π θ ( s 0 )
也就是以初始状态的价值作为目标。当然选法不唯一。

实际上,从函数估计的角度看,这种方法和最大似然法类似:我们希望策略模型得到行动概率分布能够尽可能地与采样数据的行为概率分布一致。 按照这个思路我们给出这个模型的求解方法,假设 τ τ 是我们的数据集合,采用最大似然法进行建模,目标函数可以设立为:

θ=argmaxπθ1Ni=1Nt=0Tlogπθ(ai,t|si,t) θ ∗ = arg ⁡ max π θ 1 N ∑ i = 1 N ∑ t = 0 T log ⁡ π θ ( a i , t | s i , t )
令等号右边等于 J(θ) J ( θ ) ,对其求导,得到:
θJ(θ)=1Ni=1Nt=0Tθlogπθ(ai,t|si,t) ∇ θ J ( θ ) = 1 N ∑ i = 1 N ∑ t = 0 T ∇ θ log ⁡ π θ ( a i , t | s i , t )
相比于之前求得的梯度公式,用最大似然法求得的梯度公式仅少了回报项,这个区别可以从两个角度去理解:

  1. 从策略梯度法的角度看,最大似然法没有考虑长期回报,或者说长期回报为固定值 1。即每个样本 τi τ i 对训练的影响相同。
  2. 从最大似然法的角度看,最大似然对每个样本使用了相同的权重,对策略梯度法来说,它使用序列的回报作为样本的加权权重。也就是说,对于回报为正的样本,我们最大化它的似然;对于回报为负的样本,我们最小化它的似然。

策略梯度法的推导还有一种形式,在 Richard S. Sutton 的 Reinforcement Learning: An Introduction 中被称作策略梯度定理(policy gradient theorem):

θJ(θ)=sdπ(s)aqπ(s,a)θπ(a|s,θ) ∇ θ J ( θ ) = ∑ s d π ( s ) ∑ a q π ( s , a ) ∇ θ π ( a | s , θ )
where the gradients in all cases are the column vectors of partial derivatives with respect to the components of θ θ , π π denotes the policy corresponding to weights vector θ θ and the distribution dπ d π here is the expected number of time steps t t on which St=s in a randomly generated episode starting in s0 s 0 and following π π and the dynamics of the MDP.

此处以及下一小节我们采用 Richard S. Sutton 的表示法,注意其中的:

dπ(s)=k=0γkPr(ss,k,π) d π ( s ) = ∑ k = 0 ∞ γ k P r ( s → s ′ , k , π )
具体的推导过程比较复杂,此处从略。

REINFORCE

基于策略梯度定理,我们得到了一种参数增量的表达式,但是并不是其中每一项的解析表达式我们都已知。因此,我们现在需要的是一种采样估计方法来估计该增量表达式。注意到策略梯度定理表达式的右边对状态的加权求和,其权重是在策略 π π 下该状态出现的频率,以及 γ γ k k 次方,k 是到达此状态所经历的步数。那么我们可以利用策略 π π 进行采样,再乘以衰减常数 γ γ ,这样的期望值就可以用来估计该梯度:

θJ(θ)=Eπ[γtaqπ(St,a)θπ(a|St,θ)] ∇ θ J ( θ ) = E π [ γ t ∑ a q π ( S t , a ) ∇ θ π ( a | S t , θ ) ]

然后我们对动作的求和进行估计,我们要得到的是每一项乘以在策略 π π 下该动作出现的概率:
η(θ)=Eπ[γtaqπ(St,a)π(a|St,θ)θπ(a|St,θ)π(a|St,θ)]=Eπ[γtqπ(St,At)θπ(At|St,θ)π(At|St,θ)]=Eπ[γtGtθπ(At|St,θ)π(At|St,θ)] ∇ η ( θ ) = E π [ γ t ∑ a q π ( S t , a ) π ( a | S t , θ ) ∇ θ π ( a | S t , θ ) π ( a | S t , θ ) ] = E π [ γ t q π ( S t , A t ) ∇ θ π ( A t | S t , θ ) π ( A t | S t , θ ) ] = E π [ γ t G t ∇ θ π ( A t | S t , θ ) π ( A t | S t , θ ) ]

现在我们得到了可以估计的表达式,那么
θt+1=θt+αγtGtθπ(At|St,θ)π(At|St,θ) θ t + 1 = θ t + α γ t G t ∇ θ π ( A t | S t , θ ) π ( A t | S t , θ )

可见 REINFORCE 是一种 Monte Carlo Policy Gradient 方法。而且这种方法是针对离散动作的。(当然也可以将策略表示为动作的概率分布,来生成连续的动作,此时参数 θ θ 便是这个概率分布的参数。如正态分布的均值与方差。)这个更新策略的更新量与总体回报成正比,与动作选择的概率成反比。前者的意义在于它在向总体回报最高的方向更新;后者的意义在于防止策略总是给出产生的回报不是最高但是出现频率最高的动作。

更新方法也可以写成:

θt+1=θt+αγtGtθlogπ(At|St,θ) θ t + 1 = θ t + α γ t G t ∇ θ log ⁡ π ( A t | S t , θ )

该方法的更新步骤如下:

  1. Initialize: π(a|s,θ) π ( a | s , θ ) , aA,sS,θRn ∀ a ∈ A , s ∈ S , θ ∈ R n
  2. Initialize policy weights θ θ
  3. Repeat forever:
    1. Generate an episdoe S0,A0,R1,,ST1,AT1,RT S 0 , A 0 , R 1 , … , S T − 1 , A T − 1 , R T following π(|,θ) π ( ⋅ | ⋅ , θ ) .
    2. For each step of the episode t=0,1,,T1 t = 0 , 1 , … , T − 1 :
      1. Gt G t ← return from step t t .
      2. θθ+αγtGtθlogπ(At|St,θ)

其中 θπ(At|St,θ)π(At|St,θ) ∇ θ π ( A t | S t , θ ) π ( A t | S t , θ ) 或者 θlogπ(At|St,θ) ∇ θ log ⁡ π ( A t | S t , θ ) 是策略参数存在的项。这一项被称作 eligibility vector。如果采用 softmax + linear action preferences 策略, 那么 eligibility vector 可以写成

θlogπ(At|St,θ)=ϕ(s,a)bπ(b|,s,θ)ϕ(s,b) ∇ θ log ⁡ π ( A t | S t , θ ) = ϕ ( s , a ) − ∑ b π ( b | , s , θ ) ϕ ( s , b )

Baseline

我们的策略梯度公式有个问题:不管哪个时间段,我们都要用策略的梯度乘以所有时刻回报值得总和,这样的设计显然不合理。理论上 t t 时刻的决策最多只能影响 t 时刻之后的所有回报,与之前的回报无关,所以我们的公式应该改写成:

θJ(θ)=1Ni=1Nt=0T[θlogπθ(ai,t|si,t)t=tTr(si,t,ai,t)] ∇ θ J ( θ ) = 1 N ∑ i = 1 N ∑ t = 0 T [ ∇ θ log ⁡ π θ ( a i , t | s i , t ) ∑ t ′ = t T r ( s i , t ′ , a i , t ′ ) ]

另一方面,我们知道总体回报可以理解为最大似然法中的权重,这个权重会带来两个问题:

  1. 如果序列得到的回报数值较大,那么对应的参数更新也较大,这样我们的优化可能会出现一定波动,这些波动很可能影响优化效果。
  2. 一些强化学习问题中,环境给予的回报始终为正,那么无论决策怎么样,累计的长期回报始终为正数。也就是说会增强所有策略,这与我们的初衷不符。

为了解决上述问题,我们可以调整权重的数值和范围,一个简单的方法是让所给出的长期累计汇报减去一个偏移量,这个偏移量被称为 Baseline,我们用变量 b b 表示:

θJ(θ)=1Ni=1Nt=0T[θlogπθ(ai,t|si,t)(t=tTr(si,t,ai,t)bi,t)]
这个偏移量可以设计为同一个起始点不同序列在同一时刻的长期回报的均值:

bi,t=1Ni=1Nt=tTr(si,t,ai,t) b i , t ′ = 1 N ∑ i = 1 N ∑ t ′ = t T r ( s i , t ′ , a i , t ′ )
经过这样的处理,所有时刻权重的均值变为0,就会同时存在权重为正或负的动作,权重的绝对值也得到了一定的缩小。而且很容易计算出这样一个结论: 加入这个偏移量并不会使原本的计算值变得有偏


基于策略梯度定理的带 Baseline 的梯度可写成:

θJ(θ)=sdπ(s)a(qπ(s,a)b(s))θπ(a|s,θ) ∇ θ J ( θ ) = ∑ s d π ( s ) ∑ a ( q π ( s , a ) − b ( s ) ) ∇ θ π ( a | s , θ )
更新策略:
θt+1=θt+α(Gtb(St))θlogπ(At|St,θ) θ t + 1 = θ t + α ( G t − b ( S t ) ) ∇ θ log ⁡ π ( A t | S t , θ )
其中 b(s) b ( s ) 可写为 v^(St,w) v ^ ( S t , w )

Actor-Critic

在上一小节中,我们使用偏移量来改进策略梯度算法,但是改进后的梯度计算公式仍然有问题。真实训练的过程中,我们往往需要控制交互的时间。有限次的交互有时并不能代表轨迹的真实期望。每一个交互序列都会有一定的差异,对应的回报也会有一定的差异,因此不充足的交互会给轨迹回报带来较大的方差。为了模型稳定,我们可以牺牲一定的偏差来换取方差变小。这其中一种方法就是 Actor-Critic算法。

关于Actor-Critic方法,Richard S. Sutton 在书中写道:

Methods that learn approximations to both policy and value functions are called actor-critic methods. REINFORCE with baseline methods use value functions only as a baseline, not a critic, i.e. not for bootstrapping. This is a useful distinction, for only through bootstrapping do we introduce bias and an asymptotic dependence on the quality of the function approximation.

首先我们看单步 action-critic 算法。 这里首先以 Richard S. Sutton 的方法为准。单步方法主要的有点是可以在线执行,如同 TD(0), SARSA(0) 和 Q-Learning。单步 actor-critic 算法参数更新策略如下:

θt+1=θt+α(Rt+1+γv^(St+1,w)v^(St,w))θlogπ(At|St,θ) θ t + 1 = θ t + α ( R t + 1 + γ v ^ ( S t + 1 , w ) − v ^ ( S t , w ) ) ∇ θ log ⁡ π ( A t | S t , θ )

详细步骤如下:

  1. Initialize a differentiable policy parameterization π(a|s,θ),aA,sS,θRn π ( a | s , θ ) , ∀ a ∈ A , s ∈ S , θ ∈ R n .
  2. Initialize a differentiable state-value parameterization v^(s,w),sS,wRm v ^ ( s , w ) , ∀ s ∈ S , w ∈ R m .
  3. Set step sizes α>0,β>0 α > 0 , β > 0 .
  4. Repeat forever:
    1. Initialize the first state of episode S S
    2. I1
    3. While S S is not terminal:
      1. Take action Aπ(|S,θ), observe S,R S ′ , R
      2. δR+γv^(S,w)v^(S,w) δ ← R + γ v ^ ( S ′ , w ) − v ^ ( S , w ) , (if S S ′ is terminal, v^(S,w)=0 v ^ ( S ′ , w ) = 0 )
      3. ww+βδwv^(S,w) w ← w + β δ ∇ w v ^ ( S , w )
      4. θθ+αIδθlogπ(A|S,θ) θ ← θ + α I δ ∇ θ log ⁡ π ( A | S , θ )
      5. IγI I ← γ I
      6. SS S ← S ′

    带有Eligibility Traces的Actor-Critic算法步骤如下 :

    1. Initialize π(a|s,θ),aA,sS,θRn π ( a | s , θ ) , ∀ a ∈ A , s ∈ S , θ ∈ R n
    2. Initialize v^(s,w),sS,wRm v ^ ( s , w ) , ∀ s ∈ S , w ∈ R m
    3. Repeat forever:
      1. Initialize the first state of episode S S
      2. eθ=0, ew=0 e w = 0 .
      3. I1 I ← 1
      4. While S S is not terminal:
        1. Take action Aπ(|S,θ), observe S,R S ′ , R
        2. δR+γv^(S,w)v^(S,w) δ ← R + γ v ^ ( S ′ , w ) − v ^ ( S , w ) , (if S S ′ is terminal, v^(S,w)=0 v ^ ( S ′ , w ) = 0 )
        3. ewλwew+Iwv^(S,w) e w ← λ w e w + I ∇ w v ^ ( S , w )
        4. eθλθeθ+Iθlogπ(A|S,θ) e θ ← λ θ e θ + I ∇ θ log ⁡ π ( A | S , θ )
        5. ww+βδwv^(S,w) w ← w + β δ ∇ w v ^ ( S , w )
        6. θθ+αIδθlogπ(A|S,θ) θ ← θ + α I δ ∇ θ log ⁡ π ( A | S , θ )
        7. IγI I ← γ I
        8. SS S ← S ′

      Asynchronous Advantage Actor-Critic (A3C)

      A3C是一种异步优化方法。其主要特点是异步,即并行的交互采样和训练。策略梯度法和Actor-Critic法都通过目标函数的梯度进行策略更新,而计算梯度需要基于当前的策略模型,所以每一次计算梯度时,我们需要使用当前最新的策略模型重新进行交互采样,得到序列样本,然后使用这些样本完成梯度计算;完成梯度计算后,我们丢弃使用过的样本,重新采样。这种训练方法被称为On-Policy Learning。在深度强化学习中,我们使用Replay Buffer存储了一段时间的交互样本,模型学习时使用的样本不一定是由当前模型交互得到,这样的学习方法被称为Off-Policy Learning

      对于On-Policy来说,每一次模型更新都需要一定量的新样本,为了更快地手机样本,我们需要用并行的方法收集。我们同事启动N个线程进行交互,只要保证每一个线程中的环境设定不同,线程间交互得到的序列就不完全一样,这样得到的样本更有意义。收集完成样本后,每一个线程独立完成训练得到参数更新量,并异步更新到全局模型参数中。A3C方法使用多步回报估计法,对应的公式变为:

      i=1nγi1rt+1+v(st+n)v(st) ∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t )
      为了增加模型的探索性,模型的目标函数中加入了策略的熵:
      θJ(θ)=1Tt=0Tθlogπθ(at|st)(i=1nγi1rt+1+v(st+n)v(st))+βθH(πθ(st)) ∇ θ J ( θ ) = 1 T ∑ t = 0 T ∇ θ log ⁡ π θ ( a t | s t ) ( ∑ i = 1 n γ i − 1 r t + 1 + v ( s t + n ) − v ( s t ) ) + β ∇ θ H ( π θ ( s t ) )

      A3C单一线程的执行过程如下:

      1. T0 T ← 0
      2. Initialize policy paramter θ θ
      3. Initialize value parameter ω ω
      4. Repeat until T>Tmax T > T m a x
        1. dθ0,dω0 d θ ← 0 , d ω ← 0 .
        2. Synchronize model parameter θθ,ωω θ ′ ← θ , ω ′ ← ω .
        3. Sample with policy πθ(at|st) π θ ′ ( a t | s t ) to collect {s0,a0,r0,} { s 0 , a 0 , r 0 , … }
        4. TT+n T ← T + n
        5. R=vθ(st) R = v θ ′ ( s t ) for non-terminal state, R=0 R = 0 for terminal state.
        6. for i{n1,0} i ∈ { n − 1 , 0 } do
          1. Rri+γR R ← r i + γ R
          2. dθdθ+θlogπθ(ai|si)(RVω(si)) d θ ← d θ + ∇ θ ′ log ⁡ π θ ′ ( a i | s i ) ( R − V ω ′ ( s i ) )
          3. dωdω+ω(RVω(si))2 d ω ← d ω + ∇ ω ′ ( R − V ω ′ ( s i ) ) 2
        7. end for
        8. θdθ,ωdω θ ← d θ , ω ← d ω

      Advantage Actor-Critic (A2C)

      A3C算法表现十分优异,但是其中的异步更新是否是必要的?凭直觉,异步或者同步更新并不是决定算法优劣的主要因素。那么为什么不尝试使用同步更新方法呢?这就是A2C方法的来源。我们可以在Baseline项目中a2c文件夹下看到A2C的实现。可以直接运行其中的run_atari.py文件执行算法。OpenAI的官方博客中也提到A2C的效果优于A3C。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值