里程碑
数据集CMU MoCap
物理感知
实时
输入模态proprioception

AMP:让物理角色「写得像」动捕演员的对抗式模仿学习

Xue Bin Peng, Ze Ma, Pieter Abbeel, Sergey Levine, Angjoo Kanazawa(UC Berkeley + 上海交大)。ACM TOG (SIGGRAPH) 40(4), Article 1, 2021;arXiv:2104.02180。 imitationphysics-based characterGAIL 线索 T02

🧠 一句话心智模型:不再手写「角色每个关节该贴哪个参考姿态」的奖励函数——而是训练一个判别器,让它像 GAN 里的裁判一样,看一段动作「像不像数据集里的人」。判别器输出的「像不像分数」直接当奖励,驱动 RL 策略自己走出有风格的动作。姿态对齐、动作选择、片段切换全交给对抗训练自动涌现

🎯 为什么重要:物理动画的「奖励函数工程」瓶颈

物理模拟角色(人、T-Rex、狗)要做出自然的动作,传统做法是tracking:给一个参考动捕片段,让角色逐步贴住参考姿态。这套范式有两个老大难:

核心矛盾
奖励要手写——每个动作都要人工设计「姿态误差」度量并调参(对称、稳定、能耗……),不可跨技能通用;
数据集一大就崩——扩展到几十段混杂的动捕片段时,必须额外搭一个 motion planner 决定「这一帧该贴哪段参考」,并做片段对齐(phase variable)。一旦对齐失败,整套就崩。

AMP 的回答是:把「跟踪某个姿态」换成「让判别器相信你来自数据集」。这样不需要相位同步,也不需要选片段——所有片段组成一个「风格分布」,策略只要落在这个分布里就行。这也是把 GAIL(Generative Adversarial Imitation Learning)首次大规模、稳定地搬进物理角色动画的里程碑论文。

💡 核心思想:把「风格」变成一个判别器

整个系统把奖励拆成两项,线性组合:

r = wG · rG(任务) + wS · rS(风格),论文中 wG=wS=0.5

  • 任务奖励 rG:人来写,但写得很简单——「朝目标走」、「击中目标」、「带球到位置」。完全不管风格。
  • 风格奖励 rS判别器来打分。判别器看一个状态转移 (st, st+1),输出「这看起来像不像数据集里的动作」。越像,奖励越高。
动捕数据集 M 跑/跳/打拳/翻…(混杂) 策略 π(角色) 在物理模拟器里跑 判别器 D(s,s') 「这动作像真人吗?」 + 梯度惩罚 + LSGAN 风格 rS 任务 rG 「向目标走」 总奖励 r → PPO 更新 π
图 1:AMP 的训练循环。判别器 D 把「风格」抽象成一个二分类问题;策略为了拿到风格分,自动学会像数据集那样动。

关键在于:判别器看的是「状态转移」(连续两帧的姿态变化),不依赖任何动作标签,也不和某段参考同步——所以它学的是一个分布,不是一条轨迹。策略落在这个分布里,任务奖励把它导向目标,「在哪儿切换步态」「该不该跳」都自然涌现。

🛠️ 让 GAN 在物理角色上真稳的 4 个关键设计

裸的 GAIL 直接搬到物理角色会崩——判别器太强、梯度爆炸、模式坍缩。论文给了 4 个稳定化的工程决策,每个都通过消融证明「拿掉就完蛋」:

设计具体做法为什么必要
① 从观测模仿(state-only)判别器输入 D(s, s'),不依赖演示动作 a动捕数据只有姿态,没有「动作」(关节力矩)。这也是和原版 GAIL 的关键差别
② 最小二乘判别器(LSGAN)用 L2 损失替代 sigmoid 交叉熵避免判别器自信到「梯度消失」,训练更稳,最终奖励被裁剪到 [0,1] 区间
③ 精心设计的观测特征 Φ(s)根(骨盆)线/角速度、每个关节的局部旋转+局部速度、末端效应器(手脚)3D 位置尤其 关节速度 不能少:少了它,角色学翻滚时会偷懒「趴在地上不动」
④ 梯度惩罚(gradient penalty)对真实样本加 wgp·‖∇φD‖² 项,wgp=10消融里这是最关键的一项——不加,训练剧烈震荡、动作出伪影

把这些和 PPO + reference state initialization(从数据集随机采样初始状态)+ early termination(除脚之外碰地就终止) 拼起来,整个训练循环见论文 Algorithm 1。每个 batch 还会把策略轨迹塞进 replay buffer B,判别器从 B 和 M 共同采样,避免对最新 batch 过拟合。

🔮 直觉:为什么不需要 motion planner?
传统做法要规划器选「现在该跟哪段参考」,因为跟踪目标必须唯一。AMP 的判别器只问「这一步像不像人」,任何看起来像人的走法都给分。所以策略可以自由地:走→跑(速度切换)、走→拳(远→近),甚至组合出数据集里没有的新动作(如向前摔倒时自动抱团滚一下,再爬起来)——这些都没有显式编进数据集,是 reward landscape 自己逼出来的。

📊 关键结果:可比 tracking,且支持大尺度非结构化数据集

维度数字(来自 PDF)
角色34 DoF 人形 / 59 DoF 霸王龙 / 64 DoF 狗
最大数据集56 段 clips / 434 秒 / 8 个演员(Locomotion)
训练规模100–300M 样本;30–140 小时 / 16 CPU cores
模拟器Bullet,1.2 kHz 物理;策略 30 Hz
奖励权重wG = wS = 0.5(所有任务统一)
梯度惩罚wgp = 10

Table 1(任务回报,归一化到 [0,1],3 个种子 × 32 episodes)——同一个 34 DoF 人形换不同数据集,就能换不同风格:

任务数据集Task Return
Target Heading(沿方向跑)Locomotion(混合)0.90 ± 0.01
Target HeadingZombie(丧尸)0.94 ± 0.00
Target HeadingStealthy(潜行)0.89 ± 0.02
Target Heading仅 Walk0.46 ± 0.01(学不会跑)
Dribble(带球)Locomotion0.78 ± 0.05
Strike(走到位 + 出拳)Walk + Punch0.73 ± 0.02
Obstacles(跨障)Run + Leap + Roll0.27 ± 0.10(最难)

Table 3(单片段模仿,平均姿态误差,单位米)——和 DeepMimic 跟踪法(要手写 reward)对比,AMP 不写 reward 也能逼近

动作DeepMimic 跟踪AMP(本文)
Cartwheel(侧翻)0.039 ± 0.0110.067 ± 0.014
Walk0.018 ± 0.0050.030 ± 0.001
Run0.028 ± 0.0020.075 ± 0.015
Back-Flip0.076 ± 0.0210.150 ± 0.028
Dog - Canter0.026 ± 0.0020.034 ± 0.002
关键洞察:在单片段任务上 AMP 仍略输 tracking(因为它没用相位同步),但它的真正胜利在多片段 + 风格迁移 + 跨任务——这些场景下 tracking 根本无法直接套用。论文 §8.3 还对比了 latent space model:AMP 不需要预训练、动作更自然、风格保持更好。

🌐 在领域中的位置

DeepMimic 2018(跟踪 + 手写 reward + phase) AMP 2021(对抗式 motion prior)⭐ ASE / CALM 2022-23(把 prior 模块化、潜空间) Poli 2023 / AMP-Humanoid + 视觉(真机/具身)

AMP 是物理角色「对抗模仿」范式的奠基。它把「风格」从一种手工 reward 变成了一个可学习、可迁移、可组合的先验。后续工作(ASE、CALM、PADL)把这个先验模块化、层次化。需要指出:扩散时代的运动生成工作(如 MDM)是运动学扩散模型,不涉及物理仿真与 AMP;BeyondMimic 走的是 DeepMimic 式跟踪 + 引导扩散路线,也并未使用 AMP 的对抗判别器——这两者与 AMP 是并列而非继承关系。真正直接继承 AMP 判别器思想的是 ASE/CALM 等物理角色工作。关联线索:T04 AMP 谱系

❓ 常见误区

AMP 是模仿学习还是强化学习?

两者都是。判别器负责「模仿」(从数据集学风格),PPO 负责「强化」(朝任务目标优化)。这是 GAIL 的精髓:把模仿学习问题转化成一个 RL 问题,reward 由判别器提供

它和 DeepMimic 的根本差别?

DeepMimic 跟踪某段具体参考,需要 phase 变量把策略和参考对齐;AMP 学的是分布,不与任何具体片段对齐,因此可以无缝吃下大杂烩数据集,并涌现组合行为。代价:单片段精度略低(见表 3)。

判别器不会像 GAN 一样模式坍缩吗?

会,论文 §8.3 末(Comparisons 章节结尾,紧接 §9 Discussion)明确指出这是 AMP 的主要局限:面对大多样化数据集,策略可能只模仿其中一小撮动作。replay buffer + LSGAN + 梯度惩罚能缓解,但没根除——这也是后来 ASE 引入潜空间(skill embedding)和层次化结构的动机之一(用潜在技能码显式条件策略,避免坍缩到单一动作)。

训练真的要 100M+ 样本?

是的。物理仿真便宜,但 RL+GAN 的样本效率不高,单任务 30–140 CPU-小时是当时的常态。后续工作(如 PADL、PHC)的一大改进方向就是把 prior 抽出来复用,避免每个任务都从头练。