Action Chunking
动作分块让机器人策略根据一次观测预测一系列未来动作,从而减少误差累积。本文介绍 ACT、平滑处理和 VLA。
动作分块是机器人学习中的一种技术:策略根据一次观测预测接下来 k 个动作组成的序列(即动作块),而不是每个控制步骤只预测一个动作。这个名称借鉴了心理学和神经科学中的概念,即将一系列动作组合为一个单元;2023 年,随着基于 Transformer 的动作分块(ACT)的提出,这一概念进入机器人学习领域。ACT 仅使用低成本 ALOHA机械臂的 10 分钟演示数据,就能以 80%–90% 的成功率完成精细的双臂任务,例如将电池插入槽中。如今,预测动作块已成为模仿学习的标准做法,也广泛应用于通用机器人技术的视觉-语言-动作(VLA)模型。
预测动作块为何有效#
在行为克隆中,策略学习模仿人类演示中的动作。每个小错误都会使机器人进入演示数据从未覆盖的状态,导致下一次预测更差,因此误差会在长任务中不断累积。一次预测就确定 k 个动作的策略,每个任务回合中做出的决策次数会减少到原来的 1/k;ACT 的作者将其描述为任务有效时域缩短了 k 倍。在他们的模拟消融实验中,两个任务的平均成功率从每次预测一个动作时的 1% 上升到使用长度为 100 的动作块时的 44%。
动作块还能捕捉单次观测无法体现的时序信息。人类演示者会停顿和犹豫;看到停顿前后相同图像的单步策略无法判断该等待还是移动,而包含停顿的动作块则能复现这一行为。此外,如果演示中展示了完成任务的两种有效方法,一次性预测完整序列可以让机器人坚持其中一种,而不是把两种方法平均起来。
机器人执行一个动作块后,再向策略请求下一个动作块:
等整个动作块执行完再重新规划,可以最大限度地减少模型调用;像 Diffusion Policy 那样只执行部分动作块后就重新规划,则遵循模型预测控制的滚动时域思路,能够更快应对意外情况。
平滑动作块之间的衔接#
机器人会以开环方式执行一个动作块,而每个新动作块都从一次全新预测开始,因此两个动作块交接时,动作可能突然跳变。ACT 的时间集成会在每个步骤都查询策略,并对所有动作块在当前步骤的预测进行加权平均,权重为 exp(−m·i),让最早的预测拥有最高权重。下面的 NumPy 示例将普通动作分块与时间集成进行比较;示例中的模拟策略在每个动作块中都带有一个小误差:
import numpy as np
rng = np.random.default_rng(0)
k, steps, m = 10, 100, 0.1 # chunk size, episode length, temporal-ensembling decay
target = np.sin(np.linspace(0, np.pi, steps + k)) # the demonstrated joint trajectory
# Stand-in policy: at step t it predicts actions for steps t..t+k-1, each chunk off by its own error
chunks = [target[t : t + k] + rng.normal(0, 0.05) for t in range(steps)]
# Plain chunking: query every k steps and execute each chunk open loop
plain = np.concatenate([chunks[t] for t in range(0, steps, k)])
# Temporal ensembling (ACT): query every step and average all predictions for step t, oldest weighted most
ensembled = []
for t in range(steps):
preds = [chunks[s][t - s] for s in range(max(0, t - k + 1), t + 1)]
weights = np.exp(-m * np.arange(len(preds)))
ensembled.append(np.dot(weights, preds) / weights.sum())
for name, actions in (("plain", plain), ("ensembled", np.array(ensembled))):
print(f"{name}: largest jump between consecutive actions = {np.abs(np.diff(actions)).max():.3f}")
print(f"demonstration: largest jump = {np.abs(np.diff(target[:steps])).max():.3f}")普通动作分块在两个动作块的交界处会产生 0.085 的最大步间跳变,大约是演示数据中 0.029 的三倍。时间集成将跳变降到了 0.044,因为每个执行的动作最多会对来自不同观测的十次预测取平均。
模型越大,越难掩盖动作块之间的衔接问题,因为推理耗时可能超过一个控制步骤。Physical Intelligence 的实时动作分块会在当前动作块执行期间生成下一个动作块,冻结推理延迟期间即将执行的动作,再填充其余部分以与这些动作衔接;即使延迟超过 300 毫秒,这也能让击火柴等动态任务顺利运行。
现代机器人策略中的动作分块#
- ACT: 一种经过训练的 Transformer 条件变分自编码器,可输出由 100 个关节位置目标组成的动作块;在 ALOHA 的 50 Hz 控制频率下,这相当于两秒的运动。
- 扩散策略: 通过迭代去噪来生成每个动作序列,因此能够很好地表示包含多个不同解的演示数据。
- VLA 模型: Physical Intelligence 的 π0 将视觉语言模型与通过流匹配训练的动作专家结合起来,输出包含 50 个动作的动作块,控制频率最高可达 50 Hz。Hugging Face 的 LeRobot 库提供 ACT、Diffusion Policy 和 π0 的开源实现。
这些策略大多使用学习得到的骨干网络对原始相机图像进行编码。策略也可以改为根据检测器提供的物体位置进行条件化:Ultralytics YOLO26 模型在工作单元中的零件上微调后,可将每一帧转换为少量边界框或关键点坐标;分块策略会将这些坐标作为状态,而不是使用原始像素。










