☰
RT-2技术解析:视觉语言模型如何将机器人动作变成token
2026/10/16 19:10:26 网站建设 项目流程

1. 项目概述:一句话理解 RT-2 在做什么

先把结论摆在前面:RT-2 做的事情,就是让视觉语言模型(VLM)的输出层不再只吐“自然语言 token”,而是把机器人的动作也当成 token,直接混进同一个词表里做自回归。换句话说,以前的机器人策略模型是“视觉输入 → 动作输出”,中间夹着一个专门设计的动作头;RT-2 把这个动作头干掉了,改成“视觉输入 + 语言指令 → token 序列”,其中一部分 token 对应文本,另一部分 token 对应机器人关节角度或末端位姿。

这个思路最直接的好处是:整个模型变成一个统一的 Transformer,结构上极度干净,不需要再去考虑“该用 MLP 还是 LSTM 当动作头”“动作头要不要单独训”这类问题。凡是能建模文本依赖的架构,就能建模动作依赖,因为 token 序列的语言规律和动作规律本质上都是条件概率分布的学习问题。

这篇博文的受众,我默认是对多模态大模型有基本了解、想深入理解机器人基础模型(Robot Foundation Model)设计逻辑的研究者或工程师。如果你只是听说过 RT-2 这个名字,想搞懂“为什么一个会聊天的模型能控制机械臂”,这篇文章正好合适。我会从为什么用 VLM 做机器人控制、动作怎么 token 化、数据怎么组织、训练怎么设计,到推理时动作如何涌现,一步步拆开讲清楚。

对于已经跑过 RT-1 或类似模仿学习项目的同学,这篇文章能补上从“专用策略模型”到“通用视觉语言动作模型”的关键一步。对于刚入门的新手,我也尽量把前置知识铺垫到位。

2. 用 VLM 做机器人控制:这步棋背后到底图什么

2.1 从 RT-1 到 RT-2:架构升级的底层动机

先回顾一下 RT-1。RT-1 用的是 ImageNet 预训练的 EfficientNet 提取视觉特征,然后接一个 Transformer,输入是视觉 token 和语言指令 token,输出是离散化的动作 token。注意,RT-1 的动作 token 是模型自己训出来的一个离散动作词表,和语言 token 不是一回事——语言 token 是预先定好的 SentencePiece 词表,动作 token 是另外学的。这种设计在当时已经能实现不错的多任务模仿学习,但有一个结构上的硬伤:动作空间和语言空间是两套独立的词表,模型必须学习在两种模态之间做“翻译”,而因为两套词表的分布差异巨大,这个翻译过程异常难学——本质上是在问模型“这段视觉特征对应哪个离散动作码”,而动作离散码之间没有任何语义平滑性。

RT-2 直接把这个翻译过程取消了。它把语言词表和动作词表合并成同一个词表,视觉 token 照旧用视觉编码器产出,语言和动作都从同一个词表里采样。这样一来,模型只需要学一个简单的映射:视觉+语言上下文 → 下一个 token(这个 token 可能是文本,也可能是动作)。

用一句大俗话总结:RT-1 是让模型在两本词典之间翻来翻去,RT-2 是给它一本大词典,让它按需查词。后者的学习压力显然小得多,尤其是在数据量有限的情况下,这种架构上的简化能带来实打实的泛化能力提升。

2.2 为什么偏偏是 VLM,而不是从头训一个多模态模型

一个很自然的疑问是:既然要做“视觉+语言+动作”,为什么不从头设计一个新的多模态架构,非要拿现成的 VLM 改?答案是数据效率和泛化能力的双重考量。

自监督预训练的 VLM(比如 PaLI-X、PaLM-E 这类)在海量互联网图文数据上见过数亿级的“图+文”配对,已经具备非常强的视觉语义理解能力,能够识别物体、理解空间关系、推理隐含状态。而机器人的真实操作数据非常贵——一条机器人轨迹数据要真机采集,动辄几秒到几分钟的时长,且每个场景都要人工布置,数据量级和互联网图文数据根本不在一个量级。如果从头训一个模型,等于放弃了互联网数据带来的先验知识,纯靠 Tweets 级别的机器人数据去硬学,效果可想而知。

RT-2 最本质的贡献,就是证明了:VLM 里的视觉语义理解能力,可以被“嫁接”到动作生成上。它不需要从头学视觉语义,它只需要学一件事:从“语义理解”到“动作落点”的映射。更关键的是,这种嫁接不需要改变 VLM 的任何结构,只需要改变训练数据的格式和输出层词表的含义。

2.3 “谈虎色变”的机器人数据困境,在 RT-2 里是怎么绕过去的

网上很多讨论把 RT-2 的成功归因于“数据量大”,但仔细看论文会发现,真正的重点不是数据的量,而是数据的组成方式。RT-2 用的机器人数据其实还是 RT-1 那批(约 130k 条),真正多出来的是大量的互联网“图文”和“图文+文本”数据。模型在做训练时,是同时在这些混合数据上做标准的 next-token prediction——机器人轨迹数据教它动作,互联网数据教它语义。

这带来一个非常聪明的副作用:当模型在互联网图片上看见“桌子上的红色杯子”时,它学到的是视觉语义和语言符号之间的绑定;当它在机器人数据上看见“机械臂把红色杯子从桌子A挪到桌子B”时,它学到的是视觉语义和动作符号之间的绑定。因为两者共享同一个视觉编码器和同一个词表,语义绑定和动作绑定之间会互相促进——语言描述帮助模型识别“红色杯子”,动作标签则帮助模型理解“挪”这个动词在物理世界中到底意味着什么。

所以 RT-2 实际上不是在“用机器人数据硬凑”,而是在“用互联网数据打底,用机器人数据点拨”。这种混合训练策略,几乎是目前所有机器人基础模型的标配思路,但 RT-2 是把这个思路做得最彻底、也最有代表性的一个。

3. 核心细节拆解:动作 token 化,没有想象中那么玄乎

3.1 动作到底是怎么变成 token 的

这是 RT-2 最容易让人犯迷糊的地方,也是面试中被问烂的问题。直接说结论:RT-2 把动作表示成一个 7 维向量,然后逐维离散化,再把这个向量整体映射成一个 token。具体来说,这 7 个维度是机械臂末端执行器的 6 自由度位姿(三维位置 + 三维旋转)再加上一个夹爪开合维度。

论文里没有用那种“把多维动作压成一维再分桶”的粗暴做法——那种做法会把不同维度之间的耦合信息丢掉。RT-2 用的是离散化查表的方式,预先定义每维的取值范围,然后按固定间隔分割成 256 个 bin,7 个维度一共是 256^7 种组合。如果老老实实把这 256^7 都塞进词表,那词表直接爆炸,训练也根本训不动。所以 RT-2 的做法是:为每个维度单独生成一个 token,也就是动作输出的时候不是一次吐一个 token,而是连续吐 7 个 token,一个维度一个 token,每个 token 的取值是 0 到 255 的整数,对应那个维度的 bin 索引。

可能有人会问:那这不就是和语言词表共用一套映射吗?其实这里有个细节——RT-2 不是让动作 token 和文本 token 共享同一个嵌入表,而是在现有 VLM 词表的末尾追加了 256 个特殊 token,专门表示“这个位置的数值是某个 bin 索引”。这样做的好处是模型原有的语言能力完全不受影响,动作生成时可以复用 Transformer 对数字 token 的建模能力。动作序列的生成因此和生成一段文本在工程上完全一致,解码时采样到了动作特殊 token,就把它解析成 bin 索引,再做逆映射得到连续动作值。

3.2 协调变换与旋转表示:没处理好这里,精度会直接崩掉

动作 token 化的第一步不是直接离散化原始关节角度,而是先把动作转换到末端执行器坐标系下。这是很多人忽略的一个细节。RT-1 时代的做法是直接对关节角度做离散化,但 RT-2 换成了末端执行器的位姿——位置部分直接用三维坐标,旋转部分用的是相对于机器人基座的轴角表示。

旋转表示的选择非常关键。欧拉角有万向锁问题,四元数虽然是连续的但四个分量之间有限制条件,直接离散化容易产生无效旋转。RT-2 选择轴角表示(即旋转向量),因为它的三个分量在机器人控制里是最直观的物理量,而且离散化后即使有误差也不会让姿态变得非常离谱。工程上如果你自己要复现,建议也用轴角,不要自己发明四元数离散化方案,血泪教训。

还有一个重点:你从 ROS 或者机器人 SDK 里拿到的末端位姿通常是在世界系或基座系下的,这个没问题,但要注意,如果你的训练数据和推理数据的坐标系定义不一致,哪怕差一点点,模型学出来的策略都是一纸空谈。RT-2 的做法是统一用基座坐标系,并且做了归一化,确保所有维度都落在 [-1, 1] 或者类似的固定区间里再分桶。这个区间设置很重要,如果你某一维数据的实际分布只有 [-0.2, 0.2],但归一化区间设成 [-1, 1] 并按 256 等分,那等效分辨率只有大约 50 多个 bin 在发挥作用,精度损失非常严重。实际项目中我习惯先统计训练数据的每维 min/max,再留 10% 的余量设置边界。

3.3 推理阶段的“动作解码”:从 token 到真实指令的最后一公里

训练完成后,推理时模型的输入是“当前图像 + 文本指令”,输出是若干 token。其中语言指令的 token 很好解析,直接送进分词器反解码成文本;动作 token 则需要做一次“翻译”:命中到动作特殊 token 后,把它的索引 i 映射成数值:value = min + i × (max - min) / 255。这 7 个数值就构成当前时刻的 7 维动作向量。

这里的采样策略也值得说说。RT-2 的推理阶段如果想更平滑地控制机器人,一般可以加一个滑动窗口滤波,比如把最近 3 个时间步预测的动作做加权平均,防止出现抖动。论文里没有把这事儿写得很细,但自己做部署时这个细节几乎必踩坑——Transformer 在推理时是逐 token 生成的,相邻帧之间的动作预测会有微小跳变,直接下发到底层控制器会让机械臂像帕金森一样抖。我当时做类似项目时,先用指数移动平均(EMA),然后把 7 个维度的差分都 clamp 了一下,效果立竿见影。

另外要注意,RT-2 的推理频率和底层控制频率通常是不匹配的。RT-2 从输入图像到输出动作,整个前向传播在 A100 上大概几十毫秒到一百多毫秒,但机械臂的底层控制周期通常只需要几毫秒到几十毫秒。中间一般要加一个插值器:RT-2 输出一个目标位姿,插值器在时间上做平滑过渡,底层控制器再去跟踪这个插值轨迹。

4. 从“看懂”到“做到”:两阶段训练与思维链的隐式涌现

4.1 阶段一:从现成 VLM 热启动,不浪费一点预训练知识

前面的内容反复提到 RT-2 是从 VLM 初始化来的,但这一步到底怎么做,很多人还是不太清楚。RT-2 有两种规格的模型,大号的 RT-2-55B 是在 PaLI-X 的基础上继续训练,小号的 RT-2-5B 是在 PaLM-E 的基础上继续训练。中间的视觉编码器和语言模型部分原封不动地继承权重,只是把输出头改了一下:原本 VLM 的输出层是一个映射到词表大小的线性层,RT-2 只需要在词表维度上追加动作 token 对应的嵌入向量,其他权重全部冻结。

这里面的关键决策是“到底冻结哪些层”。RT-2 论文里明确说明:不是全部冻结,而是把 VLM 的全部参数都放开一起做微调。为什么?因为模型要学的“动作”本质上是一种新的输出分布,如果只训输出头,模型无法在内部特征层面把视觉语义和动作语义融合得足够好。但全参数微调有风险——如果机器人数据占比太小,模型可能快速遗忘语言能力。RT-2 用的是大约 1:1 的图文数据和机器人数据混合配比,并且用较小的学习率(相对预训练阶段),在保证语义能力不崩塌的前提下,学习动作映射。

实操层面,我强烈建议你复现时不要一上来就全参微调。先在机器人数据只调动作 token 相关的层(比如输出头和最后几层 Transformer),确认动作 loss 在掉,再解冻更多层。全参微调的不确定性太大,尤其是你没有 256 块 TPU 的情况下,翻车率极高。

4.2 阶段二到推理:CoT 是显式加的,但“隐式思维链”是训出来的

如果你仔细读过 RT-2 论文的附录,会发现推理时有一个非常关键的改动:在输入里拼接“思维链提示”。比如说,用户指令是“把红色杯子放到蓝色盘子里”,模型实际接收的是“用户说:把红色杯子放到蓝色盘子里。思考过程:我应该先找到红色杯子,然后移动到蓝色盘子,最后释放。”后面再接“动作:”作为输出的起点。

这就是论文里说的 CoT(Chain-of-Thought)提示。它的作用是激发 VLM 在预训练阶段学到的推理能力,让模型在生成动作之前先“想”一遍,从而大幅提高复杂任务的成功率。论文里的数据很清楚:没有 CoT 提示时,RT-2-55B 在见过和没见过的任务上的成功率会掉 10 到 15 个百分点。

更有意思的是,论文提到在 CoT 提示引导下,模型在内部表征中表现出一种“隐式规划”的现象——即使你不给它显式的思维链提示,模型在生成动作 token 之前,内部注意力也会先聚焦在任务相关的物体上,再转移到目标位置。这说明模型在训练中已经学到了“先理解、再规划、后执行”的隐式链路,CoT 提示只是把这个过程显式化,让模型更容易调动这种能力。

我自己的理解是,这个机制的底层逻辑和人类类似:当我们去端一杯水时,我们是先“看见”水杯在哪、路径上有无障碍物,然后才协调肌肉去完成动作。对外人来说,这个过程是瞬时的,但对大脑来说,这其实是一个完整的推理链条。RT-2 的 CoT 提示就是把这个链条摆到了模型面前,让它别跳步。

4.3 训练数据的样本组织:一个被忽略但决定成败的细节

RT-2 的训练数据可以分为三大类:

第一类是机器人操作数据,每条样本长这样:一张当前摄像头图像,一段语言指令,一串动作 token。第二类是视觉问答数据(VQA),比如图片里有什么物体、物体是什么颜色,这些数据帮助模型保持视觉语义能力。第三类是纯文本数据,用来维持模型的通用语言能力和世界知识。

你可能会疑惑:机器人数据和问答数据在一条样本里怎么共存?答案是:本质上它们都是一样的——都是“多模态输入 → token 序列输出”。在训练时,RT-2 把所有这些数据混合在一起,全部当作 next-token prediction 任务来处理。机器人数据的 label 是动作 token,问答数据的 label 是文本 token,混合训练。

这个设计的微妙之处在于数据配比。如果机器人数据太多,模型会在语言问答任务上退化,变得只会做动作不会说话;如果机器人数据太少,模型又学不好动作。RT-2 论文给了两个配比参考:55B 模型用的是大约 50% 机器人数据 + 50% VQA/文本数据,5B 模型更倾向于多一些机器人数据(大约 58%)。实际效果没有绝对优劣,取决于你最终要部署的场景。如果你要做的是纯机器人控制,可以把机器人数据比例提到 70% 以上,牺牲部分的“聊天能力”换取动作准确率。

5. 实操复现路线:从零搭建一个“VLM+Action Token”的最小工程

5.1 选定基座模型与硬件,量力而行

RT-2 的原始实现依赖 Google 内部超大集群和 TPU,普通团队在不做任何裁剪的情况下直接复现 55B,基本不可能。但如果只是想复现核心机制,完全可以缩小规模。

我建议从 3B 级别的开源 VLM 入手,比如 LLaVA 系列、Qwen-VL 或者 InstructBLIP 的权重作为基座,在公开的机器人操作数据集上做微调。硬件上,一张 80GB 显存的 A100/H100 起步,或者两张 48GB 的 L40S 做数据并行。数据方面,可以用 RoboMimic、RLBench 这类仿真数据,也可以从 BridgeData V2 这类真实机器人数据集中取一小部分做初测。

预算有限的情况下,还有一个更省钱的调法:冻结 VLM 的视觉编码器和语言骨干,只训练一个“动作适配器”模块(类似 Lora 的思路)。代价是动作精度会下降,但工程成本大幅下降,适合第一次跑通流程。

5.2 最小复现的四个主要步骤

第一步是准备数据。不管你用仿真还是真机数据,统一做这几件事:用相机内参和外参把图像做标准化(resize 到模型输入尺寸、归一化像素值),把机械臂末端位姿转换到基座坐标系下,然后按实际范围做离散化映射,生成 7 个 0-255 的整数标签。

第二步是改模型词表和输出层。在 VLM 的 tokenizer 里追加 256 个特殊的动作 token(例如<ACTION_0>到<ACTION_255>),重新初始化这 256 个 token 的 embedding,其他 embedding 保持预训练权重不动。同时,把模型配置里的词表大小改成原词表大小 + 256。

第三步是设计训练损失。和标准语言模型一样,只对输出部分的 token 计算交叉熵损失。具体实现时,把文本指令部分的 label 设为 -100(忽略),动作 token 和 CoT 文本部分正常计算损失。如果你加上 CoT 训练,还要把 CoT 生成的文本 token 也纳入损失计算。

第四步是推理部署。输入图像和文本指令,让模型自回归生成,遇到动作特殊 token 后停止文本生成,解析成动作向量,下发到控制器。注意加滤波和插值,否则机械臂动作会很生硬。

5.3 用开源框架把工程量再降一档

完全从零写这套代码需要不少时间。目前社区里已经有一些开源项目做了部分工作,比如 OpenVLA(基于 Prismatic VLM 微调的动作模型)、OpenX-Embeddings 处理多数据集统一格式等。OpenVLA 和 RT-2 思路一脉相承,都是把动作搞成离散 token,只是基座模型不同,数据格式有些差异。拿它当参考实现,再去改造成自己的任务,会比从零开始少踩一半的坑。

我自己的体会是:千万别一上来就研究“如何把 RT-2 原版代码跑起来”,先看 OpenVLA 这类简化版是怎么实现动作 token 化、怎么组织数据、怎么训练和推理的,把这个流程吃透,再回去读 RT-2 论文里的细节,很多之前看不懂的地方一下就通了。

6. 实际项目里最容易翻车的几个细节

6.1 相机标定与坐标系不统一:精度问题的头号元凶

这是我自己和很多复现者踩过最深的一个坑。RT-2 训练时用的是基座坐标系下机械臂末端位姿,但真机部署时,如果你用眼在手上的相机,图像对应的坐标系是随时在变的;如果相机的安装位置和训练数据采集时有任何偏移,模型看到的视觉特征和它学到的动作映射就对不上,控制精度会显著下降。

解决方法是:在训练数据准备阶段,就把所有图像变换到统一的虚拟相机视角下(RT-2 的做法之一),或者在部署阶段做一次手眼标定,把当前图像对齐到训练时的观察视角。前者需要大量的图像重投影计算,后者需要标定精度足够高,都不简单。但只要你跳过这一步,后面无论怎么调参,效果都会卡在瓶颈上不去。

6.2 动作 token 的分布不均衡:模型偏爱输出“中间值”

离散化一个连续动作空间时,大概率遇到一个现象:某些 bin(比如中间值附近)出现的频率远高于其他 bin。这会导致模型学成一个“均值回归器”——不管输入是什么,它都倾向于输出中间的数值,因为训练时这么做的损失最小。

我在实际训练里碰到过这个问题,典型表现是:模型在慢速任务上表现不错,但一旦需要精确移动到某个角落位置,就会失败。原因就是边界 bin 的样本太少,模型压根没学会边界输出。解决方案有几种:一是对动作标签做重采样或加权,让每个 bin 的样本数尽量均匀;二是减小 bin 数量,比如从 256 降到 128,让每个 bin 的样本密度上升;三是用分类损失加上一个辅助的回归损失头,让模型同时学习“这个动作落在哪个区间”和“这个动作的精确值是什么”。第三种方式工程上复杂一些,但效果最好。

6.3 训练和推理时 CoT 的使用不一致,导致效果大幅掉点

论文里有个细节很容易被忽略:RT-2 在做机器人数据训练时,不是只给模型喂“图像+指令 → 动作”,而是同时要求模型输出 CoT 文本和动作。也就是说,训练数据的 label 是“CoT 文本 token + 动作 token”拼接而成的完整序列。如果你训练时只学习动作 token,推理时却加上 CoT 提示,模型会非常不适应,因为它从来没有学会“先说话再动手”的模式。

反过来说,如果你的训练数据量不够大,强行让模型学习生成 CoT 反而会稀释动作学习的容量。我的建议是:复现时先跑通“不加 CoT”的版本,确认机器人控制链路本身稳定,再逐步引入 CoT 数据。对很多小规模项目,不加 CoT 可能反而效果更稳,因为生成的 CoT 文本一旦有误,会误导模型后续的动作生成。

7. 常见问题速查表

几个经常被私信问到的问题,集中整理在下表里,方便大家对照排查。

问题可能原因解决方案
模型输出动作有严重抖动未做时序平滑或滤波增加指数移动平均,或对动作差分做 clamp
动作总是偏向中间值训练数据 bin 分布不均对动作 label 重采样,或降低 bin 数量
有 CoT 时效果下降训练数据中没有 CoT 标签确保训练和推理的 CoT 使用方式一致;或去掉 CoT
推理速度太慢,跟不上控制频率模型过大、无批处理减小模型尺寸,或加入插值器降频控制
换了一个相机位置后效果暴跌坐标系/视角不一致统一训练和部署的相机视角,重新标定
语言能力退化成“机器人复读机”机器人数据占比太高降低机器人数据比例,补充 VQA 和纯文本数据
夹爪开合控制不精准夹爪自由度数值范围没对齐检查夹爪开合的归一化区间,单独做标定
模型成功率高但动作轨迹不自然缺少轨迹级平滑约束在 token 解码后加轨迹优化,或用 MPC 跟踪目标位姿

补充一个小技巧:如果你在训练日志里看到动作准确率不升反降,不要急着调模型结构,先检查数据管线的 label 对齐有没有问题——这是我见过的最常见翻车原因,没有之一。手动挑两条训练样本,把图像、指令、动作 label 逐项打印出来,跟数据采集时的真实值比对一遍,很多时候一下子就发现问题了。

8. 我的实操体会与后续扩展思考

RT-2 这个工作最让我印象深刻的,不是它刷了多少 benchmark 分数,而是它把一个极其复杂的问题——“机器人怎么从视觉输入决定动作”——拆解成了一个极其朴素的框架:所有东西都是 token,一切都做 next-token prediction。这种“暴力但优雅”的简化,是很多后续工作的精神源头。

如果你已经复现成功并且准备往更深处扩展,我个人觉得有几个方向值得探索。一个是把动作 token 的粒度从“末端位姿”扩展到“关节力矩”,让模型能直接输出力控信号;另一个是引入更细粒度的时序建模,比如用 action chunking(一次预测未来多步动作),来缓解自回归生成的误差累积;还有一个是替换离散化为连续回归头做混合架构,既保留 VLM 语义能力、又获得连续控制的精度。这些方向目前都有论文在推进,但工程上都还远未成熟,正是自己做实验的好时机。

最后分享一个小经验:做这类多模态模型的落地项目,团队里一定要有一个懂机器人底层控制的人,不然哪怕模型训练得再好,真机上那一下“机械臂猛地甩出去”的瞬态冲击,也够你调一两个月。模型只是一部分,系统链路里每个环节都会成为瓶颈——这是 RT-2 这类项目绕不开的真相。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询