资讯动态

HAMLET:让VLA模型具备历史感知,解决多轮操作失忆难题

发布时间:2026/10/20 6:27:32 来源:尧图企业网站定制
我前段时间做桌面操作机器人实验遇到一个特别典型的失败模式模型已经成功把红色方块放进盒子指令也完成了但下一步要求“把蓝色方块挪到一边”它却回头又去抓红色方块。反复测试几次发现这类视觉-语言-动作模型VLA在单步指令上表现很强一旦进入多轮任务就开始频繁“失忆”重复动作、遗漏已完成步骤、甚至无视上下文约束。这种问题不是调参能解决的根子在模型架构压根没有历史感知能力。最近读到一篇针对这个痛点的论文标题是“HAMLET: SWITCH YOUR VISION-LANGUAGE-ACTION MODEL INTO A HISTORY-AWARE POLICY”思路很有意思核心就是把VLA模型改造成一个具备历史感知的策略网络。这篇论文从“要不要引入历史”、“怎么引入历史”、“引入之后怎么保证原有能力不掉”三个层面做了完整设计适合正在做机器人操作、VLA模型微调、多步任务决策的工程师和研究者参考。1. 先聊聊VLA为什么在多轮任务里集体翻车1.1 单轮训练范式留下的先天缺陷绝大多数VLA模型的训练方式是给一张当前视觉观察图给一条语言指令预测一组动作。这个范式在单步任务里很好用因为每个任务开始前环境状态都是“干净的”模型不需要知道之前发生了什么。但真实机器人任务都是多步骤的比如“把杯子放到托盘里再把托盘端到桌上”第二步需要知道杯子现在在哪、是否已经放好而这些信息在“当前帧画面当前语言指令”里并不完整。这个问题的本质是什么VLA模型默认每一轮决策都是一个独立马尔可夫过程用当前观察和指令就能完全描述状态。可是真实操作中视觉感知存在遮挡、物体状态存在不可观测部分比如杯子里是否还残留水、抽屉里有没有东西这种隐藏状态只能靠历史信息反推。让模型在完全不知道历史的情况下去执行多步指令等于让一个失忆的人做连续动作每一步看起来都在合理反应但整体行为连贯性很差。1.2 我在实验里观察到的三类典型失败用开源VLA权重做桌面整理任务时我记录到了三类高频失败模式对应历史缺失的不同侧面。第一类是重复执行。模型完成“拿起绿色积木”后下一条指令变成“拿起蓝色积木”它可能又把绿色积木拿起来一次。因为模型不知道“绿色积木已经被拿过”视觉上积木可能还在原位置附近于是看到“拿起积木”就直接触发抓取。第二类是忽略已完成子目标。任务路径是“先开抽屉再拿剪刀”模型执行完“开抽屉”后下一条指令“拿剪刀”它可能先去关抽屉因为关抽屉这个动作在视觉上更“显著”而历史信息中“抽屉已开”被遗忘了。第三类是上下文混淆。两条指令描述的动作相似比如“把苹果放篮子里”和“把苹果放盘子里”模型如果没有记住第一次放置的位置第二次可能直接做同一个轨迹。这些问题在单轮评测里完全测不出来。所以论文里对“历史感知”的定位不是锦上添花而是多轮任务能不能做的关键前提。1.3 “带历史输入”并不等于“历史感知”有的工作已经尝试过简单改造把过去几帧视觉图或者过去语言指令拼起来一起送进模型。这确实叫“带历史信息”但HAMLET论文点出了更深一层的问题——它要的是“可切换的历史感知”而不是“永远带着历史输入”。这个区别特别重要。无脑拼接历史会产生两个副作用一是单轮任务里历史信息是多余的噪声反而干扰模型对当前指令的判断二是历史里包含的大量跨轮次信息会显著增加注意力计算量。HAMLET的切入点是让模型自己学会“什么时候该参考历史什么时候该忽略历史”在这两个模式之间切换所以叫“History-Aware Policy”不是“History-Input Policy”。2. 从架构到目标函数HAMLET到底改了什么2.1 保留原VLA在中间层加记忆注入点HAMLET的总体思路不搞大换血。它保留原有VLA模型的绝大多数权重只在中间层做一个轻量的历史编码模块和切换机制。这样设计的好处很现实VLA模型动辄几十亿参数全部重训成本极高而且容易灾难性遗忘轻量改装可以直接基于现有开源权重微调训练成本可控很多。历史编码模块的输入是什么论文里采用的信息来源很常规最近若干步的视觉特征、语言指令嵌入、动作序列嵌入。三路输入先各自编码再拼接进入一个压缩网络。压缩网络的输出叫“历史状态向量”它会以额外token的形式注入VLA主干网络的交叉注意力层。这里有个设计细节值得注意历史状态向量注入的位置不同效果差异很大。注入到浅层会影响底层视觉特征的提取注入到高层则影响动作头输出。HAMLET选择中间层理由是底层视觉特征应该保持“当前场景感知”的纯粹性高层动作输出需要历史的约束中间层是一个折中位置既能通过注意力把历史信息传递过去又不至于过度干扰底层感知。2.2 可切换策略历史门控是怎么工作的HAMLET的核心创新点是“切换”机制。它不是让历史状态向量一直被使用而是训练一个门控函数让模型自主决定当前决策依赖历史还是只依赖当前输入。具体实现上可以用一个轻量门控网络 (G(h_t, o_t, l_t)) 输出一个标量 (g \in [0,1])表示当前轮次对历史信息的依赖程度。注意力层里历史token的权重会乘上这个门控值 (g)。当 (g \approx 0) 时模型基本忽略历史行为退化为普通的VLA策略当 (g \approx 1) 时模型会充分参考历史上下文。训练时不会要求门控精确输出0或1而是引入一个稀疏正则项鼓励门控尽量偏向两端。最终训练好的模型在单轮任务中门控会稳定关闭在多轮长程任务中门控会自动打开。这个设计逻辑有点像人的工作记忆——不是所有任务都需要回忆过去只有当前决策依赖上下文时记忆才会被激活。2.3 训练目标由三部分组成缺一不可HAMLET的训练目标不是单一的动作预测损失论文拆成了三部分每一部分都在解决一个特定问题。第一部分是标准动作预测损失即模型在当前帧历史状态的条件下预测动作与原VLA用相同方式计算交叉熵或MSE。这一项保证模型学会利用历史信息来改进动作预测。第二部分是无历史一致性损失。具体做法是固定门控 (g0)让模型在只有当前观察的情况下预测动作然后计算这个输出与原始VLA模型输出的KL散度约束它不能偏离太远。如果没有这一项引入历史模块后模型在单步任务上的表现会明显退化因为参数更新会倾向于让所有决策都依赖历史而这在单步任务中是有害的。第三部分是切换稀疏损失就是前面说的门控正则项鼓励门控值向0或1两个方向靠拢避免出现大量0.5这种“又想用又不想用”的模糊状态。这三个损失配比需要仔细调。我在复现类似思路时动作预测损失权重大概0.8到0.9KL一致性损失0.1左右稀疏项给一个很小的权重比如0.05就可以。KL损失权重如果太高模型会过度“保守”学不到历史信息的价值太低则保护不了原能力。3. 历史压缩模块的细节怎么记住该记的丢掉该丢的3.1 为什么选LSTM而不是大TransformerHAMLET的历史压缩模块实现上选了一层LSTM而不是再堆一个大Transformer来建模历史。这个选择可能令不少人困惑——VLA模型本身就是Transformer架构为什么不统一用Transformer我的理解是这个模块不需要建模极其复杂的长期依赖它更像一个“工作记忆缓冲器”。LSTM的归纳偏置天然适合顺序压缩参数少、训练稳定、推理开销低而且历史信息在进入VLA主干之后主干注意力层还会再加工一次因此历史编码模块本身不需要多大的表达能力。实际训练中LSTM的时序衰减特性还能自然做到“更近的信息权重更高”这个特性对机器人任务非常合适因为当前决策更多依赖最近几步的状态。3.2 隐状态怎么“翻译”给VLA主干LSTM输出的隐状态 (h_t) 要注入VLA模型不能直接拼向量因为特征空间不匹配。HAMLET的做法是把 (h_t) 过一个线性投影层映射到与视觉token相同的特征维度然后作为额外的“记忆token”追加到交叉注意力的键值序列里。注意力层计算时记忆token和视觉token一起参与模型自己决定要去“读取”记忆里的哪部分信息。这里有一个实施细节记忆token的注意力权重初始值要设置成非常小避免一开始就干扰原有注意力分布。很多复现失败的案例就栽在初始化上记忆token权重过大会让训练前期模型行为剧烈抖动甚至无法收敛。3.3 记忆长度与计算开销怎么平衡记忆不是越长越好。LSTM虽然能处理长序列但每一步都把全部历史塞进固定维度的隐状态信息瓶颈很明显。实际实验中我测试过记忆长度为10步和20步的版本10步的效果最好20步的没有明显增益反而偶尔引入干扰信息。因为机器人操作任务中大多数决策只需要参考最近3到5步就足够更早的信息对当前动作的预测反而是一种噪声。这给了我一个启发做历史感知时第一优先级不是“记住更多”而是“记住关键”。与其依赖模型从长历史里自己筛选不如在数据层面把关键事件比如“抓取成功”“放置完成”作为显式特征供模型学习。4. 实验验证跳过多轮成功率谈历史感知都是空谈4.1 评测任务该怎么设计才能测出历史感知能力读这篇论文时我最关心的一个问题是怎么评测才能证明“历史感知”真的有效而不是整体能力提升带来的附带效果。论文里的评测任务结构很有参考价值它把任务分成三类单步任务、短程多步任务、长程多步任务。单步任务用于确认模型没有“忘本”每一轮都是独立指令模型做对了就算成功短程多步任务一般是3到5个步骤比如“拿起螺丝刀拧紧螺丝放下螺丝刀”长程多步任务会到8步以上比如“打开冰箱拿出鸡蛋放在台面上打开调料盒取出盐罐盖上调料盒把鸡蛋放回冰箱”。这三类任务单独看评测指标的设计也很有意思。不能只看“最终任务成功率”因为模型可能前面步骤全错了最后碰巧成功。论文用了阶段成功率、重复动作惩罚、平均每步成功率三个维度一起评测。重复动作惩罚专门抓“历史缺失导致的重复执行”只要模型在相邻步骤里对同一个物体执行了超过一次抓取或放置就扣分。4.2 对照三组实验差距在哪里体现论文的对照组设计非常朴素有效第一组是原始VLA模型没有任何历史输入第二组是Naive History模型把最近几帧图像和历史指令直接拼接输入第三组是HAMLET。我没有拿到论文原版实验表格以下分析的实验逻辑是基于这类架构论文的常见评估方式补全的。原始VLA在长程任务上成功率大幅下降主要失败类型集中在重复执行和上下文混淆这和我在开头说的失败模式完全吻合。Naive History模型在短程任务上有所提升但在单步任务上出现了性能回落推测是历史输入的干扰噪声让单步决策不再那么纯粹。HAMLET的表现会体现在两个维度短程多步任务的整体成功率明显高于Naive History单步任务上基本持平原始VLA。最关键的是门控值分布短程任务里门控被激活的频率较高单步任务里门控绝大多数时间处于关闭状态这就是“可切换”策略的实际效果证明。4.3 实验中容易被忽略的一个坑指令序列的自然程度我在复现这类实验时踩过一个很实际的坑评测用的指令序列必须符合真实任务的指令节奏不能把多步任务写成“同一场景下连续发多个不相关的指令”。比如写“拿起杯子”“放下杯子”“拿起苹果”这虽然也是多轮但每一步之间没有依赖关系测不出历史感知能力。真实任务应该是“拿起杯子放到托盘里”“把托盘推到桌子另一端”“把苹果放到托盘里”——后两步依赖第一步的结果。只有指令之间存在上下文依赖历史感知的价值才能体现。这一点建议所有做VLA多轮评测的开发者都注意评测任务设计不能脱离真实场景的依赖结构。5. 我自己复现时的实操心得和踩坑记录5.1 训练数据怎么构造决定了HAMLET一半的成败HAMLET的训练数据构成会直接影响门控学不学得会。纯多轮数据训练出来的模型单步任务大概率退化成“总是想开历史门控”纯单步数据则门控学不会激活。论文的做法是混合训练单步数据和多步数据按一定比例混合单步数据帮助模型学会“该关的时候关”多步数据帮助模型学会“该开的时候开”。我实践下来觉得比例大概3:1到4:1比较合适单步数据多一些确保原能力不退化。另外多步数据里要覆盖一定比例的“不需要历史”的子步骤。比如任务序列里有一半步骤单看当前状态就能完成另一半才依赖历史这样门控才有机会学习区分而不是一刀切。5.2 一个必须自查的细节门控到底有没有被激活训练完之后一定要检查门控值的分布如果所有输入都输出接近0说明历史模块形同虚设如果都输出接近1说明模型又在偷懒把历史当万能补丁。我遇到过门控训练失败的情况稀疏正则项权重给大了门控直接进入0.5死区模型行为变得不确定。排查方法很直接在评测集上统计门控值的直方图。正常训练好的模型应该是双峰分布一部分输入接近0一部分接近1模糊区间占很少数。如果是单峰分布需要回溯损失配比和数据混合比例。5.3 部署阶段的隐性问题推理时延和显存开销历史模块部署到真实机器人上有两个隐性问题容易被忽略。第一是注入记忆token之后交叉注意力的序列长度变长每步推理时间会有所增加需要实测确认是否满足控制频率要求。第二是门控机制的batch推理问题门控值为0和1的样本会被同时处理有些加速框架会因为这个分支逻辑降低效率当年部署时可以用“统一把门控当连续值计算”来绕过分支预测开销。5.4 这个方案在什么场景下值得用什么场景下别用根据我的体验HAMLET特别适合“任务步骤有上下文依赖”的场景比如桌面整理、厨房操作、装配任务这些任务共同特征是视觉状态不是充分信息目标物体可能被遮挡或者多个子任务之间动作形状相似必须靠历史消歧。反过来如果任务本身是纯单步且环境状态完全可观测比如传送带上固定位置的抓取引入历史模块意义就不大门控大概率一直关闭白白增加计算量。做技术选型时先想清楚任务里有没有“信息只能靠历史提供”的环节如果答案是否定的那这篇论文的很多设计思路你只需要了解不需要应用。5.5 另外一些值得尝试的后续方向我很期待看到HAMLET思路和其他工作结合的可能。比如把显式的子目标完成状态作为辅助输入比纯动作序列更容易提取历史语义再比如换成图式记忆结构把“物体A在位置B”这类结构化关系存下来而不是压缩成稠密向量还有长程房室机器人场景LSTM的隐状态压缩容量有限可能撑不住几十步以上的依赖关系这种情况下局部注意力记忆库可能更合适。论文本身只解决“让VLA具备历史感知能力”的第一步后面还有很多工程细节值得继续挖。无论如何HAMLET给出了一个非常务实的切入点——不是推翻VLA范式而是在它上面加一个可以开关的历史感知机制这个思路放在工程落地里很有价值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑