大脑和小脑——规划和执行

大脑和小脑——规划和执行

田青

[email protected]

[email protected]

20208

 

摘要:自然界中任何的生物体都不会自己建立数学模型,但是他们可以通过学习的方式去掌握运动技能。目前,大部分的机器人控制仍然需要人工建立的模型,用人工模型来控制复杂机器人的难度很大,主要原因是模型的复杂性和不精确性。所以近年来,用学习的方式训练机器人完成任务逐渐成为一种趋势,这种方式虽然取得了一些成效,但是截至到目前(20208月)为止,在训练机器人方面并没有能够提出一个完整清晰的架构,使得机器人可以像生物一样合理的去掌握技能。本文试图在这个方面做一些努力,提出一个简单的人工智能架构:大脑和小脑,它们分别掌管规划和执行。这个架构大概是结合了生物智能、深度学习和强化学习的一种新的架构。大脑和小脑的功能都是学会的,大脑和小脑的分工清晰而简单,大脑做规划不做执行,小脑去执行不做规划。

 

智能问题

       人工智能的发展已经有一段时间了,但是大部分的工作重点是在研究算法层面,也就是用一个算法去解决一个具体问题,例如语音识别问题和图像识别问题。有些智能问题可能比较复杂,例如自动驾驶,它是由多个算法问题组成的,但是这种组成一般不是有机的组成,也就是说组成方式没有体现出一定的通用架构,使得这种架构可以被用于其它的人工智能解决方案。

       那么是否存在一个通用的人工智能架构可以解决所有问题,或者至少是大部分问题呢?这个问题可能比较复杂。但是假如我们先不直接考虑人工智能架构的问题,仅仅考虑生物的智能问题,我们就会发现,不论是复杂的生物还是简单的生物,都会体现出一定的智能,而且它们的智能都有一定的相似性,这些相似性表现在:

  • 生物体适合在一个特定的环境中生存。
  • 生物体本身具备适应这个特定环境的行动能力和生存能力。
  • 这些能力会在实践中不断增强,生物体变得越来越聪明。
  • 生物体的很多行为都是有目的的,例如捕食和迁徙。
  • 生物体的这些能力可以遗传

生物所表现出来的这种能力,可以称为智能,或者生物智能。这种智能从生物体出现就开始有了,已经存在了几亿年。我们想象一下,如果把这些智能映射到算法,那么会有多少种算法呢?是每个生物体一种算法?还是每种行为是一种算法?我们有理由相信不可能是每种行为都体现出一种算法,例如人,我们可以通过学习掌握很多技能(行为),但是我们好像不是为每一种技能去发明一个算法,而是差不多用类似的方法去学会了这些技能。

所以一个很有可能的情况是,生物体身上所体现出的这些智能是通过同一种方法得到的,这种方法的特点是:

  1. 生物体本身具备一定的技能;
  2. 生物体在与环境的交互中这些技能得到增强。

在人工智能研究的各个领域中,与这些特点比较接近的领域就是强化学习了,它研究的是智能体和环境的交互问题,就是一个智能体如何与环境交互去完成一个任务或者达到一定目的。例如一个扫地机器人清理地面,机器人就是智能体,地面就是环境,家里的一些家具和物品也是环境,机器人的目标可能就是用最小的代价把房间的地面清理干净。

再如,你命令一个人形机器人去给你拿一瓶可乐,这个机器人就会走到冰箱那里,打开冰箱门,拿出可乐,关上冰箱门,走到你身边,把可乐递给你。这个过程是一连串的动作,是一些任务的有序结合,是由一个一个任务组成的。例如走到冰箱那里,就是一个任务,它包括智能体、环境和目标;打开冰箱门,也是一个任务,也包括智能体、环境和目标。我们可以很轻易的看出来这两个任务的环境和目标是不同的。

       一个实用的机器人肯定是可以完成多个不同任务的,但是很多任务是有相似性的,例如“走到冰箱那里”和“走到你身边”,“打开冰箱门”和“关上冰箱门”,“拿出可乐”和“把可乐递给你”,这些任务都有相似性,这种相似性我们后面还会提及,它们都属于一类任务,或者说是一个功能,就是机器人会做某一个事情了。

 

强化学习

       机器人是怎么具备完成任务的能力的,那肯定是人设计出来的,目前大概有两种设计方式去控制机器人完成任务,一个是人为建立模型的方式,另一种是采用学习的方式。深度强化学习目前就是这种学习方式的最好体现,在训练机器人领域有了很多不错的成果。深度强化学习本质上就是强化学习,只不过其中的一些函数用深度神经网络来实现了。所以这里主要先说说强化学习,简单讲讲强化学习是什么,可能不会涉及很多的细节,所以如果你不太了解强化学习,这一部分可能看的不太懂,但是没有关系,因为只要看懂后面的内容就行了,后面才是重点。

       一般来讲,主流的强化学习算法大概是这么解决问题的:开始,它先让智能体以“随机”的方式与环境交互,产生一些交互数据,通过这些交互数据来更新这个“随机策略”,使它变成一个“更好的策略”,然后再使用这个“更好的策略”继续与环境交互,产生更多的交互数据,再用这些新的数据去更新“更好的策略”,使策略变得更好。

       什么是策略呢,就是在一定情况下你要采取什么样的措施。对于机器人来讲就是面对一个环境它需要采取什么样的动作。所以策略好像决定了一个机器人是聪明还是笨。那么为什么要去不断的更新策略呢?简单的来说就是使机器人变得越来越聪明。

一般来说,策略是针对一个任务的,只有更好的策略才能更好的完成一个任务。还记得上面提到的任务吗?一个任务大概就是智能体和环境的一个简单交互过程,例如机器人从冰箱里拿出一瓶饮料,或者是机器人从桌子上拿起一个杯子。

在机器人拿杯子例子中,好的策略就可以使机器人顺利的拿起杯子,不好的策略可能就是机器人拿不到杯子,或者把杯子碰倒了。所以一个好的策略就导致机器人以合理的运动轨迹去运动,去拿到杯子。所以评价一个策略的好坏就可以变成评价在这个策略下产生的轨迹的好坏,如果在A策略下产生的轨迹比B策略下产生的轨迹好,那么我们就说A策略比B策略要好。

 

现在用一些公式和图来说明一下强化学习过程:

大脑和小脑——规划和执行_第1张图片

       上面这个图大概说明了智能体与环境的交互过程,神经网络代表智能体,地球代表环境,具体的细节如下:

  • 首先,智能体基本就等于策略,就是图中那个神经网络。策略就是一个函数,有输入和输出,输入就是智能体面对的状态,输出就是智能体采取的动作,这个策略函数可能是一个神经网络也可能是别的函数,深度强化学习的策略函数一般是神经网络。策略函数用\pi_\theta(a|s)来表示,这里的\pi_\theta(a|s)表示的是环境在状态s下采用动作a的概率。一般函数都返回一个具体值,这里为什么是一个概率,因为这个策略函数一般是被训练出来的,训练的结果一般就是,面对一个状态可能会采取不同的动作,采取每一个动作都有一定的可能性。
  • 另外一个很重要的东西就是环境的动态模型:p(s'|s,a),它的意思是环境处于某一个状态s的时候,智能体采用动作a,导致环境变成另一个状态s'的概率。为什么也是一个概率,因为环境是一个黑箱,是动态的,它的返回值是不确定的。智能体在面对同一个状态时采用同一个动作,返回的状态是不确定的。例如下棋,智能体作为一个棋手在盘面是s的时候下了一步棋a,然后对手下了一步棋,环境最终达到另一个状态s',这个s'是不可能通过sa完全预知的,只可能预测出对手大概率会怎么应对。动态模型的不确定性不等于完全随机,如果是这样,那么动态模型就没有意义了,之所以有模型,就是大概率它会返回一些确定的值。
  • 所以,智能体和环境的交互过程大概是这样的,智能体面对环境s,根据自己的策略,采取一个动作a,环境根据自己的动态模型p(s'|s,a),变成了另外一个状态s',这个新的状态就是智能体面对的下一个状态,然后智能体继续根据策略选择新的动作,这样不断循环下去,直到智能体达到目的,或者达不到目的。
  • 最终的结果,从智能体的角度上来看,就是它经历了状态、动作、状态、动作….,这样的一个有时间顺序的序列,我们把这个时间序列称为一条轨迹,通常用来表示。我们可以用来表示这条轨迹的概率,θ表示策略函数的参数,所以轨迹的概率直接解释就是:在策略θ下,产生这个状态和动作时间序列的概率。这个概率可以表示为一些概率的乘积:。它是环境初始状态的概率、策略和环境动态模型的乘积,你可以仔细想想一个轨迹的概率就是这三者的乘积。

       上面的这些概念就是强化学习的基本概念。如果我们知道了轨迹的概率,那么评价这个轨迹的好坏其实就是要去评价这个状态动作序列的好坏。动作可能难以评价好坏,但是状态可以,因为一个好的轨迹所经历的状态也应该是好的。试想,如果我们能给每个状态一个分数,然后把每个状态的分数累加起来,就能知道整个状态序列的分数,也就是这个轨迹的分数,所以用这个累加分数就能去评判一个轨迹的好坏。

       每个状态所获得的分数称为奖励值,用来表示,t表示时间序列中的某一个时刻,并不是表示在状态获得的奖励值,而是在t+1时刻达到状态所获得的奖励值,这个我们不去细究,知道大概意思就行了。如果要表示在t时刻的奖励值,可以用来表示。所以,轨迹的奖励值就是从开始到最后每个状态奖励值的累加:

       从开始到最后,一般称为一个episodeepisode一般翻译成回合。例如机器人完成了一次抓取,或者智能体下完了一盘棋,一个回合就是智能体与环境完成了一次交互过程。有的任务是容易分成回合的,但是有的任务不太容易,例如机器人走路,如果不摔倒,它会一直走下去,这样就很难用回合来区分,或者你可以把它看成是一个永远没有结束的回合。

所以强化学习的目的大概就是下面这个公式:

       这个公式的解释就是:采用最好的策略,使得轨迹的累积奖励的期望值最大,什么是期望值,简单的讲就是均值,为什么要用均值而不用实际值,因为即使在相同的策略下,每次得到的轨迹也是不用的,因为环境存在很大的不确定性,当机器人做一个动作时,达到的下一个状态是有一定随机性的,所以每条轨迹就有一定的随机性,每条轨迹的累积奖励值就可能差别很大,所以轨迹的均值(累积奖励的期望值)比单独的一条轨迹的累积奖励值更有实际意义。

       讲了这么多才刚刚说清楚了强化学习的目的,简单的说就是一句话:找到最好的策略。围绕这一句话,强化学习领域发展了很多算法,这些算法按照是否使用环境动态模型,大概分成了两类:无模型的算法和基于模型的算法。

       这些算法有着细节的不同,但是大概都是按照下面的过程去更新策略的:

大脑和小脑——规划和执行_第2张图片

       这个更新过程大概分为三步:

  1. 使用当前的策略来收集数据。
  2. 使用收集上来的数据来评价一个策略,或者去学习一个模型。
  3. 根据评价来更新策略。

其中,无模型的算法就是不依赖环境的动态模型模型,只是依靠智能体和环境的交互来收集数据,更新策略,比较通用的算法有策略梯度、Q-learning等等,这里不做详细的解释。

       基于模型的算法就是依赖环境的模型去寻找一个好的策略,知道环境模型的一个好处就是智能体可以不用和实际的环境交互就能预测出与环境交互的效果,这样就可以推断出一条轨迹的好坏,从而可以根据推断来选择策略去执行。

       下面我们先讨论一下模型,再回来讨论算法。

细说动态模型

       动态模型到底是什么?简单的回答就是对自然环境的模拟,它表示的是一个函数,就是在t时刻,环境的状态是,如果智能体采取动作,那么它达到下一个状态的概率是多少。还要说的一点就是,如果没有输入,也存在动态模型,因为环境自己也在不断变化。例如自动驾驶汽车,即使汽车停住不动,周围的环境也是在不断变化的。所以这个时候的动态模型可以表示成:

       模型是一个数学公式(我们姑且这么认为),和我们学过的任何数学公式一样,它会计算出的一个结果,但是这个计算出的结果未必就是真实环境中的结果,只是对真实环境结果的一个预测。预测值可能和实际运行的结果会有一定的偏差,偏差的原因就是模型的不精确性,就是它不一定能反应出环境的真实情况,因为环境是复杂的。

       下面举两个例子来说明一下模型。

       第一个例子是预测小球下落的速度。例如我们可以根据牛顿动力学模型计算出某一时刻小球下落的速度,这个问题中学物理就可以解决,所以这个牛顿动力学模型就是我们的模型,这里st就是小球的当前速度,就是重力,它是恒定的,就是下一时刻的速度。但是实际中因为有空气阻力的作用,小球下落的速度是不会等于按照牛顿动力学模型计算出来的数值的,所以这个空气阻力就是环境的复杂性。你可以说我们可以再加上空气动力学模型,把空气阻力考虑进去,这样会准确一点,但是空气是流动的,也会影响小球的运动,这个规律还是抓不住,所以可能在实际运行中,总有一些考虑不到的因素来影响结果,这些因素是模型考虑不到的,所以模型基本是不能完全反映出系统的动态情况。在小球下落这个例子中,动态模型是一个我们可以手写出来的计算公式。

       第二个例子是猎豹追逐羚羊。猎豹没有学习过运动学和动力学,在追逐羚羊的时候没有计算公式,它只能根据自己的感知来决定采取什么样的行动,这个也是策略,猎豹的脑袋里有真实的神经元所组成的神经网络的,假设它的参数也表示为θ,那么猎豹的策略也可以表示成。当猎豹看到前面的羚羊处于状态st的时候,根据自己脑袋里的神经网络判断一下,然后采取了动作at。当猎豹采取行动以后,环境会进入下一个状态,环境会进入什么样的状态是由环境的动态模型确定的,也就是由来确定的。猎豹追逐羚羊的动态模型是复杂的,它大概是由猎豹的运动、羚羊的运动以及周围的地理环境组成的。这么看似复杂的动态模型好像很难掌握,但是猎豹可以掌握,否则它就抓不住羚羊,就会饿死。

       读到这里你可能会问,小球自由落体的那个例子中,智能体在哪里?如果一定要回答,可能就是万有引力吧,这个回答可能比较牵强,但是我举这个例子的目的就是想说明,即使是比较简单的模型,和实际结果比较起来,也可能还有一些偏差。

       前面说过模型是一个数学公式,但是对猎豹来说,它不是数学公式,它是自然经验。猎豹可能会根据地形、羚羊的状态等等去选择动作,猎豹会预估自己运动会达到的效果,也会预估环境的变化,例如羚羊的移动方向,并且可以根据环境状态的变化去调整自己的动作,所以对于猎豹来说,它的智能体现在两个方面:

  1. 猎豹非常清楚理解环境的动态特性,和输入对环境的影响,也就是它的动作会引起环境怎么变化。
  2. 猎豹可以根据自己的能力、当前的环境和目标去选择合理的动作。

       这里的第一点就是模型,猎豹能够掌握这个模型,它的意思就是猎豹知道自己的能力,它可以推测出做出一个动作以后,环境会变成什么样子,这样猎豹就可以去决断是不是要去做出这个动作,例如:它看到了一个年轻力壮的羚羊,在一片开阔地上吃草,那它根据这个状态和自己的能力来判断它是不是要发动攻击。

       第二点指的就是策略,策略是怎么做出的,是根据能力、环境和目标做出的决断。

       模型很重要!再举另外一个例子说明一下。例如一群人过河,河上没有桥,只有大大小小的石头可以踩着过河。每个人都知道自己的能力,都可以选择合适的石头踩着过河,身高腿长的可以选择远一点的石头,腿短的可以选择近一点的石头。过河不是重点,每个人知道怎么过河才是重点,它说明的是每个人都有掌握自己这个模型的能力,一个腿短的人是不会选择很远的石头的,因为他/她知道那样很有可能掉到河里。所以每一个成熟的生物体,包括人、狗、蚂蚁、蛇等等,都会掌握自己的模型,都能明白自己的能力。初生牛犊不怕虎,说的不是初生牛犊的勇气,而是说初生的牛犊太嫩了,还没有能力去掌握自己的模型,还不能根据自己的模型做出正确的决断。所以:聪明的智能体能够掌握自己的模型!

为什么需要大脑和小脑

到现在才进入文章的主要部分,我们要从强化学习的问题出发,引出大脑和小脑的学习框架

       我们上面大概说了什么是强化学习,以及什么是模型,我们也知道了强化学习的算法大概分成两类:无模型的和基于模型的,另外我们对生物智能也有了一些感觉。那么,我们能不能借鉴这些知识来构建一个比较通用的人工智能框架呢?也许可以,但是你可能要问,既然已经有了强化学习,而且强化学习大概也是一个框架,算法也遵循一个过程,我们为什么还需要另一个框架呢?这是因为,目前强化学习的算法和框架有很多问题,它可能不适合去成为一个通用的人工智能框架,它的问题大概有如下的几个方面:

  • 从零开始试错的方式在自然界中几乎没有。强化学习的很多算法是从零开始试错的,开始的时候是一个随机策略,然后通过和环境的不断交互去提升这个策略。但是在自然界中,这个方式几乎见不到,自然界中生物体如果采用试错的方式来学习,可能很快就死掉了,一般都是在一定的基础上才去尝试一些动作,完全的试错可能只发生在一些极端状态。
  • 一个策略只能完成一个任务,而且策略的目的性很不清楚。强化学习中的策略是针对任务的。不论是策略梯度算法,还是基于值的一些算法,它只能学习到做一个任务的策略。并且从这个策略的本身定义来讲,你其实不知道这个策略在做什么,就是从策略的表达上你看不出策略的目标是什么。如果智能体是一个机器人,那么用这样的方式,做一件事情就有一个策略,也就是智能体学会了一个神经网络,做另外一件事情就需要另外一个,需要另外一个神经网络。
  • 马尔可夫性在自然界几乎不存在。简单的说,马尔可夫性就是如果智能体知道了当前的状态,那么以前的历史状态和行为就不重要了,所有的判断都可以基于当前的状态来做出。知道当前的状态当然好,但是现实情况是智能体是不知道状态的,它得到的只有观察值。例如猎豹是不知道羚羊的具体速度和加速度的,它只是看到了前面的羚羊。再如,一个打乒乓球的机器人,它也只能通过观察获取乒乓球运动的观察值,而不知道乒乓球准确的位置、速度、旋转等等。但是观测值对于猎豹和打乒乓球的机器人已经够用了,所以,得到环境的状态不是必须的,马尔可夫性也不是必须的。
  • 所以,策略的表示也是不对的。既然马尔可夫性几乎不存在,那么策略的表示也是有问题的,是不太对的,很少能通过当前的状态来判断出应该采取的动作,而是通过观察值,一般是一连串的观察值。例如打乒乓球的机器人,一般是通过观察乒乓球运动的轨迹来判断乒乓球的落点,运动轨迹就是一个连续的观察值。另外动作的选择也不是随意的,也是有一定的连续性的,往往和以前的动作有关系,所以策略的表示可能是:,其中表示在t时刻的观察值。
  • 端到端的方式有很大问题。简单的说,端到端就是从观察直接到控制,其实它就是使用了深度学习的强大能力,直接学习到从观察值到控制的映射,例如视觉抓取和一些自动驾驶方案。但是端到端的方式太直接了,而且手伸的太长,原因主要有两个:第一是观测值没有被抽象出特征,第二是很少由大脑去直接控制肌肉。第一个问题是很重要的,如果观察值直接拿来做判断,那么影响判断的因素就有很多,例如视觉抓取,如果视觉图像中有了一些不重要变化,例如背景,可能就会影响抓取的结果。第二个问题也很重要,大部分的生物,直接控制肌肉的都不是大脑,而是比大脑更加低级的神经组织,例如小脑或者脊髓。这么做有很多好处,显而易见的好处就是可以各负其责,大脑可以去做更重要的事情。
  • 策略和模型的关系。策略和模型的关系在很多强化学习算法中是不清晰的,在无模型的算法中,策略是智能体直接和环境交互学习出来的,和模型没有关系。在基于模型的算法中,很多算法是根据模型来预测出轨迹,其实没有一个明确的策略,当然也有一些算法能够根据模型学习出策略。但是在实际中,策略一般是基于模型的,上面我们提到过:聪明的智能体能够掌握自己的模型。还是拿过河的那个例子,你过河要踩哪个石头是根据自己的能力来判断的,这个能力就是模型,你只有对自己的模型有清晰的掌握,然后才能根据你的能力和环境来做出正确的判断(策略),这种方式是自然界的常态。
  • 学习到策略可能是不对的。猎豹追羚羊是看一眼羚羊在哪里,然后调整一下自己的运动姿态的吗?显然不是,猎豹应该是根据形势做了一个追赶计划,然后实施,过程中形势变化了,再调整计划,再实施。你要是问我你怎么知道猎豹是这么做的,我只能说我是猜的,因为这样比较合理,因为人也是这么做事情的,你不用看一下想一下做一下,而是看一下,想想怎么做,然后去做一些动作。所以策略可能太实时了,太近视了,没有一个长远一点的规划。另外用实时的策略去做判断可能也浪费资源,因为想次数的太多,可以一次想的远一点。

       上面说了一些强化学习的一些问题,那么怎么做才可以避免和纠正这些问题呢?可能从强化学习本身去改变有些困难,在强化学习没有出现以前,大家不知道怎么让一个智能体做到越学越好,强化学习用一些简单的算法解决了这个问题,但是同时也带来了上面所说的一些问题。解决一个问题的方式可以是多样的,强化学习也可能是用了一个不太正确的方式去解决了问题,这种情况是可能发生的,例如杀鸡用牛刀,杀牛的刀可以杀鸡,但不是最合适的。最合适的方法也许在自然界,可以借助自然界进化了几亿年的方法来做一些改进。所以,如果可以借鉴一些生物智能,从根本上来设计一个新的架构,那么新的架构可能有以下的一些特点:

  • 智能是有层次的,高层次的智能解决高层次的问题,低层次的智能解决低层次的问题。
  • 高层次的智能解决规划问题,规划比策略更加长远。
  • 低层次的智能解决执行问题,它仅仅是执行,不做规划。
  • 没有端到端的方式,所有的任务都被分成规划和执行两个部分分别处理。
  • 策略消失的结果就是不用考虑马尔可夫性质,因为不会用到了。
  • 智能是有目的的,智能体知道自己的任务是什么。
  • 和聪明的生物一样,智能体能够掌握一个好的模型。
  • 智能体基本不是用从零开始的试错方式去学习。

       下面提到的大脑和小脑的方案就是大概以上面提到的特点为目标去设计的,简单的说就是:大脑解决规划问题,小脑解决执行问题,二者之间有必要的联系。

大脑和小脑的方案

       人的大脑和小脑可以解决很多问题。大脑可以做很多思考,例如我现在面对这篇文章在想着怎么写下去;小脑可以控制运动,例如我可以走路,跑步,打球等等。大脑和小脑的分工基本就是大脑负责思考,小脑负责执行,所以借鉴这个思路提出了类似的方案:大脑负责规划问题,它规划出一个轨迹,小脑负责执行这个轨迹,大脑的规划能力和和小脑的执行能力都是学习出来的。

       举一个例子,如果机器人想抓取一个杯子,那么大脑先想好这个过程,就是机器人手臂在各个时刻的状态,然后把这些状态序列发给小脑去执行。目前,这里所提出的大脑和小脑的方案仅仅考虑用于机器人的运动控制,并没有涉及其它方面的智能。但是未来机器人的整体智能解决方案也可以依托这个方案去做扩展,原因很简单,大脑负责思考、小脑负责执行可能是一个通识,只不过其中涵盖的内容和实现方式会有所差别。

       所以,现在谈两个具体问题:

  • 大脑是怎么规划的?
  • 小脑是怎么执行的?

       先来讨论第一个问题,大脑是怎么规划的?做每件事情都是有前提的,不可能一个人告诉你去做一件事情你就去做了,而是要问清楚一些前提条件:例如做什么?去哪里?什么时间等等问题。所以规划也是一样,机器人要为一个运动任务做规划,就需要知道一些前提条件,其实就是规划的输入,规划有三个输入:

  1. 智能体要做什么
  2. 智能体当前的位置和姿态是什么
  3. 环境的是什么情况

       仔细想想,这三个条件是缺一不可的。例如机器人抓取杯子,你需要回答这三个问题才能做规划。第一,机器人要干什么:抓杯子;第二,机器人在那里;第三,杯子在哪里。其中,第二点和第三点决定了机器人运动的起点和终点,对规划起着决定性作用,容易忽略的是第一点,它也很重要,它是行为的目标,告诉机器人任务是什么,它类似于监督学习里面的标签,指出你规划的轨迹是干什么的,或者说是哪一类的。

      这三个条件是规划的充分必要条件。充分必要就是不多不少的意思,它比较苛刻,少了一个不行,多了一个就多余了。大脑的功能可以用下面的示意图来展示:

大脑和小脑——规划和执行_第3张图片

       大脑的输出是轨迹,但是这里的轨迹和强化学习里面的轨迹有一点差别,就是轨迹里面没有动作,只是一个状态的序列:,为什么没有动作,原因是大脑并不关心具体的动作是什么,这个是小脑的事情。

       现在所说的大脑功能只是一个示意图,还有很多东西没有讲清楚,例如目标、机器人位姿、环境都应该怎么表示,大脑到底是一个什么东西等等。这些东西在介绍大小脑的实现部分会有详细说明。可以简单的说明一下:目标、机器人位姿、和环境都是编码,都是一串数字,大脑是一个生成网络,输入的是这些编码,生成一个状态序列。

       简单的介绍了大脑,再介绍一下小脑,也就是回答刚才提出的第二个问题,小脑是怎么执行的。小脑做执行很简单:就是拿到一个大脑发过来的状态序列,把这个序列一个一个地执行下去。什么叫执行呢?就是小脑会根据两个连续的状态,产生一个动作,并且执行这个动作,然后再加入下一个状态,接着产生下面两个连续状态的动作,然后再执行动作,直到这个状态序列结束。小脑也可以用另一种实现方式,就是将所有的动作都产生出来,然后一起执行。两种不同的实现方式,都有一些优缺点,我们后续讨论。所以最终的结果就是小脑生成了一个动作序列,并且执行了这个动作序列

大脑和小脑——规划和执行_第4张图片

       那么,具体来说动作,是怎么产生的呢?它是由产生的。我们知道,系统的动态模型是这么表示的,它的意思是系统处于状态给它施加动作,最终会达到状态。把这句话投射到机器人上面就是:机器人处于状态(姿态、速度、加速度),机器人各个关节输出转矩,使得机器人最终达到状态(姿态、速度、加速度)。

       那么通过两个连续的状态是怎么产生动作的呢?就要回到那句经典的话:聪明的智能体能够掌握自己的模型!就是智能体的小脑知道,当自己处于状态的时候,要实施什么样的动作,才能使自己达到这个状态。小脑为什么可以知道这件事情,原因就是它通过训练学会了这个事情。简单的说,小脑也是一个神经网络,它收集了很多()这样的数据,然后训练出了从这个映射,我们把它称为小脑模型

大脑和小脑——规划和执行_第5张图片

       大脑和小脑的实现细节我们将在下一个小节再讲,现在我们说说大脑和小脑这样设计的好处。这样设计大概有下面的一些好处:

  • 体现了智能的自然特性。大脑负责思考,小脑负责控制。这样的架构符合自然规律。
  • 简单。以前端到端的学习方式看似简单,其实隐藏了很多问题,而大小脑的分开设计,表面上增加了复杂性,其实是把问题清晰和简单化了。现在的机器人控制器大多数并没有做这种大小脑的分离,什么是大脑该做的事情,什么是小脑该做的事情不是很清晰,这样的结果就是反而带来了复杂性,使得控制器的设计要么就过于简单,做不了太多的事情,要么就过于复杂,升级和维护都比较困难。
  • 容易形成统一的规范。大小脑各负其责,功能都定义的很清晰,这样就便于实现机器人控制器的设计就有据可依,这样容易形成行业规范,大家可以在规范的框架下做自己的产品,并且各个产品之间可以兼容。
  • 减少了代码和控制器设计的复杂性,还是体现了简单。大脑和小脑的功能都是学会的,都是通过训练去慢慢提升的,这是真正体现了智能,而不是通过写代码完成的功能,所以代码量相对减少,维护方便。
  • 可以做到遗传。一个机器人学会的经验可以方便转移到其它的机器人。
  • 可以做到个性化。机器人在使用的过程中技能也是在不断的增强的,而且是不断适应自身的动态特性,例如一个机器人可能有些地方磨损或者有一些别的小问题,这样的情况如果是使用人为定义的模型就不行了,因为实际和模型相差的比较大。但是使用学习的方式,它就可以不断地适应这些自身动态特性的变化,还能去完成一些任务。例如,年轻人能够做的很多事情,老年人同样可以做,可能就是慢一点而已。
  • 可以做到大小脑分离。这样非常方便的给机器人增加智能。一个简单的机器人就只需要实现小脑的功能就可以了,也就是仅仅掌握自己的动态模型就可以了。可以另外在外面给这个机器人配上大脑,这样就相当于给一个傻机器人增加了智能。这样的应用场景在工业机器人和服务类机器人中都可以出现,可以给它增加了一个大脑,去告诉机器人做什么事情。

大脑和小脑的实现设想

       这里我想提出一些大脑和小脑的实现设想,既然只是设想,那么就一定有很多不完备的地方,其实的确是如此,很多细节我是没有想清楚的。

小脑的表达和训练

       小脑的训练目的就是为了掌握机器人的动态特征和小脑模型。机器人运动的时候都就是从一个状态变换到另一个状态,所以收集机器人在运动时候的数据,就是()这样形式的数据,机器人从一个状态开始,运动了一下,达到了另外一个状态。就可用这样的数据来训练小脑。

       收集了这样的数据以后,就可以训练出两种模型,一个是动态模型:,它表示了系统的动态特性;还有一个是小脑模型,它表示了小脑怎么产生一个动作。小脑模型的训练一般是需要依赖动态模型的,一个直接的原因就是是哪里来的,你可以说是采集的,但是是依据什么来采集的,回答就是有可能是依赖动态模型。关于这部分后面再详细讨论。

       动态模型和小脑模型一般都是深度神经网络,用这种模型的好处就是它的表达能力强,在输入和输出比较复杂的情况下也能训练出很好的效果,关于深度学习这里不准备花篇幅去讨论,因为有很多资料去讲解相关内容。需要声明的是以下说的模型,如果不加说明,一般都是指深度神经网络。

       ()这样的数据相对比较好收集,因为机器人的任何运动都会产生运动信息,所以一个简单的办法就是让机器人随意运动,就可以产生很多的运动数据。另外在机器人执行任务的过程中,还可以形成大量的训练数据,也可以把这样的训练数据拿来去训练小脑的神经网络,这样可以达到实时更新的目的,使机器人可以掌握自己最新的动态特性。

       另外需要强调的一点就是:机器人可能是带有负载的状态,例如机器人可能拿着一个杯子,那么杯子就是负载,这个时候机器人整个的动态特性就会有所改变,此时机器人的状态也会有所改变,例如力传感器的数据,所以负载引起的只是状态的改变,没有引起别的改变,所以带负载的机器人和不带负载的机器人是一样训练处理的,可能就需要多一点的带负载的数据,这样机器人学习到的动态模型就更加完整。

 

大脑需要解决的问题

       大脑实现的功能比较复杂,它需要有三个输入:目标、机器人的位姿和环境,输出是一个轨迹。所以就需要解决下面几个问题:

  • 目标是怎么表达的?
  • 机器人的位姿是怎么表达的?
  • 环境是怎么表达的?
  • 轨迹是怎么生成的?

       所以我们先解决上面几个问题才能解决大脑的训练问题。

目标和任务编码

       目标就是用来说明机器人的这个行为是干什么的,也就是任务。对于人来说,你可以告诉一个人去抓杯子,但是你不能够这样告诉一个机器人,因为它不理解抓杯子是什么。也可能也会想到用自然语言处理的方式让机器人理解命令,但是不论有没有自然语言处理,最终都会有一条命令,用这个命令来告诉机器人任务是什么。

       所以我们就可以用一串编码表示一个任务或者命令,一串编码就是一串数字,每一类动作有一个编码,我们可以把它称为行为编码。例如机器人抓取杯子,都是用手抓去抓握杯子的外壁,这个动作是相似的,不论是什么样的杯子,或者圆柱形的直立在桌子上的东西,都是属于一类动作。机器人从开始的状态伸出夹持器抓住杯子这个过程就属于一个抓取动作,如果对这个动作的状态序列进行一个编码,以后就可以用这个编码表示这个行为。

       这里要注意的一点是,这个编码不是对动作序列的编码,而是对状态序列的编码,就是用一条状态轨迹来来表示一个行为,大脑是永远不关心动作的,它只要知道机器人的某一个状态轨迹表示的是某一个行为就够了,一个抓取的行为和一个开门的行为是两个不同的状态轨迹,也就是两个不同的编码。

       那么这个编码是怎么形成的呢?可以有两种做法,第一种做法是人为定义编码,例如用00000001这样的编码表示一个任务,这样就需要训练一个神经网络将不同的抓取动作都映射到这个编码上,也就是说需要训练一个“行为编码”的神经网络去做这个事情:

大脑和小脑——规划和执行_第6张图片

上面的是一个任务的轨迹,需要很多个轨迹去训练这个神经网络。你可能要问,多个相同的任务轨迹可以被映射到同一个值吗?是可以的,例如监督学习的分类就是做这个事情,把不同的猫的图片都映射成猫。

       这里对相同的任务做一个解释,相同任务的轨迹并不是同样的一条轨迹,而是做类似事情的不同轨迹,例如机器人抓取,机器人开始的位置和姿态可以不同,杯子的位置可以不同,这样产生的轨迹是不同的,但是它们都属于一个行为:抓取,所以它们的行为编码是一样的。

       人为编码的一个问题就是没有理由,为什么一个行为要映射成一个人为设定的编码,很难解释。行为和行为之间是有相似性的,这一点人可以很清楚的区分,如果要让计算机区分就需要在编码上体现,这一点对于人为编码是很困难的,可能就需要设计一些规则,想想就知道,这些规则很难设计,而且也极有可能不对。

       所以最好的方式就是大脑可以自己编码,也就是自动编码。人工智能中有这样的例子,例如自然语言处理中的词向量(word embedding),就是神经网络在处理了大量的词汇以后的自动编码,而且它能够反映出词汇之间的关系。如果行为编码也能采用这样的方式就好了,那么这个编码就能体现出行为之间的相似性,例如抓取杯子和抓取一个胡萝卜可能在行为上就比较接近,那么它们之间的行为编码的距离可能就比较近。抓取和走路两个行为编码的距离可能就比较远。

       机器人的行为识别和人的行为识别没有本质的区别,都是识别一个状态序列,告诉这个状态序列是什么。所以从这个角度上来讲,所有的行为识别技术都可以被用于机器人的行为识别,但是有一个区别就是人体的行为识别是通过观察得到的,输入的是图像或者视频,而机器人行为的输入是自身的状态,也就是说机器人自己需要知道自己在干什么,别人不知道没有关系。

       通过状态序列找出行为编码这个领域可能研究成果不是太多,怎么实现最合理还需要继续探讨。但是很容易就可以发现它和词向量的区别,词向量有太多的数据可以使用了,人类有那么多的文字都可以被用来训练词向量,但是行为编码的数据可能比较少,因为好像没有那么多的机器人数据。另外一个问题是两个不同的机器人之间的行为编码是不是可以一样?例如一个大的机械臂和一个小的机械臂做一样的动作。按道理来讲,它们的行为编码应该是一样的,但是它们的训练数据肯定是不一样的,这样就存在一个域迁移的问题,这个问题也值得去仔细研究。

       对行为进行编码的目的就是要使用,大脑使用这个编码去生成一个任务的轨迹,例如大脑使用一个抓取任务的编码去生成一个抓杯子的状态序列。但是,仅仅依靠行为编码是不够的,行为编码只是告诉机器人要干什么,还有很多的东西不知道,例如环境,下面就说说环境是怎么表达的。

环境是怎么表达的

       环境是什么?系统包括机器人和环境,也就是说除去机器人以外的部分都是环境。例如机器人抓杯子,那么杯子、杯子放置的位置和周围物体都是环境。环境是需要表达的,表达的目的就是让机器人明白环境的内容,那么什么是环境的内容呢,这个其实也是根据需求确定的。例如一瓶可乐,可乐是内容还是瓶子是内容,这就需要看需求,如果你要喝当然可乐就是内容,但是如果你要抓那么瓶子就是内容。对于操作型机器人来讲,可能更关心物体的形状和位置,那么这些就是环境的内容。

       刚才说了,行为可以用编码来表示,那么环境是不是也可以用编码来表示呢?应该是可以的。例如AutoEncoder,可以将图片压缩为编码,还可以从编码中恢复图片。所以利用这个想法,能不能把把环境直接压缩为编码呢?例如把杯子的位置和形状,甚至是背景的一些信息都压缩成编码,然后发送给机器人,机器人就可以使用这些编码来生成运动轨迹了。对于机器人的运动和抓取来说,一般有位置和形状信息就够用了,当然有的时候可能需要力量控制,那么可能就需要不同的处理方式,例如可能增加一个新的行为分类,例如抓鸡蛋。我们先不讨论这样特别的问题,先只是讨论环境的简单表示,例如位置和形状。

       现在的视觉抓取一般采用的都是端到端的方式,都是直接从图片开始训练的,我们前面说过,图片的一些不重要的变化可能会影响抓取的效果,原因就是没有对图像进行抽象,提取出必要的位置和形状信息。位置和形状在一定是时间段内是不变的,一个环境,可能从各个角度拍摄的图片都不一样,但是它们都表示的是同样的一些东西,例如桌子上放着一个杯子,这个东西的状态不会由于摄像机拍摄的角度不同而发生变化。这个就是观察值和状态之间的关系,图片是观察值,形状和位置是状态,环境编码的作用就是要从这些观察值中提炼出状态,提炼出不变的状态。

       所以,环境编码就是要表达出这种不变性,也就是说要从各种图片中提取出这种不变性,也就是对机器人的行为有用的性质,这里可能就是位置和形状。实现这种编码的一个直接的想法还是AutoEncoder,但是一般的AutoEncoder的作用是把一个东西(例如图片)进行编码,然后可以尽量地去还原这个东西(图片)。而环境编码不是这样的,它是把图片进行编码,但是这个编码表达的是物体的位置和形状信息,也就这个编码不能用来去还原图片。

大脑和小脑——规划和执行_第7张图片

       怎么设计一个环境编码器去实现这个编码,这个需要详细的讨论和研究,目前我对此涉猎不多,但是未来一段时间会关注环境的表达。但是无论如何,这个工作是重要的,它是对环境的抽象,这种抽象可以被用在很多地方,例如机器人的室内导航等等,你可以说现在导航有很多技术,例如各种地图和点云等等,但是如果这些地图和点云可以被抽象为一行数字,是不是更容易处理呢?

       另外,有些情况,环境编码可能不是太重要,例如机器人在平地上走路,那么环境可能一直就是平地,这样有这个编码和没有这个编码对机器人的训练影响不是太大,类似的可能还有机器人做一个手势等等。

机器人的位姿是怎么表达的

       机器人的位姿显然包含两个方面,一个是机器人的位置,另一个是机器人的姿态。机器人的姿态就是机器人的状态,这个不需要太多的解释。机器人的位置,这个东西有点不好归类,因为它既可以是机器人的属性,其实你也可以认为它是环境的属性。例如还是用机器人抓杯子这个例子来说明问题的话,机器人离杯子的远近就是机器人的位置,机器人当时的姿态就是当时机器人的状态,这两个东西都会决定机器人未来的运动轨迹。

       机器人的位置信息,如果可以获得机器人的绝对坐标信息,那么就用这个坐标信息当成位置编码即可。但是一般情况下可能很难获得机器人的绝对坐标,那么就用相对坐标也可以,例如可以想办法获得机器人相对于操作物体的距离和方向。

       机器人的位置和姿态编码可以简单的合并成一个编码,或者用一些简单的算法去合成,但是前提是不能丢失编码中的信息。机器人的位姿编码相对于行为编码和环境编码来讲可能就比较简单,实现的方式也相对单一,这里先不做过多的讨论。

       有了上面的这些信息以后,我们再回到原来的问题,就是:

大脑是如何训练出来的

       有了行为编码(任务),环境编码和机器人位姿编码,那么就可以训练出一个生成网络用来生成机器人的轨迹了。

       什么是生成网络,生成网络就是给一个种子(例如编码),它可以生成一个东西(例如图片)。生成网络似乎看起来很神奇,但是实际上它是现实中很常见的东西。例如你让一个小朋友画一只狗,你并没有具体说明狗长的什么样子,但是小朋友可以根据自己的想象画出自己心目中的一只狗。所以生成网络就是创作,无中生有的创作,是比简单的识别更高级的智能,Yann LeCun说过一个类似的话:预测既是智能。生成网络就可以看成是预测,它可以根据一个种子去预测一个东西,每个生成网络所预测的东西是不一样的,就像每个孩子画的东西是不同的一样。

       回到大脑上面,大脑是一个生成网络,就像一个孩子的大脑一样。在做事情方面,大脑大概回答了这个问题:桌子上有一个杯子,你去把它抓起来,你现在在这个位置和姿态,那么你用一个什么轨迹去抓杯子?这句话里面前面三个部分分别说明了环境、目标和机器人的位姿,它们就是大脑中的生成网络需要的种子,然后大脑用这些种子去生成一个轨迹。

       生成网络近年来取得很大的进步,例如现在可以生成很精确的人脸图像。生成网络的发展大概也是从随机生成到精确定向生成的一个过程。大脑中的生成网络就是一个精确的定向生成过程,例如你告诉机器人去拿一个杯子,机器人虽然会做很多事情,但是根据种子,它只能生成拿杯子的这个轨迹,因为种子就是拿杯子的种子。

       大脑这个生成网络是怎么训练出来的?数据是从哪里来的?简单的说就是通过轨迹训练出来的。前面说过小脑的训练方式,小脑的训练可以采用机器人随便运动的方式,为什么可以,因为小脑关心的只是机器人的动态模型,它不关心机器人的任务和环境等等,但是大脑关心这些,所以随便运动的方式并不适合训练大脑,训练大脑需要有目的的运动。

       那么有目的运动的数据从哪里来就成为一个巨大的挑战,为什么?因为如果机器人会了有目的的运动,那还需要学什么呢?简单的回答这句话就是:还需要学习别的有目的的运动。这句话看起来有点强词夺理,但是,好像就是这样。

       大脑需要训练数据来训练一个生成网络,和所有的神经网络一样,越训练神经网络的能力就越强。所以开始的时候,这个生成网络需要大量的数据来学习到怎么去生成,需要学习到怎么适应行为编码、环境编码和机器人的位姿编码,通过这些编码去生成一个合适的轨迹。到了后来,这个生成网络已经具备很大的能力了,就不需要太多的数据去训练一个新的任务,可能仅仅几条数据就够了。

       开始训练的大量数据可以有很多方式,例如采用模仿学习或者遥控的方式,或者使用强化学习让它学会一些技能,但是大脑需要的数据不是强化学习过程中间的数据,而是训练完成以后的数据,就是可以完成任务的好的数据。记住,大脑训练的目标就是要完成这样的一个映射:(目标、机器人轨迹、环境轨迹),其中轨迹中只包含状态信息。

       机器人是可以学会越来越复杂的动作的。例如抓取杯子,机器人可以适应桌子上放着一个简单的杯子的情况,如果杯子前面有一个酒瓶挡住了杯子,经过训练这个机器人也是可以抓到杯子的,而且这个训练的过程可能很短,因为酒瓶的信息已经在环境编码中体现了。一旦机器人掌握了绕过一个东西去抓另一个东西,那么如果把酒瓶换作一个水壶,可能机器人就不用训练就可以直接绕过水壶去抓杯子了。时间长了,机器人就学会了在复杂情况下完成任务的能力,这个能力是机器人实实在在学会的。

大脑和小脑之间的交互

       大脑和小脑之间的交互需要协议。这个协议是双向的,大脑把轨迹信息传递给小脑,小脑把状态信息传递给大脑。大脑和小脑之间发送的数据应该是自描述的,自描述的意思就是发送的格式信息是包含在内容信息当中的,这样软件就可以比较好的处理,也可以适应不同的格式要求。

       机器人是由不同的结构组成的,很自然,状态信息就是不一样的。例如一个一自由度的机器人和一个七自由度的机器人的状态信息就很不一样。甚至有可能的情况是,可能根据任务的不同发送不同的状态信息,例如一个机器人既可以走路,又可以抓杯子,如果机器人坐在那里抓杯子,整个身体是不动的,只有手臂运动,那么身体的状态信息是不是就可以不发送出去。但是发送过去也是有道理的,因为手臂的运动可能会带动身体产生轻微的移动,这样整个过程可能就比较自然。

       大脑和小脑的交互过程中需要考虑一个很重要的东西,它就是时间步长tt是怎么确定的。机器人控制的一般情况是用固定的时间步长,例如多少毫秒发送一次状态。但是这种方式可能不太合理。例如大脑把一个轨迹发给小脑,那么小脑就按照这个状态序列去执行吗?还是自己需要另外做一些调整呢?例如小脑发现之间不需要控制,通过惯性就可以达到,也就是输入为0,那么就可以忽略掉这个。或者小脑发现之间用一次控制很难达到,那么有可能会插入一个。所以大脑发送什么样的轨迹信息给小脑才是小脑最容易接受的,这个需要好好考虑,一个自然的想法就是大脑发送的轨迹是满足小脑的动态特性的,也可以说发送什么样的东西是大脑向小脑学会的。

       先说一下什么是满足小脑的动态特性。还是先看一下:,它其实是表达了一个的一个映射,但是一个轨迹其实是一个连续的状态变化,而不是由一个一个离散的状态组成的,但是,动态模型只能用离散的方式来表示一个连续的过程,于是有一个问题就出现了,怎么才能用离散的方式最合理的表示一个连续的轨迹?其实这个问题还可以换一个说法,就是怎么分割状态才是最合理的?

       对上诉问题的回答有可能是:最简单的就是最合理的!

       那么什么是最简单的呢?可能就是线性映射了,就是:

       

       这个公式里的是一个线性矩阵,这个公式的含义就是,一个动态模型的输出是输入的线性组合,输入是,输出就是这两个东西的线性组合。线性组合可能就是动态模型的最简单的方式了。

       所以这个动态模型是什么样的?它可以是一个训练出来的神经网络,是表达的一个映射,但是这个映射是有前提条件的,就是这个映射要尽量满足是一个线性映射,最终训练出来的结果就是一个近似线性映射的神经网络,甚至可以通过这个神经网络去求出的值。关于这个部分可以找到相关的论文。

       有了对轨迹状态的合理分割就可以去训练小脑模型了,同时也可以把轨迹发送给大脑去训练大脑模型。是不是要发送时间间隔t也可以去考量,我现在想法是需要发送时间间隔的,起码大脑要向小脑发送时间间隔,因为如果让小脑自己去判断两个状态之间的时间间隔就增加了小脑的复杂性。另外,小脑也需要向大脑发送时间间隔,因为没有时间间隔这个数据,大脑也训练不出来时间间隔,所以时间间隔也是训练数据的一个部分。

       但是,如果单单从生物智能的角度来看,时间间隔可能是没有用的。就拿人来讲,如果你要拿一个杯子,规划的一般只是轨迹,并没有明确的每一步时间间隔,这个时间间隔可能是一个缺省值,或者还是小脑确定的,所以,有可能不发送时间间隔是一个比较自然的方式。

       另外一点就是模糊性。大脑发送的状态序列小脑必须准确执行吗?其实是未必的,例如抓一个杯子可能有很多条轨迹都是合理的,大脑只是给出一条轨迹,所以在执行的时候可能会有一些偏差也没有关系,完成任务就可以。

大脑和小脑的整体过程

       有了上面的描述以后,就可以看一下大脑和小脑训练和执行的整体过程:

大脑和小脑——规划和执行_第8张图片

       首先是训练过程。需要强调的一点是大小脑是可以分开训练的,分开训练的意思并不是脱离,因为大脑和小脑之间是需要相互发送信息的,它们不可能脱离,分开训练的意思就是,大脑训练自己的可以不管小脑,小脑也可以不管大脑。这和生物体也非常类似,大脑可以独立的训练思考,小脑也可以独立的训练肌肉控制。

       小脑的训练可以是灵活的,最终目的是要训练出动态模型()和小脑模型()这两个映射。如果有运动就可以训练出这两个模型,所以运动可以是多种多样的,可以是随机的运动、有目的的运动、带负载的运动等等。和人一样,某个场景经历的越多就越熟悉,反之就不熟悉,动态模型也是一样,如果有不熟悉的状态出现,那么动态模型可能就不准确,就需要更多的数据来训练。例如,假如机器人换了一个工具,那么它的动态模型有可能就不是太精准,这样就需要加一些最新的数据再训练一下。具体的实现方式可以再探讨。

       大脑的训练过程需要小脑的帮助,因为大脑需要小脑发送过来的数据。大脑训练过程也比较简单,大概如下:

  1. 机器人做一个有目的的运动,就是完成一个任务。
  2. 小脑把这个运动过程的轨迹发送个大脑。
  3. 大脑把这个轨迹进行编码(去训练行为编码神经网络)。
  4. 大脑拿到行为编码、环境编码和位姿编码。
  5. 大脑用三个编码去生成一个轨迹使得这个轨迹尽量小脑发送过来的轨迹,目的就是训练生成网络。

       可以看出,大脑除了要训练生成网络以外,可能还需要训练行为编码网络和环境编码网络。这里为什么没有写环境编码网络的训练,因为它有可能在机器人以外来做这个事情,很有可能它并不属于机器人本身。其实环境不属于机器本身这一点几乎不用理解,它是事实。所以很有可能这个环境编码是另一个智能设备去做的,它可以把这个环境编码分享给环境中的所有机器人。当然,在单机的情况下还是需要机器人自己来训练这个环境编码的。这个有点类似于智能交通系统和完全自动驾驶,智能交通系统是有一个公共的环境表示,而完全的自动驾驶是智能车自己看到和表示的环境。

       其次是执行过程。执行是一个大小脑合作的过程,不能分开,具体的过程可能是下面这样:

  1. 外界给机器人发送一条指令,大脑去找到对应的行为编码,知道要去干什么。
  2. 大脑通过传感器或者外围设备将当前的环境进行编码,或者直接从外界获得环境编码。
  3. 大脑将机器人的位姿进行编码。
  4. 大脑利用这三个编码去生成一个轨迹。
  5. 大脑把这个轨迹发送给小脑。
  6. 小脑执行轨迹。

       上面的这个执行过程只是一个粗略的过程,具体的细节还会有所不同。其中一个重要的考虑就是小脑在执行的过程中是不是需要查看自身的状态,这个就涉及到上面提及的一个问题,是一次性执行完所有的动作,还是边看边执行,就是执行的过程中不断查看自己的状态,看看和轨迹中的状态有没有偏差。

       上面这个问题可以从生物智能上找到一些答案。例如如果你对做一件事情非常熟悉,例如吃饭的动作,你可能绝对不会在动作的中间停下来检查动作对不对,就是执行就完了。那么机器人执行一个任务可能也是类似的情况,开始的时候可能在中间停下来检查,但是如果发现总是没有错误,那么以后就不停下来检查执行过程了。

总结

       科学一直在发展的原因就是很多东西没有做对,如果做对了就没有那么多可以发展的地方了,这一点不是没有例子,例如经典力学,牛顿他们基本都做对了,所以就不需要太多的发展了。人工智能现在还处在大家都没有怎么做对的时候,所以还在迅速发展,近年来取得的一些成果说明大家已经做对了很多东西,现在也许可以从大家做对的东西中提炼出一些方向性的东西,于是就有了这篇文章,它只是一次探索,也许不对,也许对了一些。

这篇文章好像讲了很多东西,其实最重要的就是:大脑怎么去规划轨迹,小脑怎么去执行轨迹,以及它们是怎么被训练的。大脑负责思考,小脑负责执行,这个可能是人们对大小脑功能的基本理解。这一点和生物智能很像,这篇文章中提出的架构其实就是想办法用人工智能的方式去模拟和实现一些生物智能。

       本文提出的也仅仅是架构和一些实现设想,并没有提出这个架构的具体实现方式,原因就是具体实现还有很多细节和困难需要克服。科学和技术的发展一般都是这么一个过程:提出设想à做一些实现à产生一定影响à形成行业规范。所以目前还是处于提出设想阶段。

       在实现上的一些困难前面也提到过,例如行为编码和环境编码,这两个东西怎么去实现,到目前为止业界可能只有一些探索,并没有形成一致的方案。但是如果想要有比较完整的框架,这些问题好像都规避不过去,知道机器人在做什么和知道机器人所处的环境,这两个问题都是一定要解决的。你可以反问自己,它们可以不解决吗?

       本文所提出的大脑和小脑的方案是具备一定的优势的,这里再次总结一下:

    • 它是一个通用的架构,适合所有机器人的运动控制,你就不需要为各种运动控制修改各种控制模型了。
    • 这个架构清晰的定义了大小脑的功能,并且结构和实现都相对清晰,大脑可以规划很多事情,小脑只做一件事情。
    • 大脑和小脑的功能都是学会的,小脑只需要学会动态特性,大脑只需要学会规划,并且在实践中大小脑还可以不断学习。
    • 抛弃了策略,取而代之的是规划,可以把规划看成是一个长的策略。

后记和感谢

       这篇文章是出差的过程中写成,时间比较散,人比较困顿,断断续续持续了十多天。所以文字不是太好,有些地方自己也感觉写的不好,例如强化学习部分,感觉还是没有写明白,但是如果要写的太清楚,就需要花费大量篇幅,这样又会产生头重脚轻的感觉。其实是还可以写的更好,只是自己没有精力去做大的修改了,后续可能还有一些小的修改。

大脑和小脑这个想法有了好几年了,但是一直没有成形,最近半年的时间开始逐渐成形,一些大概的实现方式也逐渐清晰,但是也仅仅是大概。所以文章写出来的目的只是让大家看到一个想法,最好可以引起一些思考和讨论,甚至可以共同去做一些实现方面的探索。

       这篇文章没有用比较正式的论文的方式去写,而是以比较散文的方式去写,原因有两个,一个是希望文章的面目尽量简单清晰,可以让更多的人看得明白;另外一个原因最近读的论文不多,也没有做太多的考证,时间花的还是不够,所以目前还没有写成论文的能力。另外这篇文章主要是偏道理而不是偏技术,所以没有涉及任何深度学习的东西,例如大脑生成网络的实现方式。这篇文章很有可能会写第二版,第二版的格式可能会向论文去靠拢,去探索一些技术的具体实现,但是也会尽量去保持易读的风格。

       学习机器学习和人工智能有几年了,我的知识和一些想法得益于下面的这些人,特此感谢:

吴恩达:人工智能和机器学习的启蒙。

台湾大学李宏毅:从他那里学会了深度学习和部分的强化学习。

David Silver 从他那里学会了强化学习的基础。

Sergey Levine:深度强化学习知识几乎都是从CS285CS294-112这里学习到的。

Pieter Abbeel:看了他的不少论文,最近在学习CS287课程,也受益匪浅。

还有John SchulmanChelsea FinnShixiang GuXue Bin Peng等等。

 

田青

2020年8月于北京

大脑和小脑——规划和执行_第9张图片

试一下有没有人打赏:-)                                          

你可能感兴趣的:(机器人,强化学习,深度学习)