我看过一个演示视频,机器人在仿真里把一摞碗叠得又快又稳。评论区在讨论模型结构和参数量,我盯着的是另一个东西:这段视频是正常速度播放的。真机上它做同样的动作,中间有两次明显的停顿,那是模型在等下一次推理结果。
这类细节不会出现在论文里,但它决定了这个系统能不能出实验室。
分层还是端到端
具身智能的架构讨论,最后都会落到一个选择上:让大模型只负责想,还是让它连着动作一起输出。
前一种叫分层,或者叫 LLM as Planner。语言模型看指令、看场景描述、看机器人有哪些技能,输出一串子任务:找到瓶子、抓起来、移动到垃圾桶、放下。它不碰电机,电机那边由预先写好的运动原语或者策略网络执行。这条路落地最快,因为每一段都可以单独调试,出问题也知道该看哪一层。
它的问题是把语义和物理隔开了。模型知道“扔掉”这个词,但不知道这个瓶子有多重、机械臂够不够长、桌上有没有别的东西挡着。于是会出现那种语法正确、物理荒唐的计划:让它去拿高处的物品,它规划得很完整,只是机器人没有梯子。
SayCan 那类做法就是在补这个洞。把语言模型给出的可行性和一个价值函数估计的成功率乘起来,只有既想做又做得到,动作才真的执行。这个思路我比较认同,它承认了语言模型没有物理常识,然后在外层用别的东西去约束它。
另一种是端到端,代表是 RT-2 这类 VLA 模型。它把动作离散成 token,和文本放在同一个词表里,让模型像预测下一个词一样预测下一个动作。图像和指令进去,动作序列出来,中间没有规划器和控制器的人工边界。
这一步的意义在于语义能迁移。模型在互联网数据里见过“恐龙”,那么在真实场景里让它拿起一只玩具恐龙,它不需要专门训练过这个概念。这种零样本的组合能力,传统模仿学习做不到,因为它们只见过训练集里的物体和指令。
代价也很清楚:不可解释,出错时不知道是哪一环坏了,而且推理慢。端到端模型输出一个动作块要几百毫秒,这在实际控制里是很长的时间。
具体怎么把动作变成 token,值得说清楚一点。做法是把每个维度的连续值归一化,切成固定数量的区间,比如末端位姿的六个自由度加一个夹爪,各切两百多个桶,于是每个动作变成一串离散符号,和文字放在同一个词表里。模型输出的就不再是数字,而是“第几个桶”,解码时再映射回去。
这种做法的好处是能复用预训练。模型一半的知识来自互联网图文,一半来自机器人轨迹,两者混着训。关键是微调时没有把原来那份语义能力洗掉,所以它认识“恐龙”这件事仍然成立,只是现在多了一个“抓起来”的动作可以对应上。这种跨模态的迁移是它最让人意外的地方,也是最难复现的地方。
PaLM-E 经常被拿来和 RT-2 一起讲,但两者定位不同。它把图像和传感器状态编码成向量,直接拼进语言模型的输入序列,输出的仍是文本形式的规划。它更擅长说清楚该做什么,具体的动作还要交给下层的策略。把它当成一个能看图的高层规划器更准确,端到端控制不是它的目标。
数据是物理世界的荒漠
文本数据是现成的,物理交互数据不是。
采一条真实操作数据,要有人遥操作,要一台能用的机器,要保证过程中不出安全事故。成本高,速度慢,而且大部分数据集中在简单的抓取和移动上,长序列的复杂任务很少。公开数据集里能拿来直接用的更是有限,各家格式还不统一。这就是为什么这个领域一直在想办法绕开真实采集。
仿真是最主流的绕法。在 Isaac Sim 或 MuJoCo 里搭场景,让策略在里面试错,再把学到的搬到真机。问题是仿真永远不等于现实:摩擦系数不对,光照不对,相机有噪声,电机有死区。仿真里成功的策略到了真机上,经常在第一步就偏了。
域随机化是目前最有效的补丁。思路有点反直觉:既然不知道真实世界的确切参数,那就把仿真里的参数随机化到足够宽的范围,纹理、光照、相机角度、摩擦、质量、阻尼全都变。这样训练出来的策略见过足够多的变化,真实世界只是其中一个特例。
它有效,但很贵。随机化范围开得越大,训练需要的样本越多,收敛越慢。范围开小了不解决问题,开大了模型学不到东西。这个度怎么定,基本靠经验。
另一条路是系统辨识,在部署前用一段固定动作去估真实环境的参数,再在仿真里对齐。它对电机老化这类漂移没什么办法,所以还得配合在线自适应。
采集这一端的成本也值得算。真机遥操作要人、要设备、要场地,一个人一天能采到的有效片段有限,还要筛掉失败的。所以现在有大量工作在压低采集门槛:用手机加一个便宜的机械臂组成遥操作套件,或者干脆用人的第一视角视频去预训练。这些方案的数据质量不如专业设备,但量大,量大在早期比质量更重要。
合成数据是另一条补充线。用视频生成模型去造边缘情况,比如物体滑落、被遮挡、抓取时偏了一点。这类场景在真实采集里很难碰到,但又恰恰是策略最容易失败的地方。问题在于生成的东西未必符合物理规律,拿它训练等于往数据里掺错,所以还得配一层筛选。
模仿学习和强化学习之间的选择,本质上是数据效率的取舍。模仿学习收敛快,动作像人,但会累积误差,一旦进入训练分布之外的状态就崩,而且上限就是示教者的水平。强化学习能探索出人想不到的解,但样本效率低到必须依赖仿真。
我倾向的组合是先模仿再强化:用示教数据把策略预热到一个能用的水平,再在仿真里用强化学习去提升鲁棒性。这个方案不优雅,工程量大,但它绕开了两个极端。
怎么判断训出来的策略行不行,是另一件容易走偏的事。语言模型那边看困惑度和 loss,放在这里几乎没有意义,因为预测下一个动作 token 准不准,和机械臂有没有真的把杯子拿起来是两回事。
我会看任务成功率,以及长任务里每个子目标完成到哪一步。一个十步任务成功了九步,和成功了一步,平均数看起来差不多,实际问题完全不同。还有路径效率:绕了很大一圈才拿到东西,成功率是满分,但没人愿意用。轨迹是否符合运动学约束、有没有接近奇异点、会不会撞,这些是能不能上线的硬条件。
最后一个是仿真和真机的相关性。如果仿真里的排名和真机上的排名对不上,那说明仿真环境本身建错了,用它做选型的所有结论都要作废。这一项很少有人主动测,但它决定了前面那些数字可信不可信。
频率对不上,一切都白搭
这是我认为最容易被纯软件背景的人低估的一点。
大模型的推理频率大概在个位数赫兹,一次输出要几百毫秒。机器人底层的伺服回路通常是几百赫兹到一千赫兹,因为只有这个频率才能让动作平滑、让力控稳定。两者差了两个数量级,中间那段空白必须有东西填。
答案不新鲜,还是分层。上层跑 VLA 或者规划器,输出稀疏的航点或者目标位姿,允许它有几百毫秒的延迟;下层跑 MPC、PID 或者全身控制,把目标插值成密集的电机指令。上层慢,下层快,慢的那层负责想清楚去哪,快的那层负责别摔倒。
这个结构还有一个附带的好处:解耦。上层推理卡住的时候,下层仍然在维持姿态和平衡,不会因为一次 API 超时就让机械臂甩出去。安全性是这样一点一点堆出来的,不是靠模型自己学会的。
边缘部署是另一个现实问题。实验室里有整机柜的卡,现场只有一块嵌入式 GPU,功耗和散热都卡得很死。量化、算子融合、TensorRT 这类工作不性感,但它们是能不能跑到实时的那条线。
比较务实的做法是大小模型协同:本地跑一个蒸馏过的小策略,负责高频执行;只在任务切换或者遇到没见过的状况时,才异步去调大模型重新规划。用户感知到的是一点延迟,而不是一次失败。
安全不能交给模型
语言模型输出一句错话,代价是尴尬。机器人输出一个错误动作,代价可能是人。
所以我不太相信把安全寄托在模型的对齐上。该有的东西还是要有:动作指令出去之前过一层校验,检查关节限位、检查轨迹会不会撞到已知障碍、检查速度是不是超出范围;视觉显示前方有人而模型还在输出前进指令的时候,系统应该能直接切断,而不是等模型自我纠正。
还有一类更土但必须有的机制:看门狗。心跳丢了就锁死刹车,不管上层在干什么。这些东西跟 AI 一点关系都没有,是传统机器人学里的常识,但恰恰是很多演示系统里缺失的部分。
我判断一个具身项目是否靠谱,先看它失败时的样子,而不是它成功时的样子。
回到面试这件事上,我不太会问对方知不知道 RT-2 的结构,这种查一下就有。我更想问的是:你的模型推理一次要多久,这段时间里机器人在做什么,如果它算错了,什么机制会拦住它。
能答清楚这几个问题的人,通常真的在一台机器上跑过东西。
这个方向我现在还在看,没有定论。唯一比较确定的是,卡住进展的不是模型不够大,是数据太贵、延迟太高、安全边界太难划。这三件事都不在榜单上。
评论