之前只知道AlphaGo的惊人水平,但一直觉得似乎遥不可及,不知道从哪开始学习。前段时间由一篇知乎文章,了解到可以利用增强学习玩flappy bird,而且可以玩到上百分这种人类达不到的水平,才意识到可以从小的方面入手学习起来。所以准备开启一个专栏记录一下自己的学习之路。
在学习了知乎大牛的DQN从入门到放弃系列之后,准备学习一下AlphaGo创造者Deep Mind的一位大牛----David Silver的Reinforcement Learning课程。
虽然网上已经有很多资料笔记了,不过还是觉得需要按照自己的学习整理记录一下,因为我感觉有时候记录整理的效果可能确实比阅读要好很多。
这节课主要是对增强学习的应用领域以及涉及到的一些基本概念做了介绍。当然还介绍了他们这节课程的考核方式,不得不说,顶级学校的学习模式还是很值得借鉴的。
一、书籍推荐
在课程开始,silver就推荐了sutton的这本《AnIntroduction to Reinforcement Learning》:
并介绍说读完这本书会对强化学习有比较深入的理解。不过笔者还没有读,还没入门的小白怕现在还读不懂......
另外,silver还推荐了一本理性成分更多,严谨系数比较高也更加恐怖的一本数学类书籍《Algorithms for Reinforcement Learning》,比较适合痴爱数学的理论研究者。
silver说他的这本课程是以上两种风格的结合,目前认为应该是理论+实践的方式吧,like it!!
二、理解增强学习
1、直升机表演
视频中展示的小直升机拥有特效表演的技能,能够在空中独立完成一系列酷炫复杂的动作。
silver提到,学习这些特效动作,是一个从少到多不断积累经验的过程,他们会通过奖励函数来告知这个直升飞机什么是好,什么是坏,之后直升机就会去执行这些特效演示。相比起来,人为控制是达不到这样的水平的。
2、畅玩Atari游戏
将增强学习应用于游戏中应该是比较吸引我们的一项好玩的项目,这是silver之前在做的项目。事先,agent是不了解游戏的环境以及游戏的规则的,但通过一步步学习得到经验之后,agent能够操作操纵杆,来控制角色的动作,并且可以自动记录目前的得分。在这些游戏中,agent并没有详细去了解游戏的规则,只是通过不断的试错,学习,发现对于不同环境的应对策略,从而可以很好的玩游戏。甚至在一些游戏上,通过增强学习得到的agent已经可以比人类玩的更好。
在silver演示这些实例的过程中,有的学生提出了的疑惑和质疑,我认为是很棒的。例如,有一个学生问,silver在构建agent的学习模型,完成策略的过程中,是否考虑到了人类的手-眼的反应速度。因为我们知道,机器的反应速度是很快的,只有在类人的反应程度下,能够作出这些决策才是公平的。很好的问题!不过silver也没让我们失望,他们在实现的过程中是粗略地考虑到了这个问题的(好谦虚),大概使用了15Hz的频率来处理决策,是相对合理公平的。还有学生会问,训练这些游戏需要多长时间能达到课堂上演示的那个效果,
silver也提到,每个游戏,他们大概需要3-4天的时间来进行训练,从而达到人类的水准。
真的感觉,会提问,会思考是多么的重要。这应该是除了技术水平外,我和这些学生更重大和致命的差距吧!
3、控制发电站
发电站的工作人员需要通过一系列例如,控制转化电能的速度、涡轮机的调整、叶片的方向角度等来更加高效率地发电,这时候,增强学习可以派上用场。
4、人形机器人行走
如果我们想要机器人走到某个位置,怎么控制,如何规划它的每一次步伐。可以对机器人每一步是否更加接近目的地,进行奖励,从而让它自己学习到可以到达目的地的方式。
5、处理投资组合等问题
很多时候,我们会面临多种投资方式不知如何选择的问题。增强学习可以帮助我们做出最佳决策,使金钱效益最大化。
实际上,增强学习的应用非常广泛。在学习之前,扩大视野,了解更多的应用对我们之后的思路扩展和思维发散也是比较重要的。
课程中多次提到“奖励”,那么什么是reward呢??知识点
reward是一个反馈信号,它表明agent的某一个动作做的怎么样。而agent的目标就是把每一步的reward积累起来,尽可能地使reward总和达到最大。
总而言之,增强学习基于什么样的认知呢??
想一想,在我们的生活学习工作中,似乎都是在这样的激励中获得最大化的。
明白了“奖励”是什么,那么,在不同问题中,reward有哪些方式呢??
总之,在上面的例子中,我们定义了每一步正向和负向的奖励,在不同的案例中,所奖励的东西也是不同的,如果针对每一个问题构建算法,就会显得很局限不够通用。所以,我们是否能够统一框架,基于机器学习的方法,利用相同的框架,设计相同的agent思考模式,来解决这些各种各样的问题呢?想要找到统一的框架,首先就需要发现这些问题的共同点。
共同点:
每个案例都可以看成是一个连续决策的问题,而且每个案例当中的goal都是相同的:
这就是将它们统一起来的切入点。再来回顾一下,我们的目标就是通过选择策略来达到最终奖励最大化,更好地实现我们的预期效果。但聚焦于每一步的动作,这个动作的影响可能是长期的,需要经过几步之后,才能发现它的结果(Reward may be delayed)。如何理解呢?比如说,你从小课余学习了舞蹈,当时可能没觉得会对你的事业有什么帮助,但当年会上你们部门需要出节目表演的时候,你就能表演一番,从因此得到上级的夸奖,促使事业更上一层楼。什么意思呢?就是说我们不能贪心于每一步的最佳奖励,不要目光短浅,就像上例中,小时候学习舞蹈可能占用了很多学习时间,当时觉得并不是一个明智的选择,但之后会发现它的作用所在,应该目光长远。这在投资问题上(涉及钱的问题上)或许更能引起注意。
那么,决策过程到底是怎样的呢?我们又该如何去理解呢?增强学习的过程类似于大脑与环境的交互过。我们先来了解大脑的分析思考过程:
大脑就代表agent,它可以控制执行一些动作。比如,机器人可以行走、拿起东西等。这里的每一步动作都是基于它目前所获得的信息。比如说,一个机器人通过摄像机进行快照来获取它周围的环境信息,这样就会得到一些奖励信号,来判断动作的好坏。总而言之,一个agent会有两个输入,一个是观察,一个是奖励信号,它们共同决定下一步的动作。我们要设计的,就是大脑之中的那个思考分析的算法。
下面这个是大脑(agent)与环境的交互过程:
这里注意,我们无法改变环境,我们只能通过采取不同的动作来影响环境。就像机器人每走一步,它周围的环境就会变化,在这个新环境中,机器人所处的位置也就不同了。
可以看出,增强学习是基于observation、reward、action的时间序列,这个时间序列就代表着agent的经验。而这个经验就是我们进行增强学习所依据的数据。因此,增强学习需要利用这些时间序列组成的数据样本来做一些事情。这一系列数据流被称为history。
从图中可以看到, 我们的agent(即我们的算法)实际上是从history到action的映射,因此我们需要设计算法来完成这个映射。即,从一个history中挑选下一个action。agent接下来会执行的action,完全依赖于history。那么history对于环境而言,又是怎样的呢??
环境根据history会发生变化,会产生reward,我们的agent就可以得到这些东西,并最终采取行动。所以history在字面上决定了如何获取行动,history决定了下一步的措施。我们为了能够让agent活得长久一些,就需要给予它大量的history,让它去吸收去消化,这些观测资料可能是视频。我们并不需要每次都回顾history,我们通常要研究的是状态state,状态state是对信息的总结,状态state决定了下一步的action。换句话说,一些简明扼要的总结,也就是状态state,包含了我们需要的所有信息,通过这些信息,我们就可以采取下一步的行动action。假如我们用状态state来代替history,那么我们就可以在机器学习方面做的更好。(这个问题将被markov解答,下面会提到)
这里提到了一个新词“状态state”,什么是状态state呢??如何去理解它??
定义:每经历一个时间步长T,我们就构建一个状态state,它是一个关于history的函数。
state有很多种,silver介绍了常见的3种。
Environment State就是我们使用的信息。通过这些信息,我们可以确定接下来应该发生什么。你可以想象一下机器人正在和真实的环境进行交互,真实的环境可以抽象为某些数字的集合,这些数字决定接下来会发生什么。从环境的角度来讲,也就是基于目前所知道的东西,基于history,由某些数字集合决定了接下来会发生什么。会存在某种状态来代表此时的所有已知东西,该状态在下一次观测与奖励的时候,又会重新被拆分。
注意,我们并不能观测到环境state中的所有信息,它只能获取到它的摄像头所拍摄的东西(observation)。总之,环境通过采用一组数字来影响我们的下一步动作,而环境有一部分对于agent来讲是不可见的。更像是,agent知道某种形式,这种形式是用来理解环境状态的。然而我们的算法并不直接依靠这些代表环境的数字,我们的算法只是看到observation输入进来,reward输入进来,以及action输出了。
其实,对于agent来讲,它也并不需要去了解所有的环境。比如家庭机器人并不需要去了解岩石的组成,火山的爆发原理等,它只需要知道它周围的环境,就已经能够做出决定。
这里我们可以想到,环境本身的状态并没有给我们创建算法提供有用的信息,甚至我们看不到环境的状态。所以,接下来,看一下agent state是啥吧。(这段文字写的不明白,自己也没理解好)
agent state
agent state也是一组数字的集合,但这组集合存在于我们的算法当中。通过算法,我们可以使用这个数字的集合来表示agent目前得到了什么,预计应该采取何种行动,总结到目前为止所发生的事情。使用这些数字,我们可以挑选下一步的措施。无论我们选择储存什么信息,捕获什么信息,无论信息是什么,我们都可以用agent状态来决定下一步的行动,这就是我们所说的agent状态。这些信息就是增强学习算法agent使用的信息,因此,我们在创建算法的时候,要经常讨论根据agent 状态,来挑选下一步的行动。这就是我们的目标:对目前所知道的东西进行总结,也就是得到某个状态,通过它我们就可以理解该如何挑选下一步的行动。这个状态可以是任何关于history的函数。我们可以选择建立我们的agent函数,agent决定采取哪个函数,如何将history、observation、reward以及action联系起来,并将有用的信息保存下来。而这些信息将会对未来采取的action产生影响。
信息状态也称为markov状态,这个状态包含history的全部有用信息,我们能做的就是定义某个东西,这个东西具有markov性质,啥是markov性质呢??
一句话描述就是:下一个状态仅由当前状态决定。
怎么理解呢??
如果这个世界是满足markov性质的,那么未来的仅仅取决于当下,而与过去没有关系。在我们得到状态S之后,我们只需要将St存储在这里,它具有markov性质,所以之前的东西就不再需要了。也就是说,可以用状态来代替history。这样说可能不太好理解,我想了一个直白的说法,比如说我们今天继续写博客,只需要知道刚刚写到哪里了,正在写的是什么就可以了,以前的内容是啥时候写的,跪着写的还是躺着写的都无所谓。这个“刚刚写到哪里了,正在写的是什么”就是状态,而每次写的量,写作时候,是否痛苦等就是history。又比如,之前例子中提到的小直升飞机,它下一个飞行值只取决于它现在在哪里以及它此时的角度、速度等,并不需要知道过去的详细飞行轨迹。
这个markov性质感觉好棒啊,回过头来想一想这可以用到上面我们提到的问题中,用状态state来代替history啊。具体如何做呢??
我们可以将环境state定义为markov状态。我们也可以定义history是一个markov状态。
这里我感觉不太好理解,将环境state和history看成markov性质的能带来什么好处呢??
为了解释状态表示的意义,silver举了这样一个有趣的例子:
有一只小老鼠,它看到了一系列序列:
第一阶段,灯亮了,灯亮了,拉下开关,铃响了,然后小老鼠被电死了。
第二阶段,铃响了,灯亮了,拉下开关,再次拉下开关,然后小老鼠得到了美味的奶酪。
第三阶段,拉下开关,灯亮了,再次拉下开关,铃响了,接下来会发生什么呢??
基于目前的观测,推测一下小老鼠是会被电死,还是会得到美味的奶酪呢??
猜测1:被电死。因为我们觉得这和阶段一的情况很相似(后三个东西都是灯亮了,再次拉下开关,铃响了)。对于小老鼠而言,使用它的agent的这个状态,通过这种状态表示,它就能够做出决策。由于最后三个东西处于相同的序列,所以它觉得他会被电死。
猜测2:得到美味的奶酪。我们换一种表示状态的方式,比如这个agent可能是用来统计灯的数量、铃的数量或者开关的数量的。这时我们就会发现,阶段三和阶段二很相似(都是两次开关,一次铃,一次灯)。这时,我们就会觉得会得到美味的奶酪。
还有,如果agent状态是基于一个完整的序列的呢?这时就需要将物品的所有排列方式都考虑进去,很明显,在这个案例中我们并没有足够的数据(因为只给出了两种排列方式)来进行判断。
所以,我们应该注意到,我们预测的接下来会发生的事,取决于状态表示法。状态表示在某种程度上决定了未来会发生什么。我们可以使用各种各样不同的方式来表征我们的状态,
这里需要注意:
增强学习基于完全可观测的环境这个假设(虽然这不太可能,因为总有一些数据是我们没有获取到的,没有任何东西是可以完全可观测的)。在这个环境中, agent能够真正的观测到环境状态的变化。agent能够看到我们之前提到的那些数字的集合。这时我们agent的状态就和环境状态一致了,也就是,我们看到的环境state就是我们的agent状态。这样增强学习的问题就被模型化为markov决策过程(MDP)。
也就是说,在agent内部,我们使用某种表示方式,来决定下一步的操作。
现在我们来剖析一下agent内部到底是什么??
增强学习中agent的主要组成部分:
policy表明了agent能够采取的行动。这是一个行为函数,这个函数以它的状态作为输入,以它的下一步的行为决策作为输出。
value 这个函数用来评价agent在某种特殊状态下的好坏,采取某种行动之后的好坏。如果我在这个状态下,执行了某种动作,那么我的预期奖励会是多少。
model 用来感知环境是如何变化的,这里并不是真实的环境,而是在agent眼里的环境。model就是用来判断环境变化的。
具体来说,
policy是状态到行为的映射。在某种状态S下,我们拥有某种确定的policy,也就是一个选择,就像是这里的函数π,该函数告知我们如何从某个情形的状态S变成某个行动a。这个就是agent所采取的措施。我们非常希望从经验中学习得到policy,从而得到尽可能多的奖励。此外,我们还可以使用随机的policy,这种随机性可以让我们拥有更多的状态空间。下面这个就是在状态s下,执行a的概率。
value是对未来奖励的预测。假如我们需要在行动1和行动2之间做选择,我们应该是会选择拥有最大奖励的动作。这个value就是用来预测未来的奖励的。我们获得的最终奖励取决于我们的policy。对于policy来说,value函数就是告知我们,在未来我们的奖励预期会是多少。比如对于直升飞机而言,按照轨迹1最终会得到70分的奖励,按照轨迹2最终会得到65分的奖励,显而易见,我们会执行轨迹1。所以这个value对我们来说是很重要的。
ps:公式中的折现因子决定了我们需要向前看多久,如果设成0.99的话,大概意味着会向前看100步左右。
一般来说,我们的model包含两个部分:transition model与reward model
transitionmodel(状态转换模型)是用来预测下一个状态的。例如,有一个属于直升飞机的model,我们可以说这个飞机在这个位置,这个角度,面对着这个轨迹,然后风从一个方向吹过来,它可能移动到这个位置,这个角度。这就是环境的动态特性。我们可以尝试着为这个动态特性进行建模,用这个模型来预测在下一个动作之后,飞机将会遇到什么样的情况。并且用模型来估计我们得到的奖励。
根据agent可以对增强学习进行分类,依据是是否包含了上面那三个元素。
下面,了解几个概念的区别。
增强学习和规划问题
在增强学习中,环境是未知的,agent并未被告知环境的运行原理,就像是你将你的机器丢进工厂里,让它尽可能的得到奖励。你仅仅打开了它的电源,并没告诉它该如何去做,它仅仅可以通过与环境的交互,不断地进行学习,最终在那个环境中找到更好的policy,这个policy的奖励最大,这就是增强学习的问题。
在规划问题中,环境是已知的(知道所有的关于游戏的规则,被告知了详细的信息),这样得到了一个完美的环境model,也就是内置了环境的model。我们的agent不需要和外部环境进行交互,仅仅根据这个内置的环境模型进行内部的计算。就像提前规划好了一样,仅需要短时间的思考就能进行。
exploration和expoitation
1、使用随机的动作就是exploration,也就是探索未知的动作会产生的效果。有利于获得更好的policy。
2、使用greedy policy则是expoitation。利用policy,这个相对来说不好得到更好的policy,但可以得到更好的测试效果用于判断算法是否有效。
预测和控制
预测意味着遵循现在的policy,在未来我会做的怎么样。
控制指的是最优的policy是什么。我们该向哪个方向行走才会得到最多的奖励。
在增强学习当中,我们需要解决预测问题,进而解决control问题。我们需要对我们的policy进行评估,这样我们才能找到最优的policy。
还是有些混乱,希望通过之后的课程会有很清楚地掌握,再翻过头来修改。