jquave 发表于 2022-4-6 13:23

浅谈策略梯度(PG)算法

Policy Optimization(策略优化)是强化学习中的一大类算法,其基本思路区别于Value-based的算法。因此,很多教科书都将model-free RL分成两大类,Policy Optimization和Value-based。
Spinning Up 是OpenAI发布的入门教程(https://spinningup.openai.com/),这一系列是入门Policy Optimization的非常好的教材,特别适合初学者。Policy Gradient(策略梯度,简称PG)算法是策略优化中的核心概念,本章我们就将从最简单的PG推导开始,一步步揭开策略优化算法的神秘面纱。
直观理解

如果用一句话来表达策略梯度的直观解释,那就是“如果动作使得最终回报变大,那么增加这个动作出现的概率,反之,减少这个动作出现的概率”。这句话表达了两个含义:

[*]我们考虑的是动作对于回报的影响,没有考虑状态或者其他因素。
[*]我们调整的是动作出现的概率,而没有给某个动作打分,这区别于Value-based类的算法。
策略梯度推导

本节我们将一步步推导出策略梯度的基础公式,这一小节非常重要,理解了推导过程,就基本上理解了策略梯度的核心思想。所以,一定要耐心的把这一小节的内容全部看懂,最好能够达到自行推导的地步。

[*]最大化回报函数
我们用参数化的神经网络表示我们的策略https://www.zhihu.com/equation?tex=%5Cpi_%5Ctheta,那我们的目标,就可以表示为调整,使得期望回报最大,用公式表示:

https://www.zhihu.com/equation?tex=J%28%5Cpi_%5Ctheta%29%3DE%5Cunderset%7B%5Cpi+%5Csim+%5Ctau%7D%5BR%28%5Ctau%29%5D+%5Ctag%7B1%7D+
在公式(1)中,https://www.zhihu.com/equation?tex=%5Ctau表示从开始到结束的一条完整路径。通常,对于最大化问题,我们可以使用梯度上升算法来找到最大值。

https://www.zhihu.com/equation?tex=%5Ctheta%5E%2A%3D%5Ctheta+%2B+%5Calpha%5Cnabla+J%28%5Cpi_%5Ctheta%29+%5Ctag%7B2%7D+
为了能够一步步得到最优参数,我们需要得到,然后利用梯度上升算法即可,核心思想就是这么简单。

[*]策略梯度
关键是求取最终的回报函数https://www.zhihu.com/equation?tex=J%28%5Cpi_%5Ctheta%29关于的梯度,这个就是策略梯度(policy gradient),通过优化策略梯度来求解RL问题的算法就叫做策略梯度算法,我们常见的PPO,TRPO都是属于策略梯度算法。下面我们的目标就是把公式(2)逐步展开,公式(2)中最核心的部分就是,这也是这篇博客最核心的地方。

https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Cnabla_%7B%5Ctheta%7D+J%5Cleft%28%5Cpi_%7B%5Ctheta%7D%5Cright%29+%26%3D+%5Cnabla_%7B%5Ctheta%7D+%5Cunderset%7B%5Ctau+%5Csim+%5Cpi_%7B%5Ctheta%7D%7D%7B%5Cmathrm%7BE%7D%7D+%5BR%28%5Ctau%29%5D+%5Ctag%7B3%7D%5C%5C+%26%3D%5Cnabla_%7B%5Ctheta%7D+%5Cint_%7B%5Ctau%7D+P%28%5Ctau+%5Cmid+%5Ctheta%29+R%28%5Ctau%29+%5Cquad+%5Ctag%7B4%7D%5C%5C+%26%3D%5Cint_%7B%5Ctau%7D+%5Cnabla_%7B%5Ctheta%7D+P%28%5Ctau+%5Cmid+%5Ctheta%29+R%28%5Ctau%29+%5Cquad+%5Ctag%7B5%7D%5C%5C+%26%3D%5Cint_%7B%5Ctau%7D+P%28%5Ctau+%5Cmid+%5Ctheta%29+%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29+R%28%5Ctau%29+%5Ctag%7B6%7D%5C%5C+%26%3D%5Cunderset%7B%5Ctau+%5Csim+%5Cpi_%7B%5Ctheta%7D%7D%7B%5Cmathrm%7BE%7D%7D%5Cleft%5B%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29+R%28%5Ctau%29%5Cright%5D+%5Ctag%7B7%7D++%5Cend%7Balign%7D+
在以上的推导中,用到了log求导技巧:https://www.zhihu.com/equation?tex=%5Clog+x关于https://www.zhihu.com/equation?tex=x的导数是https://www.zhihu.com/equation?tex=%5Cfrac%7B1%7D%7Bx%7D。因此,我们可以得到以下的公式:

https://www.zhihu.com/equation?tex=%5Cnabla_%7B%5Ctheta%7D+P%28%5Ctau+%5Cmid+%5Ctheta%29%3DP%28%5Ctau+%5Cmid+%5Ctheta%29+%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29+%5Ctag%7B8%7D+
所以,才有公式(5)到公式(6),接下来我们把公式(7)进一步展开,主要是把https://www.zhihu.com/equation?tex=%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29展开。先来看看https://www.zhihu.com/equation?tex=P%28%5Ctau+%5Cmid+%5Ctheta%29

https://www.zhihu.com/equation?tex=P%28%5Ctau+%5Cmid+%5Ctheta%29%3D%5Crho_%7B0%7D%5Cleft%28s_%7B0%7D%5Cright%29+%5Cprod_%7Bt%3D0%7D%5E%7BT%7D+P%5Cleft%28s_%7Bt%2B1%7D+%5Cmid+s_%7Bt%7D%2C+a_%7Bt%7D%5Cright%29+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29+%5Ctag+%7B8-1%7D+
加入log,化乘法为加法:

https://www.zhihu.com/equation?tex=%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29%3D%5Clog+%5Crho_%7B0%7D%5Cleft%28s_%7B0%7D%5Cright%29%2B%5Csum_%7Bt%3D0%7D%5E%7BT%7D%5Cleft%28%5Clog+P%5Cleft%28s_%7Bt%2B1%7D+%5Cmid+s_%7Bt%7D%2C+a_%7Bt%7D%5Cright%29%2B%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29%5Cright%29+%5Ctag%7B8-2%7D+
计算log函数的梯度,并且约去一些常量:

https://www.zhihu.com/equation?tex=%5Cbegin%7Balign%7D+%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%28%5Ctau+%5Cmid+%5Ctheta%29+%26%3D+%5Ccancel%7B%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Crho_%7B0%7D%5Cleft%28s_%7B0%7D%5Cright%29%7D++%2B+%5Csum_%7Bt%3D0%7D%5E%7BT%7D%5Cleft%28%5Ccancel%7B%5Cnabla_%7B%5Ctheta%7D+%5Clog+P%5Cleft%28s_%7Bt%2B1%7D+%5Cmid+s_%7Bt%7D%2C+a_%7Bt%7D%5Cright%29%7D+%2B+%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29%5Cright%29+%5C%5C++%26%3D%5Csum_%7Bt%3D0%7D%5E%7BT%7D+%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29+%5Ctag%7B9%7D++%5Cend%7Balign%7D
因此,结合公式(7)和公式(9),我们得到了最终的表达式

https://www.zhihu.com/equation?tex=%5Cnabla_%7B%5Ctheta%7D+J%5Cleft%28%5Cpi_%7B%5Ctheta%7D%5Cright%29%3D%5Cunderset%7B%5Ctau+%5Csim+%5Cpi_%7B%5Ctheta%7D%7D%7B%5Cmathrm%7BE%7D%7D%5Cleft%5B%5Csum_%7Bt%3D0%7D%5E%7BT%7D+%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29+R%28%5Ctau%29%5Cright%5D+%5Cquad+%5Ctag%7B10%7D+
公式(10)就是PG算法的核心表达式了,从这个公式中可以看出,我们要求取的策略梯度其实是一个期望,具体工程实现可以采用蒙特卡罗的思想来求取期望,也就是采样求均值来近似表示期望。我们收集一系列的https://www.zhihu.com/equation?tex=%5Cmathcal%7BD%7D%3D%5Cleft%5C%7B%5Ctau_%7Bi%7D%5Cright%5C%7D_%7Bi%3D1%2C+%5Cldots%2C+N%7D ,其中每一条轨迹都是由agent采用策略https://www.zhihu.com/equation?tex=%5Cpi_%7B%5Ctheta%7D与环境交互采样得到的,那策略梯度可以表示为:

https://www.zhihu.com/equation?tex=%5Chat%7Bg%7D%3D%5Cfrac%7B1%7D%7B%7C%5Cmathcal%7BD%7D%7C%7D+%5Csum_%7B%5Ctau+%5Cin+%5Cmathcal%7BD%7D%7D+%5Csum_%7Bt%3D0%7D%5E%7BT%7D+%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29+R%28%5Ctau%29+%5Ctag%7B11%7D+
其中,https://www.zhihu.com/equation?tex=%7C%5Cmathcal%7BD%7D%7C表示采样的轨迹的数量。现在,我们完成了详细的策略梯度的推导过程,长舒一口气,接下来的工作就比较轻松了,就是在公式(10)的基础上修修改改了。
再进行简单修改之前,我们再总结一下公式(10),毕竟这个公式是PG算法最核心的公式:

[*]对比我们常见的监督学习算法,我们都会定义loss函数,然后loss函数对参数求导,使用梯度下降算法不断使得loss最小。对于PG算法,我们的“loss函数”其实是期望回报的对数,而我们的目标是使得期望回报最大,所以这里使用了梯度上升算法。
[*]一般的监督学习算法中,训练样本和测试样本的分布是同分布的,loss函数是从固定分布的样本上求出来的,与我们想要优化的参数是独立的。然而,对于PG算法,我们会有基于现有策略的采样的过程,策略不同,采样得到的样本不同,导致最终计算出来的loss也存在较大差异,这就使得网络很容易过拟合,后面我也会讲到更加高级的Actor-Critic框架,利用对抗的思路,解决这一问题。
[*]对于一般的监督学习,loss越小越好,loss也是一个非常有效的评价训练是否完成的指标。然后对于PG算法,这里的“loss函数”意义不大,主要是因为这里的期望回报仅仅作用于当前策略生成的数据集。所以,并不是说loss降下来,模型就表现的更好。
[*]我们可以将公式中的看做是https://www.zhihu.com/equation?tex=log%5Cpi_%5Ctheta%28a_t+%5Cmid+s_t%29的权重,当奖励较小时,就说明在下采取动作的效果不好,减少状态下出现的概率,反之,奖励较大则增加动作出现概率,从而达到选取最合适的动作的目的。
改进回报函数

我们继续观察公式(10),对于公式中的,表示整个轨迹的回报,其实并不合理。对于一条轨迹中的所有动作,均采用相同的回报,就相当于对于轨迹中的每一个动作都赋予相同的权重。显然,动作序列中的动作有好有坏,都采取相同的回报,无法达到奖惩的目的,那我们该怎么表示某个状态下,执行某个动作的回报呢?
一种比较直观思路是,当前的动作将会影响后续的状态,并且获得即时奖励(reward),那么我们只需要使用折扣累计回报来表示当前动作的回报就行了,用公式表示为:

https://www.zhihu.com/equation?tex=%5Chat%7BR%7D_%7Bt%7D+%5Cdoteq+%5Csum_%7Bt%5E%7B%5Cprime%7D%3Dt%7D%5E%7BT%7D+R%5Cleft%28s_%7Bt%5E%7B%5Cprime%7D%7D%2C+a_%7Bt%5E%7B%5Cprime%7D%7D%2C+s_%7Bt%5E%7B%5Cprime%7D%2B1%7D%5Cright%29+%5Ctag%7B12%7D+
这在spinning up中叫做reward to go,所以,公式(10)可以表示为:

https://www.zhihu.com/equation?tex=%5Cnabla_%7B%5Ctheta%7D+J%5Cleft%28%5Cpi_%7B%5Ctheta%7D%5Cright%29%3D%5Cunderset%7B%5Ctau+%5Csim+%5Cpi_%7B%5Ctheta%7D%7D%7B%5Cmathrm%7BE%7D%7D%5Cleft%5B%5Csum_%7Bt%3D0%7D%5E%7BT%7D+%5Cnabla_%7B%5Ctheta%7D+%5Clog+%5Cpi_%7B%5Ctheta%7D%5Cleft%28a_%7Bt%7D+%5Cmid+s_%7Bt%7D%5Cright%29+%5Csum_%7Bt%5E%7B%5Cprime%7D%3Dt%7D%5E%7BT%7D+R%5Cleft%28s_%7Bt%5E%7B%5Cprime%7D%7D%2C+a_%7Bt%5E%7B%5Cprime%7D%7D%2C+s_%7Bt%5E%7B%5Cprime%7D%2B1%7D%5Cright%29%5Cright%5D+%5Ctag%7B13%7D+
当然,使用reward to go的权重分配还是相当初级,我们可以使用更加高级的权重分配方式,进一步减少回报分配的方差,限于篇幅原因,我们后续再聊。
<hr/>PS:
我们是行者AI,我们在“AI+游戏”中不断前行。
如果你也对游戏感兴趣,对AI充满好奇,那就快来加入我们(hr@xingzhe.ai)。
参考


[*]^https://spinningup.openai.com/
页: [1]
查看完整版本: 浅谈策略梯度(PG)算法