Sources
这节课我们就讲解这个照片这个vocational的测梯度方法。上节课我们后半部分讲到的是deterministic策略梯度。它其实基本的使用方式是使用这个ten of grade形式。这个梯度链的形式,使得我们能够以这个链式法则的方法打通函数的输入输出,最终来对于策略的参数进行求导。这个方式其实它的一个背后的rationality就在于说我的action得是连续的,我才能对action进行求导。但当我的action如果是离散的,或者我的策略本身是casted,那这个时候怎么办呢?我们其实就需要去build在这个policy grade serum的这个基础之上。 当我们的policy grade serum当中的policy是一个深度的时候,我们应该如何去对付它呢?背后的关键的问题挑战在什么地方呢?很显然这个依然在value function当中,我们都会去致力于去解决very function。在学习过程当中,他没有办法直接去很好的去拟合这种所谓动态变化的背后的那个真正的价值函数。我们的policy其实也一样的,面临各方面的你和不准的挑战。在这个过程当中就会有相关的一些非常关键的难点,我们需要去克服它。包括最后我们要讲解的这个可信任区域优化和这个近端策略优化,这方面的一些最关键的科学问题。 这个科学问题解了之后,接下来这么多年,17年解完之后,到现在大家还是在用这种GPU的方法在优化。比如说ChatGPT背后的一些方法,直到现在其实仍然在很多落地的场景当中,这个GPU的方法它仍然是最容易work的,最有效的方法。N当然也很容易work,但DQ它必须得工作在有限的离散的action之上,它能够调通得到一个80分的效果是很快的。但是你要让它上到95以上,咱还得去依赖于当PPU这样的基于策略的方法。 其实前面的部分讲到PPU这个部分,它基本上就是固定的,那更加适合去我们在前面一半以基础的部分来讲解,我们首先来讲解基于神经网络的对梯度,这个非常快,应该很快就会破掉。我们前面讲解的基于策略梯度的定理。原因是因为我们的策略本身它是完全可以通过参数化建模的方式来去做一个approximate,不再是使用tabula的setting的方法。这样做的好就在于说我们只需要去更新我们的参数就可以了,不需要去对于我们的任何tabular particularly去做相关的更新。 这个riches sudden推出来的这个policy grade serum非常的漂亮。它是在于无论你是单步reward,还是average的value,还是第一步的value function,我们推出来结果都是一样的。也就是基于当前的这个QSA,as a critic去evaluate当前SA的value,我把它做成是对于当前policy要去拟合从S到A的映射的一个价值的这一个wait。通过这种方式我们就能够有效的去优化我们这几种目标函数,它的梯度都是一样的,当然也就意味着我们的这个目标它其实也是一致的。它只是说可能会有一些量纲上的一些映射关系而已。 于是当我的策略本身如果是一个具体的network构建的,如果说我们的action像DQN1样,它是一个有限的离散的action。那往往会使用的一个选择,甚至说是接近于唯一选择就是softmax。因为这个分布它可以去拟合任何形式的多项分布,所以说我们是完全可以Martino mal distribution去拟合到一个像柱状图一样的任何一个分布。在这个时候我们就拟合的就是FSA,故意不写QSA的原因就在于说它其实不一定是价值,它就是一个打分函数,F和西塔SA它F的西塔被更新掉了之后,那么我的派也就相应的被更新了。 然后还有一点就是说我们这个ST max的形式,它take grade很漂亮。尤其是它首先去做了log之后再take gradient的手,它会很漂亮。首先第一点就是sold max本身它是一个分母除以分子的形式。它take log之后,我首先对于上面分子去做log,减去分母做log。那分子做log之后就本来就只有FSA了。那它对于西塔求导的时候,就只有直接是FSA求导。 后续的话大家可以看到,基于一个大家应该已经比较熟悉的,我之前推过的一个推导方式的话。它其实也就是我首先对它求log,然后再take gradient。首先它变成是分子在这里面,每一项k grant,它自己再乘上它里面的FK grant。而这个加和本身它就是一个我基于当前policy,因为这个概率就是每一项选择A的概率,所以说它就是变成是一个policy选择每一个A的期望之下,我的F打分函数对于参数西塔的一个梯度的期望。所以在这个时候大家可以看到我们的max去求梯度的时候,先求log再求梯度的时候,它会变成打分函数本身相对于我选择出的action求梯度,再减去在当前的这个policy的分布之下,我的梯度的期望,也就是说是一个偏离期望的位置。减去期望本身,减去中间的中间点,它就会去形成对于这个本身的更新。 而右边这个部分的话,咱是完全有可能是使用例如海洋的方式去做一个miracle l的expectation。通过这种方式来实现它的。在我们的action space很大的情况下,它仍然能够去得到较为靠谱的一个算法。于是在这个时候大家可以看到,当我们已经转传递参数传递到SATA之后,这里面就是后像完全这里面的gradient就是我们的神经网络的BP算法。你的神经网络如何进行设计,它最终反正吐出来的就是一个分数。那么神经网络当中的参数就可以通过BP的方式能够直接的去做更新了。 回头讲到这里,我们就再次去对比一下我们的价值函数的方法和策略梯度的学习的方法,它之间的一个不同点。首先第一点就是说我们的价值函数学习方法,它是一个regression问题。但是当然它很艰难,原因是因为它的目标一直在变。但是它本质上是一个regression问题,它的目标是minimize TD error temple difference era。但是由于它的目标一直在变,或者说它的神经网络也不一定基于有限的数据能够完全拟合好它背后的真正的价值函数。所以说但凡我的q function没有你和好,它就有可能被policy自己所exploit。 比如说我们的Q方学完之后,我总得take action。那我take action的方式是什么呢?比如说是RCMAX over AUSA的形式,一旦你要这么做,那么就有可能被exploit。因为你的q function有可能会在某一些位置over estimate做出over estimation性质的发散,那这个时候你选择action就选错了。 但是策略梯度我们可以看到它的优化目标直接就是这个策略丢到环境当中去之后带来的价值。所以说它其实相比于q function而言的话,它的优化目标更加直接一些。它就是最终我要测试的时候,我想看到的那个指标。你训练的时候,你看到这个指标,毫无疑问这个指标肯定是更对齐的。但是毫无疑问它自己本身也是更难学习的。 Q function你用的材料出来数据之后做TD ara的这个learning,它就是个regression问题。但是在我们这个策略梯度上,你往往会需要去通过像是likelihood ratio,包括后面的这个采样的方式,对于我们的策略进行学习。这样的话就会带来学习不稳定性的一些额外的挑战。所以说相比于q learning而言的话,基于policy gradient theory,他的学习目标更稳定,但更具挑战。所以说我们需要在他学习的这个过程当中去增加一些额外的考虑,使得我们这个非常直接的目标才能够真正的被达成。以至于他最后的performance效果往往会更好一点。所以说我们往往都会有这样一张图存在。 经常大家会画这样一张图,就是如果横坐标是train的rounds,纵坐标是performance。比如说这个策略本身的一个average的return,或者说average read本身q learning基本上在前面的几步上就能够达到一个很好的performance。当然因为q learning本身它是基于r max的,所以说它其实学习的过程当中,它的震荡性是很明显的。原因是因为你的q function一旦梯度被更新了,你后续在做ACMAX做对TD target的时候它就会变。比如说它往往有一定的程度的震荡性,这个震荡性还蛮蛮高的,应该可能有这么高,大概是这样的信息,就是DQN。 但是如果说我们做policy gradient这一类的,比如说PPU或者是act critic的话,你会发现说他前面的一段时间或者相当长一段时间都在下面潜伏着,这是有可能的。原因是因为simply在act critic的这个架构之上,我们critic没学好,他没有办法指导好我们的策略。那策略不好,它采样出来数据也很一般。那critic其实学到的东西也是混沌,对吧? 但是一旦捕捉到了signal,critic开始起来之后,它就会带着act起来,最后它的performance往往会超过D变量震荡程度,往往它还是会比这个EQ要小的。原因是因为它其实最终是基于critic本身和去指导我的actor action直接给action,而不是说像QEQN当中,我最后还要去选根据Q方案去选action。为什么?最后会比DQN的值更高呢?原因现在目标其实更贴近于我们Y轴想要的这个目标,它就是直接就是这个目标。而DQ的目标是minimum m different era,它跟我们的policy方法是不一样的。 所以说其实大家可以看到,如果说我们想在某些方向上尽快的做出强化学习落地。如果你时间很紧迫,那你就上elephant去类似方法。但他能达到80分水平,你要达到95分以上的水平,咱还是得上这种base的方法,act credit base的方法。如果说你的时间很不够,你就插在这个位置的话,把程序掐掉了,对吧?那你就没有看到这个后续抬头的可能,这个其实是一个trade off的。 以前我跟迈克里的同学交流,经常说以前的算力也不是很够,跑一个实验到三周,我一般两周的时候就把程序掐掉了,根本没抬头就掐掉了。觉得肯定是自己的问题,肯定是我哪里写错了,于是就掐掉了,对吧?其实会发现说第三周才会渐渐起来,这个都是一些很很信仰性的问题。对,这个也是。但现在的话我们往往不会这样子,算力也会更强一些,各方面优化pick也会用的更多一些了。往往他work不work,往往会在很快的时间就会被看到的。我们接下来就要讲一个简单的算法,AC3C算法。 复习一下之前的actor critic,它其实有两个模块,它是强化学习当中的一个非常有代表性的早期的强化学习框。一个actor专门去take action,一个critic专门从当前的action上,当前的actor上去寻找的本职工作,或者表面上的工作是去做estimation。但其实它是有一个更加底层更本质的工作,叫做寻找策略提升点。到策略提升点,它才能够帮actor真正去完成策略提升,通过policy great的方法去完成策略提升。所以我们往往会说我为啥一定要做一个accretive,或者我为啥一定要做一个双双多久的方法?原因就在于你一个network让他完成两份事情,那其实它的可能两份事情都不一定完成更好。而使用这一个module的方法,你可以发现,首先第一点,它每个network的oppian ation的objective完全不一样的。Critical minimize ten different error. 寻找到策略提升点,actor优化此策略提升的价值。所以说我们才会使用双模块的。此外让我们复习这个advantages,这个act critic前面加了一个advantage function。它的目标也就是说是希望通过减少去一个极限函数来标准化critic的打分。这样子做我们其实优化的效率会更高。还有另外一点重要的优势就在于是说我使用了advantage critic之后,我们其实真正在学的时候使用到的就是v function,而不再使用q function。它也有极其重要的一个价值,因为q function本身不容易拟合好的,但是v function它只需要take in的是S就可以了,它会更容易去拟合。 好,A3C的话前面还会再带上一个CA叫做具体的异步性的操作。Cyclical advantage act critic, 它的意思就是说我们其实是希望能够提供异步式的这种AC的更新,发展到那个那个时间点的是节骨眼上的时候,他就发现说训练一个我在任何一个游戏当中训练一个AC算法,我往往会需要去不断的。因为AC算法它其实on policy learning的算法,它是当前的act和环境采样。然后马上去听了我的critic,找到策略提升点之后,马上指导actor去做策略的提升。所以说我是需要大量的并行性的,使用当前的actor去采样出相应你的数据,要用数据去调用好我当前的critic,然后马上去指导我当前actor进行变化。Actor一旦进行了变化,那么接下来就马上需要再去采集大量的数据,最后去再次去听我接下来这轮的critic。 所以说从架构层面上来讲的话,这个deam man团队又又发明了这个架构。其实非常简单,我在我看来和这个一般的premature server没有太大区别。模型能力当中有一个架构叫prime server paper的第一作者是我们AM80304自己的铃木。当时这个primate server这种架构其实在mine learning的这个community里面,其实已经是比较流行的架构了。只是说李牧当时从百度硕士毕业之后,交大本硕毕业之后,去百度做少帅,然后两年之后从百度离职。 他当时的在百度做的一个主要的工作,就是把他的学长戴文渊那套超大规模的逻辑回归给他做成primary server。这样我们不一定我们可以去采用异步更新的方法,来去更快速度的去训练百度的那个千亿或者万亿级参数的逻辑。C reversion是一个非常重要的一个工作,其实业界有很多类似的实现,但是李牧那篇工作他后来在CMU的时候和他的导师alex莫拉发表出来,发表在OSDI上。这个是一个非常旗舰的一个system的会议。 最后的这个架构其实被使用在了A3C的这个方法当中,大家可以看一下它是怎么做的。既然是A,它就是异步更新的方法对吧?大家可以看到有我们有一个global server,它其实是每天了一个global version,或者说就是同步的version。真正同步的version的这个policy派和VS这两个,也就是AC的这两个模块对吧?其实这个模块本身的话,它其实也是可以通过我同时去只是输入一个state去处理完了state的一个representation。 Learning之后我出来两个头,一个头是出来的是价值VS另外一个头出来的是pas pi因为它的输出值其实是每一个action的概率,所以说它也是一个多维的一个输出,对吧?那这样一个架构的话,我其实是可以拷贝在多个N个worker的服务器上。每个worker干什么呢?他其实在他自己的机器上和环境这个拷贝的环境进行交互,去产生大量的数据。基于大量的数据才能做局部的AC的gradient。 但是大家要注意,plant server当中其实传的是gradient,对不对?也就是说我的worker我可以去在本地计算出一个grade。也就是说这个worker我在本地基于当前的参数往往是什么呢?这global server当中我会有个参数data,我把这个data铺到本地之后,我这个F我们在本地区本地的数据取minimus当时的损失函数。损失函数得到之后,我们会得到一个gradient of sit grade of这个ata之后,把grand push回原来的这个manager的server之上去。这样做的好处什么?因为grade是以加法的形式叠加在参数之上的,所以说有的鬼脸先来,有的鬼脸后来我就当成是不同的mini bench,先训练这个,后到这个。 但是毫无疑问,它还是会存在带着一定的不一致性。因为grade本身得是站在当前的参数上,我去过了一些数据,我得到gradient。但是从global server的角度上来讲的话,其实应该是大家都收集回了当前我参数下达到每一个worker之后,得到每个worker的graden之后,一起更新了当前参数之后,我所有的worker再去铺下去。当前version的参数在这种情况下就是完全的是一致的那当然也有可能它可以去实现成完全异步的。有的时候它就会有一定的不一致性,如果不一致性很大的话,就会导致训练失败。 但是这个其实还是比较成熟的技术,只是我们用在了这个A3C的架构当中去。那相应的这个算法块我就不讲了。其实也就是我们刚刚提到的这种架构。这种架构它带来的好处就是说我可能会去使用大量的CPU的server去代替一些我们当时认为很快的单节点GPU server。大家可以看到它的这个performance,它其实完全在GPU上去跑A3C算法。它其实是可以在当时去对比这个NVIDIA k40的GPU的server的。此外它能够达到一个更好的performance,使用的是16个A3C使用的是16个CPU和没有GPU。 但其实现在的话我们不一定真正白in,原因是因为现在的CPU的性能又又进一步的提升了。此外的话也会有更好的一些架构。如果说我们的一些环境,它都像ISAC jim这样的环境,它也完全进入到GPU当中去做采样的话,那就没什么CPU的事情。只是说有的环境,比如说某一些定位关注的一些游戏环境,它就是CPU做引擎去驱动。它必须得进CPU那行,那确实得使用这个CPU和GPU协作的这种架构。 随着后来的阿尔法star demand去训练星际争霸来使用的那个架构。我没有记错的话,应该是使用了一个10万CPU1024GPU的这样一个架构,来去把这个信息生态的很棒的JI给训出来。他其实前面讲的东西都是准备工作,或者说是一个前序引导工作。他并没有touch到policy gradient在深度这个架构当中的一个核心的痛点。 那么核心的解决关键科学问题。这关键科学问题是啥呢?其实就是我们需要去touch到的点就是在于当我的策略本身做策略梯度的时候,我这个策略如果是深度神经网络,它到底有什么样的问题存在。可以看到reinforce这种算法或者是PG的这种算法,它对于我们寻找到了一个数据之后,我们对于每个数据都可以去做这种策略梯度的优化。但是你会发现什么呢?你会发现说这个策略梯度到底靠不靠谱,或者说它背后的这个违停的主要量值GD它到底靠不靠谱,其实是一个question mark。 但凡它不靠谱,而且是什么呢?我的策略本身。因为它是一个policy,我们做策略梯度的这个公式,它很可能中间会有问题,或者说有不稳定的情况出现。因为这个策略本身它是一个深度策略,它其实里面就是一个sop max包一层里面是个打分函数。那个打分函数网络它很有可能是多层的。 你在这中间去take grant,它很有可能走到了一些比较错误的方向,或者说这一个方向是对的,但是它没有告诉你不长。所以说就像是我们动手学强化学习的这书里面的插图一样。这个机器人和agent它希望爬山,它相当于什么平面?就是它的grade,它的参数的平面。纵坐标相当于这个高度,就相当于它的派塔的这个j function,就是它的这个目标值,它的策略的价值,在这个时候会给你一个方向去走,没有问题,相当于你低头看路,这个拐点的是这个方向。 但是你计算出来这个方向之后,你接下来这步是什么?就是鬼脸的乘上一个步长,把自己的参数更新。所以有可能你这一步就踏空掉,然后就下去了。你醒来的时候发现自己已经又在山脚下了,或者是已经在悬崖下面了。在这个时候你再去采数据,你又采的是很低质量的数据。因为你这个时候策略本身已经是非常接近于random的,或者是更差的策略。你采出来数据又很低质量,那这个时候你又会进入到一个下降式循环当中去。就是我们其实真正面临的策略梯度,在深度策略架构上它会碰到的一个本质的问题。 所以说怎么解决呢?也就是解决的一点就是说我们其实可以去通过数值优化当中的一些方法,能够保证是说有没有可能我沿着这个方向去走,我保证的是不掉下去。于是在这个时候,我们往往会去考虑到的就是一些像二阶的这种管的方法。一只是告诉你一阶的方向,这个方向走是最好的上升方向。他没有告诉你说这个方法你能够走多多远的距离。如果说我们有一些二阶的方法的话,它其实会给你告诉你划定一个圈,这个圈里面你不要出去,一旦出去但是我就没有办法保证你是单调递增的了,或者说以很大的概率保证你是单调递增的,你有可能就掉下去了。这就是超越梯度的方法的一个本质的理解。所以说这个方法叫做trust region policy optimization。 在这个时候,其实大家用到了一个词,也是open a的人提出来的,叫做policy optimization。它前身当然是bury Peter a bill跟他们提出来的新词。因为policy great已经在这个deep mind这边去使用在了determined policy grading上面去。而更多的如果我们要对于policy本身的价值直接去做出优化,我们可能会使用另外一policy optimization。直到现在DRPOPPO这样一些policy optimization的算法,其实大家已经耳熟能详了。于是在这个时候我们要推导这个past region在trust region当中怎么去做好,什么叫在translation当中如何去做policy obligation。 我们就得从头开始去理解,在这个policy的目标之下,我能够碰到一些什么问题。所以在这个时候,我们首先对于我们的优化目标去做出一个数学的定义。优化目标很显然就是policy在一个episode下能够取得的return的期望。那么它每次交互它的episode的这个data都是不一样的,那我们会对它进行求一个期望。第一种表示形式也就是每一步我得到reward,当然会对伽马T次方去做一个加和去得到一个目标。 还有另外一个目标其实更简单,也就是我站在当前的第一步。S零的这个位置,我们如果能够精准的去估计在V派西塔的这个派之下,它的这个价值是多少。就是在S0的价值,它通过定义就直接是上面的这个位置。我站在第一步,我接下来能够获得的return the policy pa我就能获得return的期望是多少。所以说这两个定义是完全等价的。 定义有一个简单的推导,这个推导的意义是在于说我们要去重新审视,说我们站在了当前泰西塔这样一个位置,希望能够去往拍data pride这个位置上去走。我们接下来到底要预测我们的这个价值,我们的商业的价值目标函数,它到底有哪些变化,有哪些不便。推倒本身其实不难,也有点枯燥,对吧?大家可以看到中间的这个推导的步骤,基于今天的这个时间关系的话,我们就直接看结论,这个结论是什么呢?这个揭西塔的就是说我走到了,我减去接这个时候是已经有的,就是说当前策略是拍西塔,我采样出了一些数据,我基于这些数据对我自己的policy pie去做出了更新,走到了pi data。 站在CR prime的基础之上,我们的价值和原来的这个派西塔的价值,它之间的相减的关系,它得出了一个结论是什么呢?就是expectation。这个轨迹是从新的拍prime之上去采样出来的。在这之上我们可以看到原来的这个m step t等于0一直到正无穷T次方,在这个时候大家一定要注意拍西塔,就AAT和这公式啥意思呢?大家可以看到我们要优化的目标。现在是我站在data的这个位置采样出了data,我希望走到的是基于这个data去就这是sample。我sampling perform sapling,perform optimization, 然后走到了tata pride这个位置上去。 但是基于上面的这个推导大家可以直接去展开它去推,直接是根据定义直接展开它去推就可以了。得到的是这样一个目标,这个目标当中这个位置已经是固定的,它它已经是fix的。因为我是站在了这个data的位置去去采样数据,得到数据之后,我去优化,得到的是拍拍pata pre它的大值减去原来的这个固定的价值,值得到的是这样一个值,这个值是什么呢?大家可以看到新的数据分布,这个data provision是在新的数据分布之下。但是我这里面的advantage function是老的really function,也就是说我是希望能够站在新的数据分布下去。得到了一个调节。Actually也可以说是得到了一条SA的这样一个新的SA的pair的distribution,是以follow这个新的policy,由occurence mary采样出来的。我只需要去在老的这个a policy上去看到了这个advantage就可以了。 这个有点像什么?有点像我们当时推policy推策略提升的这个定理的时候,你只需要站在老的这个q function之上去看当前新的policy做了一步的操作之后,它是不是有相应的策略提升的评估,去评估老大哥。评估的意义是什么呢?它其实的意义是说我就这一步是follow新的policy,我接下来这一步,我之后的部分都是follow老policy,然后得到了value。我们是不是有更高的一个提升,是往正向提升。 但是你可以看到在这个时候我们采样的数据采样的时候其实是希望能够从新的data Price的这个位置上去采样出来的数据。但是毫无疑问没有,因为我们算sa gradient的时候,肯定是怎么算的呢?有一步肯定是data加上erne rate,某个东西对于data的grade。在这个时候我们算的时候,这个数据是站在data的这个位置才出来的数据。因为CA Price是啥咱都不知道,现在SATA位置你有数据你才能算gradient。 当你得到了seta Price的那一瞬间,西塔这个数据就变老了,对吧?这数据就是别的数据。所以说在这个时候你会发现说我们不得不去考虑一定程度的近似,否则的话这个不方便采样的问题就会一直存在。左边的这个部分倒是还好说,因为你是站在了data的这个位置上,我去evaluate它的advantage。于是我们就做出了一个相应的一个简化操作。 这个简化操作很简单,也就是说我们其实这个occurence cy measure,其实这个trajectory当中大家可以看到它是有这个伽马T的对吧?这个gama t它其实就是oculus asure当中的,我第七步我有刚刚T次方的衰减对吧?其实我会站在我们会sample到这个ST的这个位置上,我再去采样出我的AT但在这个时候大家可以注意,本来我们如果严格按照上面的这个式子,这个trajectory是新的policy采样出来的时候,我们的action毫无疑问是应该是follow新的policy采样出来的action。但是由于我们没有这样的数据,对吧,我没有这样的数据,我们只能去follow老的policy去做出相应的采样,这是第一点。一个SD没一个问题,一个近似。还有另外一点,也就是我们得使用的是这里的state,也是使用新的policy才能得到新的state。 这等式我们为什么没写成是这个不等式或者是约等式呢?原因是因为我们会做出了important sampling采样,在一步的基础上做出了你普通的350采样。于是在这个时候大家可以看到我们唯一需要去拟合的,唯一需要去做近似的,就变成了最前面这个部分。就是说我在新的policy下,我要采样出一些state的分布,得到一些state的分布。我们能不能使用旧的policy去对一个C的分布去做出一个估计呢?答案是你就直接使用旧的policy的state分布可以了。 只是说我在still state分布上得到了state之后,我们用新的policy去对于原来的state之下,我们选择action a我可以去做一步的important sampling就可以了。所以大家可以想象是什么呢?我们其实之前学oculus r和policy被一一对应的关系的时候,比如说这policy它其实可以对吧? C其实是等于什么呢?是等于柔派S再乘上condition of在S之上。那如果我的policy变了。毫无疑问,这个位置肯定是直接就变了,变policy变了,它肯定会变。 但是因为state是什么呢?是多步之后aggregate到的一个state,它变化的趋势往往会比派自己的变化的整改性要稍微弱一些。并且我们在做一些分析的时候会发现说他还会我们虽然不会有有的时候它不会直接的变掉,这是一种情况就是说我每次我part变了一点点,那每一步我都可能正好我的action没变,这是有可能。还有另外一种情况,就是我脱离了原来的take the action之后,我还mistake类的回到了当前state,回到了一样的state,这是也有可能的这两者一结合,你会发现说证明出来这两者这个派prime ST和派西塔ST它们两者的这个概率的绝对值的差值是可以被一个2 ipsn t绑住的。也就是说我们其实如果ipsn就是这个ipsn就是他们之间的这个差距值足够小的时候,咱这个差距值是能够认为它也是不大的这是一种近似。 这种近似其实经常会出现在这个off policy的方法当中。也就是说我state的分布是不管它变没变的。比如说DDPG当中,我们其实是从replay buff当中采样出了state,但是我们并没有去管这个state和当前policy。它采到state的这个important samp ratio,我们这个state我们姑且来有,我们站在这个city作为基础之上,我们在更新我们的policy的时候,我们用important sample ly去做好原始的和现在之间区别就可以了。只是说在我们接下来要考虑到的点上,会发现说老的policy永远是之前那一部的policy。如果你说之前十部的policy要保留的话,那这个确实你保留的东西实在也太多了。 所以说有的同学会问我们接下来讲的P或者是TRPO它到底是on policy还是off policy?说他是on policy,他好像又又做了important sampling。说他是off policy的,他只使用了一轮的数据,这一轮的数据更新完之后他就扔了。我的回答往往是,它是一个考虑到了important sampling的on policy算法。原因是因为你即使是on policy算法这一步更新完了之后,你为了考虑所谓的那个一脚踏空的情况,你肯定得考虑我一步更新了之后,走到那个位置还是一个怎样的情况。考虑important point就能够帮助你考虑到我一步走过去之后是踏空掉,还是真正的踩到了地面上。 他真正的提升了自己的价值,所以说接下来的话,我们的更新方法通过我们刚刚所说的,将这样一个state的分布直接使用老策略,就是派西塔采样出的策略本身,采样出的state本身直接用它来代替新策略下的state分布,但是对于action我们不放手,我们做了一步的important sample ling。纠正这种方式的话,最终我们就得到了我们的优化目标。我们优化目标是什么呢?当然是站在西塔pi ta的基础之上,采样出的数据去优化pi SATA Price我们的这样一个目标。那这个目标为什么会这样写?首先第一点就是说上面的这个目标优化目标式子就是我们刚刚推到的这个目标式子。S的数分布仍然是原来老的策略采样出的S分布。然后后面的彩A的分布,我们做了一步的important sampling。 做完important sample ing之后,这个action这个advantage function还是用老的,这是我们推导出来的结果,但是我们要做好这件事情,我们的目标肯定是我们的assumption肯定是前面这个assumption。就是说你但凡在这里你敢用拍prime就是新的拍换成老的牌,采用出的数据分布,你一定是不希望当前的策略和老策略差距太远的。差距太远的话,其实这一步就没法保证就失效了。这一步因为你POS你一定得更新,所以说你就一定会出现sample的这个比例,这个没有办法,但是我们的state可以去通过我改变的速度比较慢去完成我的这个state上用老策略的state不做import sampling的这个目标。这样子的话,我们就需要在我们的constant之上加上一个其实就是像trust region这样的一个约束。约束是什么呢?就是我们在一个state上面,原来的policy派西塔和现在的新policy python Price,他们之间的KL divergence不要超过一个阈值就可以了。那这样做的好处是什么呢? 就好比是说你在爬山的时候,我给你画一个圈,唐僧不要走出这个圈,走出这个圈就可能就会有很大的危险,但这圈的大小咱咋咋定呢?就是可以去根据KO divergence它背后的那个二阶的gradient来去定后续的这个推导。它其实是以将这个目标以泰勒展开的形式,在使用的是这个功能梯度的方法来去求解。这个方法的话其实也比较detail,我们放在我们的教材当中供大家去参与它的details。 实际使用的时候,其实因为TRPU出来之后,很快就使用了一个比较practical的方法,叫做constant wireless s penalty的方法。也就是说把constraint转换成penalty去不要让它获得更太多的penalty,让constant更多是一种比较软的方式去更新。这样子做,我们就可以以这种as penalty的形式,把constraint像就跟拉着两个橙子一样,把它放在这个惩罚项当中去。这样的话我们就没有constant,直接对其进行更新就可以了。所以这个就是TRPU的原理。 LPU原理也就是说我们在每一个位置,通过计算当前这个位置,我们具体去计算的时候,会考虑到一些像海森镇一样的一个具体的周围的曲率。你考虑到曲率之后,你会发现曲率越大,或者海森镇二阶导的scale越大,说明你特别容易踏空。因为你周围的曲面非常有趣的那你这一步graden过去,你的步步长就得小。如果你你周围是很平坦的,你曲率没有,你就是平路斜路。在这种情况下你就大踏步往前走就可以了,保证你别掉下去。 但是在一定的这个证明的情况之下,它就会有单调性的保证。也就是说我们这个kill divergence它乘上C之后,它其实能够被我们的新的CJ ta Price。它可以被我们的优化目标值,这个就是surrogate目标值减去了这个KO divergence,作为lower版所所做保证,啥意思呢?就是说我的目标如果是要提升j SATA Price的数值,但是我不好意思,我只能去优化lt这里面是seta prime就是我们刚刚说的这个surrogate的优化目标。我得被放得住在什么位置呢?这个data和data print有一个C乘上,一个常数项C乘上,这两者之间的killed divergence,就这俩policy之间killed gins的这样一个差距。所以说当我的kill diversion很小的时候,那么我优化我的西塔,我我我优化我的L这个sea gate的时候,它就会很靠谱。 因为你西塔divergence很小,优化的策略本身它的步数也会比较的步长也会更小一点,就更加的保守一点。整体而言的话,大家可以看到就是右边这张图,我们要想优化的目标在这儿,我们想要优化的目标是这个j ta prime,这个是j data prime。但是我们其实只能通过一个sargent方法去优化的是目标。但是我们可以发现说,如果说我们优化的这个目标,它是西塔减去C的KL,那么我们其实优化这个目标就可以了。 我们大家可以看到,当在这个点上的时候,西ta等于熙ta Price的时候,毫无疑问三条线是一致的。我往上去走的时候,因为我优化的是最低的这个lower bound,走到这个位置的时候,我其实保证的是原来西塔是在提升的。我走到这个位置之后,我再去找一个切线,我再去优化它。这个有点像EM算法当中的化的方式,使得它最终能够不断的在这个monotonic al improvement的galtee之下,走到这个山的封顶。 这个就是我们为什么特别需要去强调优化的时候的monotonic guarantee monitor ic improvement guardie。这就是因为我们但凡走一步,整个ship function的shape就发生了改变。我们就像摸着石头过河河一样,你每摸一步,你得保证你这一步踩下去,它是比原来更往前走的,而不是掉到坑里面去。这个也正是强化学习的一个优化的一个难题点。如果肆无忌惮的去优化的,你每走一步这个山峰的峰形都变了,你再往前走一步又又变了。像这个风行之下有一个非常坚实的lower bound存在。我们在lower bound上进行优化,保证我每一次我的目标值都能够被提升就可以。 所以这个TRPO本身它其实第一次被发现出来之后,获得了非常多的关注。它还会又有一些额外的训练的一些road贝塔的一些,比如说在一个S的位置,我roll out不同的action,然后采样得到不同的action的pay。这样的话它更好的能够去鉴别在一个state之下,我们能够去选择哪些action我会更好一些。而不是说我只是single的这个branch的话,效果会不如这个blind葡萄树式的优化的方式。就是我我在一个state branch out多个check在一起,通过收集相应的数据进行优化。 TRPU本身的话其实大家可以发现,它就解决了最关键的一个点。就是说我的策略一旦被更新,他就有可能适得其反。原因就在于说你不知道你这个策略一旦更新的这个步长应该是多少。非常小没有问题。策略的基本上它的概率,它的价值就会提升。但是太小的话,我们又没有办法甄别出策略之间的区别。你采样的数据又浪费掉了,它的效率会非常低。TIPU就解决了这样之间的一个矛盾点,使得它能够变成是一个非常可以说是靠谱稳定的策略提升的一个算法。 后来的话这个TRPO的第一作者就从berkeley毕业之后,跳到了OpenAI的第一个工作,就是PPO算法。后来这个PPU算法已经edition已经大量超过这个TRPO算法了。原因就是因为它大量的简化了TRPO当中的一些数学的难度。是它的效果一方面更好,而且它实现也更加的方便一些。这个我们下节课有一些时间再进一步讲解。
Podcast Editor
Podcast.json
Preview
Audio
