深度⏱ ~4 min
里程碑
⭐ 为何重要

motion diffusion 的开山之作:把 DDPM 引入人体动作生成,配 classifier-free 文本条件与 transformer 骨架,将动作生成从 GAN/VAE 时代推进到 diffusion 时代。它成为后续 PhysDiff、PriorMDM、MoMask、GMD 等几乎所有 motion diffusion 工作的通用 baseline。在 action_gen 谱系里它是生成式动作建模的里程碑与分水岭。

数据集HumanML3D, KIT-ML
输入模态language
📍 演进位置
建立在
  • MotionDiffuse
  • DDPM

论文:Guy Tevet, Sigal Raab, Brian Gordon, Yonatan Shafir, Daniel Cohen-Or, Amit H. Bermano. Human Motion Diffusion Model. ICLR 2023, Tel Aviv University. arXiv:2209.14916. 🌐 · 代码:github.com/GuyTevet/motion-diffusion-model。

一句话直觉

给一句话,就生成一段会动的人。

秘诀是把"去噪"从画图搬到动作上。

人体动作扩散之于文字动画,就像爵士即兴之于看谱演奏。

同一句"走路",每次能走出不同的步态。

是什么·为什么

要解决的问题:让一段文字变成一段人的动作。

比如输入"一个人向前走两步然后转身",输出就是一串姿势连成的动画。

这叫文字到动作的生成。📎

老办法的硬伤:以前的做法像一个"压缩-还原"的罐头机。

把所有动作压成一个标准形状的小球,再从球里还原出动作。

这种标准形状有个致命假设——一个描述只对应一个动作。

可真实世界是"多对多"的。

"踢"这个字,可以是踢足球,也可以是空手道踢。

同一个动作,又可以用千万种说法描述。

罐头机把这种丰富性压成单峰,生成的动作死板又单调。📎

这项工作的转身:换成"扩散",也就是逐步去噪。

从一团完全随机的噪声出发,一步步把动作细节"修"出来。

同一句话、换一团初始噪声,能修出不同的合理动作。

所以"多对多"自然就实现了,不会被压成单峰。

扩散在画图上已经证明了能表达多解。

这里是第一次把它成功搬到动作上。📎

方法核心(大白话):四件事一起,让它又轻又好。

第一件是"骨架不用画图那套"。

画图去噪用的是一种专门处理方格网格的网络。

可动作是"一串按时间排的姿势",不是方格图。

所以换成处理时间序列的骨架,每一帧当一个词。

这样既能处理任意长度,又比画图网络轻一两个数量级。

第二件是最关键的巧思——"直接修动作,而不是修噪声"。

通常去噪网络学的是"这团噪声里该抹掉哪部分噪声"。

但动作有些重要的物理约束,比如"脚踩地时不能滑"。

这些约束没法套在"噪声"上,因为噪声没有"脚"这种概念。

所以这里让网络直接输出"我猜的干净动作"。

这样一来,所有动作层面的约束都能直接算在输出上。

脚滑了就罚、位置错了就罚、抖动了就罚。

这是把动作生成的老经验接进新框架的关键一招。

第三件是"一个模型兼两职"。

训练时偶尔(一成概率)把文字条件抠掉,让模型也学"没有条件时该怎么生成"。

于是同一个模型既会"听指挥",也会"自由发挥"。

生成时在两者之间外推,调一个甜点档位,兼顾像不像和丰不丰富。

第四件是"白送的编辑能力"。

因为去噪是一步步修的,每一步都可以强行规定一部分动作不变。

比如"开头和结尾固定,让模型补中间",就是时间衔接。

"上半身固定,让模型改下半身",就是局部编辑。

这些都不用重新训练,只改生成过程。📎

为什么直接修动作这一招关键:动作生成的老办法都靠几条"几何约束"。

位置要对、速度要顺、脚踩地不能滑。

这些约束必须在"动作"层面算,不能在"噪声"层面算。

让网络直接输出动作,这些老经验才接得进来。

否则换了新框架,反而丢了多年积累的好东西。📎

你会看到:一张消费级显卡,训三天就达到最好水平。

一段文字生成的动作,有四成多的情况甚至比真实录像更受人喜欢。

后续的文字到舞蹈、视频到动作、机器人动作生成,几乎都把它当起点。📎

一句话类比:动作扩散之于文字动画,就像爵士即兴之于看谱演奏。

同一份谱(一句话),每次都变出不同版本。

怎么做

核心机制·四件事叠成一个轻量扩散模型:换骨架、预测干净样本、无分类器引导、白送编辑。📎

骨架:transformer encoder-only(不是 U-Net)

动作数据是"N 帧 × J 关节 × D 维"的时间序列,不是 2D 空间网格。

U-Net 的 2D 卷积优势用不上。

transformer 天生处理时间序列,encoder-only 又比 encoder-decoder 轻。

模型 8 层、latent dim 512、batch 64,比图像扩散小两个数量级。📎

关键设计·预测干净样本而不是噪声

标准扩散让网络预测"该抹掉哪部分噪声"。

MDM 改成让网络直接输出"我猜的干净动作"。

因为输出直接是动作,所以能在它上面加几何约束。

而噪声层面加不了——噪声没有"关节位置""足触地"这些物理意义。

这是把动作生成文献积累的几何约束搬进扩散的关键 trick。📎

三个几何约束(加在预测的干净动作上)

  • 位置约束:通过正向运动学把旋转转成位置再比。位置比旋转对感知更友好。
  • 足触地约束:抑制 foot sliding(足触地时速度归零)。
  • 速度约束:防 jitter(动作抖动)。

细节公式留到下方深度部分。📎

Classifier-free guidance:同模型同时学条件 + 无条件

训练时按 10% 概率把文字条件抠掉,让模型也学"没有条件时怎么生成"。

于是同一个模型既会"听指挥",也会"自由发挥"。

采样时做"条件 - 无条件"差值的外推。

论文实测引导强度 2.5 是保真和多样的甜点(强度为 1 是纯条件,小于 1 偏多样,大于 1 偏保真)。📎

text-to-motion 用 frozen CLIP-ViT-B/32 文本编码器把文字编成条件向量。

CLIP 是冻结的,MDM 不训 CLIP📎

编辑(无训练,只改采样):用 diffusion inpainting 思路。

给定一段动作的子集(时间前缀+后缀做 in-betweening,或部分身体关节做 body part editing)。

每个采样步用输入子集覆写预测动作的对应维度。

让生成结果保留输入、补全缺失,可带条件也可无条件。📎

常见误区(先抛一个,完整版见末尾):"MDM 生成的动作能直接喂给机器人执行?"

——不能。MDM 是纯运动学的,不进物理仿真

生成的动作可能穿地、不平衡、脚滑。

要喂机器人必须再过一层"基于物理的模仿器"(如 PHC/UHC)做物理化。📎

正确理解:MDM 是"画"动作,不是"做"动作。

深度

前向/反向过程与预测目标。训练时把干净动作 $x_0$ 按噪声调度加噪到 $x_t$。MDM 直接预测 $\hat x_0$,simple loss:📎

$$\mathcal{L}_\text{simple} = \mathbb{E}_{x_0 \sim q(x_0|c),\, t\sim[1,T]} \big\|x_0 - G(x_t, t, c)\big\|_2^2$$

三个几何 loss(Eq.3–5)

  • Position loss:$\mathcal{L}_\text{pos} = \frac{1}{N}\sum_i \|FK(x_0^i) - FK(\hat x_0^i)\|^2$。$FK$ 是 forward kinematics(正向运动学),把关节旋转转成笛卡尔位置。预测 joint rotation 时用,位置比旋转对感知更友好。
  • Foot contact loss:$\mathcal{L}_\text{foot} = \frac{1}{N-1}\sum_i \|(FK(\hat x_0^{i+1}) - FK(\hat x_0^i))\cdot f_i\|^2$,$f_i\in\{0,1\}^J$ 是足触地 mask。抑制 foot sliding(足触地时速度归零)。
  • Velocity loss:$\mathcal{L}_\text{vel} = \frac{1}{N-1}\sum_i \|(x_0^{i+1}-x_0^i)-(\hat x_0^{i+1}-\hat x_0^i)\|^2$,防 jitter。

总 loss:$\mathcal{L} = \mathcal{L}_\text{simple} + \lambda_\text{pos}\mathcal{L}_\text{pos} + \lambda_\text{vel}\mathcal{L}_\text{vel} + \lambda_\text{foot}\mathcal{L}_\text{foot}$。📎

注:HumanML3D 表示已显式含 joint positions 和 foot contact labels,所以 text-to-motion 实验里不用几何 loss;只在 action-to-motion 用 rotation 表示时才用。

模型结构细节(Fig.2)

  • 输入:noised motion $x_t^{1:N}$(N 帧,每帧 $x^i \in \mathbb{R}^{J\times D}$,$J$ 关节数,$D$ 每关节表示维度)。
  • 把 time step $t$ 和 condition code $c$ 各经 FFN 投影到 transformer dim,相加成单个 token $z_t^k$。
  • 每帧线性投影 + positional embedding,和 $z_t^k$ 一起喂 encoder。
  • 输出:丢掉第一个 token,其余投影回 motion 维度得 $\hat x_0^{1:N}$。📎

Classifier-free guidance 采样(Eq.7)

$$G_s(x_t,t,c) = G(x_t,t,\emptyset) + s\cdot\big(G(x_t,t,c) - G(x_t,t,\emptyset)\big)$$

$s=1$ 纯条件采样,$s<1$ 偏多样性,$s>1$ 外推偏保真。$s=2.5$ 是 sweet spot。📎

采样:T=1000 步,cosine noise schedule。每步预测 $\hat x_0$,按 DDPM 重新加噪回 $x_{t-1}$,迭代到 $x_0$。📎

实验结果:三个任务——text-to-motion、action-to-motion、unconditional。

  • Text-to-Motion(HumanML3D + KIT):MDM 在 FID、Diversity、MultiModality 上达 SOTA,R-precision / Multimodal-Dist 接近 SOTA。31 用户研究里,42.3% 的情况下用户偏好 MDM 生成结果甚至超过 ground truth——说明自然度已接近真实 MoCap📎
  • Action-to-Motion(HumanAct12 + UESTC):超过专门为 action-to-motion 设计的 SOTA(Guo 2020, Petrovich 2021),即便后者 task-specific。📎
  • 架构 ablation(Table 1):测了 4 个 backbone——encoder-only(默认)、decoder + cross-attention、decoder + input token 双注入、GRU。结论:diffusion 框架对 backbone 不敏感(架构差异 < 任务差异),但 encoder-only 最简单且最稳。📎

训练成本:单 RTX 2080 Ti(消费级),约 3 天,500K steps。比同时期图像扩散小一两个数量级——论文强调的 lightweight。📎

局限

  1. 纯 kinematic,不进物理:生成的动作可能穿地、不平衡、foot sliding(foot contact loss 缓解但不根治)。要喂机器人必须经基于物理的模仿器(DeepMimic/AMP/PHC)做物理化。📎
  2. 采样慢:T=1000 步,没有 DDIM 加速(虽用 cosine schedule 仍 1000 步),实时性差。后续 MLD 用 latent diffusion 把步数压下来。📎
  3. 数据规模小:HumanML3D 14K motion / KIT 3.9K,相对 AMASS 整体仍小。text-to-motion 受限于文本标注。📎
  4. 多模态仍弱:虽比 VAE 强,但同一 prompt 生成的多样性仍远低于真实人类动作分布。📎
  5. 无 physical plausibility 保证:几何 loss 是软约束,不能保证生成的动作可执行。📎
  6. 文本理解受 CLIP 限制:CLIP 文本编码器对细粒度动作描述(如"先迈左脚然后转身")理解有限。📎

研究者视角

图谱定位:MDM 是 T08(带物理的动作生成)线索的起点 / 转折 1——把扩散搬进动作域的开山之作。📎

与 T05(Diffusion Policy)同源技术、不同目标:T05 用扩散生成控制 action(控制用),MDM 用扩散生成 kinematic motion 序列(生成用)。

与 Diffusion Policy 的核心区别(生成用 vs 控制用)📎

维度MDM(生成用)Diffusion Policy(控制用)
目标生成动作序列(动画/视频用)生成机器人 action chunk(控制用)
是否上物理,纯 kinematic是,输出进机器人/仿真执行
条件text(CLIP 编码)/ action class视觉观测 + 本体感觉
架构transformer encoder-only1D temporal CNN 或 transformer
预测目标$\hat x_0$(sample)$\epsilon$ 或 $\hat x_0$
能否直接喂机器人不能,需物理模仿器翻译能,输出直接是 action

核心区别一句话:MDM 是"动作",Diffusion Policy 是"动作"。

MDM 生成的动作漂亮但不能直接控制机器人,要喂机器人还需 PHC/UHC 这类基于物理的模仿器当"物理翻译层"——这正是 PHC 论文里用 MDM 当输入做 in-betweening 的用法。

这是 T08 线索的核心矛盾:"生成"和"控制"之间的物理鸿沟。📎

继承与催生

  • 建立在:DDPM [Ho et al. 2020](扩散母方法)、Classifier-Free Guidance [Ho & Salimans 2022]、GLIDE/DALL-E 2(预测 $\hat x_0$ 的设计选择)、CLIP [Radford 2021]、transformer、Actor/MotionTransformer(motion generation 的 transformer 先行者)、MotionCLIP [Tevet et al. 2022](同作者前作,CLIP latent 路线,MDM 是其扩散升级)。📎
  • 引出:MLD [Chen et al. 2023](latent diffusion 加速 MDM)、PhysDiff [Yuan 2023](给 MDM 加物理约束)、MoMask [Guo et al. 2024](masked modeling 替代扩散)。机器人侧 PHC/UHC [Luo et al. 2023] 直接把 MDM 输出当 input 做 in-betweening,是 MDM 进物理控制的桥梁。📎

两个关键遗产

  1. "预测 $\hat x_0$ 而不是 $\epsilon$"是扩散进 motion 域的关键工程 trick:让 motion generation 文献积累的几何 loss(位置/速度/foot contact)能直接接入扩散。这个设计选择后来被 BeyondMimic 等把扩散用进物理控制的工作继承。📎
  2. transformer 替代 U-Net 的成功示范:motion 是时间序列,U-Net 的 2D 卷积优势用不上,transformer encoder-only 更自然。这条经验被后续所有 motion diffusion 工作采纳。📎

Open problems

  1. 物理化的根治:MDM 纯 kinematic,要喂机器人必须经物理模仿器。能否把物理约束直接进扩散过程(PhysDiff 走了一步),仍开放。[未确认]
  2. 采样加速:1000 步实时性差。latent diffusion(MLD)是一途,蒸馏/一致性模型是另一途,开放。[未确认]
  3. 多模态多样性的提升:虽比 VAE 强,多样性仍远低于真实分布。如何在保真和多样之间更好 trade-off,开放。[未确认]

常见误区

"MDM 生成的动作能直接喂机器人" —— 错。MDM 是纯运动学的,不进物理仿真。生成的动作可能穿地、不平衡、脚滑。要喂机器人必须再过一层基于物理的模仿器(PHC/UHC)做物理化。📎

MDM 是"画"动作,不是"做"动作。

"MDM 预测的是噪声" —— 错。MDM 直接预测干净样本 $\hat x_0$,不是噪声 $\epsilon$。这是能否套几何 loss 的关键——噪声没有"关节位置""足触地"这些物理意义。📎

预测 $\hat x_0$ 才能把动作生成积累的几何约束接进来。

"MDM 用 U-Net 做去噪网络" —— 错。MDM 用 transformer encoder-only。动作是时间序列不是 2D 网格,U-Net 的 2D 卷积优势用不上。📎

transformer 处理时间序列更自然,且比图像扩散轻一两个数量级。

"MDM 训练 CLIP 文本编码器" —— 错。CLIP-ViT-B/32 是冻结的,MDM 不训 CLIP,只用它把 prompt 编码成条件向量。📎

CLIP 提供文本理解,MDM 只训扩散模型本身。

"编辑能力要单独训一个模型" —— 错。编辑(时间衔接、局部身体部位)无需重训,只改采样过程——每步用输入子集覆写 $\hat x_0$ 对应维度即可。📎

编辑是扩散 inpainting 的副产品。

检查点

Q1

老办法("压缩-还原"的罐头机式方法)在"踢"这个字上为什么会生成死板单调的动作?从"它假设一个描述对应几个动作"这个角度说。换成扩散后为什么就好了?

💡 参考答案

  • 老办法把所有动作压成一个标准形状的小球(正态分布),假设'一个描述对应一个动作',把多解压成单峰,所以'踢'只能生成一种死板动作。
  • 真实是'多对多':踢可以是足球踢也可以是空手道踢,一个动作又有千万种说法,老办法表达不了这种丰富性。
  • 扩散从一团噪声出发一步步修出动作;同一句话换一团初始噪声能修出不同合理动作,所以'多对多'自然实现,不被压成单峰。
Q2

MDM 让去噪网络直接输出"我猜的干净动作",而不是常见的"该抹掉哪部分噪声"。这个改动为什么关键?它让什么原本做不到的事变成可能?

💡 参考答案

  • 因为输出直接是动作(不是噪声),就能在输出上加动作层面的物理/几何约束——比如'脚踩地不能滑''位置要对''速度要顺'。
  • 这些约束没法加在噪声上,因为噪声没有'关节位置''足触地'这些物理意义。
  • 所以这个改动让动作生成多年积累的几何约束能接进扩散框架(否则换了新框架反而丢了老经验)。
Q3

MDM 用处理时间序列的骨架,而不是画图去噪用的那种方格网格网络。从"动作数据的形状"角度解释为什么这样更合适?

💡 参考答案

  • 动作数据是'一串按时间排的姿势'(时间序列 + 非空间关节集合),不是画图那种 2D 方格网格。
  • 画图去噪网络(U-Net)的优势在 2D 网格的下/上采样卷积,对时间序列用不上。
  • 处理时间序列的骨架(transformer)天生处理序列、能处理任意长度,又比画图网络轻一两个数量级。
Q4

MDM 训练时偶尔会把文字条件抠掉。这种"一个模型兼两职"的设计,在生成时怎么用,调那个"甜点档位"是在兼顾什么和什么?

💡 参考答案

  • 训练时偶尔抠掉条件,让同一个模型既学'听指挥(有条件)',也学'自由发挥(无条件)'。
  • 生成时在'条件'和'无条件'之间做差值外推,调一个引导强度档位。
  • 甜点档位(强度 2.5)兼顾的是'像不像/保真'和'丰不丰富/多样':强度高偏保真,强度低偏多样。
Q5

MDM 的编辑(开头结尾固定补中间、上半身固定改下半身)不用重新训练。从"去噪是一步步修"这个机制推断,为什么能白送这种能力?

💡 参考答案

  • 去噪是一步步修的:每一步都产生一个'我猜的干净动作'。
  • 每一步都可以强行规定一部分维度不变(用输入子集覆写对应维度),让模型只补其余部分。
  • 于是开头结尾固定就补中间(时间衔接),上半身固定就改下半身(局部编辑),都只靠改采样过程实现,不用重训。

FAQ

Q1:MDM 生成的动作能直接控制机器人吗?

不能。MDM 纯运动学、不进物理,动作可能穿地、不平衡、脚滑。要喂机器人必须经基于物理的模仿器(PHC/UHC)做物理化。📎

Q2:为什么 MDM 预测干净样本而不是噪声?

为了能套几何 loss(位置、速度、foot contact)。这些约束必须在"动作"层面算,噪声层面没有物理意义。这是把动作生成老经验接进扩散的关键 trick。📎

Q3:MDM 训练要多少资源?

单张 RTX 2080 Ti(消费级),约 3 天,500K steps。比同时期图像扩散小一两个数量级。📎

Q4:MDM 和 Diffusion Policy 是什么关系?

同源技术、不同目标。都用扩散,但 MDM 是"画"动作(生成动画,不进物理),Diffusion Policy 是"做"动作(生成机器人 action,进物理执行)。MDM 输出要喂机器人还需物理模仿器翻译。📎

Q5:MDM 的编辑能力要重新训练吗?

不用。编辑靠扩散 inpainting——每步用输入子集覆写对应维度,纯改采样过程,不重训。可做时间衔接和身体部位编辑。📎