policy-gradient

参考资料 :

  1. https://zhuanlan.zhihu.com/p/21725498

2.   https://zhuanlan.zhihu.com/p/75174892  (尤其是这个, 包括引入 base line,对应的正好是 reward的normalization)

基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然后根据价值贪心的选择动作。如果我们省略中间的步骤,即直接根据当前的状态来选择动作,也就引出了强化学习中的另一种很重要的算法,即策略梯度(Policy Gradient)。这篇文章,我们就来介绍这种算法的最基础的版本以及其简单的实现。

本篇文章的大部分内容均学习自莫烦老师的强化学习课程,大家可以在b站上找到相关的视频:https://www.bilibili.com/video/av16921335/#page=22

1、什么是 Policy Gradients

其实在引言部分我们已经介绍了策略梯度的基本思想,就是直接根据状态输出动作或者动作的概率。那么怎么输出呢,最简单的就是使用神经网络啦!

我们使用神经网络输入当前的状态,网络就可以输出我们在这个状态下采取每个动作的概率,那么网络应该如何训练来实现最终的收敛呢?

我们之前在训练神经网络时,使用最多的方法就是反向传播算法,我们需要一个误差函数,通过梯度下降来使我们的损失最小。但对于强化学习来说,我们不知道动作的正确与否,只能通过奖励值来判断这个动作的相对好坏。基于上面的想法,我们有个非常简单的想法:

如果一个动作得到的reward多,那么我们就使其出现的概率增加,如果一个动作得到的reward少,我们就使其出现的概率减小。

根据这个思想,我们构造如下的损失函数:loss= -log(prob)*vt

我们简单用白话介绍一下上面这个损失函数的合理性,那么至于从数学角度上为什么要使用上面的损失函数,可以参考:Why we consider log likelihood instead of Likelihood in Gaussian Distribution。

其实,我们最初是,既然出现了这个 s-a, 那么就进一步增加其出现的概率。 即按照梯度的方向尽量的maxmize

由于tensorflow中只有minimize函数,所以就把 loss定义为  loss= -log(prob)*vt            ,但是值得注意的是,这里的vt必须是一轮episode后的累计值(含有gamma衰减),而-log(prob)整体是单调递减的。 所以意味着, 如果vt大 ,那么为了减少loss, 则要大幅减少-log(prob)   ,也就意味着 大跨步按照梯度 增加 prob的值,  总体而言也就是  vt越大(累计reward值越大)那么这个vt链条上的prob概率也就越要调大一些;  如果vt比较小了,意味着仅需要较小幅度地提升prob值(后果是得到较小幅度地降低了-log(prob),这个场景的物理意义是loss本来就比较小了,所以沿着梯度的方向稍微降一点点。

    上述思路是没有问题,但前提是 vt总是正的,这导致为了不断减小loss,要一直不停地提升episode路径上遇到的所有s-a对的概率,而其他非episode路径上的s-a概率值,出现被动下降(因为每次一个s对应的所有action的概率之和保持为1)。 这样做,确实有一定的合理性,也符合出现的多,我就让你下次出现的概率更大。 这就好比, 只要是熟人,我就增加推举你高升的概率(给你打高分)。 这种情况下, 熟人一定比没见过的生人的评分高。 但这并不完全合理,因为,有一些熟人,他确实在你生活里多出现了几次, 但是,他的表现,未必好,达不到你的要求,甚至可能得罪你。

这样的人,虽然多出现了几次,但是他每次出现,对于你这个brain而言,都是减分项;这也意味着, 我们并非一定要按着上面的那个公式一直增加  的值,而是给 reward加一个 base line :


加上baseline b之后, 会导致:   经历了一个 s-a,但它的reward值达不到期望值,那么意味着  减去b之后是负的, 那么意味着的更新其实是朝着梯度下降方向做了减小。然后,我们再想一下背后的物理逻辑:  当 reward超出b很多的时候,意味着朝着梯度的方向,大幅增加值,值的增加也就意味着修正了策略,使得这一个s-a出现的概率进一步增大(至于为什么,可以看程序以及交叉熵)。 如果reward值,大于b,但仅大了一点点,那么就是相当于小幅增加值,这也就意味着小幅增加了这个s-a出现的概率。 如果reward值小于b,那么相当于减小\theta值,而且是reward值越小越远离期望值b的时候,\theta减小的幅度也就越大,这背后意味着将大幅降低这个s-a对出现的概率。

      上述就是加了baseline b之后的效果,显然更合理。 当然了,有的时候,比如morvan的程序,在计算 baseline b的时候, 方式是 给每一步  reward值做 normalization,也就是每个reward都相当于减去了 该s下所有a的reward值的均值, 并且再除以标准差。

解读:   

 与q-learning系列不同, policy-gradient优化的不是q-table,而是直接优化 policy pai, policy是什么呢,就是针对每个observation的 每种action被选择的  概率!(注意,不是q-learning中的q值)。 

  那么,到底怎么优化 这个  s-a 对 的 概率值呢?   首先是方向,就是某种action获得的 reward值越大,那就希望这个s-a的概率值也增大,反之则希望这个概率值变小。

   那么,在tensorflow中布局好整个graph之后, 到底怎么定义  loss 来展开训练呢?   

loss的定义是这样的: loss= -log(prob)*vt                          

    (首先需要声明的是,这个log函数,在底是 0-1的情况下是单调递减,底>1的时候 单调递增,这里情况是后者,只不过loga x的x这里是概率值,是0到1之间的一个数据,导致整体log值为负)

    vt就是奖励值, vt越大, prob 越小, 则 最后的loss值会更更大, 这就要求我们立刻按照梯度方向,大跨步修正prob(增加prob值),以使得-log(prob)*vt 的值更贴近于合理水平。  注意: 其实梯度修正的最终目的是要获得一张 非常合理的 s-a 的概率表, 在这个概率表中, 能获得较大vt的好的action,其对应的概率值就越大(注意并不是最大的vt要成为1,那种贪心是错误的), 获得较小vt的action,其概率应该小一些。 

由于-log(prob) 是单调递减函数,也就是说,  prob越小,-log(prob)就越大, 就需要配上小的vt,其乘积才等于或贴近于 最合理的 s-a 概率表; 如果是较大的vt, 而又是较小的 prob,那么就要朝着梯度的方向大跨步调整 概率网。  同理, 如果是较小的vt, 那么就应该配上较小的 prob,乘积较为适中,才更贴近 合理概率网, 如果较小的vt, 配上较大的prob,那么虽然计算




作者:文哥的学习日记

链接:https://www.jianshu.com/p/2ccbab48414b

来源:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(policy-gradient)