田青 2021/01/12
我们先用一个例子来说明一下为什么需要用强化学习来解决问题。例如上图的机器人抓取问题:一个7自由度的机器人手臂,通过一个单目相机的输入(图片),试图用两个手指的夹持器去抓起盘子里的物体。所以,这个问题的输入就是图片,输出就是夹持器的抓取位置的xyz坐标。
解决这个问题可能有不同的方式。其中一个方式就是理解问题,并且设计出方案。就像上图中option1所示的那样。例如你可以利用你对机器人系统的了解来确定:夹持器的坐标、夹持器与相机的相对位置、物体的形状等等因素来构建出被夹持物体的相对位置,以及合理的夹持位置。这种方式对于简单的物体,例如上图中option1中1这样的蓝色塑料棒是比较适合的;但是如果物体比较复杂,例如重心对夹持位置的影响比较大,如option1中2所示的工具;或者一些软的可变形的物体,夹持器可以深入的物体内部做动作,如option1中3所示的海绵球来说,人为设计出一个夹持位置可能是一件比较难的事情。
另一种选择就是把它设计成一个机器学习问题,如上图的optioan2所示。但是,对于一般的监督学习来讲,需要给它提供大量的训练数据,例如大量的(图片,夹持位置)这种成对的数据,这种数据对于人来说是很难标注和取得的。你可以想想,图片和夹持位置之间的映射很难直观的得到。
所以这样的问题基本就需要通过强化学习的方式去解决。这门课的目的就是教会你用强化学习的方式解决类似的问题。
如果用一句话来概括强化学习,就是:从经验中获取技能。强化学习也是一种机器学习,但是,和普通的监督学习不同,它不要求数据一定的对的。数据可以是对的,例如一次成功的抓取,也可以是错的,例如一次失败的抓取。但是这些数据对于强化学习来说都是有用的,都是经验,智能体(机器人)使用强化学习的方法,通过这些经验就可以学习到一些技能,例如抓取物体的技能。对的数据可以帮助智能体学习到好的动作,错误的数据可以帮助机器人学习到如何避免错误的动作。
上图说明的就是强化学习的一般步骤,强化学习算法设计好以后,这个过程大概是自动完成的:
另外在收集数据的过程中可以使用多个机器人来并行的收集,这样可以增加效率。
那么什么是强化学习呢?强化学习大概指的是这两个方面:
我们再对比一下强化学习和监督学习的区别:
监督学习 |
强化学习 |
数据是iid的,就是独立同分布的,数据之间没有相互影响,而且来自于同一个分布。 训练的过程中知道ground true的输出,也就是知道输入x所对应的正确的输出y是什么,这样才能训练出一个正确的f(x)。 |
数据不是iid的。前面数据的输出会影响后面的输入。例如游戏中采取不同的动作会影响到后面出现的场景。 没有正确的标注数据,只能知道成功或者失败,或者是动作的奖励值。 |
我们用上面这张图来进一步说明一下强化学习中的几个基本要素。强化学习是由智能体和环境相交互所组成的一个决策系统。智能体做出决策,通常指选择要执行的动作,环境返回动作执行的结果,也就是观测值,通常也指系统的状态,同时也返回一个奖励值。智能体和环境之间做多次交互,去完成一个episode,episode可以翻译成一个场景或者回合,例如一盘棋或者游戏中的一关,一个episode再长也是有限步骤的,这种情况就称为finite horizon。交互也可以是没有episode的,也就是无限循环的,一般称为infinite horizon,例如上图所示的库存管理系统。下面举几个不同的例子来说明交互过程中的要素:
训练狗 |
训练机器人执行任务 |
训练库存管理系统 |
智能体:狗 环境:食物 动作:肌肉收缩 观测值:形状、气味 奖励:食物 |
智能体:机器人 环境:周围环境 动作:电机的电流或者转矩 观测值:照相机图片 奖励:完成任务的好坏(例如达到的速度) |
智能体:管理系统 环境:库存 动作:购买什么 观测值:库存水平 奖励:利润 |
智能体与环境交互的目的就是去获取更多的奖励(智能体活得好像很现实),所以强化学习的目的就是要获取更多的奖励值,也就是累积的奖励值最大。智能体就需要找到一个策略,使得它能够在一定的场景(观测值)下,采取最优的动作,使得未来获得的累积奖励值最大。如果现在不能马上理解这一点也没有关系,后面会详细讲解。
使用强化学习都能做什么,我们看几个例子。
使用强化学习可以让机器人学会一些复杂的动作,例如用锤子钉钉子:
还可以学会玩游戏,智能体能自己发现一些高级技巧,例如可以学会尽量把小球打到上面,这样可以得到更多的分数:
以及使用工具去抓取物体,从下面的动图中可以看出,机器手可以学会一些技巧,例如把靠在一起的积木先打散再分别抓起来:
还可以学习到让智能体去控制交通,例如上图中的红色小车,通过训练就可以学会怎么去控制速度,使得其它的车辆可以运行的很通畅:
回答这个问题之前,我们先关注一个更大的问题,就是:怎么建造一个智能机器。人们对智能机器可能有很多想法,例如下图所示的影视剧中的一些机器人:
这些机器人各有各的特色,但是一个共同的特点就是:智能机器需要有适应能力。它必须能够适应复杂的和不可预测的现实世界。例如,如果你想建造一个可以自动驾驶的油轮,使用目前的技术,这并不是一个很难的事情,你可以利用海图、GPS和路径规划等设计出来一个自动航行系统,这个系统应该并不复杂,原因是因为海上的情况简单,需要处理的情况比较少。但是即使是一个可以自动驾驶的油轮,上面也需要有人,因为你并不能保证轮船不出问题,出了问题就需要人来维护和修理。所以相对于油轮的自动驾驶来讲,油轮的维护是一个更难解决的问题,需要更强的适应能力,目前的人工智能技术还解决不了。
为什么现实的适应问题比较困难,一个原因是:现实世界是非结构化的和不可预测的。幸亏有了深度学习,它在解决这类问题上给了一些帮助。深度学习通过训练一个很大的、参数很多的模型,通常是一个深度神经网络,来解决这个问题。通过训练,就可以建立起一些复杂的映射,例如图像识别,就是一个从图像到类别的映射,图像是高维、非结构化和复杂的,如果不通过深度学习,这种映射将很难实现。另外,深度学习在应用的过程中更关注的是模型本身和参数的调整,而不是算法的调整。深度学习的应用领域大家都比较熟悉了,例如在图像分类、文字识别和语音识别等等领域。
在“什么是强化学习”部分,我们已经讲过了强化学习的基本概念。我们说:强化学习是基于学习的决策过程的一种数学表达方式。强化学习与深度学习的结合为解决复杂的强化学习问题提供了方法。早在上世纪90年代就有这样的例子出现,例如有一个游戏,叫TD-Gammon,就是利用深度强化学习的方式解决的。再后来的AlphaGo其实与TD-Gammon的解决方式很类似。深度强化学习在机器人和游戏领域目前已经有大量的应用,随着课程的深入,我们会越来越熟悉这些应用。
下面我们从另一个角度来看看强化学习的好处在哪里。
上图将标准的计算机视觉与基于深度学习的机器视觉做了对比(1和2),同时也将一般的强化学习和深度强化学习做了对比。标准的计算机视觉需要设计各种特征提取器,以及基于这些特征的分类器,例如SVM分类器;而深度学习采用的是端到端的方式,中间的特征提取都是自动学习出来的,同时输出就是分类,也不用设计分类器了。同理,用传统的强化学习的方式也需要提取特征,这里就需要设计特征,那么就需要设计人员既是游戏专家,懂得哪些特征最能代表游戏的局面,还要是强化学习专家,知道怎么设计基于这些特征的策略;但是如果用深度强化学习,这些事情就不用了做了,因为特征提取和策略分类都是自动学出来的。
说到端到端的学习,它对于序列决策过程到底意味着什么?它基本就意味这用一个过程将识别和决策这两个目标统一起来了,也就是说过程中并没有一个明显的识别过程,例如下面的两幅图:
第一副图的做法是,先识别出图像的类别,然后再把类别作为输入去决定下一步的动作,它是由两个神经网络去完成的。第二幅图说明的就是端到端的方式,它直接学习从图片到动作的映射,它可以将两个神经网络合并成一个。相比较前一种,端到端的方式有一些优势。例如,其实可以看得出来,没有必要去做一次分类,可能在分类的过程中还丧失了一些有用的信息,就是说这种分类并不是动作驱动的,哪些信息对动作分类有用,在训练的时候其实并不清楚;另外就是变成一个网络以后训练的成本也降低了,总体网络的大小也能变小一些。在机器人领域,这种端到端的方式被称为sensorimotor loop,sensorimotor这个词大概可以翻译成“感知运动”,直观的理解就是“从传感器到电机”,就是从传感器数据端直接映射到电机的运动端,这个也就是端到端的含义。
下面看一个关于机器人具体的例子:
对于传统的机器人控制,一般需要经历下面的一些过程:
可以看到,整个过程是复杂的,而且个过程中的每一步都可能产生一些误差,而最终的结果就是将这些误差累积起来了。假如物体的位置估计不准确,那么基于这些位置所做的规划可能就很不准确了。当然可以通过反馈的方法消除一定的误差,但是重新经历一遍以后,这些误差又累积起来了。
用端到端的方式,就可以使上述过程变得简单,而且也不用考虑误差的问题,例如下图所示:
刚才说了,端到端的方式是一个sensorimotor loop,从传感器信息(图片)直接映射到电机的动作。我们可以把这一过程想象成大脑处理问题的方式,当图片作为输入过来以后,先经过一些卷积层,我们可以把这些卷积层想象成大脑中的视觉皮质(visual cortex),它的作用是从视觉(图片)中提取信息;然后再经过一些全连接层,同理,我们可以把它想象成大脑中的运动皮质(motor cortex),它的作用是根据视觉皮质的输出(可能还会加上一些别的东西,例如机器人当前的状态),去选择合适的动作。通过端到端方式去训练,让神经网络自己去找到合适的方式去处理视觉特征提取和运动决策,从而就最大限度的避免了人为错误的引入,而且整个过程也比传统的方式简单多了。
深度学习支持了端到端方式,所以它与强化学习的结合就给强化学习带来了巨大的能力,使它可以解决复杂的、非结构化的序列决策问题了,这样就使得解决真正的人工智能问题成为了可能,甚至可以狭义的说,强化学习问题本身就是人工智能问题。
基本就是下面几点原因,其实很容易理解,不用再做解释了:
但是,让人惊奇的是,早在1993年,一本书“Reinforcement learning for robots using neural networks” J. Lin,就提出了很多预言,到现在也一直被认为是正确的。
近些年,深度强化学习在游戏和机器人领域也取得了很不错的成绩,下面这张图是一些经典的例子,其中大部分的算法会在未来去讲解。
典型的强化学习的目标是最大化累积奖励,但是这个并不是序列决策过程中唯一重要的问题,所以,除了典型的强化学习问题以外,我们还需要关注一些其它的问题。例如:
先说第一个问题。奖励来源于哪里?对于有些场景来说,这个问题是简单的。例如开始举的例子,机械臂抓物体,成功了就有奖励,不成功就没有;训练狗也是一样,狗做对了动作就给食物,没做对就没有食物,食物就是奖励;或者打游戏的时候,可以实时的看到游戏界面上的奖励。但是,对于另外的一些场景,可能就比较困难。例如训练机器人去倒一杯水,水是不是倒入了杯子里,可能需要设计特殊的传感器和算法去识别。
另外,有些奖励可能非常稀少。例如,一般一个人只有一次读大学的机会,也就是说一生中只有一次奖励,所以不能通过试错的方式去找到一个顺利毕业的策略,这样的例子在人生中非常常见。在生物界,这样的例子也很常见,猎豹显然不能通过试错的方式去掌握抓捕羚羊的技能,给猎豹的机会也不是太多,可能几次抓不到就会饿死。所以对于人和猎豹等自然界的生物,一定有一些更加复杂的评价机制去指导行为。
奖励类似于监督学习中的监督,只不过是间接的监督,不是象监督学习那样直接告诉你答案,那么,还有没有其他形式的监督?当然有,例如可以:
1. 从演示中学习
2. 从观察世界中学习
3. 从其它的任务中学习到技能。
上面所提到的这些方式详细解释起来有点麻烦,但是以后都会详细讲解,现在只是有一个感觉就好了。课程中举了几个例子分别说明了一些学习,例如:
强化学习是使用学习的方式去学会控制的,一般情况下需要和环境直接交互,但是预测可以部分减少甚至避免这个过程,最近算法的发展已经证明了预测已经成为越来越重要的一件事情。能够预测的前提就是需要知道运动模型,也就是需要知道在当前状态下,如果采用某个动作,未来的状态会是什么样。这里未来的状态可能是确定的,也可能是随机的。所以有了这个模型,那么就不用和实际的环境交互,也可以一步一步推断出未来的状态,这个就是所谓的预测。基于模型,就产生了的各种算法,后面有几次课程会专门讲解这个部分。
下面图中的这句话:“The idea that we predict the consequences of out motor commands has emerged as an important theoretical concept in all aspects of sensorimotor control”,翻译过来大概是:我们可以直接预测出运动指令的结果,这种想法已经在感知运动控制的各个方面成为一个重要的理论概念。
下面举几个论文中的例子,给大家一些直观的感觉,感觉一下预测到底是怎么做的。预测的一个方式就是去预测下一个场景的图像,显然这种方式也只能用深度学习才可以做到。例如下面的这篇Frederik Ebert的论文“Self-Supervised Visual Planning with Temporal Skip Connections”,论文的链接地址是:https://arxiv.org/abs/1710.05268。
它的过程大概是这样:一个机器人在一个环境中与一些物体进行互动,如图所示,一个机器人在推一些物体。这个推的动作可能不是设计好的,而是机器人随机的移动所产生的一些推动,这些移动的视频被记录下来。记录这些数据的目的,不是为了让机器人去学会一些策略,而是要去学会一个模型,就是已知当前的场景和机器人的动作,去预测下一个场景,这些场景都是用像素去表达。预测出来的场景可能会有一些模糊和不确定性,但是也基本可以表达物体的运动方式。有了这些预测模型以后,就可以给机器人一个任务,例如图中所示,要把标记为小红点的物体移动到绿点的位置。机器人就可以利用这个学会的模型去做一个运动规划了。
2019年的另外一篇论文和上一篇有这相似的效果,但是更进了一步,机器人不是直接去推物体,而是需要决定是不是需要使用工具去移动物体。它的作者是Annie Xie,题目是:“Improvisation through Physical Understanding: Using Novel Objects as Tools with Visual Foresight”,链接地址:https://arxiv.org/abs/1904.05538 。
另外一篇类似的论文也是2019年的,出自Łukasz Kaiser,论文的题目是“MODEL BASED REINFORCEMENT LEARNING FOR ATARI”,链接是:https://arxiv.org/abs/1903.00374 。从论文的题目就可以看出来,它是利用模型预测的方式来玩atari游戏,基本也是去预测下一个场景是什么,再去选择合适的动作。
说了这么多,让我们看看刚才提出的问题,就是如何制造智能机器。如果要制造一个智能机器,我们应该从哪里开始下手呢?大家可能会想到一种方式就是模仿人的大脑。
如上图所示,大脑是由各个区域组成的,每个区域有不同的功能,如果能复制每个区域的功能,然后组合起来是不是就可以实现智能了呢?这一想法在很早的时候就有了,但是随着对大脑认知的发展,大家发现大脑并不像当初认为的那么简单,而是构造非常复杂,其中的功能模块也很多,并且存在一定的交叉,所以,即使实现一个简单的功能模块可能都很不容易,更不要说把它们都实现了。
于是出现了另一个想法:能不能把学习作为智能的基本单元?大概的想法是,大脑中的各个区域的功能虽然不同,但是这些功能可能都是学会的,这一观点也许不能被接受,但是起码我们可以简单讨论一下。例如人,我们拥有很多技能,大概可以分成两类:
人可以学会很多事情,包括一些很难的事情,例如很艰深科学研究,或者很复杂的人体技能。可能我们的学习机制可能足够强大,可以完成与智力相关的一切。所以,学习可能就是智能的基本单元,至少它与智能的关联也是很大的。
既然学习这么重要,是不是可以用学习的方式来实现大脑中的那些功能模块呢?例如,好像我们可以模仿视觉皮质的功能,去设计一种类似的学习方式去完成从图片中提取特征这个功能,我们知道深度学习已经可以做这个事情了;我们还可以模仿运动皮质的功能,去再设计另外一种学习方式等等。这一理论在上世纪90年代和本世纪初还是比较流行的。
还有一种大胆的假设就是,并不是每一种功能都需要一个不同的学习方式,是不是有可能所有的功能都是由一种算法去实现的!这种算法非常灵活,可以适应各种输入和输出,但是内部其实还是一种算法。如果真的存在这样的一种算法,那么这种算法可能说明了一件事情:所有的学习都是一样的。其实这一点并不难理解,例如,所有的机器学习都是类似的,都是最小化或者最大化一个代价函数,或者说与学习的目标更加接近。所以从算法的内部来讲它们可能都是一样的,我们简单可以简单的理解成都在做梯度下降。不同的算法的区别可能就在于输入和输出是不同的,目标是不同的。
有人做了一些实践,可以从中发现一些佐证。例如:有人设计了一个实验,用舌头去看东西!如下图所示,实验者把摄像头的视频输入转换成电信号,然后用一些排列好的电极把这些电信号传递到实验对象的舌头上,经过一段时间,实验对象就会建立起一些电极信号与实际物体之间的映射了,可以简单的觉察到物体的一些轮廓。也就是说他通过舌头看到了物体!
另外一个实验是这样,实验人员把负责听觉的皮质连接到视觉神经上,一段时间以后,负责听觉的皮质也可以“看”了。也就是说这个实验转换了听觉皮质的功能!
这两个实验说明了一些有趣的事情。例如第一个实验,它说明了并不是只有眼睛才能看,其实物体并不是眼睛看见的,眼睛只不过是信号的收集器官,真正看见的是大脑。佐证这个事情的还有另外一个有点残忍的例子,就是把刚生下来的小猫一直放在一个只有黑白格子的世界里,经过一段时间以后,再放回到现实世界里,结果小猫什么都看不见了。原因并不是小猫的眼睛出了问题,而是脑袋出了问题,它并没有被训练成能够看到这个世界。有点跑题,我们再回来,第一个实验说明的一个问题是不一定只有视网膜上的成像才能被看见,其它的信号输入也可以被看见。其实这一点不难理解,有的生物的眼睛和人有很大的不同,例如昆虫,也能看到这个世界,但是它们的视觉输入信号和人的是有很大不同的。
所以,如果真的是只有一种算法来处理所有的事情,那么这个算法一定是强大的,它应该具备下面两个特点:
上面两点大概可以对应到深度学习和强化学习,深度学习的长处就是能够处理各种复杂的非结构化的输入;通过定义不同的奖励,以及采用不同的算法,强化学习可以让智能体学会各种技能,也就是对环境可以做出一些复杂的反应。
另外还有一些实验佐证了深度学习对信号的处理方式与大脑对信号的处理方式有很多类似的地方。例如2012年吴恩达的一篇论文:“Unsupervised learning models of primary cortical receptive fields and receptive field plasticity”,链接在:https://web.stanford.edu/class/cs379c/archive/2012/suggested_reading_list/supplements/documents/SaxeetalNIPS-11.pdf 。这篇论文中把猴子大脑中对视觉信号的处理和神经网络对视觉信号的处理做了对比,发现了很多相似的地方。他们还对比了触觉信号,也有相同的发现。这样可以在一定程度上佐证深度学习对信号的处理与大脑类似。但是Levine在课程里说,也许并不是处理的类似,而是数据本身的特性,可能代表这些数据的特征是固定的,也就是说深度学习可以发现这些特征,大脑也能发现同样的特征而已。这个观点我也比较赞同。
还有一篇论文在尝试说明大脑在一些方面与强化学习有类似的地方。“Reinforcement learning in the brain”,链接地址:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.174.5024&rep=rep1&type=pdf 。这里只是截录一些里面的文字:
“具体而言,行为动物的电生理记录和人类决策的功能成像已在大脑中揭示了关键强化学习信号(时间差异奖励预测错误)的存在。”
“预期奖励的感知与奖励本身具有相似的触发方式”
“基底节似乎与奖赏系统有关”
“像自适应这样的无模型RL通常非常适合动物自适应的实验数据”
如果大脑,甚至所有的生物处理问题都只有一种算法,那么这种算法可能与深度强化学习非常接近,上面的这些实验和论文在一定程度上佐证了这一观点。但是人们要找到这种单一的算法还有很长的路要走,这其实是一个解密自然规律的过程,我认为到目前为止,人类可能没有能力去解释任何的自然规律,只能够去发现了利用规律。在人工智能领域,人类可能还没有发现规律,就是没有一套理论去指导大家合理的去应用人工智能,就像人类目前可以合理的应用力学规律去做各种设计和运动控制一样。
深度强化学习可以解决很多问题,但是到目前为止,解决的问题还是有限的,这并不说这个方法不行,可能大家还是没有找到最合理的用法。深度强化学习目前可以解决下面一些问题:
虽然深度强化学习可以做一些事情,但是和生物智能比较起来,还是有很大的不足,主要体现在下面几点:
所以,综上,我们可以看到,目前强化学习的水平还是很有限的。我们还是处于人工智能发展的非常早期,甚至大家连什么是人工智能都没有一个统一的说法。但是,深度强化学习至少给了我们一些启示,就是我们可以用一种类似的、基于学习的方式去解决各种不同的智能问题,而不是一种问题去设计一种算法。
阿兰.图灵说:“与其尝试制作一个模拟成人思维的程序,不如尝试制作一个模拟儿童思维的程序。如果对此进行适当的教育,将会得到成人的大脑”。