ASE:给虚拟角色装一个「可复用的运动技能库」
🎯 为什么重要:物理动画 + RL 长期被"从零训练"困住
物理仿真角色动画(physically simulated characters)有个老大难:
结果:① 样本效率极低;② 复杂任务学不会(连走都没学会,怎么学"跑到目标然后挥剑");③ 不自然(reward 工程师手忙脚乱地加"对称性""能量效率"等启发式)。
对比人类:我们一辈子积累了庞大的运动技能库——走路、跑步、跳跃、蹲下、伸手……学新任务(比如打网球)时直接调用这些底层技能,专注学"策略"而不是"怎么站"。ASE 就是给仿真角色装一个类似的"技能库"。
💡 核心思想:GAN 学动作风格 + 互信息学技能结构 = 可复用的"技能语言"
ASE 的"魔法"是把两个目标拼在一起训练同一个底层策略 $\pi(a|s,z)$:一个让它「动得像数据」,另一个让它「不同 $z$ 动得不一样」。两者结合,就得到一个结构化的技能空间。
数学上,预训练目标是两个项的和:
$\max_\pi \;-D_{JS}\big(d^\pi(s,s') \,\|\, d^M(s,s')\big) + \beta\, I(s,s'; z)$
第一项是模仿目标(用判别器近似 Jensen-Shannon 散度):让策略产生的状态转移分布"看起来像"数据集。第二项是技能发现目标(互信息):让不同的 $z$ 产生可区分的行为——否则模型会塌缩到只生成一种动作。
🛠️ 让这套框架在 37-DoF 人形上真跑通的 4 个关键设计
论文用了一个带剑盾的 37 自由度人形角色(仿真模型 120D 状态、31D 动作),在 Isaac Gym GPU 仿真器上 4096 并行环境、120 Hz 仿真、训练 ~10 年模拟时间。让这一切真正起效的关键设计:
| 设计 | 心智模型 | 为什么必要 |
|---|---|---|
| ① 球面 latent space + 未归一化动作空间 | 高层策略 ω 输出未归一化 $\bar{z}$,用归一化 $z = \bar{z}/\|\bar{z}\|$ 投影到球面再传给 π | 训练初期 ω 分布靠近原点 → 均匀覆盖球面 = 探索所有技能;训练后期 ω 偏离原点 → 聚焦少数技能 = 利用。一个 trick 内置了 explore-exploit 切换 |
| ② 判别器复用作 motion prior | 阶段 2 训练 ω 时,把阶段 1 的 D 冻结,作为风格奖励 $-\log(1-D(s,s'))$ 加进任务奖励 | 避免高层指挥出"非人类"的技能组合(如频繁切换导致抖动)。冻结 = 不需要新数据 |
| ③ 从随机初始状态训练 | 预训练时让角色从各种随机姿态(包括摔倒状态)开始 | 附带学到了鲁棒的恢复策略——跌倒能爬起来。这个能力自动迁移到所有下游任务 |
| ④ 大规模并行仿真 | Isaac Gym,4096 个环境并行,单 V100 训 10 天 = 超 100 亿样本(10 billion,约 10 年模拟时间) | 对抗模仿学习样本饥渴。没有 GPU 大规模并行根本不可行 |
想象 latent space 是一个气球的表面(球面)——每个点是一个技能。高层 ω 输出的 $\bar{z}$ 是球心附近的随机点,归一化后相当于"从球心向外随机投掷飞镖",落点会均匀覆盖球面——这就是探索(所有技能都试试)。训练久了,ω 的均值偏离原点,飞镖落点就集中在某个区域——这就是利用(找到好技能就多用)。一个 trick 把 RL 最难调的 explore-exploit 平衡几何化进了动作空间。
📊 结果:一个模型学多种技能,复用到多种任务,还附带鲁棒恢复
用 187 段动作捕捉 clip(~30 分钟)预训练,单模型学到的技能涵盖走路、跑步、蹲走、挥剑、盾击等。然后复用到 5 个下游任务(每种任务只训高层 ω):
| 任务 | 从零训 | ASE(无 SD) | ASE(无 Div.) | ASE(完整) |
|---|---|---|---|---|
| Reach(剑尖到目标) | 0.56 | 0.33 | 0.72 | 0.75 |
| Speed(指定速度移动) | 0.95 | 0.87 | 0.93 | 0.93 |
| Steering(指定方向) | 0.94 | 0.74 | 0.90 | 0.90 |
| Location(走到目标点) | 0.67 | 0.25 | 0.47 | 0.45 |
| Strike(跑去挥剑击倒) | 0.87 | 0.50 | 0.80 | 0.82 |
| 维度 | 数字 |
|---|---|
| 训练规模 | 4096 并行环境,120Hz 仿真,10 年模拟时间,单 V100 × 10 天 |
| 技能多样性 | 单模型自动学到走/跑/蹲走/挥剑/盾击/转身等,无需手动分割数据 |
| 恢复能力 | 500 次随机扰动(500-1000N,0.5s)全部成功恢复,平均 0.31s,最大 4.1s |
| 技能组合 | Strike 任务自动组合「跑→挥剑→站定」,无需 reward shaping |
| 关键消融 | 去掉 skill discovery → 性能大跌;去掉 diversity → 技能覆盖锐减 |
🌐 在领域中的位置
ASE 是物理动画角色迈向 "skill foundation model" 的关键一跃。它把"技能学习"和"任务学习"彻底解耦——预训练一次,复用终身。这和机器人界的 RT-1 / OpenVLA 思路异曲同工:都是先训通用底层,再适配上层。关联线索:T04 动作生成谱系。
❓ 常见误区
ASE 是模仿学习还是强化学习?
两者结合。底层策略 $\pi$ 用对抗模仿学习(类似 GAN,让动作像数据集);高层策略 $\omega$ 用标准 RL(PPO,最大化任务奖励)。底层学"动作像人",高层学"用哪些动作完成任务"。这种分层让两个目标互不干扰。
它和 AMP(Adversarial Motion Priors)有什么区别?
AMP(同作者前作)也用判别器约束动作风格,但每个任务仍从零训。ASE 多了"预训练 + 复用"这一层:先把通用技能库训出来冻结,之后所有任务只训轻量的高层 ω。AMP 是"单任务风格化",ASE 是"通用技能库"。
为什么不直接用 motion tracking(动作跟踪)?
Motion tracking 要求策略显式跟踪某段 clip,需要动作规划器选哪段 clip、何时切换。ASE 让策略隐式学习整个分布,并通过 latent $z$ 自然组合——不需要显式规划器,能生成数据里没有的新组合(如跑过去→挥剑→站定,这个完整序列在数据里没有)。
这跟真机器人 VLA(RT-1 等)什么关系?
思路高度类似——都是"先训通用底层 + 后训高层任务"的分层基础模型范式。区别:ASE 处理低维状态 + 高维动作 + 物理仿真,VLA 处理高维图像 + 离散动作 + 真实世界。两者各自是动画界和机器人界的"skill foundation"代表。