第二章:ACT算法基础
各位同学好,我是老张。今天咱们来聊聊ACT算法——这个在机器人操作领域越来越火的技术。说实话,我第一次接触ACT的时候,也被它那套「动作分块」的思路惊艳到了。
2.1 ACT算法原理
ACT,全称是Action Chunking with Transformers。名字挺长,但核心思想其实很简单:把连续的动作序列切成小块,然后用Transformer来预测这些块。
为什么要这么做?你想想看,传统的机器人控制是一步一步来的——观测当前状态,输出一个动作,执行,再观测。这样做的缺点是,每一步都只看到眼前,容易陷入局部最优。而ACT的做法是:一次看一段时间的窗口,预测未来一段时间的动作序列。
核心公式(简化版):
输入:观测序列 O = [o_t, o_{t-1}, ..., o_{t-k}]
输出:动作块 A = [a_t, a_{t+1}, ..., a_{t+H-1}]
其中 H 是动作块的长度(chunk size)
我在项目中遇到过一个问题:chunk size设得太小(比如2步),模型几乎退化成逐帧预测,抖动很厉害;设得太大(比如100步),模型又学不会长程依赖,动作变得很「飘」。后来我总结出一个经验:chunk size通常取16-32之间比较稳妥,具体要看你的任务周期。
2.2 模仿学习与行为克隆
ACT的训练方式,说白了就是行为克隆(Behavior Cloning)。什么意思呢?就是让机器人看人类演示,然后学着做。
嗯,这里要注意一个关键点:行为克隆不是简单的「输入-输出」映射。它其实是在学习一个条件概率分布:
π(a_t | o_t) —— 给定当前观测,输出动作的概率
但ACT更进一步,它学的是:
π(A_t | O_t) —— 给定一段观测,输出一段动作块的概率
这个区别很微妙,但效果差别巨大。我记得有一次做桌面抓取任务,用逐帧的行为克隆,机器人总是抓不准——因为它每次只看到当前帧,不知道物体运动的趋势。换成ACT之后,机器人能「预判」物体的运动轨迹,成功率从65%直接飙到了92%。
避坑指南:我曾经犯过一个错误——把演示数据直接喂给模型,不做任何预处理。结果模型学了一堆噪声。后来我加了两个预处理步骤:
- 动作平滑:用滑动窗口平均去除高频抖动
- 时间对齐:确保所有演示序列的时间步长一致
这两个小改动,让训练收敛速度快了将近一倍。
2.3 ACT与Diffusion Policy的关系
说到ACT,就不得不提Diffusion Policy。这两个算法是什么关系?我个人的理解是:ACT是骨架,Diffusion Policy是血肉。
具体来说:
| 对比维度 | ACT | Diffusion Policy |
|---|---|---|
| 输出方式 | 直接预测动作块 | 通过去噪过程生成动作块 |
| 多样性 | 单一输出 | 可以生成多种可行方案 |
| 训练稳定性 | 较稳定 | 需要调参 |
| 适用场景 | 确定性任务 | 需要多模态输出的任务 |
说白了,ACT更适合那些「只有一种正确做法」的任务,比如拧螺丝、插拔接头。而Diffusion Policy适合「有多种可行方案」的任务,比如抓取——你可以从左边抓,也可以从右边抓,只要抓到就行。
我最近在做一个项目,把两者结合起来:先用ACT做粗粒度规划,再用Diffusion Policy做细粒度优化。效果还不错,后面有机会再跟大家细聊。
2.4 算法输入输出
ACT的输入输出,其实比你想的要灵活。我画了一张图,帮你理清思路:
输入方面,我习惯把视觉信息和状态信息分开处理。视觉信息用CNN提取特征,状态信息直接拼接。这样做的原因是:视觉特征和状态特征的维度差异太大,混在一起训练容易出问题。
重要提醒:输入的时间窗口k和输出的动作块长度H,这两个参数是强相关的。我见过有人把k设成1,H设成64,结果模型完全学不会——因为输入信息太少,根本不足以预测那么远的未来。我的经验是:k和H的比例保持在1:8到1:16之间比较合理。
输出方面,ACT输出的是绝对动作还是相对动作?这个问题我纠结了很久。后来发现,对于抓取这类任务,用相对动作(即每一步相对于上一步的增量)效果更好,因为模型不需要记住绝对位置,只需要学会「往哪个方向动」就行。
好了,ACT的基础就讲到这里。记住一句话:ACT的核心是「看一段,做一段」,而不是「看一步,做一步」。这个思路的转变,让机器人操作上了一个大台阶。