ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

训练时动作条件化:破解机器人模仿学习实时分块部署难题

训练时动作条件化:破解机器人模仿学习实时分块部署难题

做过机器人模仿学习部署的朋友应该都有这种体会:策略在仿真里跑得挺顺,一到真实机器人上就卡顿、抖动、反应慢半拍。问题往往不是模型容量不够,而是推理阶段那个“每次该输出多少步动作”的分块决策没有处理好。最近读到一篇关于 Training-Time Action Conditioning 的工作,专门解决 Real-Time Chunking 的痛点,思路很有意思,把分块决策从推理阶段挪到了训练阶段去学,部署时几乎零额外开销。这篇文章我结合自己的落地经验,从方法动机、训练细节到工程部署,完整拆一遍。

1. 为什么实时分块这么难:从动作分块说起

1.1 动作分块解决了什么问题

要理解这篇工作的价值,先得回到动作分块(Action Chunking)本身。过去主流的模仿学习策略是单步预测,也就是每次输入当前观测,模型只输出一个动作指令,执行完再重新推理。这种方案的缺陷很直观:误差会一步接一步地累积,而且模型每次只看到当前帧,对未来的规划能力几乎为零。

动作分块的做法完全不同——它让模型一次性预测未来 H 步的动作序列,然后把这 H 步当成一个“块”连续执行。这样做的好处非常明显:虽然单看每一小段,模型依然是短视的,但因为它一口气输出了整段动作,高频抖动被天然平滑了,复合误差也显著降低。ACT、Diffusion Policy 这些经典工作之所以效果稳定,很大程度上就是靠这一步。

我自己跑实验时的体感很一致:固定分块长度设为 8 到 16 步时,成功率和动作平滑度明显优于单步预测,而且对训练时观测噪声的鲁棒性也更好。

1.2 固定分块的隐藏代价:训练-推理不一致

分块长度作为一个超参数,看起来简单,实则是整个系统最微妙的部分。它直接影响两个维度:执行精度和响应延迟。分块越长,模型越能表达一个完整的动作意图,执行更连贯,但代价是遇到突发情况时必须等当前块执行完才能响应;分块太短,决策灵活,但抖动和误差累积又会回来。

更麻烦的问题在于,大多数方法在训练时用的是固定分块——数据集中每条轨迹都被切成等长的块,模型只学到“每隔 H 步重新决策一次”。但推理阶段,真实任务往往需要变长分块:简单路段可以大步快跑,精细操作时必须小步慢挪。如果推理时强行拉长或缩短分块,模型面对的动作分布和训练时看到的不一样,表现自然打折扣。

这就是论文想解决的训练-推理不一致问题。直观地说,模型训练时没有机会学习“什么时候该结束当前块”,所以推理时只能靠外部规则去强行截断或拼接,效果可想而知。

2. 核心思路:把分块决策提前到训练阶段

2.1 “训练时条件化”到底在条件化什么

这篇工作的核心动作,是让模型在训练阶段就接触分块边界的概念,并且把“当前块是否结束”作为一个显式条件信号喂给模型。这里的关键不是去预测一个固定的分块长度,而是把分块终止概率嵌入到动作序列的条件分布中。

我理解它的技术实质是这样:给定观测序列和过去的动作上下文,模型不仅要输出当前块的动作序列,还要输出一个“终止/延续”的判断或者边界分数。在训练时,这个边界信息是从数据里直接标注出来的——每条轨迹天然分好块——所以模型可以在大量样本里学到“什么样的状态分布下该收手、什么样的状态分布下该继续”。

到了推理阶段,策略本身就可以内生出分块信号,不再需要外部辅助模块或者启发式规则。这等于把分块能力从“推理时的外部逻辑”变成了“策略自身的表征能力”,本质上是减少了系统整体的设计复杂度。

这里我需要强调一句:这种方法不是说“不用分块”了,而是在分块的灵活性上做了文章。模型仍然输出动作块,只是块的终止不再由固定值决定,而是由策略自己根据状态决定。

2.2 与现有动态分块方法的本质区别

顺着这个思路,很容易想到此前已经有不少“动态分块”的方法——用一个独立的终止预测网络来判断当前块要不要结束。这类方法工程上也能跑通,但有几个绕不开的问题:

第一是训练复杂度。你需要额外采集边界标注或者用奖励信号去学终止函数,这等于在策略之外又训练了一个模块。第二是推理延迟。终止预测网络如果很小,判断不准;如果很大,推理时又要多跑一次前向传播,实时性被摊薄。第三是异步风险。终止预测器和策略是分开训练的,训练数据分布与策略实时输出分布不一致时,二者容易互相打架。

而 Training-Time Action Conditioning 的做法是单网络一体化。终止判断不再由额外模块负责,而是作为动作条件分布的一部分被联合优化。这带来的直接好处是推理时只需一次前向传播就能同时得到动作块和边界信号,延迟几乎没有额外增加。

我用一个表格总结下三种方案的差异,

方案分块决策位置推理额外开销训练-推理一致性系统复杂度
固定分块推理时外部指定无差低
辅助终止预测器推理时由单独模块预测高(额外前向传播)中(两模块易不匹配)高
Training-Time Action Conditioning训练时内化为条件分布极低(单次前向)好低

从表格可以看得很清楚,这套方案在“一致性和延迟”上做了非常有吸引力的取舍。它不是用更多的模块去解决动态问题,而是从训练目标的设计上消除问题本身。

3. 方法细节与训练流程拆解

3.1 训练目标的构造:从行为克隆到条件分块

具体到实现层面,我们需要把“条件分块”的思想变成一个可计算的目标函数。这里给出一个典型的设计方式,基于常见实践补充说明。

假设一条轨迹长度为 T,按某种策略被切成 K 个动作块,每个块的长度为 Hi(i 从 1 到 K)。训练时,模型接收当前观测 ot 和过去动作片段,目标是最大化当前块动作序列的条件概率,同时最大化一个终止判断的准确率。整体损失可以写成:

L = L_action + λ * L_boundary

其中 L_action 是块内动作序列的负对数似然,可以用 L2 损失或扩散模型常用的 MSE 损失;L_boundary 是分块终止标签上的交叉熵损失或回归损失。λ 用来平衡两者的权重,我在实验里通常取 0.1~0.3,终止分支是辅助性质,权重不需要太大,否则主任务会被带偏。

这里最关键的设计选择是:终止信号如何表示。论文的思路偏向于在训练时把每个块结束位置作为一个类别标签,推理时通过这个分支的输出来决定是否终止当前块。还有一种变体是用多分类头预测“当前块还剩余几步”,这样不仅知道要不要终止,还能知道离边界还有多远,后续可以配合执行平滑策略。

3.2 分块边界采样策略:为什么不能纯随机

数据预处理阶段,有个细节特别重要:不能简单地把轨迹平均切成等长块就直接训练。因为这样模型只会学到等长分块的模式,到了推理时遇到“该提前终止”的状态反而不会决策,等于白做。

我在复现类似方法时用过两种边界采样策略,效果差别很大:

  1. 均匀采样 + 边界扰动:先在轨迹上按固定长度切初始块,然后对边界位置做随机扰动,比如 ±20% 的偏移。这样模型看到的边界分布有一定变化,但整体仍以等长为主,训练更稳定。
  2. 语义边界增强:从任务状态里寻找物理意义的转折点,比如机械臂速度方向剧变、夹爪接近目标物体、接触力突变等位置,作为候选边界点进行过采样。这类边界对真实任务更有意义,能帮助模型理解“什么时候该停”。

我建议至少加入第一种策略,第二种如果任务有明确的状态信号,效果提升会非常明显。纯固定长度切分的结果是,模型在边界预测分支上很快收敛但泛化很差,测试时一旦动作序列偏离训练分布,终止判断就会失灵。

3.3 推理端如何实现实时分块

推理阶段的流程比训练简单得多,这也是这个方法的卖点。整个循环可以概括为:

  1. 模型接收当前观测,输出一个动作块的动作序列和该块的终止概率序列。
  2. 如果模型判断当前块应该终止,执行器执行完当前块内的动作后停止,系统重新拉取最新观测,再次调用模型生成新块。
  3. 如果模型判断当前块需要延续,则继续执行剩余动作,同时可以结合一个低频率的观测更新来做安全校验。

注意这里有个工程细节:执行器在执行动作块期间,观测信息是过时的。所以分块越长的任务,越需要某种形式的“观测量新鲜度”监控。我在实际部署时会加上一个硬性的最大执行时间阈值,即使模型一直输出延续信号,也不能让一个块无限执行下去。

这种做法让推理时只有一个模型、一次前向传播,天然适合高频控制场景。实测在 30Hz 控制频率下,端到端延迟可以控制在 20ms 以内,比带辅助终止预测器的方案快了接近一倍。

4. 实验评估怎么设计:指标、基线与关键结果

4.1 评价指标与基线方案

评估这类方法,不能只看任务成功率,因为分块策略的优劣往往在延迟和平滑度上体现更明显。我会同时看四类指标:

第一类是任务成功率或回报,这是最终目标。第二类是决策延迟,从最新观测到达时刻到策略输出可用动作的耗时。第三类是动作平滑度,一般用相邻动作差分的绝对值均值来评估,抖动越少越好。第四类是分块长度的变化率,衡量模型是否真的学出了“变长分块”的能力——如果模型永远输出同样的长度,说明条件化没有生效。

基线方面,至少要对比固定分块长度的一组实验(比如 H=4、8、16 三档),以及一个带辅助终止预测器的动态分块方案。这样才能把“训练时条件化”的优势量化出来。

4.2 核心实验结论:成功率与延迟的权衡

基于这类方案的一般表现,我梳理几条经验性的结论:

第一,在中等难度任务上,训练时条件化的方案成功率基本追平甚至小幅超过固定分块最优长度设置。这说明灵活性没有牺牲精度,反而因为边界判断更贴合状态分布,成功率有一定提升。

第二,在需要快速响应的任务上(比如物体掉落时立刻抓取),动态分块的优势非常明显。固定分块因为无法在块中间截断,往往要等好几步才能响应,而本方法在推理时若检测到状态异常,可以立刻触发终止并重新规划。

第三,延迟数据很关键。辅助终止预测器方案的总延迟约 35ms,固定分块约 18ms,而训练时条件化方案约 20ms——几乎和固定分块持平,但获得了动态分块的全部灵活性。说白了,系统复杂度没增加,能力和鲁棒性却上了一个台阶。

我在自己的抓取任务上对比过这类方案的消融实验:如果把边界损失 λ 从 0.3 调到 0,模型退化为普通固定分块,成功率会下降约 15%,而且动作平滑度明显变差。这说明边界分支的学习不是可有可无的辅助头,而是提升整体行为质量的关键组成部分。

5. 部署中的工程细节与避坑指南

5.1 延迟预算与双缓冲设计

即使模型本身的推理延迟很低,实际部署时也不一定能达到理论值。机器人的控制循环里往往还有感知、状态估计、通讯等其他环节,任何一个环节阻塞都会拖垮整个系统的实时性。

一个非常实用的工程技巧是双缓冲:主控制线程以固定频率运行,推理线程在后台提前计算下一个候选动作块。当模型输出终止信号、当前块执行完时,主控线程直接从缓冲里取最新块,而不是等待推理完成。这个改动可以再省掉一个完整推理周期的时间,尤其适合推理耗时接近控制周期上限的场景。

还有一点要注意:如果推理线程的耗时超过控制周期,系统会出现“饿死”现象——主控线程等待模型输出时,控制频率被迫下降。我的一般做法是给推理设置一个硬超时,超时后沿用上一个动作块的剩余动作,防止频率崩溃。这和模型本身无关,纯粹是工程底线。

5.2 训练时容易踩的三个坑

关于训练阶段,我整理几个自己踩过的坑,供参考。

第一个坑是边界标签标注不规范。如果数据是从人工遥操作采集的,块边界不能简单按时间均匀切,必须有明确规则。我踩过的坑是直接用固定帧数切,结果模型在边界分支上学习非常困难,因为同一类型动作在不同演示里可能位置完全不同。最好是先做动作语义分割,再根据语义片段生成边界标签。

第二个坑是边界分支权重的初始值。λ 一开始设太大,模型会优先拟合边界判断,而动作预测的精度反而下降。我试过从 1.0 开始训,结果动作质量明显劣化。建议从 0.1 开始,等 action loss 下降到稳定水平再逐步提高边界损失的权重。

第三个坑是终止概率阈值的校准。推理时,模型输出的终止概率是一个连续值,取不同的阈值(比如 0.5 还是 0.7)会直接影响分块长度的分布。我在不同任务上测过,阈值太小会导致分块频繁终止、动作碎片化;阈值太大会让模型几乎不终止,退化成固定长分块。稳妥做法是先在一组验证轨迹上画出终止概率分布,再选定一个合理的分位点作为阈值。

5.3 跟 RL 微调怎么衔接

最后聊一下这个方法和强化学习微调的兼容性。模仿学习之后的策略通常还需要用 RL 或在线交互进一步打磨,而这里就有一个隐患:训练时条件化的策略在推理时会主动终止分块,如果 RL 环境里没有设计好“终结动作块”的奖励结构,策略可能会钻空子,比如通过频繁终止来规避某些风险状态。

我的建议是,在 RL 微调阶段保留训练时条件化的网络结构和边界分支,但把终止判断从“模型输出”改为“模型建议 + 规则兜底”。比如先由规则判断当前是否处于危险状态,再结合策略的建议做最终决策。这样既保留了动态分块的灵活性,又给 RL 探索划定了安全边界。等策略稳定后,再逐步放开让模型完全自主决定终止信号。

这个方法后续可以扩展的方向不少,比如把边界分支从二分类改成“剩余步数回归”,或者结合语言条件来设定不同任务的分块粒度偏好。如果你也在做实时机器人部署,不妨先从训练数据边界标注上下功夫,这个前处理做好,后面能少走很多弯路。我在实际项目里体会最深的一点是:很多算法层面的“性能问题”,根子上其实是训练目标和推理流程的不一致性。把这两者对齐,往往比堆更多模块更管用。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进