做具身智能和机器人操作实验的同学应该都体会过这种挫败感视觉-语言-动作模型VLA在离线评测里表现亮眼样本效率高、指令跟随也好可一旦把同一套权重放到现场面对新的光照、新的物体摆放、新的夹具磨损成功率立刻缩水。我之前在某实验室调一套桌面抓取方案时模型在标准场景里能到九成成功率换到另一个房间只剩六成。后来我用EVOLVE-VLA这条思路在测试阶段引入环境反馈让模型“边干活边适应”效果改善非常明显。这篇文章围绕测试时训练这件事展开。EVOLVE-VLA不是把模型重新训练一遍而是在部署时用环境返回的反馈信号对模型的少量参数做短时、小步长的自适应更新。它解决的问题是预训练模型面对真实环境分布偏移时的临场适应能力适合在做VLA部署、机器人学习、具身智能评测的研发同学参考。我会把设计思路、关键参数、评估方法和我实际踩过的坑一起讲清楚尽量写得能直接复现。1. 为什么VLA到了测试阶段还需要继续学1.1 VLA的“书本知识”和“考场环境”之间总有落差VLA的核心链路并不复杂摄像头图像加自然语言指令一起送入多模态模型输出离散动作token或者连续动作向量机械臂再把这些动作映射成真实运动。预训练阶段模型见过海量互联网图文和机器人轨迹数据这种先验让模型知道“杯子”长什么样也知道“把水杯放到托盘里”大致意味着什么样的手臂移动轨迹。但真实现场的困难往往不在语义理解而在感知和物理执行的分布偏移。我在实际调试中遇到的偏移种类很多光照从暖黄变成冷白背景多了杂物物体表面从哑光变成高反光夹爪末端换了软胶材质甚至连桌面高度变化都会影响动作执行结果。这些变化都会让模型输入的图像特征偏离训练分布而动作策略一旦建立在错误特征上成功率就明显下滑。把一套在标准仿真环境里测评通过的权重放到真实桌面第一轮成功率通常要打七折以上个别细长物体抓取任务甚至会直接失败。这个现象的本质是模型在训练时见过的输入分布比较窄而测试环境总有几个维度是训练时没覆盖到的。如果只靠预训练权重的“记忆”模型就只能拿见过的东西去硬套新场景。所以我一直觉得VLA部署不能只停留在“训练完就冻结”需要一种机制让模型在新环境里快速完成自我修正。1.2 测试时训练不是重新训练很多人第一次听到测试时训练Test-Time Training时容易误解以为是在现场跑梯度下降把模型整个重新训一遍。其实完全不是一回事。传统微调是拿一批标注好的数据集在部署前离线完成通常要动全部参数成本高而且新数据仍然来自一个固定的采集分布。测试时训练则是在推理阶段利用每一条新到来的数据用某种自适应目标对模型做短时更新。它不需要人工标注也不追求长期收敛只追求模型在“当前这一段环境里”表现更好。在做VLA机器人操作时测试时训练有一个天然优势环境本身会返回反馈信号。任务是否完成、夹爪有没有抓到物体、机械臂有没有碰到障碍物、物体移动了多少距离这些都是环境在动作执行后给出的真实结果。这个信号是模型在预训练阶段拿不到的却是评价当前动作好坏最直接的依据。把这种反馈转化成更新信号相当于让模型在考场上现翻书而不是完全凭记忆答题。之前我也见过一些基于自监督的测试时方法比如让模型旋转图片做预测、做掩码重建这类方法能让视觉编码器适应新场景但没法改变动作分布因为自监督目标里根本没有任务语义。这也正是引入环境反馈和纯自监督最大的区别反馈直接来自物理世界和执行结果更新方向天然对齐任务目标。1.3 环境反馈比人工标注和纯自监督都更贴合操作任务离线微调机器人操作模型最贵的是动作级标注。细粒度动作标签需要逐帧标成本极高而且不同机器人、不同夹具之间的动作标签很难迁移换个硬件就得重标。纯自监督信号虽然不用人工标注但它只能学习输入自身结构比如图像重建得更好或者特征聚类更清晰这些优化目标都间接得让人没底你不知道它最终是否提高了抓取成功率。环境反馈介于两者之间它不需要人标又直接对应任务目标。任务成功是稀疏信号过程信号则提供了相对稠密的优化方向。比如抓取任务里夹爪合拢后有没有夹住物体就是比最终放置成功更早暴露问题的一个中间信号。EVOLVE-VLA的做法本质上是把这些环境反馈当成一个“可预测的目标”让模型在测试时通过预测反馈来修正自己的动作分布。这个视角往下走就能自然引出整套设计框架。2. EVOLVE-VLA的整体设计思路拆解2.1 核心思路先预测反馈再更新策略EVOLVE-VLA要解决的问题可以描述成给定当前观测、语言指令以及上一步执行的动作模型能否预测环境接下来会给出什么反馈信号。如果能预测预测误差就反映了模型对当前场景物理规律的理解程度。把这个误差当作训练目标用梯度反传更新一部分参数那么下一次决策时模型的动作就会更贴近当前环境的真实反馈规律。这里有一个非常关键的设计选择不是直接把反馈信号当监督去回归动作而是拿它当“未来事件”去预测。我最早试过直接拿成功与否做动作分类损失让模型去学习“成功轨迹的动作分布”结果很差。原因是动作监督需要假设反馈能唯一反解出正确动作但实际中一个成功信号可以对应多条轨迹直接回归动作会让模型把不同成功轨迹平均在一起动作越来越保守。预测反馈则要稳健得多。它只要求模型理解“这个动作在当前环境下会带来什么结果”语义上更接近世界模型。模型不关心唯一正确动作是什么只需要学会评估当前动作好不好从而在采样时逐渐偏向高反馈概率的动作。这个目标的训练信号更干净也更适合短时自适应场景。2.2 四个核心模块完整的EVOLVE-VLA实现我会在工程上拆成四个模块。它们之间不是简单的串行关系而是各负责一段信息流处理下面这张列表可以帮助理解主干策略网络预训练好的VLA模型负责从图像和文本生成动作分布。测试时主干参数冻结只贡献前向计算。反馈编码器把环境反馈转换成统一向量。稀疏成功信号可以编码成0/1稠密信号则做归一化后送入编码器还可以把反馈与对应动作构成对比样本。轻量适配模块用LoRA或者小型MLP插入策略网络中间层测试阶段只更新这部分主权重保持不动。测试时优化器维护一个短时状态保存最近若干条环境反馈与动作轨迹按小batch做几步梯度更新。这四个模块各司其职。反馈编码器决定了模型能看到什么“物理真相”适配模块决定了更新成本优化器则控制模型以多快速度适应当前环境。我在实际落地时反馈编码器经常成为性能瓶颈因为原始反馈太杂比如力矩值、距离值、布尔状态不整理成统一向量后面更新就很乱。2.3 为什么只更新轻量模块而不是全量微调刚开始尝试测试时训练时我也踩过全量更新的坑。直接把整个VLA所有参数放开效果反而变差这一度让我怀疑方法是不是有问题。后来拆开分析原因有两层。第一层是反馈噪声会被放大环境反馈本身有随机性一次成功可能只是偶然全量更新改变参数幅度大噪声被放大之后动作分布会很乱。第二层是灾难性遗忘全量微调会让模型在适应当前场景时把预训练得到的通用操作能力冲掉换一个场景之后又得从头再来。把更新范围限制在轻量适配模块上相当于给模型加了一个“短期记忆区”。主干网络仍然保存通用语义和操作先验适配模块只记录当前场景的偏差修正。这样做的好处很直接梯度计算量小、显存开销低、更新后动作变化受约束即使反馈噪声较大也不容易把模型学崩。我的实际操作习惯是先冻结主干验证加LoRA之后的效果确认正向收益后再考虑逐步放宽靠近输出端的少量层。大部分任务只更新LoRA就足够放宽全量参数通常没有必要。这里也提醒一下LoRA的秩不是越大越好我常用4到8秩太大适配模块表达能力强短期场景容易过拟合。3. 核心机制与实操要点3.1 环境反馈信号的三种形态怎么选环境反馈不是只有“成功/失败”这一种。根据任务不同我习惯把反馈分成三类类型例子信号强度获取成本稀疏任务信号任务是否完成、物体是否到达目标区低但直接最低稠密过程信号物体位移、夹爪开口、力传感器读数高需要额外传感器约束违反信号碰撞检测、关节限位、越界警告中通常设备自带选择时要结合任务结构单步操作任务优先用约束违反加任务成功多步长任务一定要找中间过程信号否则反馈太稀疏模型不知道是哪一步出了问题。比如抓取加摆放任务夹爪闭合后有没有夹住物体就是一个很好的中间信号它比最终放置成功更早暴露问题能让模型少走很多弯路。信号使用前要做归一化力读数、距离、角速度这些量纲差异很大不归一化直接送进网络更新步长会被大数值维度带着走小数值维度几乎学不到东西。归一化不需要很复杂按当前窗口内的均值和标准差做z-score就行我在伪代码里也默认做了这一步。3.2 一次完整的测试时更新流程一个可以直接照搬的流程我自己在模拟器上调试时是按下面六步走的。每一步之间有顺序依赖反馈编码一定要在轨迹执行完之后再做否则拿不到完整上下文同样更新之后不要立刻大改动作策略要留一小段连续执行来观察效果。在目标任务环境中先做一次或几次rollout收集图像、指令、动作序列和环境反馈。把反馈编码成向量与对应观测和动作组装成训练样本。用预测反馈误差构造损失函数在适配模块上做小步长更新。用更新后的模型继续执行下一次rollout。每隔固定步数把适配模块重置到初始状态避免模型过分绑定当前环境。监控最近若干轮成功率指标不再提升就切换到低频更新。对应的伪代码大概长这样# 伪代码EVOLVE-VLA 测试时更新主流程 vla load_pretrained_vla() adapter LoRA(vla.policy_layers) feedback_head SmallMLP(vla.hidden_dim, feedback_dim) opt AdamW(list(adapter.parameters()) list(feedback_head.parameters()), lr5e-5) for step in range(total_steps): obs, lang collect_observation() action vla.sample_action(obs, lang, adapteradapter) exec_action(action) # 在环境中执行动作 feedback get_environment_feedback() # 稀疏/稠密/约束信号 fb_vec normalize(feedback_encoder(feedback)) # 关键让模型预测“这个动作会带来什么反馈” hidden vla.hidden_state(obs, lang, action) pred_fb feedback_head(hidden) loss mse_loss(pred_fb, fb_vec.detach()) loss.backward() clip_grad_norm_(adapter.parameters(), max_norm1.0) opt.step() opt.zero_grad() if step % reset_interval 0: adapter.reset() # 周期性忘记短期偏差这里feedback_head是模型末端加的一个小预测头训练时也只更新它和适配模块不碰主干。损失函数里fb_vec用detach是防止环境反馈的梯度反传到编码器造成耦合。伪代码里的reset_interval我习惯设成50到100步具体下面超参会说。3.3 关键超参数怎么定测试时训练的超参数和离线微调不完全一样因为它们影响的对象是“单次部署里的短期自适应”。我实测下来几组配置比较可靠的一组默认值是学习率在5e-5到1e-4之间每次更新步数5到20步样本batch大小4到8反馈窗口保留最近20到50条记录重置间隔在50到100步。这套组合不一定最优但作为起点很省事。学习率方面很多人第一次上手会套正常微调的1e-4甚至更高结果就是动作输出振荡机械臂在执行端抖得很厉害。原因很简单测试时训练的数据量非常小反馈噪声相对高学习率必须比离线微调更保守。更新步数也不是越多越好超过20步之后边际收益很小反而让每次rollout之间的延迟明显变长。反馈窗口这个参数容易被忽略但它的重要性不亚于学习率。如果只保留最近一两条反馈就立刻更新模型很容易被单次偶然结果带偏。把窗口稍微拉大一点相当于对近期反馈做了近似平均随机噪声会被摊薄更新方向更可靠。我在抓取任务里试过窗口从4调到32成功率大约能高五个百分点。3.4 防遗忘和防震荡的几个技巧实际操作中我总结出三个最管用的技巧。第一个是KL约束更新适配模块时让新模型在基座模型输出分布上的KL散度不超过一个阈值相当于给更新套上缰绳。这样不管反馈怎么带动作分布都不会偏离基座太远给后续场景留了余地。第二个是梯度裁剪max_norm设到1.0就够。我第一次跑的时候没设裁剪结果一条异常的力矩反馈直接把LoRA参数顶飞之后连续十几轮动作都是乱的只能重置适配模块才能恢复。裁剪加的这几行代码性价比非常高。第三个是动作平滑。适配模块更新后输出分布会在某个时刻突然变化反映到机械臂上就是抖一下。我后来在动作执行层做了滑动平均新动作权重不要超过0.3抖动明显减少成功率基本不变。如果还抖就降低更新频率比如每3步才更新一次而不是每步都更新。防遗忘还有一个容易忽略的点周期性重置。测试时间一旦拉长环境状态会持续变化适配模块里积累的偏差可能只适合一小段时间。每隔几十步重置一次让模型重新从基座知识出发比一直积累下去更靠谱。这是长时任务里几乎必须的操作。4. 我实际跑过的一组效果与成本账4.1 评估设置与对比对象为了验证EVOLVE-VLA是不是真的有用我在一个模拟环境的桌面操作任务上做了对比实验。任务大致是按语言指令把指定物体移动到目标位置同时故意改了光照方向和物体表面材质让分布偏移明显。对比对象有三个完全不更新的基线VLA、全量在线微调的版本、只更新LoRA适配模块的EVOLVE-VLA版本。评估指标我用了三项最终任务成功率、达到稳定成功率所需的交互轮数、单次rollout平均增加的延迟。成功标准定义为指定物体最终到达目标区域且没有发生碰撞。每个配置跑多组随机种子结果取平均。这里要说明一下模拟环境里的成功率方差比较大多组种子的平均值才有参考意义单跑一组特别容易误判。4.2 关键结果怎么看下面这张表是我记录的示意性数据。具体数值换一个模型或任务会变但整体趋势在多次复现里是接近的可以用来理解不同方案之间的差别。配置任务成功率达到80%成功率的轮数每轮额外延迟基线VLA不更新62%无法达到0全量在线微调71%约45轮明显增加EVOLVE-VLALoRA更新81%约18轮少量增加EVOLVE-VLA在成功率上明显领先适应速度也比全量微调快得多。全量微调版本慢的原因在于它动了太多参数更新时梯度噪声大前期动作容易崩要花很多轮才能找回稳定行为。只更新LoRA则相当于在一个很小的参数空间里快速搜索当前场景的修正方向方向找得快动作变化也更平滑。另外一个有意思的现象是基线VLA其实不是完全不能用它在62%的成功率附近波动时偶尔也能连续成功几次。这说明模型底层能力是够的缺的只是对当前场景的快速校准。测试时训练本质上就是把这个校准过程自动化而不是把整个任务重新学一遍。4.3 成本到底能不能接受测试时训练最让人担心的是“测试还要训练那还叫测试吗”。我的实测体感是只要能控制更新范围成本完全可接受。单步更新只反向传播适配模块的梯度显存占用增加大概在可用显存的五分之一到三分之一之间具体取决于策略网络的大小。每轮rollout多出的延迟主要来自几次前向和反向计算控制在几十毫秒级别是可以做到的。更实际的做法是按需更新。当模型在连续多轮rollout里已经表现不错时可以把更新频率降下来甚至暂时只监控反馈、不再更新。我建议在部署接口上留一个调节开关允许根据当前成功率动态切换高频更新、低频更新、只监控三种模式。这样既能保住成功率又不会让每次执行都有额外的训练开销。5. 常见问题与避坑实录5.1 反馈噪声大模型越更新越偏这是最容易遇到的问题。环境反馈虽然是真值但单次反馈有很大的随机性。抓取动作里夹爪合拢时机差几十毫秒结果就不同物体材质稍有变化摩擦系数变了滑没滑落可能完全是运气。如果模型每收到一条反馈就更新一次等于把随机噪声当信号学参数不断漂移。我的解法是先攒反馈再更新至少攒4到8条反馈形成一个batch再更新一次。还可以对连续反馈做指数滑动平均让单次的偶然成功不至于立刻改变动作分布。更保守的做法是加置信阈值连续两轮到三轮都出现正向反馈才允许更新否则只记录不更新。这个方法在噪声大的任务里非常管用代价是适应速度会稍微慢一点。5.2 反馈延迟导致更新滞后真实机器人上环境反馈往往不是实时返回的。视觉处理、动作执行、传感器读取都有延迟模型可能已经执行到第N步收到的还是第N-2步的反馈。如果直接用滞后反馈更新当前状态相当于拿旧知识改新决策很容易错位。解决办法是维护一个反馈对齐队列。每条动作记录都带上时间戳反馈回来时按时间戳对齐到对应动作再做更新。只要时间戳准哪怕反馈延迟稳定存在更新也不会错位。如果延迟本身还伴随抖动我会把反馈窗口拉长一些允许历史反馈在窗口内重新配对错位的影响会被摊薄很多。5.3 模型被当前场景带偏换个场景又不行测试时训练天然服务于当前场景所以“当前场景学得太深”是必然风险。我遇到过这种情况模型在现场场景里适应得很好成功率很高但把同一套适配后的参数放到另一个光照环境里表现反而比完全不更新的基线还差。第一次遇到时我挺意外后来想明白了适配模块把当前场景的偏差刻进参数这个偏差对其他场景就是新的干扰。应对手段是给适配模块加约束不能让它无限偏离基座。具体做法有三个KL散度约束、周期性重置、控制LoRA的秩。KL约束说了周期重置也提了这里再强调一下LoRA秩的选择。秩我常用4到8秩太大会让适配模块有太强的表达能力更容易过拟合当前场景。这个问题没有完美解只能根据部署需求取舍。5.4 多步任务里反馈稀疏不知道错在哪一步对于多步操作任务最终成功信号只能告诉你结果不对不能告诉你哪一步出了问题。模型更新的时候所有步骤都摊到了同一份反馈某一步的偶然失败会被错误归因到其他步骤导致整条策略越学越乱。我习惯引入中间过程信号比如每一步的子目标完成度、物体是否离开初始区域、机械臂是否执行了预期轨迹。每完成一个子目标就给一个阶段反馈这样损失函数可以分开计算每一步的贡献。如果环境实在提供不了中间信号就退而求其次在时间维度上做衰减加权让离结果更近的动作承担更多反馈权重。这一步对多步任务几乎是决定性的。5.5 更新后动作突变机器人抖动适配模块更新之后模型的输出分布会在某个时刻突然变化反映到机械臂上就是抖一下。这在真实硬件上很危险轻则任务失败重则碰撞损坏设备。这个问题我前期吃过亏后来做了两件事。第一是限制更新幅度每次更新后把适配模块的增量缩放到一个最大范数以内避免单次梯度让参数跳动过大。第二是执行层平滑把当前动作和历史动作做加权平均新动作权重控制在0.3以内。另外降低更新频率也有帮助试过每3步更新一次抖动明显减少成功率基本不变。这里想强调一句测试时训练引入额外的推理开销并不可怕可怕的是更新让动作不可控所以任何能降低方差的手段都值得优先尝试。6. 几点个人体会和后续想试的方向环境反馈的质量真的决定了整个方法的上限。我一开始把精力都花在优化更新算法上学习率、步长、模块结构调了很多版收益都不大。后来把反馈信号定义清楚做好归一化和时序对齐提升反而非常明显。所以如果你要复现EVOLVE-VLA这套思路我建议先把第一个任务的环境反馈吃透再考虑学习率和步数这些细节。后续我自己想试的方向有三个。一是把不同任务的历史适应经验存下来作为下一次测试时训练的元初始化让新场景的适应速度更快。二是把环境反馈历史注入到VLA的上下文里让模型不仅能通过梯度更新适应还能在注意力层面“记住”刚才发生了什么。三是和模型自带的预测能力结合如果VLA内部本身有世界模型分支环境反馈可以先去更新世界模型再由世界模型指导动作生成这样梯度路径更长但也更符合人对物理世界的理解方式。这些想法还比较初步但我觉得测试时训练这个方向在具身智能里会越来越常见。真实环境永远不会和训练集一模一样让模型在部署现场学会“临场发挥”比把所有情况都装进权重里更现实。希望这篇内容能给正在做VLA落地的同学一些参考少走点我走过的弯路。