枢纽
数据集HumanML3D, AMASS
物理感知
输入模态language

PhysDiff:让扩散模型「脚踏实地」

Ye Yuan, Jiaming Song, Umar Iqbal, Arash Vahdat, Jan Kautz(NVIDIA)。ICCV 2023(Oral)/ arXiv:2212.02500。 动作生成physics-guided diffusion线索 T05

🧠 一句话心智模型:扩散模型能生成漂亮的人体动作,但脚会穿地、人会飞天、脚底打滑——它不懂物理。PhysDiff 在每一步去噪之后塞进一个物理模拟器:让一个 RL 训练的「模仿策略」在模拟器里「照着动作演一遍」,输出物理合法的版本,再继续去噪。扩散管「像不像」,物理管「能不能」

🎯 为什么重要:动作生成的「最后 5% 物理感」最致命

在动画、VR、游戏里,人对动作的物理感极其敏感——脚穿过地面 2 厘米,整段动作就「假」了。但纯数据驱动的扩散模型只学了「动作分布」,没学「重力、接触、地面」,所以会产生 3 类典型 artifact:

Artifact直观原因
Floating(飞天)身体悬空不落地扩散模型不约束「必须踩在地上」
Penetration(穿地)脚陷入地面以下不知道地面是刚体
Foot Skating(打滑)脚贴地滑动,像穿冰鞋没建模「接触时摩擦力」
核心矛盾:为什么不能事后修一下?论文 Fig.2 给了答案——如果在最后一步用物理「投影」一次,动作已经被扩散推到「物理上无法修正」的区域(比如人已经失去平衡),硬修只会更糟。必须把物理嵌进扩散循环里,让每一步去噪都被物理「拉回正轨」。

💡 核心思想:扩散 + 物理,交替迭代

PhysDiff 修改的是扩散的采样过程(不是训练过程),所以它是 plug-and-play——可以直接套在已有的 MDM、MotionDiffuse 上。核心是 Algorithm 2:每个去噪步之后,可选地调用一次「物理投影」$P_\pi$。

纯噪声 x_T 扩散采样循环(50 步) ① 去噪一步 Denoiser D(x_t, t, c) 得到 x̃(粗动作) ② 物理投影 P_π RL 策略 π 在 IsaacGym 里「演一遍」 → x̂ ③ DDIM 更新到 x_(t-1) 用物理修正后的 x̂ 不是 x̃,进入下一轮 循环 50 步 干净 动作 Scheduler End 4, Space 1
图 1:PhysDiff 采样循环。每步先扩散去噪(得到粗动作),再用 RL 策略在物理模拟器里「演一遍」(物理合法化),然后继续下一步。不是事后修,是边生成边约束

物理投影 $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 不是在「质量 vs 物理合法性」之间权衡——它两个都拿。FID 更低(质量更好),同时 Phys-Err 暴跌。这说明扩散模型本身有能力生成高质量动作,只是缺物理约束来「拣选」正确的那个解。

🌐 在领域中的位置

纯运动学扩散(MDM / MotionDiffuse) 事后物理修正(post-processing,效果差) PhysDiff(物理嵌入扩散循环)⭐ 物理 + 扩散在控制/具身(PhysDiff 思想外溢)

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 环境一起跑)。