policygradient的简单介绍
策略梯度方法(Policy Gradients)
策略梯度方法(PG)是强化学习(RL)中经常使用的算法。基于值函数的DQN算法通过近似估算状态-动作值函数 来推断最优策略,而策略梯度方法则是直接优化策略。
策略梯度方法的目标是找到一组最优的神经网络参数 最大化总收益函数关于轨迹分布的期望
首先,定义我们的目标函数为:

显然,直接求上式的梯度是不可能的,原因如下:
因此,需要公式(2)变形,现在令轨迹的收益 , 则目标函数可以写为
我们假设 的分布函数 是可微分的,那么根据期望的定义,
它的梯度为
存在下面的一个恒等式:
将该恒等式带入公式(5)得到
策略梯度可以表示为期望,这意味着我们可以使用抽样来近似它。接下来我们谈谈如何计算
由Markov性,一条轨迹 出现的概率是
方程两边同时取对数,可得
由于 的值仅仅和带有参数 的项有关,那么
最终,目标函数的梯度变为
在从实际系统中抽样时,我们用下面的式子进行估算
接下来,我们便可以使用 来更新参数
是最大对数似然。在深度学习中,它衡量观察数据的可能性。在强化学习的背景下,它衡量了当前策略下轨迹的可能性。通过将其与奖励相乘,我们希望如果轨迹导致高的正奖励,则增加策略的出现可能性。相反,如果策略导致高的负奖励,我们希望降低该策略的出现可能性。
策略梯度方法的高方差问题: 由于采样的轨迹千差万别,而且可能不同的 action 会带来一样的 Expected Reward。如果在分类任务中出现一个输入可以分为多个类的情况,梯度就会乱掉,因为网络不知道应该最大化哪个类别的输出概率。梯度很不稳定,就会带来收敛性很差的问题。为了解决这个问题,提出下面两种方法:
1.修改因果关系: 因果关系指的是,当前时间点的策略不能影响该时间点之前的时间点的所带来的收益,这个在直觉上很好理解,今天老板看到你工作努力想给你奖赏,老板不会给你昨天的工资加倍,只会给你今天的工资或者未来的工资加倍。
在公式(12)中便存在这样一个问题,在时间点 的策略影响到了时间点 之前的时间点 的收益。因此,对公式(12)做出如下调整
其中,我们把 称作 “reward-to-go” ,意为“之后的奖赏”。
2.引入基线: 首先,引入基线后的梯度的形式为
其中, 是一个常数。接下来在数学上证明其合理性
策略梯度方法的样本效率问题: 策略梯度法是一个在线 (on-policy) 算法,这是因为在计算策略梯度 的时候所用的数据都是在新的策略下采样得到的,这就要求每次梯度更新之后就要根据新的策略全部重新采样,并把之前的在旧策略下采样到的样本全都丢弃,这种做法对数据的利用率非常低,使得收敛的速度也极低。那么如何有效利用旧的样本呢?这就需要引入 重要性采样 的概念。
将重要性采样的原理应用到我们的目标函数,则满足以下等式
由公式(8)可知
现在,我们求目标函数 的梯度,
最后像前文所述,通过修正因果关系和引入基线来减小方差
但是,这种形式也是存在问题的,上式中中间那块连乘部分的数值,是关于T指数增长的,如果每个数都略小于1,而时间轴非常长,这个乘积最终将非常接近于0,这样梯度效果就会很差了。
为了解决这个问题,我们可以重写目标函数的形式,如下
进一步展开可得
这样我们便可以在两个层面上做重要性抽样了,最终形式为
但是同时又带来了一个新的问题,那就是需要知道在新的给定策略下某个时刻在某个状态的概率 ,我们一般将 这一项忽略,因为当两个策略足够接近时,这个比值近似为1。
引入“折扣因子”的目的是让奖赏r有权重地相加,让最开始收获的奖励有最大的权重,越往后面权重越小,因为距离当前状态的越近,影响越大。前边的公式也将相应地做出调整。
策略梯度地公式修改为:
参考
policy-gradient
参考资料 :
1.
2. (尤其是这个, 包括引入 base line,对应的正好是 reward的normalization)
基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然后根据价值贪心的选择动作。如果我们省略中间的步骤,即直接根据当前的状态来选择动作,也就引出了强化学习中的另一种很重要的算法,即策略梯度(Policy Gradient)。这篇文章,我们就来介绍这种算法的最基础的版本以及其简单的实现。
本篇文章的大部分内容均学习自莫烦老师的强化学习课程,大家可以在b站上找到相关的视频:
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,那么虽然计算
链接:
关于Policy Gradient的理解
虽然前段时间稍微了解过Policy Gradient,但后来发现自己对其原理的理解还有诸多模糊之处,于是希望重新梳理一番。
Policy Gradient的基础是强化学习理论,同时我也发现,由于强化学习的术语众多,杂乱的符号容易让我迷失方向,所以对我自己而言,很有必要重新确立一套统一的符号使用习惯。UCL的David Silver可谓是强化学习领域数一数二的专家(AlphaGo首席研究员),他的课程在网上也大受欢迎,因此我接下来用于讨论问题的符号体系就以他的课件为准。
在概率论和统计学中,Markov Decision Processes (MDP) 提供了一个数学架构模型,刻画的是“如何在部分随机,部分可由决策者控制的状态下进行决策”的过程。强化学习的体系正是构建在MDP之上的。
Value function也是MDP中一个非常重要的概念,衡量的是从某个状态开始计算的return期望值,但容易令初学者混淆的是,value function一般有两种定义方式。
一种叫 state-value function :
另外,如果仔细观察 return 的定义
强化学习的一类求解算法是直接优化policy,而Policy Gradient就是其中的典型代表。
首先需要讨论一下policy的目标函数。一般而言,policy的目标函数主要有三种形式:
以上的
虽然这三种目标函数形式不同,但最后分析得到的梯度表达式都是一样的。
对目标函数求梯度会用到一个很重要的trick,叫 likelihood ratios :
目标函数就采用上述第三种的形式:
有个叫 Policy Gradient Theorem 的理论表明,无论采用上述哪种目标函数,在多步的MDP下,都有:
策略梯度(Policy Gradient)
强化学习方法主要分为两类,一类是Model-based,另外一种是Model free,如图所示:
而Model Free中又包含两种方法,其中一种是基于策略的角度考虑的方法,而Policy Gradient则是Policy based的基础方法。Value based的典型方法则是Q-learning方法,Actor-Critic则是Value based和Policy based方法相结合,它拥有两个Networks,分别是Actor和Critic,Actor使用Policy based的方法,Critic使用的是Value based的方法。
公式如下所示:
推导过程如下所示:
其中,s代表state,a代表action,pi代表我们的policy策略,也就是一个policy network,输入是state,输出是一个action,R代表Reward。
该Deep network的框架如下所示:
该网络输入为当前的状态(如游戏画面,五子棋的盘面等),输出则为各个Action的概率(假设总共有3个Actions)。因此,Policy Gradient公式可以理解为在当前State的状态下,采取不同Action的概率乘以其相应的权重,也就是其Reward。
1. Reinforcement Learning An Introduction
2. 李宏毅.DRL Lecture1
3.
强化学习中valuebased和policygradient的区别在哪里
,
off-policy和on-policy的根本区别在于off-policy学习的policy和agent实际执行的policy并不相同。虽然看起来很trivial,但这给了off-policy极大的发挥空间,使RL有能力做knowledge representation。假设有一个机器人在地面上行走,我们想知道在某个状态时如果机器人停止动力系统,需要多久才能完全停下来。我们可以构造一个policy,action永远都是停止动力系统,reward是每个time step为-1,那很显然在某个state下机器人停止所需的时间就是在我们构造的这个policy下的v(state)。我们可以有很多类似的问题,同样我们需要构造很多类似的policy来回答这些问题。这些policy的value function一般称作GVF(general value function),可以作为knowledge representation。但问题在于怎样学习这些policy,由于数量巨大,显然不可能对每个GVF进行on-policy的学习,此时便可以利用一个exploration很强的behaviour policy进行off-policy学习。
希望对你有帮助~
