(四)策略梯度(policy gradient)

 前面一章表格型方法,进行策略迭代的时候利用到了Q函数。是一种value-base的方法,而之前介绍到还有一种policy-base,本章的就是一种policy-base的方法。
  ps:强化学习的目的是寻找最佳策略,value-base相对复杂一点儿,先算价值再找策略。policy-base就是直接寻找策略的。
  那有一个大问题就是:==明明已经有了value-base方法,为什么还要去开发policy-base呢?==有什么特殊性吗?当然有了,value-base是有局限性的,只适用于离散动作空间而且是确定性策略(原因还不清楚,但是就是这么回事~)。而policy-base使用场景包括随机策略、动作空间连续(当然也兼容离散动作空间,确定性策略)。所以研究policy-base的方法是十分有必要的。
  还记得最开始那张RL的图吗?里面有三个元素组成:agent, reward, environment。其实在这三个里面能由我们主观控制的只有一个agent(其实对应的是policy),剩下两个都是客观存在的,只不过在选取不同的策略下呈现方式会有不同。所以直接对policy进行修改是有意义的。那现在最大的问题就是:如何从policy出发寻找最佳policy呢?
  回想第一章说过的,策略其实就是一个概率分布。会告诉在状态下执行各个动作的概率。那策略梯度的思想就十分清楚了:当判断出某种行为可以带给我们价值大的,就增加这种行为的概率。现在思路理解了,可怎么把思想进行建模呢?既然是概率分布,那就使用机器学习中常见的方法:概率参数化。把问题转换成对参数进行数学操作。本文中统一用Θ代替。下面就介绍下这个流程:
  之前从概率的角度出发,每一个动作都是一个概率。而一条轨迹由无数个动作组成,轨迹也可以用概率表示:

  注意上面的Θ代表的就是某个策略
  RL关注的是奖励最大化,用概率分布的方法来表示策略的奖励:

  为了便于说明,还是将上式转变成期望:

  所以一切的一切现在都变成了对Θ进行操作,实现期望最大化。
  一个问题来了:怎么实现期望最大化呢?——梯度上升
  首先解释一下啥叫梯度,其实就是变化率,也叫导数。梯度上升就是一点儿一点儿的变化,但整体是上升趋势。这里求导的对象自然就是Θ了。
先给出结果式,然后再来看看这个东东是怎么来的:

  具体的推导过程如下:

  这里面用到了一个技巧:

  可以很直观的理解上面的式子:从采样得到的数据中,确定状态动作对——(s(t), a(t))。如果发现轨迹奖励是正的,就增加这个动作对的概率。否则降低。那 升高降低多少呢?怎么体现在参数Θ上呢?就是利用上面的计算式确定梯度,然后进行更新。
  所以整体策略梯度的更新流程如下图所示:

  有几个点需要明确:
  1.Θ更新式中的η是权重,就是这场游戏的奖励
  2.数据采集时,智能体本身有随机性。对于相同的状态s不一定都会采取相同的a,所以要把每笔数据记录下来(每条数据内容状态动作对及对应的奖励)。
  3.策略梯度采样的数据只能使用一次,更新参数后就不能用了(原因我也不知道为啥~)

  上面讲的都是关于Θ的,那和我们的策略有啥关系。不要忘记,是用Θ来代表策略的。优化Θ就相当于优化策略。
  以上介绍了策略梯度的思想及实现方法,下面介绍一些改进的小技巧。能够帮助我们提高策略梯度的效果。

  技巧1:添加基线(baseline)
  首先问自己一个问题:为啥要添加基线?
  设想这样一种场景,之前解释过在进行梯度更新时,奖励为正的增大其概率,奖励为负的减少其概率。但现实中往往是这样的:奖励全部是非负的,像乒乓球中就是[0,11]。对于这种情况会出现一个问题:之前是使用概率去衡量的,当完成归一化之后,只有原来上升多的才会上升,上升少的相比之下会下降。这不是我们期望的结果。所以我们会期望奖励不要总是正的,这就是基线的作用。把奖励都减去一个常数,只有奖励超过基线的概率上升。否则即使是正的太小了也不好,让其概率下降,数学化的表达如下:

  那怎么求呢?对于b的求解,可以使用MC进行一次完整训练,然后取期望,并且也可以不断更新这个b:

  技巧2:分配合适的分数(给动作确定权重)
  在前面的式子中有这样一个问题:在任意动作中,乘的奖励是相同的。因为一次轨迹的奖励是确定的,baseline也是确定的。但实际上动作有好有坏,所以希望能根据动作分配适合的奖励分数。并且通过这个不同的奖励分数,可以反应每一个动作是好还是不好。举一个例子来进行说明:

  从上面图中看到,最终的奖励是+3,如果不进行权重分配的话。所有的动作奖励都会被认定为+3。以(s(b),a(2))这对为例,可以很明显的看出它其实并没有什么作用,奖励都是第一对来的,甚至它会带来负面影响,因为s(b)在执行a(2)后会进入s©,而s©会削弱当前的奖励。同理,如果前面是负的,s(b)即使增强,但幅度小的话,也看不太出来。所以可以认定执行这个动作前的奖励对于评价这个动作没有参考价值。只有把执行这个动作以后发生的所有奖励加起来,才是这个动作真正的贡献。修改后的数学表达式为:


  代表从t时刻开始后面的奖励,更能代表动作所对奖励起到的贡献
甚至可以为将来的奖励加上折扣因子:


  代表折扣回报

  把R-b这一项合起来,就叫做优势函数,即

 表示为:

  下面介绍一个最简单也最经典的梯度策略算法:REINFORCE(蒙特卡洛策略梯度)
  设计到蒙特卡洛思想,就是以回合为单位进行取样的。
  因为对于算法了解不是很深入,在此就简单罗列一些相关知识点。等后面学习明确了再过来补充说明。
  算法伪代码如下:

  算法流程图如下:

  老规矩,课后题:


参考资料:【强化学习】策略梯度方法-REINFORCE_哔哩哔哩_bilibili

因作者水平有限,如有错误之处,请在下方评论区指出,谢谢!