包饺子机器人
为了讲清楚世界模型,我想从一次过年讲起。那时我在斯坦福做博士后,我和朋友们一起包饺子庆祝春节。
当然了,其他四个人在认真包饺子,而我在玩手机,因为我包饺子的水平太差了。
很巧的是,当时我们正在实验室做一个捏橡皮泥的项目。因为有了橡皮泥操作的经验,我很快意识到为什么我包饺子不行。因为我对柔性物体,对这种弹塑性面团的世界模型掌握的不行。
虽然我不行,但是我的机器人可以行。那个时候还没有面团,我们很快跑去先拿橡皮泥快速验证了一下,好像是可以捏出一个饺子形状的。
所以我跟我的合作者浩辰说,不如我们一起来真正让机器人学到饺子的世界模型,让它能包饺子吧。它不是工厂里的流水线操作,而是让一个机械臂独立完成包饺子的步骤。
接下来大家可能知道我要说什么了,我在给国际友人讲的时候,这页内容很受欢迎。但是在今天这个场子里,大家都是专家。
因为他们可能对包饺子流程一无所知,所以每一步我都得讲得非常细节。倒水和面、搓成长条、切成小块——在我们东北叫做剂子,然后用擀面杖把这个剂子压扁,擀成皮儿,最后再包馅儿。
整个过程我们人类用到了什么工具呢?
我们用到了手,用了一把刀,用了擀面杖。当然了最后因为科研难度太大,所以捏褶这一步,我们学习了意大利人使用了这样一个模具,完成包馅的这一步。
接下来,我们就分析如果让一个机器人去包饺子,它会用到哪些工具。上面这一排是我们觉得包饺子机器人可能会用到的工具,于是我们3D打印了这些工具。
有了这样一个工具库之后,我们就开始给机器人造厨房。
白色虚线里的架子把工具架起来,黄色虚线里面的摄像头用来感知中间的物体和机器人的机械臂,以及机械臂使用的工具。最后红色的区域就是机器人大展拳脚的地方,也就是它的案板。
有了这样一个可以施展拳脚的地方,机器人就开始与面团进行快乐互动了。首先,我们让它随机选择各种各样的工具,跟这个面团进行各种各样随机的互动。
从而让机器人自己去了解面团是怎样变化的,了解面团的世界模型。我们采集了这些互动的数据,用于后续的训练。
都要训练什么呢?在训练世界模型之前,我们先要训练出一个工具选择器。当我们给定当前面团的状态,以及目标的状态,比如一个饺子时,
工具分类网络能帮我们从各种各样的工具里面选择最合适的工具进行操作。比如和目标的饺子相比,它现在还太厚了,所以我应该选大擀面杖。
选好了工具之后,我们回到世界模型,这里的世界模型就是面团的状态如何变化。学会世界模型有什么用呢?
我们假设工具已经被选出来,机器人要做的动作是确定的,当我们把当前的面团状态输入到一个神经网络——也就是未来要训练的世界模型中时,这个世界模型可以预测出下一时刻面团的状态。
这就是我们的机器人掌握到的面团的世界模型,一起来看看它的能力。简单来说,它预测得很准。
图中红色的是使用的工具,蓝色的是面团形态。上面是我们的预测值,下面是真实值。我们会发现上面和下面长得非常像,这说明我们的世界模型可以准确地捕捉出捏了面团以后它会怎么动。
所以我们只需要调换一下顺序。现在我们给定当前面团的状态,给定要用的工具,以及用世界模型预测出面团未来的状态,那么我们就可以得到机器人的动作是什么。
这样我们就可以学出一个机器人策略网络,让它们知道如何在当前状态使用一个动作去达到未来我们渴望的那个状态。
现在我们终于可以把这套体系完整地连起来。首先是选择工具,是用擀面杖还是其他工具,然后把这个结果输入到刚刚得到的机器人策略里面,机器人策略会给出此时机器人要输出的动作,比如我此刻到底是应该按压还是滚动这个工具。
然后,我就可以看到新的面团状态了,而新的面团状态再通过视觉反馈作为新的感知信息输入到这个闭环里面。这样我们的机器人就可以包饺子了。
我们可以看到这个机器人会主动选择自己想要使用的工具去切割,比如说把一个大的面团去切成小份,
比如切成小份之后,会选择用一个小夹子把面团变成更加规整的形状。
当然聪明的观众应该已经发现了,在这个视频中有一只邪恶的手一直在干坏事。他不是我,他是我的合作者浩辰,他一直在给机器人捣乱。
为什么要捣乱呢?因为我们要证明自己的机器人算法是足够鲁棒的,它可以不受外界的影响,它是学习出来的,跟直接写死在里面的代码不一样。
无论你怎么影响它,它总能自己学到怎么样去选择工具,怎么样去应对不同的状态。在这一步的时候,浩辰一下子把整个面团还原成了最初的状态。
所以我们让机器人从头开始包,但它还是可以做得到。
最后我们把它放在捏褶的模具上面,这样一个皮厚馅小的饺子就包出来了。
也许你们会觉得很搞笑,看的时候可能会有这样那样的问题。比如有的朋友可能会问,继续训练下去它会更好吗?
当然是会的,我们整个过程用到的机器人数据只采集了20分钟。如果给它更多数据和更多试错空间,自然可以让饺子皮包得更加完美。
它是天花板吗?我可以说是也不是。对现在市面上用来包饺子的智能体而言,我们做的这个项目是天花板,但是这绝对不是机器人或者具身智能的天花板,比如如果给这个机器人用灵巧手,或者把强化学习的技术加进去,它还有很多很多可以拓展的地方。
举一反三的泛化能力
那么回到我们的主题,通用具身智能。包饺子的项目帮我们解决了智能体怎么样自己去完成一个复杂的控制任务,但是通用性的问题还是没有解决。
什么是通用性?当我们训练机器人做了一个任务,然后又让它去做第二个、第三个任务,让它去做很多很多不同的任务,这时候一个新任务出现了。
如果是人类的话,有了前面做任务的经验,很有可能直接就能做,所以我们希望机器人也可以达到这样的水平。因此,我们试图让机器人去找到任务之间的某种普遍联系,从而可以无需额外训练就能直接完成新的任务。
在通用具身智能里面,这叫做泛化。我们再回到包饺子那个情况,因为我们学的世界模型不是对饺子的,而是对整个面团的,所以它可以自然地泛化到其他面团操作中。
比如这个地方我们用同样的模型可以让它去做一个字母曲奇,RoboCook,所以我们就把RoboCook对应的字母捏了出来。
同时因为我们的世界模型用的神经网络,它天然有一些泛化能力,所以它可以泛化到除了面团以外的比如橡皮泥、比如油泥、比如一些泡沫上面。这都是通用具身智能所需要的泛化的能力。
但是泛化远远不止这些,比如这里我给大家举一个例子,展示物体形态和功能之间的联系。听起来好像很抽象,但其实非常简单。
假设这里有两把刀,我们人类只要会使用左边这把刀,自然就会使用右边这把刀,不需要再学一遍,我们的大脑自动就把它们泛化了。
为什么?可能我们知道什么是刀尖,什么是刀身,什么是刀背,我们能找到它们之间的某种对应关系。
所以无论这个刀变大变小变了颜色,还是变了形态或者姿态,我们都可以使用刀。
当然了这种相似不一定只局限在类内,还可以有更广泛的相似。比如我们知道要想拿住勺子,就要抓在勺柄的部分,那么我就可以推理出,想要拿起网球拍,也要抓住它拍柄的部分。
如果我们看到一个摩托车,知道要去抓它的把手,那么我可以推理出打开家里的门也应该抓住它的把手。
这就是我们人类了不起的泛化能力,而我们想把这样的能力赋给通用具身人工智能。
比如我们让机器人去切豆腐。我们教会它使用一把刀,看看他是不是能够举一反三,会使用所有的刀了。
ok到目前为止,我们已经可以让AI智能体有感知,有世界模型,从而帮助它去做决策,而且它还可以泛化到新的任务。我们给身体赋予了智能,这就是我们现在定义的具身智能。
但是具身智能仅此而已吗,这是全部吗?当然不是。
有一种理论说,具身其实是可以发展智能的,代表人物有来自于加州大学伯克利分校的Hubert Dreyfus和心理学家Linda Smith,他们认为人类智能的发展,是因为我们身体不停地与外界进行交互。
比如说我们在玩玩具的时候,视觉和触觉一直在彼此反馈,于是在探索这个世界的时候,我们就获得了新的技能新的知识,尤其在婴儿时期。人类的婴儿智力发展极快,他们从什么都不会,到三四岁可能就很懂事了,这可能正是因为孩子在不停跟这个世界去交互。
我们不妨看这样一个例子。这是一个7个月大的小朋友,他非常认真地盯着这个小玩具,但是当它被布盖住的一刻,这个小朋友完全愣了。
他以为玩具没了。他不知道小玩具被布遮住了,以为东西消失了。这是因为7个月大的小朋友是不知道物体永远存在这样一个概念的。
而随后他跟这个世界开始进行互动,他开始进行探索,当他偶尔不小心把这个布掀开,发现可以摸到这个东西,然后就明白了这个东西原来一直在这里。这样的探索帮助到人类去发展智能。
基于这样的想法,我们在机械狗上也做了一个小小的尝试。我们先在仿真器里面训练了一个还可以的机械狗。但是当我们把它实际放到床垫子上跑的时候,跑着跑着就摔倒了。
我们此时的目标就是让他稳稳地在上面走来走去就可以了。于是我们想,那不如给它一些跟世界交互的数据吧。但这个数据是谁的呢?我们先让它看看别人的数据,给它看看和它同一个型号的其他机械狗的数据。
然后我们可以看到,当它有了跟这个世界更多的交互数据之后,通过强化学习的方式,它可以在这个垫子上走得比较稳了。
不过很快我们又给了它新的挑战,希望它能跑得快点,跑道也可以再延长一些。于是我们把俩床垫子拼在一起,让它加速前进,然后它不负众望地又摔倒了。
最后我们说好,现在我让你自己亲身跟这个世界发生交互,跟这个世界进行学习。
于是我们发现,当这只狗亲自与世界交互之后,它不仅可以快速平稳地跨过床垫子,甚至还可以倒退着跑回去。
当然这是一个很简单的例子,但是已经可以告诉我们,身体不仅仅可以承载智能,它也可以帮助我们发展智能。 |