Why Robots Need to Dream | 为什么机器人需要做梦
Why Robots Need to Dream | 为什么机器人需要做梦
波士顿动力的 Atlas 翻一个干净利落的后空翻,视频下方的评论区一片"未来已来";走进一家现代化仓库,几百台 AMR 自主穿梭,激光雷达安静地转,任务调度系统像呼吸一样自然。但如果你把这两台机器交换一下工作——让 Atlas 去仓库搬货,让 AMR 去翻跟头——结果会让你大跌眼镜:Atlas 大概率在第二个工位就报错停机,AMR 听到"翻跟头"指令的瞬间就会陷入死锁。
这个看似戏谑的思维实验,揭开了现代机器人技术的核心矛盾:我们擅长制造在某一项任务上惊艳的机器,但不擅长制造在真实世界中稳健的机器。 而真实世界,是出了名的混乱、罕见、不可预测。这一章我们想回答一个朴素但根本的问题:今天这些"很笨"的机器人,缺的是什么?答案指向一个看似浪漫、实则工程上极其具体的概念——世界模型(world model)——也就是机器人在行动之前,先在"内心"里预演未来的能力。
长尾诅咒:为什么今天的机器人还这么"玻璃心"
让我们先把"笨"这个字量化一下。在工业机器人领域,一个流传甚广的笑话是:如果在流水线上有一颗螺丝掉到传送带上,整条产线就要停机二十分钟。这不是段子——绝大多数工业机器人采用基于示教(teaching-by-demonstration)或刚性脚本的方式工作,它们对环境的隐含假设是"一切如规划",任何扰动都可能被判定为异常,然后系统进入保护性停机。机器本身没有"知道"螺丝是什么、它会怎么滑动、它会卡住哪个关节的内部表征;它只有一个"在指定时间到达指定位姿"的时间表。
自动驾驶领域的"长尾问题"是另一个更危险的版本。Waymo 在 2020 年公布过一组数据,他们在亚利桑那州跑了超过 2000 万英里的公开道路测试,系统对 99% 以上的常见路况都处理得相当老练。但剩下的 1%,才是真正要命的部分:一个孩子从两辆停靠的车之间冲出;一个骑行者单手撑伞逆风前行;高速公路上有一只被压扁的纸箱,但因为侧风正以奇怪的姿态"飘"过车道;暴雨天一辆白色卡车在前方静止,激光雷达点云被水雾打散。每一个这种场景,可能十年才在某个路口发生一次,但只要发生一次,代价就不可逆。这就是长尾——在统计分布上概率极低、但工程上不容忽视的尾部事件。Tesla 的 FSD、Waymo 的 Driver、Cruise 的 Origin,所有顶尖系统都在长尾里反复挣扎。
表面上,这些脆弱性似乎都可以用"再多采集一些数据"来解决。给工业机器人拍一百万颗螺丝掉落的视频,给自动驾驶车跑一亿英里罕见场景。但这条路在 2020 年代被证明是走不通的——一个根本性的统计事实是,长尾之所以是长尾,恰恰因为它无法被穷尽枚举。 你能列出十万种罕见场景,真实世界会给你第十万零一种。
更深的根源在于:这些系统缺乏对世界的"理解"。它们没有内心模型可以预演未来。一个优秀的工业机器人应该能"想象"出螺丝掉到传送带上之后的几种可能轨迹,并据此微调自己的避让策略;一辆成熟的自动驾驶车应该能"反事实地"推理:"如果我现在不减速,这孩子可能从 A 点冲出到 B 点,我们的距离是 X,刹车距离是 Y,那么……"这种反事实推理(counterfactual reasoning),正是当前主流的纯感知-决策管线所欠缺的。
直觉上,人类每时每刻都在做这种推理。你伸手去拿一个杯子,你的大脑会自动预判:如果我以这个角度抓,杯子的重心会怎样,我的手指该以什么力度合拢,你甚至在触觉反馈到达之前就已经"知道"杯子滑不滑。你在结冰的人行道上走路,会无意识地调整步态、降低重心、缩短步幅,所有这些调整都来自一个隐式的物理引擎在后台运转。我们说人类有"常识",在机器人学家眼里,常识本质上就是一个运行了几十年的世界模型。
那么,机器人能不能也拥有这种能力?这正是过去十年学界与工业界在努力回答的问题,而答案,要把我们带回到一个更基础的范式之争。
三种范式的对决:反应式、模仿学习与世界模型
要让机器人在真实世界行动,基本有三种主流范式。我们用一个统一的"决策 = f(感知, 历史)" 框架来描述它们,这样比较会更清晰。
第一种是纯反应式控制(Reactive Control)。 它的代表是经典的 PID 控制器、有限状态机、以及稍微复杂一点的行为树(behavior tree)。在反应式范式里,f 是手工设计的:开发者枚举每一种可能的感知输入,写好对应的输出。这种范式的优点是可解释、可验证、实时性强——这也是为什么它统治了工业机器人 50 年。但它的缺点同样致命:它无法处理设计者没枚举到的情况。流水线上的螺丝、走廊里突然出现的小孩、实验室里被风吹歪的纸箱,这些在设计者的枚举表之外,因此系统要么崩溃,要么冻结。一个行为树写得再复杂,也只是把"枚举"这件事从 100 个分支扩展到 10000 个分支,本质上没有跨过"理解世界"这道门槛。
第二种是端到端模仿学习(End-to-End Imitation Learning)。 2010 年代中期以来,随着深度学习的爆发,研究者开始尝试用神经网络直接拟合 f——给定感知输入,直接输出动作。最经典的形式叫行为克隆(Behavior Cloning, BC),本质就是监督学习:收集大量"专家做某件事"的轨迹(比如人类驾驶员开车的视频+方向盘转角),训练一个 CNN 把视频映射到动作。这种范式在结构化场景下表现惊人,ALVINN(1989 年,算是 BC 的鼻祖)早在 30 多年前就能在公路上做车道保持;NVIDIA 的 PilotNet(2016)用不到 100 小时的驾驶数据训练出可以自动转向的端到端模型。问题是,BC 的泛化能力极差。一个简单的反例是:BC 训练的模型一旦进入训练数据没覆盖的"边缘场景",它的输出就开始发散,而发散的状态又会把它推向更没见过的状态,形成正反馈,最后彻底跑飞。Ross、Gordon 和 Bagnell 在 2011 年的著名论文里把这个问题叫做 covariate shift——测试时的输入分布会逐渐偏离训练时的分布,而 BC 学到的映射在分布外毫无意义。
为了修补这个问题,学界发展出了一系列改进:DAgger(让专家在线标注模型自己的轨迹)、Co-training、IRL(Inverse Reinforcement Learning)等等。这些方法有用,但都受限于一个根本事实:它们都没有让机器"理解"自己在做什么,只是在模仿专家的表面动作模式。如果专家自己也并不完美呢?如果专家在某些场景下的反应也是基于他自己内心的世界模型在做反事实推理,而不是某种"刺激-反应"的浅层映射呢?模仿,最多只能学到专家的皮,很难学到专家的魂。
第三种是基于世界模型的"想象-规划-行动"循环(Imagine-Plan-Act)。 它的核心思想是:在 f 之外,显式地学习一个"世界如何运转"的模型 p(s_{t+1} | s_t, a_t),然后在决策时,在脑子里预演各种动作序列的未来后果,选最好的那个执行。这个范式其实并不新——控制论里的模型预测控制(Model Predictive Control, MPC)几十年来就是这么做的;PILCO(2010)用高斯过程做概率动力学模型,在 cart-pole 等任务上展示了惊人的样本效率。但深度学习时代,世界模型有了新的表达形式:Ha 和 Schmidhuber 在 2018 年的 NIPS 论文 "World Models" 中,用一个变分自编码器(VAE)做感知压缩、一个 RNN 做潜在空间的动力学预测、一个简单的线性策略做控制,首次在 Atari 和赛车游戏上展示了"在梦里训练"的可能性;之后 Hafner 等人的 Dreamer 系列(2020-2025)、DeepMind 的 MuZero(2020)、以及 LeCun 倡导的 JEPA(Joint Embedding Predictive Architecture),把这个范式推到了强化学习的最前沿。DreamerV3(2023)甚至在 150 个不同的 Atari 任务、7 种不同的机械臂控制任务、8 种不同的腿足机器人任务上,使用同一套超参数、同一份代码达到了人类水平。
这三种范式,我们可以画在一张二维地图上:横轴是灵活性/泛化能力(在没见过的情况下能否正确反应),纵轴是样本效率(需要多少数据/交互才能学会)。反应式控制样本效率极高(零样本,纯手工)但灵活性极低;端到端模仿学习灵活性在分布内较高但分布外崩塌;世界模型范式则试图同时占据右上角。世界模型不是替代反应式和模仿学习,而是把它们纳入一个更上层的框架: 反应式控制器可以成为世界模型"想象"出来的低层执行器;模仿学习可以提供世界模型的初始训练数据,以及最后的策略蒸馏源。
为了把这三种范式的内在结构说清楚,我们来看一个简化版的闭环:
```mermaid flowchart LR sense[Perception 感知] --> wm[World Model 世界模型] wm --> imagine[Imagine Future 想象未来] imagine --> plan[Plan 规划] plan --> act[Act 行动] act --> env[Physical World 物理世界] env --> sense reality[Reality 真实下一帧] -.->|Supervision 监督信号| wm ```
这个闭环就是本书后面 14 章的骨架。感知把高维原始信号(像素、点云、关节角度)压成可操作的表征;世界模型在表征空间里学习"如果我做 a,世界会变成什么样";规划在世界模型里搜索动作序列;行动把最优动作送到执行器;执行结果又成为世界模型的下一帧监督信号。这条回路就是机器人的"内心戏",也是人类大脑无时无刻不在做的事。
什么是世界模型:在大脑里预演未来
让我们把"世界模型"这四个字拆开揉碎,看看它到底由哪些组件构成,以及它"在脑子里预演"这件事,在数学上对应着什么。
形式上,世界模型是一个参数化的概率转移函数 $p_\theta(s_{t+1} | s_t, a_t)$,它回答的问题是:在当前状态 $s_t$ 采取动作 $a_t$,下一时刻进入状态 $s_{t+1}$ 的概率是多少。$s_t$ 可能是高维的——一张 256×256 的 RGB 图像,或一个 100 万点的激光雷达点云——但在工程实践中,我们几乎总是先用一个编码器 $f_\text{enc}$ 把 $s_t$ 压到低维潜变量 $z_t = f_\text{enc}(s_t)$,然后让世界模型在潜变量空间里工作: $p_\theta(z_{t+1} | z_t, a_t)$。这样做有两个原因:一是潜变量空间维度低,学习更容易;二是潜变量空间更容易学到"语义化的物理量"——比如物体的位置、速度、关节角,而不是纠缠在像素细节里。
世界模型一般有三个组件:编码器(Encoder)、动力学(Dynamics)、解码器(Decoder)。编码器把观测压成潜变量;动力学是核心,通常是一个 RNN、Transformer 或状态空间模型(SSM),负责预测下一时刻的潜变量;解码器把潜变量还原成可解释的观测(这一步在训练时用于提供重建损失,在推理时常常可以省掉,因为规划只需要在潜变量空间里进行)。
训练时,我们收集轨迹 $\tau = (o_1, a_1, o_2, a_2, \ldots, o_T)$,然后最小化下面的损失:
$$\mathcal{L}(\theta) = \sum_{t=1}^{T-1} \left[ \| \hat{o}_{t+1} - o_{t+1} \|^2 + \beta \cdot \| \hat{z}_{t+1} - z_{t+1} \|^2 \right]$$
第一项是重建损失(让解码器还原观测),第二项是潜变量空间内的预测损失。这个损失函数做的事就是:强迫模型学会"如果我做这个动作,世界会变成什么样"。学完之后,我们可以把真实世界抛开,完全在模型内部 rollout——这就是"想象"。
但世界模型真正的魔力,不在于它能预测未来,而在于它让反事实推理变得廉价。Counterfactual reasoning——"如果当时我做的是另一件事,世界会是什么样"——在真实世界里做一次就要花一秒钟(还可能撞墙),但在世界模型里做一次只需要几毫秒,而且没有物理风险。这意味着机器人可以在几秒钟内"想"出上千种可能,挑出最好的那个去执行。这就是为什么我们说世界模型让机器人从"反应式"升级到"反思式"。
把这件事映射回人类认知,会非常有意思。当你伸手拿一个玻璃杯,你的视觉系统先估算出杯子的位置、形状、重心;你的小脑在后台运转一个粗略的物理模型,预测手指合拢时杯子会不会滑、会不会倒;如果模型预测到"可能滑",你会在手指接触杯壁的瞬间,自动微调握力和接触角度。整个过程发生在几百毫秒内,你完全无意识——这背后其实就是一个高度优化的世界模型在跑。神经科学家把这套机制叫做 internal model 或 forward model,位置在运动皮层、小脑和顶叶的联合区域。1995 年,Miall 和 Wolpert 用经典的"打手"实验(被试戴棱镜眼镜,伸手够一个目标)首次给出了人类存在 forward model 的行为学证据。
这给了我们一个重要的工程启示:世界模型不是机器人的某种"奢侈品",而是它在开放环境中生存的必需品。 工业机器人在固定工位不需要世界模型,因为环境简单且不变;但一旦进入家庭、街道、灾区这些开放环境,世界模型就成了"能工作"和"经常出丑"之间的分水岭。
为什么端到端学习不够用
既然端到端模仿学习在 2010 年代那么火,看起来又简单,为什么我们不直接堆数据、堆算力,把 BC 推到极致,反而要绕一圈去搞世界模型?这个问题的答案,值得花几段认真说清楚。
第一个原因,我们已经提过 covariate shift。但 covariate shift 只是表象,深层原因是端到端模型学不到因果结构。一个 BC 模型学到的是"在这种像素模式下,方向盘应该转这么多度",它学到的是相关性(correlation),不是因果性(causation)。相关性在分布内有用,在分布外就会反噬。比如,训练数据里所有的"儿童"都出现在学校区域,模型可能学到"学校区域要减速",这在分布内是对的;但如果一个孩子出现在高速公路上(分布外),模型就会犹豫——它的训练里没有"高速公路+儿童"这个组合。而一个有世界模型的系统,会从物理上推理:孩子的移动速度、我车的速度、刹车距离,这些是因果变量,不会因为场景变了就失效。
第二个原因是多模态问题(multi-modality)。在真实场景中,同一个感知状态可能对应多个合理的动作。比如在十字路口前,人类驾驶员可能左转也可能右转,两个都是合理的。BC 模型在训练时会用损失函数强行"平均"这些多模态行为,平均之后的结果就是"两个都不太对"——一种统计学上称为 regression to the mean 的现象。世界模型则可以在想象中"尝试"每一种可能,选最优。
第三个原因,也是最微妙的一个:BC 缺乏"失败经验"。人类驾驶员之所以能在事故边缘做出正确反应,是因为我们见过事故、听过事故、在想象中演练过事故。但 BC 的训练数据天然偏向"成功轨迹"——专家们已经把事故避开了,事故的样本在数据里非常稀少。结果就是 BC 模型几乎没见过"自己犯错"长什么样,因此一旦犯错,就不知道如何回到正轨。世界模型则可以通过"想象"自己犯错来学习恢复策略——这正是 Go-Explore、Self-Imitation Learning、以及 Dreamer 系列中"imagined rollouts"的核心思想。
第四个原因涉及数据效率。在 2020 年代,大家开始意识到,具身智能(embodied AI)的真正瓶颈不是模型大小,而是数据。OpenAI 用 GPT-4 的规模在互联网文本上训练,但具身智能体的数据必须从物理世界采集,获取成本高几个数量级。Tesla 的 Optimus、Figure 的人形机器人,目前的训练数据还远远不够。世界模型提供了一个"数据放大器"——从少量真实轨迹学到的世界模型,可以在内部生成海量的"想象轨迹",这些想象轨迹可以用来训练策略,等效于把数据量扩大了 100 倍甚至 10000 倍。这是 PILCO、Dreamer 等模型样本效率惊人的根本原因。
到这里,我们已经从"是什么"和"为什么"两个角度,把世界模型的核心概念铺陈开了。在进入更深的理论之前,让我们用一段简短的代码,把"训练一个世界模型"这件事落到实处。
50 行 PyTorch 实践:训练你的第一个世界模型
光说不练假把式。下面这段 50 行左右的 PyTorch 代码,会在一个 5×5 的 gridworld 上训练一个最小的世界模型,然后我们用这个模型"想象"几条未来轨迹。代码故意写得紧凑,目的是让你看到最核心的逻辑——一个编码器(其实就是直接把 (x,y) 当潜变量),一个 MLP 动力学,一个训练循环,一个想象函数。
```python import torch import torch.nn as nn import torch.optim as optim import numpy as np
torch.manual_seed(0); np.random.seed(0)
--- 1. Gridworld dynamics: deterministic, with wall clipping ---
W = 5 # grid size def step(s, a): x, y = s if a == 0: y = min(y + 1, W - 1) # up elif a == 1: y = max(y - 1, 0) # down elif a == 2: x = max(x - 1, 0) # left elif a == 3: x = min(x + 1, W - 1) # right return (x, y)
--- 2. Collect random-walk data: 2000 transitions ---
S, A, S2 = [], [], [] s = (np.random.randint(W), np.random.randint(W)) for _ in range(2000): a = np.random.randint(4) s2 = step(s, a)