Processing math: 100%
【强化学习】Policy-Gradient

简介

与Q Learning的比较

相比于之前学习的Q Learning,这个算法的不同点在于,可以不分析奖励值,直接从一个连续的动作空间中选择下一步要进行的动作,而Q Learning只能从有限多个动作中进行选择。

如何更新

Policy Gradients不使用反向传递误差来更新网络,而是使用环境给出的 reward 来进行反向传递,从而来决定是否增加这次选择的动作再次被选择的概率。

策略梯度如何下降

类比交叉熵

H(p,q)=xp(x)logq(x)

其中 p(x) 为对应的标签,q(x) 为输出的概率。

但在RL中是没有标签的。此时可以使用 reward 来充当标签。

假设一次状态行为序列为 γ={s1,a1,r1,s2,,st,at} ,其中 st 表示 t 时刻时的状态,at 代表位于 st 时采取的动作。这样的动作策略,使得我们得到了 reward R(γ) 。接下来使用下面的式子进行计算:

L(θ)=1NγR(γ)logπθ(γ)

其中 πθ(γ) 表示了采取策略 γ 的发生概率,N 为采样 γ 的数目。

算法推导

算法中的策略梯度函数推导

将智能体的整个行为过程用数学表示如下:(表示成为一个动作和状态的序列)

pθ(τ)=pθ(s1,a1,...,sT,aT)=p(s1)Tt=1πθ(at|st)p(st+1|st,at)

我们要优化的目标为:

θ=arg maxθEτpθ(τ)[r(st,at)]

即为遵循上面的状态、动作轨迹,所能达到的最大环境奖励值的期望,此时求得的策略就是最佳策略

这里进行如下的定义:

J(θ)=Eτπθ(τ)[r(τ)]=πθ(τ)r(τ)dτ

其梯度如下:

θJ(θ)=θπθ(τ)r(τ)dτ=πθ(τ)θlogπθ(τ)r(τ)dτ

此处用到了一个定理:

这样的话就得到了下面的算式:

θJ(θ)=Eτπθ(τ)[θlogπθ(τ)r(τ)]

接下来专注求解 θlogπθ(τ) 。将 πθ 转换如下:

πθ(s1,a1,...,sT,aT)=p(s1)Tt=1πθ(at|st)p(st+1|st,at)logπθ(τ)=logp(s1)+Tt=1logπθ(at|st)+logp(st+1|st,at)

在计算梯度时,由于第一项和最后一项均为常数(由环境本身决定),因此其梯度为0。最终将上式代入式 (1) 可以得到:

θJ(θ)=Eτπθ(τ)[(Tt=1θlogπθ(at|st))(Tt=1r(st,at))]

对策略梯度进行评估

经过前面的推导,我们可以得到如下公式:

这就是策略梯度的计算公式。可以利用如下的式子来更新当前策略:

θθ+αθJ(θ)

接下来就可以初步的得到一个算法:

如何进行收敛

极大似然估计中的策略梯度如下所示:

可以看到,极大似然的公式和policy gradient只相差一个reward和的乘积。这样的话,在求解策略梯度时,就可以用求极大似然的方法来进行求解。

再观察策略梯度的公式:

θJ(θ)1NNi=1θlogπθ(τi)r(τi)=1NNi=1(Tt=1θlogπθ(ai,t|oi,t))(Tt=1r(si,t,ai,t))

式子中的梯度表明了增加轨迹 τ 概率的方向,可以看到式子中的 πθ(τi) 与奖励值相乘,这就表明如果奖励值大时,对应的高奖励的轨迹就更有可能出现,反之低奖励值的轨迹出现的概率更小。

部分观测时的算法设计

只需要将式 (2) 中的 st 修改成为 ot 即可,因为环境本身会直接给出奖励值,与观测多少数据是无关的。

Policy Gradient的高方差问题

高方差问题

策略梯度方法有一个重要的缺陷就是方差会很高。这里用一个简单例子进行说明,如下图:

这里横坐标代表不同的采样样本,绿色线段是采样得到的智能体与环境交互后得到的奖赏值;第二步向第一步得到的奖赏值上加一个常量,该常量并不会影响策略梯度(下文也有相关推导)。但这两次得到的策略的概率分布结果却相差很多,这就是策略梯度方法高方差问题的直观体现,而高方差带来的问题就是算法更新的过程不稳定。

减小方差的方法

Causality假设

第一个是进行causality的假设:未来时刻的策略并不能影响之前时刻的奖赏值。

对原有的策略梯度公式中的奖赏值部分进行修改,原先的公式中后两项是先求和再相乘,如下:

θJ(θ)1NNi=1[(Tt=1θlogπθ(ai,t|oi,t))(Tt=1r(si,t,ai,t))]

修改之后的公式如下所示:只考虑从当前策略的时间往后推移的奖赏值,而不考虑之前的

θJ(θ)1NNi=1[(Tt=1θlogπθ(ai,t|oi,t))(Tt=1r(si,t,ai,t))]

加入Baseline

第二种方法在奖赏值的基础上减去一个常数(均值),这个常数叫作baseline,公式化表示就是:

θJ(θ)=Eτπθ(τ)[θlogπθ(τ)(r(τ)b)]

最简单的情况下取值为:

b=1NNi=1r(τ)

那么如何选择最优的baseline来最小化策略梯度本身的方差呢

方差计算公式:Var[x]=E[x2](E[x])2

将策略梯度的公式代入得到:

如果要使其最小,可以通过对其求导数并令其导数为0,从而求得最优的baseline的表达式,这里为了简化推导,令 g(τ)=θlogpθ

从而得到:

b=E[g(τ)2r(τ)]E[g(τ)2]

Policy Gradient方法的实现技巧

这里其实应当自己总结一下,不过先把课程中老师提到的技巧记录一下:

总体上只需要给出损失函数即可,剩下的任务交给tf或者pytorch去做

其他要点:

  • 使用较大的batch size对参数进行更新
  • 手动调整learning_rates很困难,可以使用ADAM优化器

Off-policy Policy Gradient

其实policy gradient的方法的高方差问题起源于该算法是on-policy的算法,由于每次采样必须使用新的策略,所以每次采样的数据在一次梯度上升之后就被扔掉了。

有一种解决方法是使用 importance sampling:

Author: iwannaeat
Link: https://iwannaeat.github.io/2021/02/19/【强化学习】Policy-Gradients/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.