前两天在一个项目复盘群里看到有人贴出这篇“Semantically Guided Task Planning: Supervised Vision-Language-Action Model by Large Language Models”,说实话,我第一次读这类题目时很容易被术语劝退:语义指导是什么?VLA模型又是什么?LLM到底站在哪个环节?后来自己动手做了一个机器人抓取实验,才真正明白这个标题背后其实是一套很朴素的思路——机器人做任务规划时,不能光靠感知和动作的暴力映射,而是需要一个“懂语义的老师”来告诉它每一步该完成什么,再把这种“理解”变成模型内部的监督信号。这次我不打算复述论文,而是把这个做法拆开,讲讲LLM到底在哪个环节起作用、VLA模型是怎么被训练出来的,以及实际训练和部署时那些不写在论文里的坑。如果你在做具身智能、机器人操作任务,或者平时也关注多模态模型,这篇文章应该能帮你少走几周弯路。
1. 语义指导在任务规划里的位置:为什么LLM要“管”VLA
1.1 任务规划的两个层级:高层语义分解和低层动作执行
传统任务规划把机器人操作拆成两个层级:高层是符号规划,负责把“把杯子放到餐巾纸旁边”翻译成“拿起杯子、移动手臂、放到目标位置、松开”这样的步骤序列;低层则是运动规划,负责把这些步骤变成具体的关节角度、轨迹和力控信号。早期系统用PDDL这类形式化语言描述状态和动作,好处是逻辑可验证,坏处是必须由人来定义所有谓词和动作效果,换个环境就得重新写模型。
后来大家开始尝试让端到端模型直接学习“感知到动作”的映射,也就是把视觉图像和语言指令扔进一个网络,输出直接是机械臂的动作序列。这个过程跳过了显式的符号规划,看起来简洁了很多,但也丢掉了一个很关键的东西——语义链。模型知道“现在该让手臂往上抬”,却不知道“为什么抬起来”。当任务稍微复杂,比如需要先清理障碍、再挪动杯子,这种一步到位的模型很容易在一连串动作中间迷失方向。
1.2 VLA模型的长板与短板
VLA的全称是Vision-Language-Action,是最近一年多具身智能领域最常见的一种模型结构。它的典型做法是:用预训练的视觉编码器抽图像特征,用语言编码器抽指令特征,然后把两种特征送到一个Transformer里,最后用动作解码器输出机械臂的连续动作。这类模型的优势在于借助互联网规模的数据预训练,对物体和指令有不错的泛化能力,至少不会再出现“换了桌子颜色就不认识”的尴尬情况。
短板也很明显。首先是组合泛化差。把“拿起红色杯子放到蓝色盘子里”和“拿起蓝色杯子放到红色盘子里”这两条指令,模型可能只学会了颜色和位置的固定搭配,一旦组合变化就崩溃。其次是长期推理弱。一个8秒的轨迹还好,如果是需要十几步的复合任务,比如“把水果从袋子里拿出来,先放到碗里,再移开砧板,再摆到架子上”,VLA很难靠自回归方式把中间的因果依赖保持住。这两个问题本质上都是因为模型没有在语义层面做显式规划,动作输出再漂亮,也缺少一个“逻辑骨架”。
1.3 LLM提供的“语义指导”到底是什么
这篇文章标题里最核心的词是“Semantically Guided”,意思是语义引导或语义指导。注意,这里不是说让LLM去直接控制机器人,也不是让LLM在推理时实时生成每一步动作。它的思路更接近:让LLM在训练阶段充当一个“语义标注师”,把一堆已有的机器人轨迹自动翻译成结构化的步骤描述,然后用这些语义标签去约束VLA模型的训练。
举例来说,专家轨迹里只有相机图像、文本指令“把杯子放到餐巾纸旁边”和对应的手臂动作。LLM可以给这条轨迹补充出“拿起杯子”、“移动到餐巾纸右侧2cm”、“放下并确认杯底接触桌面”这几个细分步骤,甚至可以标注出每个子步骤的完成条件。这些标签成为VLA学习时的额外监督信号,让模型不仅要拟合动作,还要在内部表征上拟合语义步骤。推理时LLM不一定需要在场,VLA自己就能通过已经学到的语义表征去决策。这就是标题里“Supervised by Large Language Models”的含义——LLM是老师,VLA是学生,任务是语义引导下的规划学习。
2. 把LLM变成监督者:一个可落地的训练管线
2.1 离线数据增广:用LLM给现有轨迹打语义标签
第一步要做的是离线数据增广。假设你手里有一批机器人遥操作采集的专家轨迹,格式是“观测图像-语言指令-动作序列”。绝大多数开源数据集并没有现成的语义步骤标签,只有用户指令和底层动作。如果直接拿来训练VLA,模型只能从图像里自己摸索,效果很看运气。
我的做法是先把轨迹切分成若干片段,每一段对应一个稳定的动作阶段,然后用LLM逐段生成语义描述。实际操作中,直接让LLM一次性看完整条轨迹效率不高,还容易出现幻觉,最好先把轨迹的关键帧抽出来,按时间顺序拼接成一张有先后关系的“图文说明”,再让LLM生成分步骤。这里要特别注意给LLM提供一个清晰的prompt模板,比如要求输出“目标-前置条件-动作-结束条件”四个字段。设计模板时不要图省事,字段越结构化,后续用来构造训练标签就越方便。对于某些动作特别长的轨迹,我还会让LLM生成多个候选分解,再通过动作轨迹的边界来过滤掉不匹配的步骤。
2.2 语义中间层:让VLA在“语义-动作”联合空间里输出
有了语义标签,接下来要改模型结构。单纯的VLA会用一个Transformer把视觉语言特征直接映射到动作空间。为了加入语义监督,需要在原有结构中间插入一个语义解码器,它与动作解码器共享大部分Transformer层,但在顶部并行分出两个输出头:一个输出离散的语义token序列,一个输出连续的动作值。
训练时,视觉图像和文本指令先通过编码器得到联合嵌入,然后这个嵌入会同时送到两个解码器。语义解码器负责预测LLM标注的步骤描述,动作解码器负责预测机械臂的关节位置或末端速度。两个头分别算损失,语义头用交叉熵,动作头用均方误差,最后加权求和。推理时,动作头正常工作,语义头也可以选择关闭或轻量运行。这个设计的核心思想是:让语义信息不仅仅存在于输入文本里,还要变成模型内部表征的一部分,这样即使指令中没直接写明“先清理障碍”,模型也能根据语义上下文生成对应动作。
2.3 为什么“监督”比“蒸馏”更准确
有些人会把这种做法理解成知识蒸馏,其实区别很重要。知识蒸馏通常用LLM的输出概率或中间向量去约束小模型,让大模型的知识“软性”传递过去。而这里更像是把LLM输出的语义标签当作离散的注释数据,喂给VLA做标准监督学习。两者的区别在于:蒸馏关注的是转移“回答风格”,监督关注的是建立“语义根基”。
在实际操作中我更喜欢“监督”这种方式,因为LLM生成的文本经过结构化后,可以被脚本过滤和校验。比如某条轨迹LLM生成的目标是“把杯子抬高”,但对应动作片段里手臂根本没有抬升,这条标签就是有问题的,可以直接丢弃或修正。如果做蒸馏,错误的logits会混在软标签里,很难定位。当然,监督也会引入标签噪声,但噪声可以被离线控制,这比在线纠正容易得多。个人经验是,让LLM对同一条轨迹生成多个候选语义分解,然后用规则选择与动作时序一致性最高的那个,监督信号会干净很多。
3. 数据、损失与训练稳定性:最容易翻车的三个环节
3.1 数据准备:语义标签的颗粒度
在准备数据集时,最容易出现的问题不是数据量不够,而是标签颗粒度不合适。如果LLM生成的语义标签只有“移动杯子”这样的一整句,VLA很难从中获得有效的梯度信息,因为这句话和动作序列之间没有明确对齐关系。如果颗粒度太细,比如把每个控制周期都标注成“手臂上移0.5cm”,那等于让模型背答案,完全学不会泛化。
下面是一个我常用的标签层次结构:
| 层级 | 示例 | 用途 |
|---|---|---|
| 任务级 | 把杯子放到餐巾纸旁边 | 给模型提供全局目标 |
| 步骤级 | 拿起杯子、移动至目标、放下 | 给模型提供因果分解 |
| 原子动作级 | 手掌闭合、手臂抬升、手腕翻转 | 给模型提供执行细节 |
建议用步骤级作为主监督信号,任务级作为输入指令的一部分,原子动作级只用于辅助。因为步骤级恰好能把长轨迹切成几个语义完整的段落,让模型学会“先完成什么、再完成什么”。在整理数据时,还要把所有步骤描述统一成一套词汇表,比如“reach”“grasp”“place”之类,避免LLM输出“pickup”和“grasp”这种同义词造成标签空间膨胀。
3.2 损失函数:两个loss的比例怎么定
同时优化语义交叉熵和动作回归损失,最直接的坑是动作回归损失把语义损失“淹没”。均方误差的数值往往比交叉熵大一个数量级,如果不做处理,模型会把注意力全放在动作输出上,语义分支几乎学不到东西。
我试过几种做法,比较稳定的是先用一个较大的权重主训动作回归,把语义头当作辅助任务,在训练开始几个epoch用0.1的权重预热,之后线性升到0.5甚至1.0。这里存在一个权衡:语义权重太高,模型可能会为了迎合语义标签而牺牲动作精度;权重太低,语义分支又形同虚设。还有一个细节:语义token和动作token最好在Transformer内部共享注意力层,而不是各用一套参数。共享注意力会让模型在生成语义描述时也“看到”动作上下文,动作预测也能借用语义信息。但这会导致训练变慢,需要把batch size适当调小,或者用混合精度训练。
3.3 训练稳定性:多模态对齐的灾难
训练过程中最经常看到的“虚假收敛”是loss稳定下降,但仿真测试成功率不涨。这类问题九成出在多模态对齐上。视觉编码器和语言编码器是预训练的,它们各自的特征空间已经固化,要让它们和新的动作解码器对齐,需要很多“语义-动作”对。如果训练数据里指令表达太单调,模型很快过拟合到几个模板,比如所有指令都以“把”开头,换一种问法就失灵。
我踩过的坑是忘记在语义标签里加入负样本。比如,LLM给一个轨迹生成的步骤分解是正确的,但如果把所有标签都是“正确分解”,模型学不到区分错误步骤的能力。后来我在每个batch里混入5%的错误标签,比如把“先拿起杯子”标成“先拿起盘子”,强迫语义分支区分物体身份的语义差异。还有一个有效方法是采用课程学习,先训练只有两三步的简单任务,等语义头稳定后再加入七八步的复杂轨迹,模型不太容易一开始就在长程依赖上崩溃。
4. 评测设计:别忘了把“语义”本身也测进去
4.1 用语义成功率替代单一动作成功
很多VLA项目的评测只报一个动作成功率,比如“机械臂最终把杯子放对了没”。但对于语义引导的任务规划,光看这个指标远远不够。模型可能一路歪打正着蒙对了结果,但它内部完全没理解语义;也可能动作执行得很好,但中间步骤顺序错了,最终结果因为巧合还是正确。如果不把语义过程作为指标,你根本看不出LLM的监督信号到底起了什么作用。
我自己常用的做法是加两个额外指标:一个是子目标完成率,也就是LLM标注的每个步骤是否都完成了;另一个是语义分解准确率,把VLA语义头输出的步骤描述和标准语义标签做对比,用文本相似度或者直接让LLM打分来判断。这里有个小技巧:不是简单看两句话是不是一样,而是看语义关键要素是否对齐,比如物体名称、动作类型、空间关系这三个要素都对了,就认为是语义正确。这样能避免因为同义词问题被误判。
4.2 场景组合与干扰项
评测环境的设置也要有针对性。单纯在同一个桌面布局上跑成功率没有任何说服力。我建议至少准备三类场景:第一类是“常见组合”,用来确认模型没有退步;第二类是“组合泛化”,把训练中出现过的物体、位置、动作进行新搭配,比如训练时见过红杯子和蓝盘子,测试时换成蓝杯子和红盘子;第三类是“语义干扰”,在桌面上放一个和目标物体很像的干扰物,指令要求拿左边的杯子,但右边有个颜色相似的杯子,看模型会不会被误导。
语义干扰项是评估“语义理解深度”很有效的试金石。模型如果只是靠视觉特征匹配动作,遇到相似干扰物时成功率会明显下降;而如果内部真的编码了“左边”和“右边”这种关系语义,就更容易抵抗干扰。这类评测任务不需要很多,但一定得保证在训练数据里没有出现过完全相同的配置,否则测不出泛化能力。
4.3 一个可复现的评估小流程
我目前跑的评估流程很简单,整理出来供参考。先准备一组人工编写的测试指令,比如100条,覆盖10种任务、3种桌面布局和3种干扰条件。每一条指令都让LLM生成标准语义分解并人工校对,作为参考标签。然后在仿真环境里让VLA模型执行,记录三类数据:动作成功率、子目标完成率、语义分解准确率。为了减少随机性,每条指令跑5次,取平均。
下面是结果记录表的一个示意,注意数字不是真实成绩,只是展示格式:
| 指标 | 无语义监督的VLA | 加语义监督后的VLA |
|---|---|---|
| 动作成功率 | 71.2% | 78.6% |
| 子目标完成率 | 58.4% | 72.3% |
| 语义分解准确率 | 41.7% | 69.5% |
从表里很容易看出,动作成功率提升也许只有7个百分点,但语义分解准确率提升了将近28个百分点。这说明语义监督的主要收益不在动作层面,而在“规划逻辑”层面。对任务规划项目来说,这才是最值得关注的提升。
5. 端侧落地:压缩VLA模型时,语义能力最先丢
5.1 为什么要在端侧部署VLA
VLA模型如果只在云端跑,机械臂每做一个动作都要把图像传上去再等推理结果,延迟高、数据流量大,很多工业场景根本接受不了。所以现在的趋势是把VLA模型部署到机器人本体或边缘计算设备上,也就是“on-device”方向。这就引出了模型压缩的工程问题:VLA本身就是多模态大模型,参数量动辄上亿,放在服务器上可能无所谓,放到一个带GPU的小盒子甚至纯CPU设备上就很紧张。
前阵子有篇综述专门梳理了端侧大语言模型的压缩和系统设计,核心方向无非是量化、剪枝、知识蒸馏、低秩分解这几类。VLA模型也可以借用这些方法,但有一点和纯语言模型不一样:它同时处理图像和连续动作,对压缩更敏感。你不能只关注压缩后“还能不能聊天”,而要关注压缩后“还能不能看懂场景”和“还能不能做出准确动作”。
5.2 语义指导对压缩的裨益
有意思的是,用LLM语义监督训练出来的VLA模型,在压缩时反而有一些额外优势。因为语义分支学习的是抽象的概念表征,它不需要把图像中的每一个像素细节都记住。换句话说,模型内部已经有了一部分“压缩过的理解”,不是纯粹靠原始特征硬啃。这跟一个人读书一样,理解内容之后再转述,比背诵原文省力得多。
实际操作中,剪枝时可以按语义头输出的敏感度来选择保留哪些注意力头。具体做法是:对每个注意力头做重要性评估,让该头单独失活,观察语义分解准确率下降多少;下降越明显的头越重要。这样剪掉对语义影响小的参数,保留语义必需的结构。与按动作损失剪枝相比,按语义损失剪枝剪出来的模型在复杂任务上成功率更高。因为动作损失偏向局部精度,语义损失偏向全局规划,全局结构对长程任务更关键。
5.3 压缩后的语义保持测试
压缩后最常见的“成绩单”是:模拟环境中动作成功率只跌了1%,看起来很漂亮。但一换到新任务,模型直接不会规划了。多数情况下是因为量化把语义表征的分布打坏了。语义token的embedding往往落在比较窄的数值范围内,对量化误差特别敏感。用int8量化时,动作输出和视觉特征都还好,语义分支却可能发生严重波动。
我建议在压缩流程里加一道“语义一致性回归测试”:拿一批带有标准语义标签的轨迹,压缩前和压缩后各跑一次,对比语义分解准确率。如果语义准确率掉得明显,哪怕动作成功率没有变化,这个模型也不建议直接上线。还有一个实操技巧:把视觉编码器压到int8,语义解码器保留int16,这样能在显存占用和语义稳定性之间取得平衡。量化校准集也要多放一些复杂长尾指令,不要只放常规抓取场景,否则校准出来的范围覆盖不了语义分支的实际分布。
6. 一点扩展思考:从“被监督”到“会提问”
6.1 双向语义引导:VLA可以反馈给LLM
目前的流程是LLM单向给VLA打标签,但在不少场景里,VLA执行过程中会遇到LLM没预料到的障碍。比如语义分解里写着“走到桌子另一侧”,但实际路径上被一个高脚杯挡住了。只靠离线标签,模型不知道该怎么处理动态障碍。一个自然的扩展是:在推理阶段让VLA的语义头把当前场景的状态反馈给LLM,LLM重新生成下一步语义,再把新语义作为条件让VLA继续执行动作。这样做相当于把静态的“老师-学生”关系变成了动态的“教练-队员”关系。
不过这种双向推理代价不低,LLM要在机器上做多次推理,延迟会显著增加。折中方案是只在检测到失败或低置信度时才触发LLM重规划,其余时间仍让VLA自己跑。实现时可以给VLA加一个简单的状态置信度估计头,输出值低于阈值就发信号给LLM做纠错。这种“由学生报告问题、由老师调整方案”的思路,很可能是后续任务规划系统的一个主流方向。
6.2 更好的监督信号:用世界模型做闭环验证
LLM生成的语义标签即使离线过滤过,也免不了有错误。更可靠的方式是引入世界模型,把VLA预测的动作序列先丢进一个可微分的物理仿真器里,看看是否真的能完成语义目标。如果仿真结果表明某个步骤无法达成,就可以自动拒掉这条语义标签。听起来复杂,但现在很多项目已经在尝试把轻量级可微分物理引擎接入训练管线,让语义标签不再只依赖自然语言,而是和物理结果挂钩。
这样做还有一个额外好处:VLA可以在训练时接触到大量“反事实”标签,比如“如果把杯子放到桌沿,就会掉落”,这种语义知识靠人工标注很难穷尽,但世界模型可以自动生成。未来如果这套流程成熟,LLM可能只需要提供一个初始的语义猜测,剩下的大量验证和纠错全部交给闭环仿真完成。
6.3 其他领域的扩展
这套“用大模型生成语义监督信号训练专用模型”的范式,其实不限于机器人。类似的问题也出现在界面操作、自动驾驶决策、智能助手等方向。任何需要“高层规划+低层执行”的场景,都可以考虑是否需要一个可验证的中间语义层。我见过有人把同样的结构用在文档处理上:用LLM生成拆解步骤,再训练一个小模型按步骤执行,效果也相当稳定。核心还是那句话:让模型先学会理解为什么这么做,再学会怎么做,比直接把输入输出对接要扎实得多。
我自己的体会是,语义引导不是把LLM当成一个无所不知的遥控器,而是把它当成一个能持续产出结构化知识的“训练伙伴”。多模态模型越做越复杂,真正难的不只是网络结构,而是怎么让模型在一个又一个具体任务里保持稳定的语义能力。先把标签体系做好、把评测指标设计全,再谈模型和压缩,这条路走起来会顺很多。