DeepMimic:给 RL 一个「参考动作」,它会自己学会后空翻
🎯 为什么重要:RL 学动作之前,看起来都像「抽风」
2018 年前,深度 RL 让模拟角色学走路,确实能走,但动作极其难看——上身乱晃、步态怪异、姿态僵硬。问题不在 RL 算法本身,而在reward 太天真:「向前走 = 好」会鼓励它用任何扭曲方式向前。手工设计「美观」reward 几乎不可能。
以前也有人这么干(Da Silva 2008, DeepLoco 2017),但效果有限、只能学走路。DeepMimic 把这件事做到了极致:一个框架、25+ 种技能(后空翻、旋风踢、平衡木、跳马、爬行、匍匐前进、起身、头转……),而且对摔打、推力、地形变化都鲁棒。
💡 核心思想:状态里有「参考动作的指针」,reward 里有「像不像」
DeepMimic 的状态、动作、reward 三个组件都很朴素,但合起来非常强大:
Reward 由两部分组成(任务时 $\omega^I = 0.7, \omega^G = 0.3$):
$$r_t = \omega^I r_t^I + \omega^G r_t^G, \quad r_t^I = w^p r_t^p + w^v r_t^v + w^e r_t^e + w^c r_t^c$$
其中 $r^I$ 是模仿 reward(姿态 0.65 + 速度 0.1 + 末端位置 0.15 + 质心 0.1),$r^G$ 是任务 reward(比如「向目标方向走」)。
🛠️ 两个让高难动作「能学会」的关键 trick
| 设计 | 心智 | 为什么必要 |
|---|---|---|
| ① Reference State Initialization(RSI) | 每个 episode 开始,从参考动作的随机一帧初始化角色状态 | 不是总从「后空翻起跳」开始(否则永远学不会落地)。RSI 让角色在训练初期就能遇到「腾空最高点」这种高 reward 状态,从而知道「往这边走是好的」 |
| ② Early Termination(ET) | 角色摔倒(躯干触地)就立刻结束 episode,剩余步给 0 reward | 不这么干,大部分训练数据会是「躺在地上挣扎」——网络容量被浪费在建模这些无效状态。ET 相当于对数据分布做 curate,让训练聚焦在有用的轨迹上 |
| ③ PD 控制器作动作接口 | RL 输出 PD 控制器的目标关节角,而非直接力矩 | PD 控制自带局部反馈和阻尼,比直接学力矩稳定得多;让 RL 聚焦在「宏观动作」而非「底层肌肉控制」 |
| ④ 多片段整合 | Multi-clip reward(取 max)/ skill selector(one-hot)/ composite policy(用 value function 选) | 一个策略学不会所有技能;这三种方法分别适合「同类动作(多种走路)」、「按指令切换」、「差异大的动作库」 |
后空翻这种动作,「起跳 → 飞行 → 落地」三段必须串起来。若固定初始状态(站起来),策略必须先学起跳才能碰到飞行段——但起跳要靠「能稳稳落地」这个未来 reward 撬动,鸡生蛋蛋生鸡。RSI 直接把角色扔到飞行段,让它先学会「这个姿势下怎么落地」,再反向链式学起跳。ET 则保证它不会一直躺在地上摸鱼。这两个 trick 让「学一个动作」从「学会 1 个连续动作」简化成「学会 N 个状态到状态的局部映射」。
📊 结果:25+ 种高难技能,且鲁棒到能抗 720N 推力
| 角色 | DoF | 状态维 / 动作维 | 学会的技能 |
|---|---|---|---|
| Humanoid(人形) | 34 | 197 / 36 | Walk, Run, Jog, Jump, Backflip, Frontflip, Sideflip, Cartwheel, Spin, Spinkick, Kick, Punch, Dance A/B, Vault 1/2-Handed, Crawl, Roll, Balance Beam, Getup, Headspin, Baseball Pitch, Landing |
| Atlas(机器人,169.8kg) | 31 | 184 / 32 | Walk (0.988), Run (0.846), Backflip (0.630), Spinkick (0.477) |
| T-Rex(恐龙,关键帧) | 55 | 262 / 64 | Walk (0.979) |
| Dragon(龙,关键帧) | 79 | 418 / 94 | Walk (0.990) —— 当时深度 RL 处理过的最大动作空间 |
| 维度 | 数字(来自 PDF) |
|---|---|
| 算法 | PPO + TD(λ) + GAE(λ),γ=0.95,λ=0.95,clip ε=0.2 |
| 训练数据 | ~60M 样本 / 单技能,论文称需「several days per skill」(CPU 训练) |
| 控制 / 物理频率 | 策略 30Hz,物理模拟 1.2kHz(Bullet) |
| 鲁棒性 | Run 可抗 720N × 0.2s 前向/300N 侧向推力;Spinkick 690N 前向/600N 侧向;Walk 240N 前向/300N 侧向 |
| retargeting | 同一参考动作可迁移到 Atlas(4× 重)、月球重力(1.622 m/s²)、不规则地形 |
| RSI + ET 消融(Table 5) | Backflip 不用 RSI:return 看似不低(0.730 vs 0.791),但动作退化成「站着向后小跳」,永远学不会真正的空中翻(论文原话:"never learns to perform a full mid-air flip");不用 ET:return 暴跌至 0.379,角色摔倒后躺着模仿动作(local optima)——可见 ET 才是保住动态技能的关键 |
| 纯任务 reward(无模仿) | 「扔球」任务学会的是「抱着球跑向目标」——能完成任务但动作难看 |
🌐 在领域中的位置
DeepMimic 是 「数据驱动 + 物理执行」范式的奠基作。它的核心思想——「用动作捕捉定义『像不像』,用 RL 解决『怎么做』」——后来被 AMP(用判别器替代直接 reward)、PhysDiff(用扩散生成参考动作)等继承。关联线索:T04 物理角色动画谱系。
❓ 常见误区
DeepMimic 是模仿学习吗?
不是常规的模仿学习(行为克隆)。它是强化学习——reward 函数里包含「与参考动作的相似度」。BC 是监督学习(直接学「状态→动作」映射),DeepMimic 是 RL(学「怎么行动才能让 reward 最大」)。它能产生参考动作里没有的恢复 / 调整行为,因为它有探索。
RSI 是不是「作弊」?
不算。RSI 只在训练时用,推理时不用。它的作用是「让训练初期遇到高 reward 状态」,相当于课程学习或一个好的初始状态分布。最终学到的策略在任何初始状态下都能跑。
它和 PhysDiff 啥关系?
PhysDiff 里的「物理投影策略」就是 DeepMimic 风格的模仿策略——同样的 PPO + 4 项 reward + PD 控制。只不过 DeepMimic 模仿的是动捕数据,PhysDiff 模仿的是扩散去噪的中间产物。可以说 PhysDiff = 扩散 + DeepMimic。
为什么 60M 样本就够了?
因为参考动作大大缩小了搜索空间。纯 RL 学走路要亿级样本;DeepMimic 把搜索空间限制在「像参考动作的解」附近,所以 60M 够了。这也是数据/知识注入对 RL 的价值——不是让 RL 更聪明,而是让问题更小。