本实录是根据“博文视点在线课堂”线上分享内容汇总整理而成 分享嘉宾:冯超 相关图书:《深度学习轻松学:核心算法与视觉实践》
我们再回到这张图上,我们如何去计算呢?我们就需要把这个问题去做一个推演,我们刚才其实已经看到了有那么一个序列,那个序列就是环境给我们一个状态,我们产生一个行动环境,给我们一个状态,我们产生一个行动,这样不断交替的,那么实际过程当中我们是什么样的一个状态呢?我们可以看现在这个画面,就是说如果我们在时刻1的时候环境给了我们一个S_1,那么我们这个时候也能拿到一个S_1状态下的一个Reward的就是S_1状态下的回报,拿到了S_1我们刚才说从S要变成A了,这个时候我们要涉及到我们自己的策略,那么我们就可以算一下。基于我们当前的这个策略,我们可能会产生很多的行动,也就是各种各样的A。我们对于产生从某一个状态到某一个行动,它会有一个概率,那么根据概率我们就会产生这样种种的A,然后这些A实际上每个就是因为有一些概率,它会有一定概率去产生的,但是每一条路都是有可能会走到的。刚才我们说我们从S_1走到了A_1了,然后A_1有好多种选择,如果我们选择了某一种,比方说我们选择了上面的A_1的第一种方案A_1^1,那么从它开始,我们Agent走完走了A_1^1这种策略这种行动那么就把这个行动发给了那个环境,然后我们还可以想象刚才的那个图片那个Agent和Environment的交互,当我们把Action发给了Environment之后,Environment要进行State Translation就是它要把状态做一个变换,根据我们刚才想象的那个用形式化的方法定义概率的形式,我们现在已知S_1和A_1,那么S_2又会有很多很多的形式,我们也在这列出来了。
然后因为S_2有很多种形式,又根据S_2我们同时也会放出一些回报来,就是针对S_2状态那个环境的同时也会给我们一个回报,然后整个这个过程我们也可以用像Flappy Bird这样的一个游戏去表示。S_1就是某一个世界就是世界的一个情况。然后我们从S_1到A_1是我们有一个策略,我们有一定的概率会产生某种行动,对于游戏来说,我们就是跳一下或者不跳,那么我们就是这两种操作。假如说我们跳一下的话,那么根据我们跳一下和当前状态的状态,这两种结合起来的这个游戏会进行到下一帧、进行到下一个状态,那么就进入到了S_2这个状态,同时如果当前我们要是穿过一个水管,那我们就加一分。我们实际上就会发现。当我们进入到S_2的时候,由于我们这个序列的关系,而且不断轮回的关系,我们实际上又回到了同样的一个问题,站在S_2每一个状态的时候,我们该产生什么样的决策,而每一种决策会产生什么样的未来的价值,我们还要回到原来的问题,怎么样把长期的这个回报最大化,长期的收益最大化,所以站在S_2这个角度我们同样是要考虑这个问题,那么站在S_1的时候我们也要考虑这个问题,那么看上去S_1和S_2这两个时间我们都要考虑这个问题。这两个问题之间有没有什么相似性呢?我们看最下面的这个,那么我们就可以把刚才的东西全部做一个规约,就是说我们现在需要考虑一个事情,当我们处在某一个状态的时候,我们未来有可能会得到什么样的一个长期的回报,于是我们把刚才上一张图片当中所有的Reward的那个地方全部换了,我们换成一个叫做Value的东西,就是说我们站在这个状态的情况下,我们未来能获得到什么样的收益。于是乎我们把刚才所有的都换掉之后,我们发现实际上这个问题有一点自回归的性质,就是说我们站在S_1的状态下,我们可以算在S_1状态下未来的一个长期的回报的预期,我们站在S_2状态下也可以计算长期回报的一个预期,那么我们就可以把两部分结合起来,那么我们把刚才两部分结合起来会得到一个什么效果呢,就是我们下面放的这张图片这个东西。
这个公式在增强学习当中其实是比较经典也是比较重要的一个公式,叫做贝尔曼公式(Bellman Equation),它其实就把我们刚才那张图上的整个过程做了一个重新的规划,我们看到S_1和S_2,实际上在两个状态下,我们都可以求它的一个未来的长期的预期。但是我们因为有一个树状的结构,我们把这些树状结构全部把它综合加合起来,那么我们看到外层有一个加合,就是从S_1到某一个Action的一个概率计算,可以想象成它的一个权重,那么内层的加合又有一个从A到下一个状态的一个概率,最后那层就是当前状态下,比方说现在下一个状态,从S_1状态到S_2状态的时候我们获得的一个Reward的回报,再加上我们从S_2这个状态开始的一个未来长期的回报,通过这样的一个贝尔曼公式的计算,我们就突然发现实际上我们等式的左边有对于某一个状态未来价值的估计,我们等式的右边也有这个东西,如果我们等式当中其他所有的项目都已经固定的话,那么我们就可以根据这些东西去把这个价值求出来,换句话说我们如果知道了Policy如果知道了State Translation也知道了Reward,那么我们就可以把这个Value求出来。
我们刚才是说站在S的角度从S推导到A,从A再推导到S这样的一个过程,然后我们前面其实已经说过了我们这个序列其实有两部分组成的,一部分是S,一部分是A。刚才我们是从S出发去做了一个推导,那么推导出来了一个贝尔曼公式,那么我们现在要从A开始推导,我们现在的起点是已经通过策略推导出来了一些行动,我们知道我们下一步怎么行动了。我们从这个A开始出发,我们能不能计算一下说当我们处于某一个状态,产生了某一个行动之后我们未来有可能的期望的一个收益,比方说像我们在某一个场景下,比方说小鸟跳了一下之后未来预期能够挣多少分。那么这个推导过程其实和刚才从某一个状态出发是一样的,我们只不过是先知道一个行动,从行动出发,我们有State Translation这个东西,可以根据概率把它转到某一个新的就是第2时刻的一个状态S_2,因为有概率,所以我们有很多种转的可能性。然后我们从这些这些状态再出发,再用策略Policy根据状态去生成新的行动、新的Action。这样我们就有了第2时刻的Action,所以从上面这一张图我们就可以看到我们是从A到了S再到了A和刚才前面的那个过程正好是反了过来,错了一个位。虽然它错开了一个位,但是并不影响它最后的一些表达的形式。我们可以看到我们根据上面的一个总结,我们同样可以得到这样的一个贝尔曼公式,那么也是同样把各种概率的形式加合起来。
这里我们重新可以把这几这两个公式放在一起,我们再对比来看一下就是它是怎么实现的。下面的公式就是我们光从状态去考虑它的期望,那就是从S到A到S这样的一个过程,下面就是说我们从A开始,当然从A开始我们还是要把前一个状态的S带上,就是说我们从A开始要先跳到下一个S,再跳到下一个A,然后我们去考虑SA这个组合未来带来的长期收益。同样的我们发现一个情况,就是它的这个长期收益的价值函数在左右两边都出现了,那么就是说如果其他的东西都是固定的话,那么这个未来的价值实际上是可以计算的,这样也就解决了我们刚才的疑虑,因为刚才我们说的它不能算了。
实际上我们刚才讨论的一些事情就和增强学习当中的优化策略已经比较相关了,我们前面说到如果我们把前面一张图里面所有的其他的东西都固定的话,我们就可以把这个价值函数计算出来了,我们计算出价值函数有什么用呢?这些价值函数可以帮助我们去更新一下策略,重新帮我们评估一下当前某个策略好不好,我们可以采用一种叫做策略迭代(Policy Iteration)的方法去求解这个问题。我们还记得刚才那个问题吧?我们刚才的问题是说我们要找到一个最优的策略,使得长期的收益最大化,那么我们可以从某一个策略出发,首先去计算一下当前策略的一些东西。我们就主要是计算一下在当前的策略下,我们长期的收益是什么样?也就是说我们刚才所说的价值函数是什么样,我们在某一个策略下把这个价值函数求出来,就可以用刚才发的这个图片上的这个公式就可以计算一下了。我们计算在某一个状态下的所有行动,它未来长期的回报可能是什么样的,然后我们从中挑一个最优的行动,怎么挑呢?我们就挑那个未来长期回报最多的行动作为我们的策略,也就是说我们以后遇到这个状态,我们就采取这个行动就OK了,然后这样的话,我们的策略实际上就可以进行一轮更新。当我们更新完成之后,我们又可以用新的策略继续进行价值函数的估计,我们估计出来新的价值函数之后,我们又可以重新拿出来对策略进行一波更新,更新之后再去估计价值函数,然后再去更新,这样反复的迭代,我们就可以做到把这个策略更新的特别好了。所以这其中的一个很重要的观点就是策略和价值函数要并行,我们能把价值函数求出来就可以更新策略,更新策略我们又可以求这个价值函数,这两个东西是相辅相成的。
实际上我们刚才已经把一些很基本的东西跟大家介绍完了,最后我们来简单地介绍一种在现实中曾经有过一些应用,当然现在可能用的相对少一点,在一些简单问题上还是会应用的一个算法叫做Q-Learning,这个算法和我们前面讲到的内容有什么不同呢?主要就是在于它对价值函数的更新方法的不同,我们可以看到上面这张图片我们放了Q-Learning当中的更新的一个关键步骤,这个步骤就是说我们同样可以看到这个Q的这个函数,它里面的是S和A,就是说在某一个S状态下,然后行使了这个Action之后的一个长期的收益情况。它这里怎么做价值函数的更新呢?它就是要做一个加权平均,实际上就是说等式左边是它这个函数,等式的右边是它自己本身乘以一个系数,乘以1-α,α是一个小于一的数字,也就是说1-α是一个小于一的数字,也就是说它会把原来自己的价值打去一个折,然后再加上另外一部分,另外一部分是一个R,R就是到下一个状态时候的一个回报,回报去加上下一个状态当中最优的一个价值,然后把他们两个加起来和前面历史信息做一个比较,最后对历史信息做一个更新。
大家如果是第一次听增加学习的课,这个公式还是比较陌生,但是我们就可以用Q-Learning对这个公式呢加深了解。第一步我们首先要初始化一个模型,是什么模型呢?就是我们需要一个模型去计算一下,当我们处于某一个状态的时候,我们又要做某一个行动,两个东西合起来在长期的未来可能能获得什么样的收益,我们需要设计这样的一个模型,这个模型是什么样子呢?什么样子其实都是可以的,比方说我们也可以用现在深度学习的方法,我们就把这张图片送进去,在在结尾的时候呢我们输出一个向量,这个向量当中的每一个元素告诉我们,比方说向量的第一个元素告诉我们采用行第一种行动方案时候,它长期的一个价值是什么样的,然后对于我们现在这个问题,实际上只有两个行动了。也就是说对于Flappy Bird来说,我们假设输入一张图片,那么输出就是一个长度为二的向量,第一个格子比方说就是告诉我们在当前状态下,如果让小鸟往上跳一下,未来长期的回报是什么样子,如果不动,未来长期回报是怎么样的,我们实际上就可以得到这么两个数值出来。然后我们可以进行第二步了,刚才我们已经定义了一个函数或者说一个模型,然后我们可以用神经网络、用深度学习的方法,也可以用比较简单的方法去定义这么一个模型,这个模型初始有一些参数。我们现在就装作什么都不懂,就用参数去开始玩游戏,我们就用参数玩几局,哪怕小鸟一出来就死也没关系,玩个几局之后我们就可以积累一些大量的信息,就是我们前面提到的那个序列就是一个状态行动,当然还配有每一个状态行动之后的Reward收益,然后我们就可以收集到大量的序列了,这些序列就是我们后面用来学习的一个基础。我们拿到了大量序列之后,实际上就可以计算一下每一个序列或者每一个状态当时应该获得什么样的回报,这样我们就把每一个序列继承了回报的数字,然后我们形成了一个新的序列。
我们有了一个新的序列之后,就可以把各种的Reward求解出来了,然后我们就可以用刚才大家看到的那个公式去进行一个计算。大家不妨再回到刚才那张图上去,大概看一下刚才那张图上,实际上我们需要有一个历史的Q括号SA这样的一个东西,这个就是针对当前模型的S的一个输出。后面那个要更新的向——Reward,我们刚才从前一张PPT已经得到了,然后max部分找下一个状态的最优的输出就可以了,我们把这些拼起来就可以得到我们想象中价值模型的样子,这时候的q(s,a)是我们根据刚才Q-Learning的公式计算后的新得到的q(s,a)。但是我们现在的模型计算出来的还是老的q(s,a),而这个q(s,a)是一个新的q(s,a),那么怎么办呢?我们就需要对这个模型去做一些更新了。我刚才漏发了一张那个图,这张图上就是我刚才说的要根据Q-Learning去更新一下这个价值函数,这个价值函数不是模型里面现在输出的,但是它是我们希望下一步需要输出的,就是要更新成的。最后我们拿到了这个更新,我们认为模型应该输出了这个数字,那么我们实际上就回到了监督学习训练这样的事情上来了,就是我们已知S和A,需要让这个模型输出q(s,a),我们把这样的数据重新塞回到我们之前的模型里面去进行一些训练就好了。至于这个训练的过程,如果大家对机器学习和监督学习有些了解的话,这个过程大家应该是比较清楚的了,就是我们已知X和Y然后对这个模型去进行训练,就是说我们希望它输出的结果和我们想象当中应该得到这个Value要越接近越好就可以了。
我觉得到这里差不多把增强学习的一些入门知识就介绍完了,今天我们也可以再短暂地回顾一下。第一部分我们主要介绍了增强学习的大体流程,希望大家能够记住Agent和Environment它们之间交互的过程,Environment给一个State,然后Agent返回一个Action,然后Environment再给一个State,当然它同时会把它的Reward给我们,然后我们再给它一个Action这样不断的交互,这是我们的第一部分。第二部分就是我们怎么用形式化的方法把一个问题用数学的方法去定义出来,我们是需要找到一个最优的Policy,使得我们的长期回报最大化,然后接下来我们就开始想想这个问题怎么去求解,那么我们该怎么求解呢?我们刚才的想法是说我们固定下来当前的某一个Policy,然后去求解在这个Policy状态下的价值函数,长期回报实际上就可以计算出来了,计算出来以后,我们根据这个计算的结果,再去把这个策略做一个不断地迭代更新,我们就可以把最优的策略不断的解出来,最终它这个效果可以收敛。我们只要记住这个过程,后面又介绍了一个算法叫做Q-Learning,当然这个方法相对比较复杂,还需要一些那更多的知识,但是大家可以暂时的去了解一下这个算法的过程,我们也可以用深度学习的模型方法去建筑一个价值网络就可以计算了。