ACT:轻量高效的机器人模仿学习策略,快速实现机械臂操作技能

📅 2026/7/18 12:13:48
ACT:轻量高效的机器人模仿学习策略,快速实现机械臂操作技能
1. 项目概述为什么ACT是机器人模仿学习的绝佳起点如果你刚开始接触LeRobot或者想找一个计算资源要求不高、训练速度快、效果又足够好的机器人模仿学习策略那么ACTAction Chunking with Transformers几乎就是为你量身定做的。我刚开始用LeRobot做机械臂抓取任务时也试过其他更复杂的模型但往往被漫长的训练时间和庞大的显存需求劝退。直到切换到ACT才真正体会到“快速迭代”的快乐——它能在消费级GPU上用几个小时就完成训练并且用几十条演示数据就能学到像模像样的操作技能。ACT的核心思想很巧妙它不预测单个下一步动作而是直接预测未来一小段连续的动作序列即“动作块”Action Chunk。这就像开车时老司机不是只看眼前一米的路而是会规划接下来几秒的方向盘和油门怎么配合。对于需要精细接触和连续操作的机器人任务比如插拔USB、拧瓶盖这种“向前看几步”的能力至关重要能有效减少动作的抖动和不连贯性。它的模型参数量大约在8000万左右相比动辄数十亿参数的大模型显得非常轻巧但千万别小看它在诸多标准机器人操作基准测试上它的表现常常让人惊喜。2. ACT训练前的核心准备数据、环境与硬件2.1 理解你的数据演示数据集是关键ACT是模仿学习模型它的“老师”就是你提供的演示数据。在按下训练按钮之前你必须彻底理解你的数据集。LeRobot支持的数据集通常以Hugging Face Dataset的形式组织里面包含了每次演示episode的图像序列、机器人状态如关节角度和动作序列。你需要重点关注几个数据维度图像视角ACT支持多相机输入。你的数据集中至少应包含一个稳定的视角如顶置相机或腕部相机。如果能有2-3个不同角度的相机比如一个全局视角一个近距离特写视角模型对物体位姿的理解会稳健得多。检查你的图像是否清晰、光照是否稳定、背景是否过于杂乱。动作表示机器人动作是如何定义的是关节空间的位置/速度/扭矩还是末端执行器的笛卡尔空间位姿这直接影响模型学习的效果。通常对于精细操作末端执行器的位姿位置旋转常用7维向量表示比关节角度更易学习。数据量与质量官方文档说50条演示就能有不错的效果但这有个前提——这50条演示必须是高质量、高成功率的。如果演示本身就有很多失败或抖动模型会把这些坏习惯也学去。我的经验是准备100-200条覆盖任务不同变体如物体初始位置略有不同的成功演示训练效果会更稳定。2.2 搭建训练环境一步到位的配置指南LeRobot的安装已经相当友好但为了确保ACT训练一路绿灯我建议按照以下步骤搭建一个干净的环境# 1. 创建并激活一个独立的Python虚拟环境强烈推荐 conda create -n lerobot python3.10 -y conda activate lerobot # 2. 安装PyTorch请根据你的CUDA版本选择以下以CUDA 11.8为例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 安装LeRobot核心库 pip install lerobot # 4. 安装额外的依赖特别是用于视频数据处理的库 pip install av decord这里有个容易踩坑的地方视频编码库。LeRobot数据集中的视频通常用.mp4格式存储av和decord库负责高效解码。如果安装后读取视频报错很可能是这两个库的版本或底层FFmpeg有问题。一个排查方法是尝试用pip install av --no-binary av从源码编译安装。2.3 硬件资源评估与选择ACT的轻量级特性让你有多种选择本地GPU推荐拥有一张显存8GB或以上的GPU如NVIDIA RTX 3070/4070或更高就能获得非常舒适的体验。batch size设为8时显存占用通常在6-7GB。云端GPU如果没有本地显卡Google Colab的免费T4 GPU约15GB显存完全够用。付费升级到A100当然更快但对于ACT训练并非必需。纯CPU训练不推荐理论上可行但训练时间会延长数十倍只适合极小的数据调试。注意在开始长时间训练前务必运行一个极简的训练循环比如10个step来验证整个数据流、模型前向传播和反向传播是否正常。这能提前发现数据格式错误或环境配置问题避免浪费几个小时才发现失败。3. ACT训练全流程拆解与参数精调3.1 启动训练命令的深度解析LeRobot提供了lerobot-train这个命令行工具让训练启动变得简单。但每个参数背后的含义决定了你是“能用”还是“用好”。下面是一个完整的训练命令示例我们逐行解析lerobot-train \ --dataset.repo_idyour_hf_username/your_awesome_dataset \ # 关键你的演示数据集 --policy.typeact \ # 指定使用ACT策略 --output_dir./train_outputs/act_experiment_1 \ # 训练日志、检查点保存位置 --job_nameact_fine_tuning \ # 用于WB等实验跟踪的名字 --policy.devicecuda \ # 使用GPU --training.save_interval5000 \ # 每5000步保存一个检查点 --training.eval_interval10000 \ # 每10000步在验证集上评估一次 --training.num_epochs50 \ # 训练轮数 --policy.lr1e-4 \ # 学习率这是最重要的超参数之一 --policy.batch_size8 \ # 批大小根据显存调整 --wandb.enabletrue \ # 启用Weights Biases记录实验强烈推荐 --wandb.projectlerobot-act \ # 你的WB项目名 --policy.repo_idyour_hf_username/act_policy_final # 训练完成后模型自动上传的地址核心参数调优心得--policy.lr学习率1e-4是官方推荐的起点对于大多数任务效果不错。如果你发现训练初期损失下降很慢可以尝试调到3e-4如果发现损失剧烈震荡或变成NaN则需降低到5e-5或1e-5。学习率是训练稳定性的“定海神针”。--policy.batch_size在显存允许范围内尽可能调大。更大的batch size意味着每次参数更新梯度更稳定。从8开始如果你的GPU显存有16G可以尝试增加到16。调整后可能需要微调学习率通常batch size翻倍学习率也可以适当翻倍。--training.num_epochs不要盲目设大。ACT训练收敛很快通常10-20个epoch对应约10万-20万训练步就足够了。你可以通过观察验证集上的成功率或损失曲线来判断是否早停early stopping。3.2 训练过程中的监控与诊断训练启动后不能只是干等着。你需要像医生看监护仪一样密切关注几个关键指标损失曲线Loss在TensorBoard或WB上看train/loss和eval/loss。健康的曲线应该是训练损失稳步下降验证损失也随之下降并逐渐趋于平缓。如果验证损失很早就开始上升而训练损失继续下降这是典型的过拟合信号说明模型只记住了训练数据没有泛化能力。解决办法包括增加数据量、添加数据增强如图像随机裁剪、颜色抖动或减小模型容量但ACT本身已经很小了。成功率Success Rate如果验证集有标注成功率这是最直接的指标。关注它的上升趋势。如果损失在降但成功率不升可能是动作表示或奖励函数设计有问题。梯度范数Gradient Norm这个指标能反映训练是否稳定。如果梯度范数突然变得极大爆炸或接近零消失都意味着训练出了问题可能需要调整学习率或检查数据是否有异常值。我的习惯是在训练的头1000步以较高频率比如每100步查看一次这些指标确保训练方向正确。之后可以降低查看频率。3.3 模型保存与检查点策略训练命令中的--training.save_interval5000意味着每5000步保存一个检查点。这非常重要因为回滚与选择你可以在训练结束后比较不同检查点在验证集上的表现选择最好的那个而不是直接用最后一个。中断恢复如果训练过程意外中断比如云实例断连你可以从最新的检查点恢复训练而不是从头开始。检查点文件通常包含模型权重、优化器状态、当前步数等信息。恢复训练的命令类似但需要指定--resume_from_checkpointpath/to/checkpoint参数。4. 提升ACT性能的进阶技巧与实战心得4.1 数据增强给小数据注入“强心剂”当你的演示数据有限时比如只有50-100条数据增强是防止过拟合、提升模型泛化能力的利器。对于机器人视觉策略有效的增强方法必须具有物理合理性不能改变任务的语义。我常用的增强组合包括随机裁剪Random Cropping以小幅度的随机偏移裁剪图像模拟相机微小的位姿变化。这能教会模型不依赖于物体在图像中的绝对位置。颜色抖动Color Jitter轻微调整图像的亮度、对比度和饱和度。这能增强模型对不同光照条件的鲁棒性。高斯噪声Gaussian Noise在图像上添加微小的随机噪声可以使模型对传感器噪声更不敏感。在LeRobot中你可以通过自定义DataLoader或在前处理管道中插入这些增强变换来实现。关键是要适度过强的增强比如大范围裁剪可能会破坏图像中关键物体或特征的结构反而有害。4.2 多任务与上下文学习ACT的Transformer架构让它天生具备处理序列和上下文信息的能力。你可以利用这一点提供语言指令除了图像和状态在模型输入中加入一个描述当前任务的自然语言指令的嵌入向量例如“拿起红色的积木”。这能让同一个模型学会执行多种不同的任务。历史信息除了当前时刻的观测可以额外提供过去几帧的图像和状态。这给了模型一点“记忆”有助于处理动态场景或需要预测物体运动的任务。实现这些功能需要对ACT的模型代码有一定了解需要修改其输入编码器Encoder部分以融合额外的模态信息。这属于进阶操作但带来的性能提升可能是显著的。4.3 超参数搜索的务实策略虽然ACT超参数不多但手动调优仍可能耗时。一个务实的方法是采用网格搜索Grid Search或随机搜索Random Search但范围要小迭代要快确定核心超参数学习率lr、批大小batch_size、Transformer的层数/隐藏层维度可微调。设定小范围例如学习率在[1e-5, 3e-4]之间取3-4个值用一个小型数据集或完整数据集的子集快速训练1-2个epoch。根据验证损失选择最佳组合再用完整数据集和更长的epoch进行最终训练。使用WB的Sweep功能可以自动化这个过程。记住超参数调优的收益是边际递减的把时间花在收集更多高质量的演示数据上往往比极致调参的回报率更高。5. 训练后评估与真实世界部署5.1 使用lerobot-record进行系统化评估训练完成后模型在验证集上的损失只是一个代理指标。真正的考验是在仿真或真实机器人上运行策略。lerobot-record命令就是干这个的lerobot-record \ --robot.typeso100_follower \ # 机器人类型需与数据收集时一致 --robot.port/dev/ttyACM0 \ # 机器人硬件端口 --policy.pathyour_hf_username/act_policy_final \ # 训练好的策略路径 --dataset.repo_idyour_hf_username/evaluation_runs \ # 评估结果保存的数据集 --dataset.num_episodes20 \ # 运行20次进行评估 --dataset.single_taskPick up the blue block and place it in the corner \ # 任务描述 --display_datatrue # 实时显示相机画面和推理结果这个命令会加载你的策略控制机器人执行任务并将执行过程图像、动作、结果记录为一个新的数据集。你可以通过分析这个评估数据集来计算真实成功率并观察失败案例是抓取位置不对还是动作序列不连贯这些是迭代改进模型和数据的最宝贵反馈。5.2 从仿真到实物的“Sim2Real”鸿沟如果你是在仿真环境中训练如Isaac Sim计划部署到真实机器人必须考虑“仿真到现实”的差异视觉差异仿真图像过于“干净”缺乏真实世界的纹理、噪声和光照变化。解决方法是在仿真中使用随机化的纹理、光照和相机参数进行域随机化Domain Randomization或者在真实数据上对仿真训练的模型进行微调Fine-tuning。动力学差异仿真中的物理参数摩擦力、质量与现实不符。这可能导致仿真中成功的抓取策略在现实中因为力度不够而失败。除了物理参数随机化还可以在动作输出后加入一个低通滤波器平滑指令减少现实机器人因模型误差而产生的抖动。使用lerobot-record在实物上收集少量数据对仿真模型进行微调是跨越Sim2Real鸿沟最有效的方法之一。通常只需几十条真实世界的成功演示就能让模型的性能大幅提升。5.3 常见失败模式分析与排查表在评估中遇到失败是常态。下面是一个快速排查指南现象可能原因排查与解决思路机器人动作僵硬、抖动动作序列预测不连贯控制频率过高检查ACT输出的动作块长度(chunk_size)是否过小。尝试增加chunk_size或在动作执行层加入平滑滤波。确保推理频率与机器人控制频率匹配。始终无法接近目标物体视觉特征提取失败相机标定不准可视化模型中间层的注意力图看它是否关注到了正确物体。检查训练数据中相机视角是否与部署时一致。重新进行相机标定。抓取姿势奇怪如侧着抓演示数据中抓取姿态单一末端旋转表示有问题检查演示数据是否包含了物体不同朝向下的成功抓取。确保动作空间中的旋转表示如四元数、轴角是连续且无奇异的。训练损失不下降学习率太低数据标注有误模型架构错误逐步提高学习率试错。仔细检查数据集确保动作序列与图像观测在时间上是对齐的。用极简任务如点到点移动验证训练流程是否正确。过拟合训练成功率高评估成功率低训练数据量太少任务多样性不足收集更多、更多样化的演示数据。引入前述的数据增强技术。尝试在模型中加入Dropout等正则化层。6. 将ACT集成到你的机器人系统实战案例理论说再多不如看一个实际例子。假设我们有一个任务让机械臂从桌面上杂乱摆放的积木中抓起红色的那个并放入盒子。第一步数据收集我们使用LeRobot的远程操作工具人工示教50-100次成功完成该任务的流程。录制数据时确保使用了腕部相机和顶置相机两个视角。数据集上传到Hugging Face Hub命名为my_org/red_block_to_box。第二步训练配置我们决定使用较大的batch size16以稳定训练并因为数据量不大设置较高的学习率3e-4以加快初期收敛。训练命令如下lerobot-train \ --dataset.repo_idmy_org/red_block_to_box \ --policy.typeact \ --output_dir./outputs/red_block_act \ --policy.batch_size16 \ --policy.lr3e-4 \ --policy.num_layers6 \ # 使用稍深的Transformer默认可能为4 --training.num_epochs30 \ --wandb.enabletrue \ --wandb.projectred_block_picking第三步迭代与调试训练启动后我们在WB上发现验证损失在第15个epoch后开始缓慢上升。我们判断出现了轻微过拟合。于是我们中断训练采取了两个措施1从数据集中随机抽取了10%的图像应用颜色抖动和微小裁剪增强2将学习率在后续训练中衰减到1e-4。然后从第15个epoch的检查点恢复训练。第四步部署与评估训练完成后我们在真实的机械臂上运行评估。前几次尝试发现机械臂接近积木时有时会犹豫。通过回放lerobot-record记录的数据我们发现当积木紧贴其他物体时模型注意力会有些分散。我们额外收集了20条“拥挤环境”下的成功演示加入到原数据集中对模型进行了少量步数的继续训练continue training。最终任务的执行成功率从最初的约70%提升到了90%以上。这个过程的核心在于快速训练、快速评估、快速迭代。ACT的低计算成本使得这个闭环可以非常紧凑让你能在一天内完成多次“训练-评估-改进”的循环这是它对于研究和开发而言最大的魅力所在。