里程碑
数据集AMASS
物理感知
输入模态proprioception

CALM:把动捕数据「编成 64 维潜向量」,让角色像玩游戏一样被指挥

Chen Tessler, Yoni Kasten, Yunrong Guo, Shie Mannor, Gal Chechik, Xue Bin Peng(NVIDIA + Technion + Bar-Ilan + SFU)。arXiv:2305.02195(arXiv preprint v1, 2023-05;PDF 未注明正式 venue)。 physics-based characterlatent skill 线索 T02

🧠 一句话心智模型:把每段动捕动作压缩成一个 64 维「身份码」z。策略只要拿到这个码,就能做出和那类动作风格相似的运动——不必精确复制,但「一望即知」是哪个动作。训练时用「条件判别器」逼策略「这个 z 必须做出对应的动作」,避免之前 ASE 那种「学了一堆动作但 latent 乱成一锅粥、没法指挥」的问题。

🎯 为什么重要:「多样性」和「可控性」的两难

做一个游戏里的虚拟角色,要同时满足:

核心矛盾
多样——会走、会跑、会蹲走、会挥剑、会踢腿……动作库越大越好;
可控——你说「蹲走到目标前,踢一脚,再庆祝」它就照做。
但之前的范式都只能拿一个
· DeepMimic:一个动作训一个策略——精确但不可扩展
· AMP:学风格分布——多样但无法指定具体动作
· ASE(前作):引入 latent + 互信息——能多样,但 latent 没有语义结构,同一个 z 可能跑出完全不同的动作(mode collapse),控制精度只 35%

CALM 的目标:潜空间既要多样,又要语义清晰——给定一个 z,策略必须稳定地做出对应的动作。这样的话,「游戏手柄式」控制才能实现:玩家选动作(提供 z)+ 选方向(提供目标),角色立刻执行。

💡 核心思想:条件判别器 + 端到端编码器

动捕数据集 M 160 段 / 30 分钟 切成 2 秒子序列 编码器 E MLP → 64 维球面 z latent z unit L2 ball 低层策略 π(a|s,z) PPO 训练,30 Hz 条件判别器 D(s, s' | z) 「这个状态转移 真的 像是 z 对应的动作吗?」 关键创新:判别器也吃 z → 同一个 z 必须稳定输出同一类动作 reward 动作 + 梯度惩罚 Phase 2 高层策略:给方向 + 期望风格 ẑ → 选 z_t Phase 3 推理:FSM 直接选 z,零样本解任务
图 1:CALM 三阶段。条件判别器是「让潜空间有语义」的关键——它强制策略「这个 z 必须做出像 z 对应数据那样的动作」,不能再随便 mode collapse。

最关键的一点:判别器也看 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 让编码器只服务于策略目标,不被判别器「带跑」

三阶段流程:

  1. Phase 1 低层预训练:联合训练 E 和 π,用条件判别器 + 互信息;50 亿步(5B),4096 个 Isaac Gym 并行环境,单 A100。
  2. Phase 2 精度训练:冻结 E 和 π;训高层策略,让它输出既朝目标方向、又接近期望 ẑ 的 z_t。奖励 r = exp(-0.25·d_err) + exp(-4·‖z_t − ẑ‖²)
  3. Phase 3 推理(零样本):用 FSM(有限状态机)把「走到位 → 踢 → 庆祝」这种规则序列化编排,不重训、不写 reward
🔮 直觉:为什么「条件判别器」比 ASE 的「互信息 + 多样性损失」更有效?
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.6818.6 ± 0.435%
CALM(本文)0.2319.8 ± 0.178%

Table 2:零样本任务求解(Heading / Location / Strike)——同一个低层 + 高层策略,FSM 编排:

移动风格Heading 风格分Location 终点分Strike 终点分
Run(跑)0.920.991.00
Walk(走,含抬盾/空手)0.81–0.920.99–1.000.96–1.00
Crouch-Walk(蹲走)0.91–0.940.990.99–1.00

所有任务都用同一套预训练模型,只是 FSM 不同。Location 任务示例:「crouch-walk 走到目标 → crouch-idle 站定」;Strike 任务示例:「crouch-walk 接近 → 挥剑 / 踢 / 举盾冲撞」。组合数 = 3 种步态 × 3 种终结动作 = 9 种任务变体,全部零样本解出。

关键洞察:CALM 的真正贡献是「可控性提升 2.2 倍」(35%→78%)。这把「学习驱动的虚拟角色」从「能做出酷动作但不能指挥」推进到「像玩游戏一样精确指挥」——FSM 编排让任务设计从「写 reward 函数」变成「写状态机」,门槛骤降。

🌐 在领域中的位置

DeepMimic 2018(一动作一策略) AMP 2021(风格分布,无具体控制) ASE 2022(latent + 互信息,但潜空间无语义) CALM 2023(条件判别器 + 可语义潜空间)⭐ PADL / Nexus(语言/分层控制)

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 等)。