CALM:把动捕数据「编成 64 维潜向量」,让角色像玩游戏一样被指挥
z。策略只要拿到这个码,就能做出和那类动作风格相似的运动——不必精确复制,但「一望即知」是哪个动作。训练时用「条件判别器」逼策略「这个 z 必须做出对应的动作」,避免之前 ASE 那种「学了一堆动作但 latent 乱成一锅粥、没法指挥」的问题。
🎯 为什么重要:「多样性」和「可控性」的两难
做一个游戏里的虚拟角色,要同时满足:
① 多样——会走、会跑、会蹲走、会挥剑、会踢腿……动作库越大越好;
② 可控——你说「蹲走到目标前,踢一脚,再庆祝」它就照做。
但之前的范式都只能拿一个:
· DeepMimic:一个动作训一个策略——精确但不可扩展;
· AMP:学风格分布——多样但无法指定具体动作;
· ASE(前作):引入 latent + 互信息——能多样,但 latent 没有语义结构,同一个 z 可能跑出完全不同的动作(mode collapse),控制精度只 35%。
CALM 的目标:潜空间既要多样,又要语义清晰——给定一个 z,策略必须稳定地做出对应的动作。这样的话,「游戏手柄式」控制才能实现:玩家选动作(提供 z)+ 选方向(提供目标),角色立刻执行。
💡 核心思想:条件判别器 + 端到端编码器
最关键的一点:判别器也看 z。以前 ASE 的判别器只问「这动作像不像数据集」,策略随便挑一个能蒙混过关的动作就行。CALM 的判别器问「这动作像不像 z 所指定的那段动作」——同一个 z 必须稳定映射到同一类动作,潜空间立刻有了语义。
🛠️ 让潜空间「语义清晰」的 4 个关键设计
| 设计 | 具体做法 | 为什么必要 |
|---|---|---|
| ① 条件判别器 | D(s, s' | z) 同时吃状态转移和 latent;损失见公式 (3)、(7) | 让相同 z 产生相似动作——潜空间具备语义结构,这是 ASE 没做到的 |
| ② 单位超球面 latent | 把编码器输出归一化到 L2 单位球面(64 维) | 固定范数提升训练稳定性;避免推理时采到 OOD 的 z 产生怪动作 |
| ③ 对齐 + 均匀损失 | Lalign:同一动捕中重叠的 2 秒子序列 → z 相近;Luniform:随机子序列 → z 分散 | 潜空间既「同类聚」又「异类分」,插值有意义(如「跑→蹲走」平滑过渡) |
| ④ 随机切换条件 + 梯度惩罚 | 训练时在随机时刻切换 M,让策略学切换;wgp 加梯度惩罚,阻断判别器梯度回传到编码器 | 切换训练让角色能流畅衔接动作;stop-grad 让编码器只服务于策略目标,不被判别器「带跑」 |
三阶段流程:
- Phase 1 低层预训练:联合训练 E 和 π,用条件判别器 + 互信息;50 亿步(5B),4096 个 Isaac Gym 并行环境,单 A100。
- Phase 2 精度训练:冻结 E 和 π;训高层策略,让它输出既朝目标方向、又接近期望 ẑ 的 z_t。奖励
r = exp(-0.25·d_err) + exp(-4·‖z_t − ẑ‖²)。 - Phase 3 推理(零样本):用 FSM(有限状态机)把「走到位 → 踢 → 庆祝」这种规则序列化编排,不重训、不写 reward。
ASE 的潜空间像没有标签的聚类——它只要求「不同的 z 给不同的动作」,但哪个 z 对应哪个动作完全是抽奖。CALM 的条件判别器相当于给每个 z 贴了张「身份卡」:训练时就告诉它「z=E(M) 必须做出像 M 的动作」。这样一来,latent 空间就有了语义——你拿一段新动捕编码成 ẑ,策略就能有目的地做出来,而不是「随便挑一个看起来像的动作」。
📊 关键结果:可控性 35% → 78%,零样本解多步任务
| 训练规模 | 数字 |
|---|---|
| 动捕数据 | 160 段 / 30+ 分钟(Reallusion) |
| 训练规模 | 4096 Isaac Gym 并行环境,单 A100,50 亿步(5B) |
| 控制频率 | 低层 30 Hz,高层 6 Hz |
| 潜空间 | 64 维单位超球面 |
| 子动作长度 | 2 秒(重叠切分) |
Table 1:预训练质量(vs ASE)——编码器更清晰、动作更多样、控制更准:
| 方法 | Encoder 质量 ↓(Fisher) | 多样性 ↑(Inception) | 可控性 ↑(人评准确率) |
|---|---|---|---|
| ASE(前作) | 0.68 | 18.6 ± 0.4 | 35% |
| CALM(本文) | 0.23 | 19.8 ± 0.1 | 78% |
Table 2:零样本任务求解(Heading / Location / Strike)——同一个低层 + 高层策略,FSM 编排:
| 移动风格 | Heading 风格分 | Location 终点分 | Strike 终点分 |
|---|---|---|---|
| Run(跑) | 0.92 | 0.99 | 1.00 |
| Walk(走,含抬盾/空手) | 0.81–0.92 | 0.99–1.00 | 0.96–1.00 |
| Crouch-Walk(蹲走) | 0.91–0.94 | 0.99 | 0.99–1.00 |
所有任务都用同一套预训练模型,只是 FSM 不同。Location 任务示例:「crouch-walk 走到目标 → crouch-idle 站定」;Strike 任务示例:「crouch-walk 接近 → 挥剑 / 踢 / 举盾冲撞」。组合数 = 3 种步态 × 3 种终结动作 = 9 种任务变体,全部零样本解出。
🌐 在领域中的位置
CALM 是 AMP/ASE 谱系里「可控性」的关键跃迁。它的「条件判别器 + 单位球 latent + 对齐/均匀损失」成了后续 latent skill 工作(PADL、Nexus 等)的基础设施。关联线索:T04 AMP 谱系。
❓ 常见误区
CALM 和 AMP 都是「对抗模仿学习」,差别在哪?
AMP 的判别器是无条件的——只问「这动作像不像数据集」。策略可以随便挑一个动作做。CALM 的判别器是条件的——「给定 z,这动作像不像 z 对应那段」。这强制 z 有语义,策略必须按 z 做对应动作。
训练后给一段没见过的动捕,能直接编码成 z 用吗?
不一定。论文 §9 明确指出:对 in-distribution 的动作效果好;OOD 动作(如脚尖走 → 误映射成「弹跳走」)质量不保。这是 CALM 的开放问题,未来方向是扩大训练数据分布。
FSM 是不是一种「倒退」?为什么不用学习的高层?
不倒退,是有意为之。FSM 提供了可解释、可控、零样本的任务设计接口——像游戏设计师用手柄指挥角色。学会的高层策略(Phase 2)负责方向控制,FSM 负责动作选择,两者互补。这种「学习 + 规则」的混合范式比纯端到端更实用。
潜空间为什么是 64 维球面?
64 维足够表达多样动作(实验经验值);单位球面约束让所有 z 范数一致——避免策略在某些方向上「过度敏感」,也防止推理时采到怪异 z 导致 OOD 动作。这是对比学习方法里常见的技巧(SimCLR 等)。