我没再开新环境。前面 Task03 已经把 MuJoCo + ACT 的操作复现链路理通,Task04 又顺着同一条线看了 LeWorldModel。Task05 就把这两部分合成一个可复用成果:一个优先复现是 MuJoCo + ACT,一个进阶理解是 LeWM 世界模型。

我选分支 A 的原因没有变:先弄清楚机械臂操作里“观测怎么变成动作”,再往前推一步,看世界模型怎样预测动作之后的环境变化。现在回头看,这条线比一开始想得更适合入门。ACT 的链路短,能看到数据、训练、部署;LeWM 的链路抽象一些,但它逼着我开始区分 policy 和 model,不然很容易把所有“机器人会动”的模型都混在一起。

优先复现:MuJoCo + ACT

ACT 这部分用的是项目里的 06-策略抓取或抓取VLA/大模型控制、VLA、VLM/04mujoco复现ACT、Pi0、SmolVLA/。任务场景很具体:在 MuJoCo 里遥操作机械臂,把杯子抓起来放到盘子上。环境判定成功的条件是杯子在盘子上、夹爪打开、末端执行器位于杯子上方。

四步:先采示教数据,再回放检查数据,再训练 ACT,最后把策略放回 MuJoCo 里 rollout。ACT 从示教轨迹里学 action chunk,推理时根据当前观测吐出一小段动作;手写规则主要负责环境和遥操作,不负责最终策略。一次预测一段动作,比只预测下一帧更适合“靠近杯子、闭爪、抬起、移动、放下”这种连续操作。

在这里插入图片描述

数据格式这里我保留得比较细。教程里同时用外部相机图像 observation.image、腕部第一人称图像 observation.wrist_image、6 维状态 observation.state 和 7 维动作 action。这让我意识到,操作模型的难点不只在 Transformer 本身,数据字段是否对齐、视角有没有覆盖闭爪/接触/放置这些片段、示教轨迹有没有抖,都会直接影响后面的训练。
在这里插入图片描述

训练侧我主要看两个信号。一个是 train_loss 从最开始的 67.215 降到后面 0.04 左右,说明模型确实在拟合示教动作;另一个是 eval_mae 没有同步变得很好,日志里很多阶段还在 0.28-0.32 之间波动。这个数提醒我,loss 下降只能说明训练集动作拟合变好了,不能直接等同于仿真任务稳定成功。这个判断比单看一张训练曲线更有用。

部署效果用 rollout 看。这里至少能证明“数据采集-训练-checkpoint-部署”这条工程链路是通的;但我不会把它说成已经解决了泛化。当前任务里物体、场景、视角都比较固定,换杯子位置、换光照、换机械臂,结果还要重新测。

进阶理解:LeWorldModel

LeWM 是 Task04 的主线。如果 ACT 是直接输出动作,那世界模型能不能先预测“动作执行后环境会变成什么”,再用预测结果选动作?

LeWM 的结构比我预想的轻。当前图像 o_t 经过 encoder 变成 latent z_t,predictor 接收 z_t 和动作 a_t,预测下一时刻 latent。训练时主要盯两项:

pred_loss = (pred_emb - tgt_emb).pow(2).mean()
loss = pred_loss + lambd * sigreg_loss

pred_loss 让模型学会预测未来,SIGReg 防止 encoder 把所有输入压成一个常数向量。这个问题在世界模型里绕不开:如果每张图都变成同一个 latent,预测误差可能看起来很低,但模型已经分不清房间、方块和目标位置了。LeWM 用随机投影加一维正态性约束去管特征分布,我这次先按工程直觉理解:它少绕 teacher-student 和 EMA,把“特征别塌”这件事直接写进 loss。
在这里插入图片描述

用训练好的 LeWM 做规划时,流程像一个短视野的模拟器。先把当前图像和目标图像都编码成 latent,再采样一批动作序列,用 predictor 在 latent 里向前滚几步,挑出离目标 latent 最近的动作。执行时只走第一步,下一帧重新规划。我比较认同这个设计:世界模型长时间自回归会积累误差,一次性执行完整动作序列容易把小偏差放大。
在这里插入图片描述

复现结果里,tworoom 的 success_rate 是 98.0,50 个 episode 里失败 1 个;cube 的 success_rate 是 64.0,50 个 episode 里成功 32 个。tworoom 更像低维导航问题,latent 预测已经足够支撑简单规划。cube 更接近机械臂操作,64%:权重只训练了 12 轮,成功标准又只看方块和目标位置距离是否小于等于 0.04 m,没有检查夹爪过程和最终稳定性。

在这里插入图片描述

踩坑和处理

ACT 这边主要坑在环境和数据。MuJoCo 版本要对到 3.1.6,Python 用 3.10 更省心。训练前先跑 demo_data_example 的可视化很有必要,数据回放如果不对,后面训练久也只错误轨迹拟合得更像。 DataLoader 的 pickling 报错,把 num_workers 设成 0 先把链路跑通。

LeWM 官方 Google Drive 权重不方便下载,项目里用 Hugging Face 上的 Datawhale 权重更顺。.pt 和 eval 需要的 .ckpt 不能混着用,最后按任务放成 lewm_object.ckpt。另外 STABLEWM_HOME 要指到任务外层目录,例如 lewm/tworoom,否则权重和日志容易散在根目录里。

还有ACT 的 loss 下降、LeWM 的 success_rate 好看,都只是局部证据。ACT 需要 rollout 视频来证明策略能回到环境里跑;LeWM 的 cube 需要更严格的成功判定,比如夹爪是否稳定抓取、方块到目标后是否连续保持 20 帧。

操作线的收获

现在对操作模型有了一个更清楚的分层。ACT 这一类 imitation policy 直接学“在这个观测下该输出什么动作”;LeWM 这一类世界模型先学“动作会把环境推到哪里”,再通过预测结果做规划。前者工程闭环更短,适合先跑通;后者更接近后续做规划、筛选动作和失败预判。

后面我不会再同时开 Pi0、SmolVLA、OpenVLA、GR00T。下一步先做两个小实验:第一,把 ACT 的成功率评估补全,固定 20 条初始状态,看 rollout 真实成功次数;第二,把 LeWM 的 cube 训练补到官方完整轮次,再把成功判定从 0.04 m 距离扩展到抓取过程和稳定保持。等这两个数,再去比较 Pi0 或 SmolVLA 。

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐