在线课堂实录丨《增强学习入门》—嘉宾:冯超

王一

2017-09-08

亲爱的博文视点在线课堂的各位同学,大家晚上好,我是冯超,今天非常高兴能跟大家一起来学习一下有关增强学习的一些基础知识。我们今天的这个课程其实是一个相对比较基础的课程,希望能够帮助大家打好这方面的基础,以方便将来大家有机会去学习更多比较深入的内容。增强学习其实是近年来确实比较火的一个概念,大家可能多多少少都有过一些了解,那么具体来说什么是增强学习,或者说我们平时接触过什么样的增强学习呢?增强学习又有哪些特点呢?

相信大家都多少了解。我刚才发的这个图片是在去年的一场围棋比赛,一方是我们的人工智能的系统叫AlphaGo,和韩国的棋手进行一个下棋。当时真的是火遍了全世界,因为在这场比赛当中曾经大家认为就是高不可攀的围棋,人工智能竟然战胜了人类。在这个系统的训练当中和增强学习有非常紧密的关系,今年其实也有AlphaGo或者他们的升级版Master和国内的旗手进行了一场比赛,同样是人工智能大获全胜,这可以说是对增强学习又有了进一步的推广,大家又更渴望地去了解其中的一些内容。

一般来说增强学习一般会定义成像我上面发的这个图片的样子似的,大概有以下这么几个环节:首先大家可以看到在图片当中有两个方框,这是两个主要参与这个活动的个体,一个是下面的那个框,他的名字叫做Agent,一般就是我们所要操作的一个对象,或者说我们本身参与的话,我们自己就是Agent。上面那个框叫做Environment,它表示的是一个环境,就是我们身处的某一个场景,或者是某一个世界,它们之间会产生各种各样的交互,它们之间的交互是什么样呢?一般来说,首先向我们的Environment——上面那个框会向我们的Agent——下面这个框会发出一些信号,或者说由我们的Agent去捕获一些信号,捕获什么呢?大概就是捕获“状态”这么一个信息。比方说我们会处在某一种什么状态之下,在这种状态之下Agent就需要去思考在这个状态下我们去做一些什么样的事情,然后在这个思考的过程,我们一般被称作为Policy——就是一个策略,当我们思考结束之后,我们就会做出某种行动,即右面那个箭头显示的Action,做完Action之后我们的Environment会进行一些状态的变换,Environment做完变换之后,我们整个场景或者整个世界就会发生一些改变。改变之后,Environment就会返回一个新的状态,同时它也会返回上一次我们的Agent操作之后会得到的一些反馈,而这个反馈是一些可以量化的、会影响到Agent个人的一些反馈,一般我们会把这个反馈称之为Reward,或者说一种给Agent的一种回报。刚才的叙述可能比较抽象,我们现在把这个图重新拿出来,以大家还比较熟悉的AlphaGo围棋的博弈系统为例,再来说一下这当中是怎么对应的。

我们首先可以把Agent想象成是AlphaGo这个程序本身,然后它自己需要完成一些下棋的过程,那么整个走子算法的策略就可以称之为Policy,它具体走出来的每一个子就称之为Action,实际上在下棋的环境当中,把棋盘走子的效果和对手组合起来就称之为Environment。当我们的AlphaGo决定了某一个走子的算法策略之后,并且具体地走出来一招也就行动了一个Action之后,那么棋盘上就会多出来一个子,对方也会根据我们的思考去走出它相应的招数,这个时候就相当于我们棋盘上产生了一些变化,那么这个变化就可以称之为State Translation,就是我们的状态发生了转变。结束之后,这个时候经过一轮走子回到了AlphaGo,这个时候展现在它面前的就是一个新的棋盘,这个新的棋盘的样子就可以称之为一个新的State,同时还会得到一些Reward,就是奖励或者回报。那么对于围棋来说,最终如果它获得胜利,它就可以加一分,如果输了就减一分,但是中间过程它将不会得到分数。

为了让大家能够更加清楚这个流程,我们就再举一个例子,现在放的这张图片是另外一个例子,这个是一个游戏,是曾经比较火爆的游戏,叫做FlappyBird。它的游戏方法就是,我们可以看到画面上有很多这样的水管,中间有一个小鸟,整个这个游戏只有一个键,就是用来拍打小鸟,我们拍一下小鸟,它就会煽动翅膀向上飞一下,如果没有人操纵它,它会随着重力再掉下来。然后我们就通过这样的操作让小鸟不停地穿过一个个的水管,它不能碰到这些水管,如果碰到的话就会死掉了,但是它每穿过一个水管就会加一分。

对于这样的例子,我们的整个问题该怎么定义呢?怎么用刚才那个形式再套进去呢?我们可以看到刚才这个游戏中小鸟就是我们刚才举的这个例子当中的Agent,它自己有一套行动方案,或者说我们在操作它的时候会有一套行动方案,比方说它比两个水管中间的空隙要低,那么它应该往上跳一下,如果比两个水管的中间空隙要高,那就应该让它自由落体,慢慢的往下降一下。这个就是我们的一套行动方案。只不过我们需要把刚才所说的语言用一些数学的形式把它表达出来,这样才能更好地帮助它去做操作。我们每次有这么一个思考的过程,根据当前的状态思考完成之后,我们就会走出一个行动,在这一时刻,我们要不要让它飞得高一点,还是让它飞得低一些。考虑完了行动之后呢,我们就会采取一个行动,这个游戏整个画面会不停地往前走,那么后面的水管就会慢慢退出整个画面,每当我们的玩家或者说我们要写出来的一个智能系统完成一次操作之后,整个这个画面也会随之往后移动,新的水管会出现旧的水管会消退,这也是一个它状态的转变。我们可以看到的整个水管世界其实就是这个Environment,水管不断的变化,就是State Translation,每过一段时间水管世界新的地图就会产生,这就是产生了新的State,然后每穿过一个水管子就会加一分。

前面我们其实说了两个例子,我们现在再来看一个例子,但是这个例子我们就不去详细地介绍了,这个例子就是大家比较熟悉的俄罗斯方块,俄罗斯方块的玩法就是我们有很多的格子,有一些预定的方块会从上方掉落下来,我们可以通过旋转和平移的方式把它移到我们想要的一个位置,当每一横行的方块占满之后,那么这个横行的方块就会被消掉,然后我们会得到一定的分数。那么这个逻辑该怎么套用到刚才的那个框架上呢,大家就可以去想一下,比方说Agent就是我们操作俄罗斯方块的人,那么整个环境、整个俄罗斯方块的图画应该就可以算作是Environment,那么他们的Policy、Action这些东西是什么?

我们刚才看过了前面的关于这个增强学习基本概念的问题,大家应该已经有一个了解了,那就是增加学习大概是这样一个交互的行为,我们自己扮演一个Agent,我们会处在一个环境——一个Environment当中,对于AlphaGo来说就是棋盘,对于小鸟来说,那就是水管世界,对于俄罗斯方块来说,就是一个整个环境,他们之间会不断的进行一个交互,随着时间的流逝,就围棋来说我们走一个子,那么接下来走下一个字,对于小鸟来说我们每操作一下水管世界向后退一步,新的水管出现,随着时间的流逝不断的进行下去。

那么对于这个问题我们怎么能进一步用数学的形式把它表达出来呢?刚才的描述显然是不太能够帮助我们用一些算法来解释的。我们现在要用算法的形式去表达它,但是在表达之前我们需要了解一下整个的交互过程是什么样子。前面我们已经看到了Agent和Environment一个交互的形式,我们主要是看中Agent这个方面,对于Agent来说,它经历了些什么东西呢?我们可以用上面这张图片上面的一些标记来表示,图片当中中间有这么一个序列,这个序列当中的S代表在某一个时刻Agent看到的一个状态,比方说棋盘上的棋或者水管世界中当前水管的状态。A代表我们当时做的一些操作,比方说下棋下的子和我们在水管世界中是应该往上跳还是原地不动,当然了,像这样的事情随着时间的流逝,那么他就会不断地向前,于是我们在整个Agent和Environment的交互当中就会得到这样的一个序列。比方说我们第一个时刻的状态就是S_1,第二个时刻的状态就是A_1,这个S就是State,这个A就是Action,我们就这样不断地前进。我们可以假设这个状态会有一个终点,那么在时刻N的时候,最后得到了一个终点,那么就是我们得到了一个状态S_N、得到一个状态A_N,这样最后就有一个结果或者说最后一个S_N作为一个结果,这样我们就得到一条完整的序列。

然后我们还可以仔细再观察一下这个序列,就像刚才发的这张图片一样,这个序列其实是两种类型的事物之间交替出现的一个过程。一种类型就是State,另一种类型是Action,所以其中的这个状态或者说事物跳变有两种形式,一种形式就是从S到A,就是说我们现在有了State,那么我们需要下一个状态是Action。还有一种情况是我们现在的有了Action那么下一个状态又要跳到S,也就是说有这么两种过渡的形式,如果我们想把整个序列的过程说清楚,那么就要把这两种变换的过程也去把它说清楚。

在这个过程当中,我们怎么用一些更形式化的方法去把它表达出来?我们就可以引入下面的两个定义,第一个是从S到A,也就是说回到我们刚才的那个画面,当Environment提供了一个State的时候,我们的Agent要输出一个Action、要做一个行动,这个过程就可以用我们刚才提到的那个Policy来表示,Policy就是一个策略,相当于说我们身处于什么样的环境,我们就要采取什么样的行动。对于AlphaGo来说,就是我们现在在这个棋局下,我们该怎么下,于是乎我们就需要考虑基于历史的一些状态的情况下,我们下一步该怎么行动,其实包括像小鸟一样,也是有这样的问题,就是如果我们已经已知了S_1到S_N这个序列,那么我们怎么能猜出来下一个行动该是什么样呢?

我们就可以根据前面这些东西做这么一个建模:我们去估计一下下一个行动大概是什么样子的或者下一个行行动是什么概率,这样我们就可以建立起来一个概率分布去分析策略大概该怎么安排。比方说,对于小鸟来说,如果现在比两个水管间的空隙低很多的话,那么让小鸟往上挑这个概率肯定会高一些,原地不动的概率肯定会低一些,这样实际上就形成了一个策略。另外一方面就是从A到S,就是我们上面这张画面当中的State Translation,其实刚才我们也说到了,就是一个状态的转换,也是要基于前面的这些历史,估计下一刻是什么样子的,比方说还是像FlappyBird一样,如果我们走得比较好,就是小鸟顺利地通过了水管之间的空隙,那么游戏继续水管就会向后挪一步,新的水管就会出现,如果小鸟不幸撞到了水管,那么就Gameover了,我们就应该给出一个Gameover的一个状态,实际上这部分的转换应该是由Environment或者这个游戏本身去控制的,Agent本身应该是没办法控制到的。

可以说刚才我们说的思路基本上是没有问题的,实际当中的建模也是这个样子,但是我们是遇到了一个问题,那就是前面我们这个建模方法,实际上计算量是非常大的。大家去看一下这两个公式,第一个公式,比方说当我们用Policy去决定第N时刻的行动的时候,我们需要考虑前面所有的这些状态和行动。State Translation也是这样的,要考虑的东西非常非常多,然而这样的东西一旦我们考虑得非常多,就会导致我们计算量非常大,整个模型也会非常大,这样实际上是不太利于把这个东西真正地实现的。这样我们就得需要找一个解决的办法,那是什么办法呢?

我们就可以用到马尔可夫的这个性质,马尔可夫的性质基本上就是说下一时刻的状态转变只和上一个时刻的状态有关系,而跟上一个时刻之前的一些状态就没有关系了。基于这样的思考我们就可以发现,对于这两个公式,比方说前面的Policy在当前时刻的行动就只和当前时刻的状态有关系,和前面没关系。比方说Flappy Bird,现在这个状态下,小鸟在某个状态,我们采取的行动和前面没有关系,不管你前面曾经是什么东西都可以,不管你前面是什么样的状态,比如说你前面从上面飞到下面,从下面飞到上面都和我现在的决策是没有关系的。基于这样的思路,我们就可以把刚才条件概率当中given条件的那部分做一个大的削减,这样条件部分就只剩下当前的状态了。同理对于State Translation来说,我们的条件只有上一个状态和上一个状态产生的一个行动,只有这两个东西和我们下一个状态是有紧密关系的,而再往前的东西我们就不再产生依赖了,这样整个的模型它的长度和大小呢都得到了控制,同时也就使它变得更加的容易进行建模和求解了。

我们搞清楚了前面的那个SA的序列,下面我们就要回到增强学习的目标问题上了。增强学习的目标是希望让我们的收益最大化,而且是让长期的收益最大化,什么是长期的收益?我们可以回到刚才前面的画面当中,每一轮当的Agent完成一个行动之后,Environment会返回一个新的状态,同时会返回一个Reward就是类似于一个回报的东西。我们每进行一次都会有这么一个东西,那么我们的目标是说在和Environment的长期的一个交互当中,我们希望把所有的回报加起来能够满足最大化,这就是我们的目标。

我们其实相当于从两个方面,一个是从交互的方面我们提出来的一些东西,我们又从目标方面提出来了一个目标,那么综合起来我们就可以看到刚才发的这张图片上,基本上我们把增强学习这个问题进行了一个完整的定义,它分为两部分,一部分是一个已知,假如说我们已知第一个是P(s_(t+1) |s_t,a_t),也就是说我们已知State Translation这个环境是怎么变化的,同时我们知道Reward对于某个状态来说,它大概是要返回什么样的回报,我们到什么状态能得到什么样的回报,这个我们也是已知的,同时我们知道一个起始的状态,我们就可以进行求解了。那么我们求解的是什么呢?我们求解的就是这个P(a_t |s_t)这个东西就是我们刚才看到的那个Policy,就是换句话说就是我们该怎么操作这个Agent,那么我们求这个东西目标就是要使得我们的长期收益最大化,也就是说让我们得到的Reward收益是最大的。然后对比前面的两个问题,就可以说对于AlphaGo我们怎么样找到一个策略,就是对于什么样的棋局,我们下什么棋,使得我们的收益最大化,也就是最终是能赢棋。对于FlappyBird的那个小鸟游戏就是我们该如何的设定一个操作的方案,什么状态该往上跳什么状态不动,使得我们穿过的水管数最多得到的分最多,这就是我们的目标。

然后我们为了让我们的学习得到巩固,我们再回来看看FlappyBird的问题就是我们看一下已知和求解和使得这些东西是怎么对应的,我们再过一遍。那么我们已知的P(s_(t+1) |s_t,a_t),其实就是状态的转移,那就是说这个游戏随着我们操作完一步之后,那么游戏下一步画面是什么样的,然后Reward就是用来计算就是如果我们当前穿过了一个水管,那么就加一分,没穿过就不加分。S_0就是我们的一个起始画面,这个需要他给出的,然后求解就是给求解一个策略,就是我们该怎么操作这个小鸟,然后使得我们的长期的收益最大化,就是说使得我们整体的最终得分能够最大。

那我们前面已经把这个问题定义清楚了,下面我们就要开始去想办法去求解了,怎么去求解这个长期收益最大化,那么我们就要回到这个目标函数,因为我们一般来说对于学习我们肯定是要从这个建立模型,然后搞定目标函数,那么我们就回来去看一下这个价值函数,这个价值函数的形式来说就是我们要最大化这个长期收益,这个长期收益是我们每一轮整个里边Environment环境返回给我们的收益,所以他是这样的一个加合的形式,而且这个时间有可能对于某些任务这个时间是无限长的,所以这个计算量也可能是巨大的。我们从下面这张图片就可以看到这个公式,把这个回报做一个加合,使它最大化的这个公式可以把它拆解开,怎么拆解开呢?就是我们按时间把它拆成一个序列,也就是这个R_1 、R_2 、R_3 、R_4这样的一个序列,然后他们每一个的回报这个Reward的话,它实际上是和当前的这个状态有关系的,你处于什么样的状态,他会给你什么样的分数,就比方说这个小鸟这个游戏,那么在实际的计算当中,其实我们刚才也看到,就是由于这个时间是非常的不固定的,我们不知道到目前为止的某一步来说,我们接下来可能会操作多少步,对于像围棋来说,因为围棋的落子的数量基本是有限的,所以下到一定程度它会结束。对于Flappy Bird的话,理论上我们应该是可以无限地玩下去的,只要我们存在一个可行的一个能通过水管的方案,那么我们站在当前的某一步的角度、某一步的情况下、某一个状态的情况下,我们要做出决策,我们应该怎么操作才能使得我们的最大化,这个时候我们就要估计从这一步开始到未来,我们尽可能地多收益,所以这是一个比较复杂的问题。(不好意思啊,刚才我好像是把那个手机的那个麦克风给堵了一下。)

可以把这再总结一下,就是说因为我们刚才看到我们要把长期的收益最大化,而这个长期收益跨度时间是非常长的,我们不可能说站在当前的时刻,我们想要做出一个行为,使得未来很长一段时间内最大化,这个听上去总感觉是不太可能的,那么我们该如何把这个事情做得更好,那么就引出了下面的一些东西,我们需要去找到一种方法去直接把这个事情衡量出来。比方说我们构建一个函数,那么它直接可以算出来。比方说在当前状态下我们产生一个行动,那么未来能预期获得多大的收益,但是大家也可能想想都觉得这个事情不是很容易,因为我当前产生一个什么样的行动,就能计算出来我未来多长时间之后能够获得多大的一个预期收益,这个似乎是不太容易的,那么我们怎么做呢?我们就需要从增强学习,就是我们刚才说到的这个序列的过程入手,我们把这个过程做进一步的剖解,我们看看能不能通过这个过程当中的一些特性帮助我们去找到这个问题求解的办法。

我们再回到这张图上,我们如何去计算呢?我们就需要把这个问题去做一个推演,我们刚才其实已经看到了有那么一个序列,那个序列就是环境给我们一个状态,我们产生一个行动环境,给我们一个状态,我们产生一个行动,这样不断交替的,那么实际过程当中我们是什么样的一个状态呢?我们可以看现在这个画面,就是说如果我们在时刻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,当然这个方法相对比较复杂,还需要一些那更多的知识,但是大家可以暂时的去了解一下这个算法的过程,我们也可以用深度学习的模型方法去建筑一个价值网络就可以计算了。

今天跟大家介绍增强学习的部分基本上就到这了,希望大家课后可以再重新回顾一下,其实知识点也不是特别多,但是需要大家再反复地去看一看多理解理解,这样可能对大家未来的学习会有帮助。总体来增强学习这个方向非常火,现在有好多人都在做这个事情,也做出了实际上不止AlphaGo,还有很多多很优秀的成果,也非常希望大家能够在这个领域做出一些好玩、有趣、有价值的东西,能够实现自己的一些梦想吧。

好了,那我现在就开始回答一下大家的一些问题,大家如果要有什么问题想问的话可以留下言,我挑其中的几个问题跟大家一起探讨一下。

首先是这个叫MasterBR这个同学,然后他是问如何系统地学习,增强学习的知识?如果真的想系统的话,我们可以先从看一些书或者一些教程开始吧。像我自己入门时候看过一本叫Sutton的人写过的一本书,它应该算是增强学习当中一个泰斗吧,他写了一个比较基础又比较全面的一本书,名字我可以稍微去找一下,然后如果可以翻墙的话,国外还有一个配套的课程,但那个课程讲地会相对比较深一些,初学者学可能会有点困难。剩下的我觉得大家就可以找一些比较经典的一些代码,比方说像我刚才说的这个flappybird,这个实际上在_都有很多人去实现了,然后大家可以去读一读,去感受一下。增加学习的书就刚才我说了那一本,然后我再去找一下,稍微等一下,一会我去找一下,我觉得基本上把那本书看完的话,你会对算法整个大体的脉络有一些了解。其实今天主要讲了一些MDP的东西,再往后会有一些比方说我们知道StateTranslation的话,那就算是一个我们知道mode问题,那么就可以用policy Iteration或者Value Iteration这样的算法可以去解,那么如果我们不知道mode的,就现在来说,基本上大家会用Monte Carlo或者Temporal Difference这样的方法去解,然后TD又会发展出来一些Sarsa或Q-Learning的一些方法,再往后有一些像Policy Gradient,然后还有像A3C这样的一些算法,但是我自己目前在了解后面的一些算法,主要就是直接读论文去了,但是像刚才说的这些算法像Q-Learning这样的算法实际上在那本书上都有,然后我可以把书名发给大家,大家去搜索一下,他们最近也在出第二版,那本书还是不错的。

这个问题是说增强学习的前沿代表性算法有哪些?前沿算法其实也挺多的吧,现在很多其实都是在以前的算法上做一些演变吧。像近几年现在比较有名的一些算法,其实一个是像A3C就是一个异步Actor-Critic一个算法,还有就是像TRPO这个算是我还了解一些的,可能有的更前沿的我也不是很了解,当然这个除了这两个之外,其实后面还有很多新的东西吧,反正有人曾经做过一些总结,就是近几年来,这样的算法还是非常非常多的。

然后增强学习目前的工业界有哪些应用呢?其实这个东西反正在很多地方,就是只要我们能发现它是有这种序列交互性质的东西,实际上都可以做,然后比方说我们可以把它用在像无人驾驶这样的一些事情上吧,无人驾驶其实就是一个序列的问题,比方说我们当前发现某一个时刻现在路况是什么样子的,然后要产生一个行动去怎么开,踩油门、刹车,还是往左打打转,或往右打转,然后怎么办,然后下一个时刻又是一些状态来了,然后reward是什么呢?我觉得就是我们只要不出事那reward应该是正的,出事了那就是负的或者是负无穷大的。基本上我们只要拿MDP,就是拿我们刚才学的这个能套上去,那就可以用增强学习去解。我刚才发的这个就是我曾经入门看的书,这本书的作者也非常牛,是很多算法的作者,然后他这本书写得非常详尽,希望就是大家有兴趣的话,真的可以好好深读这本书,读懂它的话后面很多新算法基本上都可以用这样的思想去解释,后面再去读其他的文献也就不那么吃力了。

我们最后再回答一下这个问题就是增强学习和深度学习有什么区别,然后其实增强学习和深度学习不算是同一个级别的比较,就是其实我们看机器学习这个大的问题有很多角度去看,深度学习是从一个角度去看,增强学习是从另一个角度去看。深度学习同一个类型的学习有什么呢?比方说既然深度学习,那肯定有浅层学习了,浅层学习代表就是我们曾经学的一些系数学习的一些问题。比方说像Logistic的回归,这样的模型就是属于浅层的学习,那么对于增强学习同类型的学习,我们一般都是说像监督学习和非监督学习,这两种学习一般是和增加学习放在一起,它们属于一种大的学习类型。自动驾驶应该是可以用增强学习去实现,自动驾驶也可以用其他的方法去实现。总之,有很多种方法其实都可以实现,关键是看我们的问题可以用什么样的方法去定义,只要能把它定义清楚,那就可以用比方说一些思想或者一些模型去把它解出来,具体来说实际上它们每一种方法是有区别的,但是它的应用实际上是很广泛的,实际上很多很多的问题我们都可以用增加学习去做,甚至说一些大家认为不太可能用增强学习的东西,只要你能把它用这个模型套上,它也可以用这个方法去做。

这个问题是百度的小度机器人有没有用到怎样学习。我猜它是有可能用到了,但是小度机器人应该是有很多功能吧,我不知道你具体说的是哪个功能了,但我猜反正每个功能其实它都有可以用它的点。还是那句话,如果它的这个应用场景我们可以用增强学习的方法给它建模,比方说我们有这种交互概念的东西,比方说它如果做一些自动聊天机器人这样的事情,只要有这样持续的这么一些东西,那其实都可以用增强学习去做,只不过看我们怎么定义了。

读者评论

相关博文

  • 社区使用反馈专区

    陈晓猛 2016-10-04

    尊敬的博文视点用户您好: 欢迎您访问本站,您在本站点访问过程中遇到任何问题,均可以在本页留言,我们会根据您的意见和建议,对网站进行不断的优化和改进,给您带来更好的访问体验! 同时,您被采纳的意见和建议,管理员也会赠送您相应的积分...

    陈晓猛 2016-10-04
    4424 682 3 6
  • 迎战“双12”!《Unity3D实战核心技术详解》独家预售开启!

    陈晓猛 2016-12-05

    时隔一周,让大家时刻挂念的《Unity3D实战核心技术详解》终于开放预售啦! 这本书不仅满足了很多年轻人的学习欲望,并且与实际开发相结合,能够解决工作中真实遇到的问题。预售期间优惠多多,实在不容错过! Unity 3D实战核心技术详解 ...

    陈晓猛 2016-12-05
    2721 35 0 1
  • czk 2017-07-29
    4220 29 0 1

推荐用户