P-CALM-2023 · 条件化对抗 latent(让技能可指挥)
一句话定位:ASE 的"无监督 latent skill"路线继承者,把判别器从 $D(s,s')$ 改成条件化 $D(s,s'\mid z)$——让 latent space 自带语义结构、可直接被"指定技能"指挥,配合 precision training 二阶段配方实现"用 FSM 而非 reward 拼任务"。
完整引用:Chen Tessler, Yoni Kasten, Yunrong Guo, Shie Mannor, Gal Chechik, Xue Bin Peng. CALM: Conditional Adversarial Latent Models for Directable Virtual Characters. ACM SIGGRAPH 2023 / ACM TOG 42(4). arXiv:2305.02195.
机构:NVIDIA (Israel / Canada) + Technion + Bar-Ilan University + Simon Fraser University
在线索中的位置:见 T04-motion-prior-amp-to-bfm.md 转折 3(与 ASE、Multi-AMP 同列「结构化 latent skill」一代;为 PHC/PULSE/MaskedMimic 铺路)。
动机:ASE 学出了 diverse skill,但 latent 不可指挥
ASE [Peng et al. 2022, arXiv:2205.01906](本仓库 P-ASE-2022.md)解决了 AMP 的"prior 压成单一 reward、无内部结构"问题:训一个 low-level controller 吃 64 维 latent $z$、用 mutual information + diversity loss 让 $z$ 自发对应不同技能。但 ASE 留下两个硬伤:
- latent space 没有全局语义结构:两个语义相近的 motion(如 "walk" 和 "crouch-walk")在 $z$ 空间里不一定近;随便采一个 $z$ 不知道会出什么动作。
- mode collapse 仍未根治:mutual information + diversity 只能在统计层面逼 diversity,policy 仍然会找到判别器高分的局部最优反复刷。
后果:ASE 的 latent 没法被用户直接指挥。你想让角色"朝目标 crouch-walk 走过去、到了之后 kick、然后 celebrate",ASE 做不到——它没有从 motion 到 latent 的可映射接口。
CALM 的洞察是:判别器的输入要带上 latent $z$。判别器不再是"分辨人 / 机器人",而是"分辨给定这个 $z$ 时,policy 出的 transition 是否像这个 $z$ 对应的 reference"。这一个改动让 $z$ 必须自带语义(否则判别器无法做条件匹配),同时也自然有了 motion→latent 的可编码映射(encoder 学着把 motion 压到正确 $z$)。
方法核心
1. 三阶段框架(Fig.2)
| 阶段 | 训练对象 | 监督来源 |
|---|---|---|
| Stage 1 · Low-level | encoder $E$ + low-level policy $\pi(a\mid s,z)$ | 条件化判别器 $D(s,s'\mid z)$ |
| Stage 2 · Precision training | high-level policy $\pi^H(z_t\mid s_t, \hat z, d^*_t)$ | task reward + latent similarity |
| Stage 3 · Inference | 冻结所有模型,用 FSM 拼任务 | 无训练 |
核心目标(Eq.2):让 policy 的 transition 分布 $d^\pi(s,s'\mid z)$ 在 Jensen-Shannon 散度下接近 reference 的 $d^M(\hat s,\hat s')$。这是 GAIfO [Torabi et al. 2018](Generative Adversarial Imitation from Observation)的条件化版本。
2. 条件化判别器与 policy reward(Eq.3 / Eq.4 / Eq.7)
判别器损失:
$$\mathcal{L}_D = -\mathbb{E}_{M\in\mathcal{M}}\Big[\mathbb{E}_{d^M}\log D(\hat s,\hat s'\mid z) + \mathbb{E}_{d^\pi(z)}\log(1 - D(s,s'\mid z))\Big],\quad z = E(M)$$
policy 奖励:
$$r(s_t, s_{t+1}, z) = -\log\!\big(1 - D(s_t, s_{t+1}\mid z)\big)$$
⚠️ 关键工程细节(Eq.7):判别器还加 negative sampling 项 $\log(1 - D(s,s'\mid z'\sim\mathcal{Z}))$——给判别器看"用别的 $z'$ 生成的 transition、但假装条件是 $z$"的负样本,逼判别器真的学到"$z$ 的语义"而不是只记 motion。再加 gradient penalty 系数 $w_{gp}$(AMP 风格)。
⚠️ stop-gradient:判别器的梯度不回传到 encoder(Eq.7 末尾 $z = \text{stop grad}(E(M))$)。encoder 只通过 policy 的 reward 信号学——避免判别器把 encoder 拉向"判别容易"的方向而非"控制有用"的方向。
3. 让 latent space 自带结构的四个 trick(Sec.5.1)
ASE latent 不可控的根因是没有 explicit 结构约束。CALM 加四味药:
(a) L2 单位超球面:encoder 输出 project 到 $\|z\|_2 = 1$。理由:(i) 固定 norm 提升训练稳定性(dot product 常用);(ii) 避免 inference 时采到 OOD 潜在导致非自然动作。
(b) Sub-motion splitting:每条 motion 切成 2 秒重叠子片段。理由:sub-motion 内时序邻近 → 特征相近,可作为 alignment 信号;2 秒足够呈现完整技能特征。
(c) Alignment + uniformity loss(Wang & Isola 2020):
$$\mathcal{L}_{\text{align}} = \mathbb{E}_{(M,M')\text{ overlapping}}\|E(M) - E(M')\|^2$$
$$\mathcal{L}_{\text{uniform}} = \log\mathbb{E}_{(M,M')\text{ i.i.d.}}\exp\big(-2\|E(M) - E(M')\|^2\big)$$
Alignment 拉同时段重叠子片段靠近、uniformity 推随机采子片段远离。这两项联合逼 latent space 形成有意义拓扑。
(d) Skill transitions:rollout 中随机时刻切换 conditional motion $M$(从而 $z = E(M)$)。policy 必须学会在任意时刻切换技能——下游 FSM 拼任务的前提。
4. Precision training:高层 policy 学"方向"(Sec.6.1)
Low-level policy 只知道"做哪种技能",不知道"朝哪个方向做"。Stage 2 训一个 high-level policy $\pi^H(z_t \mid s_t, \hat z, d^\ast_t)$:给它"想要的技能编码 $\hat z = E(M)$" + "想要的方向 $d^\ast_t$",输出实际的 $z_t$ 给 low-level。Reward(Eq.8):
$$r_t^{\text{locomotion}} = \exp\!\big(-0.25\,d(d^*_t, \dot x_t^{\text{root}})\big) + \exp\!\big(-4\|z_t - \hat z\|^2\big)$$
两项:方向对(root 速度方向匹配 $d^*_t$)+ latent 接近参考(保持技能风格)。高/低层频率不同:low-level 30 Hz、high-level 6 Hz——典型的 options framework。
5. Inference:FSM 拼,零训练(Sec.6.2)
部署时所有模型冻结。任务用 FSM 描述,例:
- Strike 任务 = "run towards object" → 距离 < 0.5m 时切到 "perform attack" → 完成后 "stand idle";
- Location + 庆祝 = "crouch-walk to target" → 到达后 "celebrate (arms-up)"。
FSM 在每一步根据 state 决定:是给 high-level policy $(\hat z, d^*_t)$、还是直接给 low-level 一个 isolated $z$(如剑舞的某一招)。整个过程零训练、零 reward 设计——CALM 的核心卖点。
6. 架构与训练超参(Sec.7 + 8.1.1)
| 组件 | 结构 |
|---|---|
| Encoder $E$ | MLP(motion → 64D 超球面 latent) |
| Policy $\pi$ | MLP,含额外 $H(z)$ head 解析 latent,再 $\pi(s, H(z)) \to a$,$a\in\mathbb{R}^{31}$ |
| Discriminator $D$ | 与 policy 同构(额外 $H(z)$ head) |
| High-level policy | 独立网络 |
- 数据:160 motion clips、共 ~30 分钟(Reallusion 2022 数据集)——比 PHC/MaskedMimic 后续用的 AMASS 小 1-2 个数量级;
- 训练:Isaac Gym,4096 并行环境,单 A100,~50 亿步;
- 频率:low-level 30 Hz、high-level 6 Hz;
- Latent:64D 单位超球面;
- 优化:PPO 训 policy。
关键实验
Table 1 · 预训练质量(CALM vs ASE):
| 指标 | CALM | ASE | 说明 |
|---|---|---|---|
| Encoder quality ↓ | 0.23 | 0.68 | Fisher 类可分性(within-class 紧凑度,越低越好) |
| Diversity ↑ | 19.8 ± 0.1 | 18.6 ± 0.4 | Inception Score(越大越 diverse) |
| Controllability ↑ | 78% | 35% | 用户研究:给定 motion + 文字描述,让人判别生成是否匹配 |
CALM 在三项上都赢,Controllability 翻倍(35% → 78%)——直接证明条件化判别器让 latent 真的"对应"了 motion。
Table 2 · FSM 拼任务的 zero-shot 表现(location / heading / strike 三个任务 × 三种 loco 风格 × 多种 finish motion):
- 几乎所有组合成功率 0.92–1.00;
- 风格保真(heading style score 0.81-0.99)与方向准确同时达到;
- 最弱一项是 "walk + heading style"(0.81),作者归因于 walk 速度区间和 run/crouch 重叠。
Fig.3e · 插值实验:把 "sprinting" 与 "crouching idle" 两个 latent 在 64D 球面上线性插值,policy 平滑过渡:速度单调下降、高度单调下降、中间保持"某种走"——证明 latent space 拓扑有意义,这是 ASE 做不到的。
为什么重要
- 条件化判别器 = latent space 自带语义。ASE 用 mutual information 隐式逼 diversity,但 latent 是"暗码";CALM 把 $z$ 显式塞进判别器,让 $z$ 必须"对应到具体 motion"才能骗过 $D$。这一个改动让 latent 从可生成升级到可指挥——是后续 PHC / PULSE / MaskedMimic / HOVER 等"可控 controller"路线的方法论起点。
- alignment + uniformity loss 把对比学习引入物理角色控制。Wang & Isola 2020 的对比损失(本来用于表征学习)第一次被搬到 motion latent 上,给后续"motion 嵌入空间"工作(MDM、MotionGPT 的 motion tokenizer)提供了 baseline 思路。
- precision training = 干净的两阶段配方。Stage 1 学技能、Stage 2 学方向,二者解耦。后续 humanoid 工作(OmniH2O 等)的"low-level tracker + high-level controller"分层都受此启发。
- FSM 替代 reward 第一次让"任务设计"从"写 reward function"转移到"组合约束"——这一思想后来被 MaskedMimic 显式类比为 prompt-engineering,被 BeyondMimic 用 guided diffusion 进一步发扬。
- 奠定了 NVIDIA 的物理角色控制路线:CALM → ASE 升级 → MaskedMimic → BeyondMimic / HOVER / OmniH2O 的演进链条清晰可见,每一步都在"加 modality"或"加可指挥性"。
局限
- 数据集小(160 clips / 30 分钟)。相比 PHC/MaskedMimic 用的 AMASS(40h+、上千 clips),CALM 的技能覆盖很窄——它解决的是"如何学可控 latent",不是"如何 scale 到全人类 motion 词汇"。
- 仍然需要 Stage 2 high-level policy 训练。每个新方向类任务都要训一个 $\pi^H$。MaskedMimic 后来证明这个 high-level 可以用一个 unified controller 替代,CALM 没走到那一步。
- latent 仍然抽象。用户不能直接说"walk"——必须先有 motion clip $M$,encode 出 $z$,再用 $z$ 指挥。text-to-motion 接口需要 PADL/SuperPADL 的语言监督延伸(CALM 明确选择"无监督",是 trade-off)。
- conditional discriminator 比 AMP/ASE 更容易过拟合。论文用 negative sampling + gradient penalty 缓解,但训练曲线仍不如 unconditional 稳。
- skill transitions 是手工训练 trick:随机时刻切 $M$ 让 policy 学过渡——但这意味着"切到没见过的 motion 组合"还是不行。
- 没有 terrain / object / interaction。CALM 只解决 flat 地面的 loco + 单技能切换,复杂场景需要 PACER++ / InterPhys 等后续工作补。
复现要点
以下要点基于论文 Sec.5–7 + Eq.3–8 + Table 1-2。可作为复现起点。
- 判别器必须是 conditional $D(s, s'\mid z)$:latent $z$ 通过额外 head $H(z)$ 喂入判别器。不要把 $z$ 拼进 $s$——单独 head 让 $z$ 与 $s$ 在判别器内部交互更稳。
- encoder 输出 L2 归一化到单位球面,不做归一化训不出来稳定的语义 latent。
- 对齐 + 均匀损失 $\mathcal{L}_{\text{align}} + \mathcal{L}_{\text{uniform}}$ 必须加。论文用 Wang & Isola 2020 的 $\sigma=2$ 形式。
- stop-gradient on encoder when training D:判别器梯度不回传到 encoder。encoder 只由 policy reward 训练。
- negative sampling:每 batch 多采一个 $z'\sim\mathcal{Z}$,给判别器看 $D(s, s'\mid z')$ 当负样本。
- gradient penalty $w_{gp}$:沿用 AMP 的设置(约 5-10)。
- sub-motion 切片 2 秒、50% 重叠:太短学不到技能特征、太长 encoder 容量不够。
- skill transitions:rollout 时随机时刻切 $M$(典型每 1-2 秒切一次)。
- 数据:~160 motion clips;低层 policy 30 Hz、高层 6 Hz;latent 64D。
- 训练规模:Isaac Gym 4096 envs、单 A100、~5B 步。
- PPO 标准配置;critic 与 policy 同构。
- 常见坑:(1) 漏掉 negative sampling → 判别器只学到"是 motion 不是 motion",latent 退化;(2) 忘了 stop-grad → encoder 学到"骗判别器"的 degenerate 表示;(3) 不加 alignment loss → 插值不平滑;(4) Stage 2 不冻结 encoder/low-level → 灾难性遗忘。
延伸
- 建立在:AMP [Peng et al. 2021, arXiv:2104.02180](本仓库 P-AMP-2021.md,判别器式 prior 起点)、ASE [Peng et al. 2022, arXiv:2205.01906](本仓库 P-ASE-2022.md,latent skill 直接前作)、GAIL/GAIfO [Ho & Ermon 2016; Torabi et al. 2018, arXiv:1807.06158](observation-only 对抗模仿)、Wang & Isola 2020 [arXiv:2005.10242](alignment + uniformity 对比损失)。
- 引出:PHC [Luo et al. 2023, arXiv:2305.06456](universal tracker,把 CALM 的 latent 思路 scale 到 AMASS)、PULSE [Luo et al. 2024](PHC 续作,physics-based universal latent skill)、MaskedMimic [Tessler et al. 2024, arXiv:2409.14393](本仓库 P-MaskedMimic-2024.md,把"可控 latent"升级为"任意 modality inpainting",unified controller 路线顶峰)、PADL/SuperPADL [Juravsky et al. 2022/2024](语言监督的对照路线)。
- 本仓库笔记:T04-motion-prior-amp-to-bfm.md(转折 3「结构化 latent skill」一节,与 ASE/Multi-AMP 同列)、P-AMP-2021.md、P-ASE-2022.md、P-MaskedMimic-2024.md、P-PHCUHC-2023.md。