P-DeepMimic-2018 · Example-Guided Deep RL of Physics-Based Character Skills
作者 / 机构:Xue Bin Peng, Pieter Abbeel, Sergey Levine (UC Berkeley); Michiel van de Panne (UBC)
发表:ACM SIGGRAPH 2018 / ACM TOG 37(4), Article 143
arxiv:1804.02717 · 代码:github.com/xbpeng/DeepMimic(C++/Python,Bullet) · 项目页:xbpeng.github.io/projects/DeepMimic/
在线索中的位置:T04 (motion prior) 与 T12 (agile locomotion) 的共同起点;AMP 的直接前作,奠定「reference-state alignment」范式。
一句话定位:第一篇用 RL + MoCap 学会 backflip/spinkick/cartwheel 等高动态技能的工作——核心贡献不是算法(PPO)而是 reward 设计 + RSI + early termination 三件套,从此物理角色动画进入「数据驱动 + RL」时代。
动机
2018 年前,deep RL 已经能在仿真里学到走、跑(Heess et al. 2017 等),但生成的动作"丑且怪":上肢多余晃动、步态诡异、姿态不自然。问题根源是纯 task reward(前进速度、不摔倒)信息太稀疏,policy 找到的是"满足物理约束的任何解",不一定是"像人的解"。
同时,kinematic 方法(直接回放动捕)虽然动作好看,但不抗扰动、不与环境交互。DeepMimic 的洞察:把 MoCap 从"被回放的目标姿态"升级为"被对齐的参考状态",让 reward 每一步都对照参考,policy 就有了一条精细的稠密信号;再叠加上 task objective(如指定方向走),就能得到"好看且可交互"的控制器。这其实是对 [Peng et al. 2016](MACE)思路的深度化与大规模化。
方法核心
以下细节全部来自 PDF 正文 Sec.5–7 + Appendix(页码 143:4–143:7、143:15–143:16)。
1. 状态、动作、参考
- State $s$:每条 link 相对 root(pelvis)的位置、四元数旋转、线/角速度,全部在角色局部坐标系(root 在原点,x 轴朝 facing 方向)。再加一个 phase variable $\phi \in [0,1]$($\phi=0$ 周期起点、$\phi=1$ 周期终点;cyclic motion 每周期 reset)。任务里再加 goal $g$(如目标方向 2D 单位向量)。
- Action $a$:不是 torque,而是 PD controller 的目标朝向——spherical joint 用 axis-angle、revolute joint 用标量角。这是关键设计:PD 把"低层阻尼/局部反馈"抽象掉,policy 不必学底层控制。policy 以 30 Hz 查询。
- 参考 motion $\{\hat{q}_t\}$:MoCap(CMU/SFU)或 artist keyframe(T-Rex/dragon 没有 MoCap),手工 retarget 到角色。
2. 精确 reward 公式(Sec.5.3,可直接复现)
每步总 reward 是 imitation 和 task 两项加权和:
$$r_t = \omega^I r_t^I + \omega^G r_t^G, \quad \omega^I = 0.7,\ \omega^G = 0.3\ \text{(所有任务固定)}$$
imitation reward 又分解为 4 个指数项,每项形如 $\exp(-\|\cdot\|^2 / \sigma^2)$(论文写成 $\exp(-c\|\cdot\|^2)$,$c = 1/\sigma^2$):
$$r_t^I = w^p r_t^p + w^v r_t^v + w^e r_t^e + w^c r_t^c$$
权重 $w^p = 0.65,\ w^v = 0.1,\ w^e = 0.15,\ w^c = 0.1$(pose 占绝对大头)。各项精确公式(论文 Sec.5.3):
| 项 | 含义 | 公式($j$ 遍历所有 joint,$e$ 遍历末端) | 系数 $c$ |
|---|---|---|---|
| $r_t^p$ pose | 关节方向匹配 | $\exp\!\left(-2 \sum_j \lVert\hat{q}_t^j \ominus q_t^j\rVert^2\right)$($\ominus$ 为四元数差,取 scalar rotation in rad) | 2 |
| $r_t^v$ velocity | 关节角速度匹配(finite difference 估) | $\exp\!\left(-0.1 \sum_j \lVert\dot{\hat{q}}_t^j - \dot{q}_t^j\rVert^2\right)$ | 0.1 |
| $r_t^e$ end-effector | 手脚 3D 世界坐标匹配(米) | $\exp\!\left(-40 \sum_e \lVert\hat{p}_t^e - p_t^e\rVert^2\right)$ | 40 |
| $r_t^c$ center-of-mass | 质心位置匹配 | $\exp\!\left(-10 \lVert\hat{p}_t^c - p_t^c\rVert^2\right)$ | 10 |
注意:pose 项是 sum-of-squared-joint-errors 再 exp(不是先平均),所以关节数越多该项对误差越敏感;系数 2 比较温和($\sigma^2 = 0.5$)。end-effector 系数 40 很严($\sigma^2 = 0.025 \text{m}^2$,1cm 偏差 reward 衰减到 $\exp(-0.4) \approx 0.67$),这是为了让手脚精确对齐。
task reward 示例(Target Heading,Sec.9):
$$r_t^G = \exp\!\left(-2.5\, \max(0,\ v^\ast - v_t^T d_t^\ast)^2\right)$$
只惩罚"速度不够",超过 $v^*$ 不罚。
3. RSI(Reference State Initialization)—— 探索的关键 trick
每个 episode 开始时,不固定从 motion 起点开始,而是从参考 motion 里均匀随机采一帧状态作为初始状态(PDF Sec.6.1)。论文用 backflip 举例说明为什么这是必须的:
- 若固定起点,policy 必须先学会 jump 才能碰到"空中翻转"那一段的高 reward。但学不会 jump 就永远碰不到,所以永远学不会翻转——这是 deep RL 经典的 sparse-reward 探索陷阱。
- RSI 让 policy 一开始就常被扔到"空中翻转到一半"的状态,立刻能拿到高 reward、学到"翻转到这一姿态是好的",再反推回起跳动作。
论文明确把 RSI 描述为"reward 之外的第二条信息通道":参考 motion 既能通过 reward(目标姿态)也能通过 initial state distribution(先让 policy 体验目标状态)传递信息。
4. Early Termination(ET)—— 类不平衡的解药
cyclic skill 训练时 episode 默认 20s。一旦 torso/head 等关键 link 触地就立即终止,剩余时间 reward 全为 0(PDF Sec.6.2)。论文两个论点:
- reward shaping 的副效果:摔倒后躺地上"假装做动作"是 local optimum(reward 还能拿一半),ET 直接把这个 basin 砍掉。
- 类不平衡:没 ET 时,早期训练数据 90% 是"地上挣扎"样本,网络容量被浪费在建模这些无效状态。ET 等于把数据分布 bias 到"接近成功的样本",类似监督学习里的重采样。
消融(Sec.10.4 + Fig.11):去掉 ET 后大量 skill 学不出来;去掉 RSI 后 backflip 等"长飞行相位"动作收不到正确 basin,policy 只能学到"原地小跳"。这两个 trick 是 DeepMimic 能学动态技能的真正功臣,而非 PPO 本身。
5. Multi-skill integration(Sec.7,三种方案)
(1) Multi-Clip Reward:$r_t^I = \max_{j=1..k} r_t^{I,j}$,对 $k$ 个 clip 各算 imitation reward 取 max。policy 自动学会"当前最像哪个 clip 就跟哪个",可在 clip 间切换,无需手工 kinematic planner(区别于 Peng 2017a)。
(2) Skill Selector:goal $g_t$ 是 one-hot 向量指定要执行哪个 clip,policy 学一个能按指令切换技能的统一控制器。每个 cycle 开始随机采 $g_t$。
(3) Composite Policy(MACE-like):每个 clip 单独训一个 $(\pi^i, V^i)$,运行时用 value function $V^i(s)$ 选当前最高分的子 policy 执行。适合 skill 数量大、单 policy 学不过来的场景。
6. 网络与训练(Sec.5.2 + Appendix)
- Policy/Value 都是 2 层 FC,1024 → 512,ReLU,线性输出;policy 输出高斯 $\mathcal{N}(\mu(s), \Sigma)$,$\Sigma$ 是固定对角协方差(不学习)。
- 视觉任务(terrain heightmap):CNN(16 个 8x8 → 32 个 4x4 → 32 个 4x4)→ 64 FC,再与 state 拼接进主网络。
- PPO 超参(Appendix,全角色共用除 stepsize):minibatch 256,每次 4096 samples;$\gamma=0.95$;GAE/TD $\lambda=0.95$;PPO clip $\epsilon=0.2$;value stepsize $10^{-2}$;policy stepsize $5\times 10^{-5}$(humanoid/Atlas)、$2\times 10^{-5}$(dragon/T-Rex);SGD momentum 0.9。
- 物理:Bullet,1.2 kHz;policy 30 Hz。
- 算力:单 humanoid skill 约 60M samples,8-core CPU 约 2 天,无 GPU。
为什么重要
- 奠定 reference-state alignment 范式:之后所有"逐帧跟踪 MoCap"的工作(PHC、UHC、OmniH2O、ExBody、HumanPlus、BeyondMimic)reward 设计本质都是这个 $\exp(-\|x-x^{ref}\|^2/\sigma^2)$ 模板的变体。
- 首次让 RL 学会 backflip/spinkick/cartwheel/headspin 等高动态技能:之前 RL 只能学到 walk/run,动态动作是手工控制器或 kinematic 回放的领域。这把"物理角色动画"从 control theory 拉到 deep RL 阵营。
- 揭示了 RSI/ET 的重要性:这两个 trick 看起来工程性,但论文用 ablation 明确证明没有它们就学不出动态技能。后续 AMP/PHC/UHC/HOVER 全部继承。
- 是 AMP 的直接前作:AMP 论文开篇就是"DeepMimic 留下三个硬伤(必须时间对齐、鲁棒性差、单风格)",AMP 用 distribution matching 解掉这三个问题。可以说没有 DeepMimic 就没有 AMP。
局限
- 必须时间对齐:每一步都要对照参考的第 $t$ 帧,policy 不能自由改变节奏。这导致面对地形扰动时无法 adapt 步频(AMP 解决)。
- 一个 clip 一个 policy:扩展到大量技能需要 multi-clip reward 或 composite policy,且 skill selector 只能学少量技能(实际 < 10)。
- 依赖高质量 retarget:MoCap 要手工 retarget 到角色骨架,T-Rex/dragon 没数据只能用 artist keyframe。
- 摔倒难恢复:偏离参考就被惩罚,恢复行为有限;尽管 robust to perturbation 能扛 720N·0.2s 推力(run),但跌倒后的 getup 需要单独训。
- CPU-only、单机 2 天/skill:效率上被 Isaac Gym + AMP 之后的工作大幅超越。
复现要点
基于 PDF Sec.5–7 + Appendix 的精确数字,可直接落地。
- reward 4 项系数 $c$:pose=2, velocity=0.1, end-effector=40, CoM=10;权重 $w^p=0.65, w^v=0.1, w^e=0.15, w^c=0.1$;$\omega^I=0.7, \omega^G=0.3$。
- action = PD 目标角度(不是 torque),spherical joint 用 axis-angle。
- 必须实现 RSI:每 episode 从参考 motion 随机采一帧初始化。没有 RSI 几乎学不出 backflip/frontflip/spinkick 等 long-flight-phase 动作(ablation 明确)。
- 必须实现 ET:torso/head 触地立刻终止,剩余 reward 全置 0。
- 网络极简:1024-512 FC + ReLU,不需要更复杂。
- PPO clip 0.2(不是 AMP 那种 0.02),$\gamma=0.95$,$\lambda=0.95$,minibatch 256 / batch 4096。
- 物理 1.2 kHz / policy 30 Hz:这是 Bullet 配置;Isaac Gym 实现可调到 200 Hz 仿真 + 50 Hz policy 仍能学。
- 起点:原仓库
xbpeng/DeepMimic(C++/Python/Bullet,最忠实但工程旧);Isaac Gym 实现可参考real-stanford/dex_pdt或ZhiwenZhao42/Humanoid-Gym里的 DeepMimic-style reward。 - 常见坑:(1) pose reward 用四元数差取 scalar 部分,不是直接四元数相减;(2) end-effector 是世界坐标不是局部坐标,要先转到世界系;(3) phase variable 必须包含在 state 里,否则 policy 不知道当前在 clip 哪个位置。
相关
- 建立在:PPO [Schulman et al. 2017]、MACE [Peng et al. 2016](composite policy 思路)、Tan et al. 2017(仿真 locomotion)。
- 直接引出:AMP [Peng et al. 2021, arXiv:2104.02180](解掉时间对齐/单风格)、DeepMimic-style reward 成为 humanoid RL 标准(PHC/UHC/OmniH2O/HumanPlus/BeyondMimic 全沿用)。
- 本仓库笔记交叉引用:
- T04-motion-prior-amp-to-bfm.md(DeepMimic 是 reference-state 起步,转折 1)
- T12-agile-locomotion.md(高动态技能 tracking 起点)
- T03-reward-design-evolution.md(motion-prior reward 演化)
- P-AMP-2021.md(直接后继,本笔记多次对照)