PhysDiff:让扩散模型「脚踏实地」
🎯 为什么重要:动作生成的「最后 5% 物理感」最致命
在动画、VR、游戏里,人对动作的物理感极其敏感——脚穿过地面 2 厘米,整段动作就「假」了。但纯数据驱动的扩散模型只学了「动作分布」,没学「重力、接触、地面」,所以会产生 3 类典型 artifact:
| Artifact | 直观 | 原因 |
|---|---|---|
| Floating(飞天) | 身体悬空不落地 | 扩散模型不约束「必须踩在地上」 |
| Penetration(穿地) | 脚陷入地面以下 | 不知道地面是刚体 |
| Foot Skating(打滑) | 脚贴地滑动,像穿冰鞋 | 没建模「接触时摩擦力」 |
💡 核心思想:扩散 + 物理,交替迭代
PhysDiff 修改的是扩散的采样过程(不是训练过程),所以它是 plug-and-play——可以直接套在已有的 MDM、MotionDiffuse 上。核心是 Algorithm 2:每个去噪步之后,可选地调用一次「物理投影」$P_\pi$。
物理投影 $P_\pi$ 的核心是一个用 RL 训练的「模仿策略」 $\pi(a_h | s_h)$:给它一段参考动作,它在物理模拟器里控制一个 SMPL 角色去「追」这个动作。训练用的是 PPO + 4 项奖励(姿态、速度、关节位置、关节旋转),数据来自 AMASS 大规模动捕数据集。
🛠️ 三个让它真正能用的设计
| 设计 | 心智 | 为什么必要 |
|---|---|---|
| ① 物理投影调度 | 不在每一步都用物理(太贵),而是在最后几步集中用(默认 End 4, Space 1:最后 4 步连续投影) | 物理模拟很慢;早期去噪是「均值动作」(噪声大、细节少),投影无意义还可能扰乱扩散;末段去噪接近真实细节,物理约束才有用 |
| ② 训练时不动,推理时套用 | 不改 denoiser 网络的权重,只改采样算法 | 可以直接把现成的 MDM / MotionDiffuse 拿来用,不用重训——这是它能成为「plug-and-play」的关键 |
| ③ RL 模仿策略 + PD 控制器 | 动作 = PD 控制器的目标关节角;加 residual force 处理「坐下」等需要额外接触力的动作 | PD 控制稳定;residual force 补足缺失的接触力(模拟器里角色屁股没接触椅子时,光靠 PD 撑不住) |
扩散去噪的早期 $t$ 大(噪声大),模型预测的是 $\mathbb{E}[x | x_t]$——「数据集均值动作」。这个均值动作往往没什么身体位移,本身就物理不合理,硬投影会把模型推离数据分布。而最后几步($t$ 小)预测的是精细动作,此时物理投影既有效又不伤分布。论文 Table 4 系统验证:「End 4, Space 1」是性价比最高的调度。
📊 结果:物理错误下降 78~94%,动作质量还更好
| 任务 / 数据集 | FID ↓(质量) | Phys-Err ↓(物理错误 mm) | vs SOTA |
|---|---|---|---|
| HumanML3D(文本→动作) | 0.433(SOTA) | 4.111(vs MDM 31.572) | 物理错误 ↓ 86%,FID 提升 20%+ |
| HumanAct12(动作→动作) | 0.096(competitive) | 2.850(vs MDM 13.377) | 物理错误 ↓ 78% |
| UESTC(动作→动作) | 13.27(competitive) | 1.463(vs MDM 28.371) | 物理错误 ↓ 94% |
| 维度 | 数字(来自 PDF) |
|---|---|
| 扩散步数 | 50 步 + classifier-free guidance(coef=2.5) |
| 物理策略训练 | 3 层 MLP (1024, 1024, 512),PPO,4000 epoch,IsaacGym 8192 并行环境 |
| 物理模拟频率 | 模拟器 60Hz,策略 30Hz |
| 推理时间 | 51.6s/动作(vs MDM 19.6s,慢 2.5×);batch=256 时只慢 1.7× |
| vs 后处理 | 事后投影(1 步或多步)反而更差——证明「嵌入扩散循环」是必要的,而非装饰 |
🌐 在领域中的位置
PhysDiff 是「物理引导扩散」范式的代表作。它把「扩散管分布、物理管约束」这件事讲清楚了:约束不必可微(可以用模拟器),只要嵌进采样循环就行。这个思想后来在机器人动作生成、4D 重建等场景反复出现。关联线索:T05 扩散策略谱系。
❓ 常见误区
PhysDiff 是把扩散模型重新训练一遍吗?
不是。它只改采样过程,denoiser 网络直接用现成的 MDM / MotionDiffuse 权重。这是它「plug-and-play」的核心。重训的只是物理投影策略 π,那个用 PPO 在 AMASS 上单独训。
物理模拟器为什么不会让动作变差?
会,如果调度错了。论文的核心实验(Fig.5, Table 4)就是研究这个:早期步骤投影会把动作推离数据分布(变差),最后几步投影则「修正细节而不伤分布」(变好)。调度是关键。
RL 模仿策略是 PhysDiff 的核心吗?
是。它本质上是 DeepMimic 那一套(动作模仿 + PPO),只不过这里的「参考动作」是扩散去噪的中间产物。所以 PhysDiff = 扩散 + DeepMimic 的杂交——扩散管「生成」,DeepMimic 管「执行」。
2.5× 慢是不是太贵了?
对实时应用是的(51s 生成一个动作)。但动画/影视工作流不是实时的,这个代价完全可接受。论文也指出 batch=256 时只慢 1.7×,因为物理模拟器高度并行(GPU 上 8192 环境一起跑)。