T2M-GPT:把「文本→动作」当成「文本→代码」,VQ-VAE + GPT 朴素组合就击败扩散
🎯 为什么重要:扩散并不是动作生成的「终局」
2022 年,扩散模型在图像生成上横扫一切,紧接着被搬到动作生成(MDM、MotionDiffuse)。社区里渐渐形成一种「扩散要一统天下」的印象。T2M-GPT 是一篇「对扩散必要性提出质疑」的工作——作者发现:
此外,作者也指出当时主流的文本→动作方法的工程负担:
| 已有方法 | 问题 |
|---|---|
| Guo et al. / TM2T | 三阶段(文本→motion token→motion token→motion),复杂;还常生成不出文本对应的动作 |
| MDM / MotionDiffuse(扩散) | 评测时用真值动作长度——不实用(真实部署时你不知道动作该多长) |
| naive VQ-VAE | codebook collapse——512 个 code 只用几个,重建和生成都崩 |
T2M-GPT 把这三个问题一起解决:一阶段 GPT、隐式学长度(End token)、用 EMA + Code Reset 防崩。
💡 核心思想:两阶段 VQ-VAE + GPT,像「文本→图像 token」一样做「文本→动作 token」
两个关键工程秘诀让这套「朴素组合」真正跑通:
- EMA + Code Reset 防 codebook 崩塌:朴素 VQ-VAE 训练的崩塌现象——512 个 code 只有少数被激活。论文 Table 3 显示:不加这两个 recipe,重建 FID 0.492、生成 FID 飙到 42.797(完全失效);加上后 FID 直接降到 0.116。EMA 让 codebook 平滑更新($C^t \leftarrow \lambda C^{t-1} + (1-\lambda) C^t$),Code Reset 把不活跃的 code 重置为当前 batch 的编码——这两招对角 VQ-VAE 工作者来说是「标准操作」,但作者发现没人在动作生成上认真用过。
- 训练时随机替换 τ=50% 的 code(scheduled sampling / corruption):GPT 训练时输入是真值 code(teacher forcing),推理时输入是自己生成的 code——两者分布不一致(exposure bias)。T2M-GPT 训练时把 50% 的真值 code 替换成随机 code,强迫模型「哪怕前文错了也要把后面的修正回来」——结果 FID 从 0.140(τ=0)降到 0.116(τ=0.5)。
🛠️ 四个让 VQ-VAE + GPT 真正打败扩散的关键设计
| 设计 | 心智 | 为什么必要 |
|---|---|---|
| ① 1D-CNN VQ-VAE | 动作 = 时间序列,1D CNN 做编解码,下采样 l=4 | 比 transformer 编码器轻;保留时序局部性;codebook 512×512 够用 |
| ② EMA + Code Reset | codebook 用 EMA 平滑更新;不活跃 code 定期重置 | 这是整套方法能否 work 的关键。Table 3 显示没这两个 → 生成 FID 42.8(崩);有 → 0.116(SOTA) |
| ③ End token 替代「长度预测头」 | 训练一个专门的 End token,GPT 生成到 End 就停 | 之前 Guo et al. 要单独训一个模块预测动作长度——工程复杂且预测不准;End token 一阶段搞定,且自然支持变长 |
| ④ 训练时 code corruption (τ=0.5) | 训练时把 τ×100% 的真值 code 替换成随机 code | 消除 teacher forcing 的 exposure bias——推理时模型见过自己生成的噪声 code 也不会慌 |
动作信号比图像简单得多(维度低、时序短、语义粗粒度),扩散模型「在连续空间迭代去噪」的优势用不上——反而自回归 GPT 「逐 token 决策」更契合「动作 = 一串离散姿势的串联」这个本质。再加上 VQ-VAE 把动作压成几十个 token,GPT 学起来很快(18 层 + 单 V100 训 78 小时即 SOTA)。这是「问题难度和工具复杂度要匹配」的典型例子。
训练规模:单卡 Tesla V100-32G;VQ-VAE 14 小时(200K+100K iter,lr 2e-4 → 1e-5);GPT 78 小时(150K+150K iter,lr 1e-4 → 5e-6)。
📊 关键结果:FID 5× 完胜扩散,且不需真值长度
Table 1:HumanML3D(最大数据集,越重要)
| 方法 | R-Precision Top-3 ↑ | FID ↓ | MM-Dist ↓ | Diversity ↑ | MModality ↑ |
|---|---|---|---|---|---|
| Real motion(上界) | 0.797 | 0.002 | 2.974 | 9.503 | — |
| Guo et al. | 0.736 | 1.087 | 3.347 | 9.175 | 2.219 |
| MLD(潜扩散) | 0.772 | 0.473 | 3.196 | 9.724 | 2.413 |
| MDM(扩散) | 0.611 | 0.544 | 5.566 | 9.559 | 2.799 |
| MotionDiffuse(扩散) | 0.782 | 0.630 | 3.113 | 9.410 | 1.553 |
| T2M-GPT (τ=0.5) | 0.775 | 0.116 | 3.118 | 9.761 | 1.856 |
Table 2:KIT-ML:T2M-GPT FID 0.514(接近 MDM 0.497),R-Precision Top-3 0.745(持平 MotionDiffuse 0.739)。
Table 3:消融(HumanML3D)—— EMA + Code Reset 是「work 不 work」的分水岭
| Code Reset | EMA | 重建 FID ↓ | 生成 FID ↓ | 生成 Top-1 ↑ |
|---|---|---|---|---|
| ✗ | ✗ | 0.492 | 42.797(崩!) | 0.048 |
| ✗ | ✓ | 0.097 | 0.176 | 0.490 |
| ✓ | ✗ | 0.102 | 0.248 | 0.461 |
| ✓ | ✓ | 0.070 | 0.116 | 0.491 |
Fig.5:数据集规模影响——把训练集缩到 10%/20%/50%/80%/100%,所有指标随数据单调改善,且 100% 时还没饱和。作者结论:「HumanML3D 数据量仍是瓶颈,更大数据集会带来进一步收益」。
🌐 在领域中的位置
T2M-GPT 是动作生成领域「扩散 vs 自回归」之争的关键一票。它和同期 MLD(潜扩散)一起确立了「动作 = 离散 code 序列」这个表示范式;之后的 MoMask、MotionGPT 等都建立在这个表示之上,只是把 GPT 换成更高效的 masked transformer。关联线索:T08 动作生成谱系。
❓ 常见误区
T2M-GPT 是「GPT 模型」吗?和 LLM 里的 GPT 是一回事吗?
「GPT」在这里指 Generative Pre-trained Transformer 的范式——自回归 next-token prediction。架构上是标准 decoder-only Transformer(18 层,dim 1024,16 heads),不是 OpenAI 的 GPT-3/4。它「预训练」的部分是先训好 VQ-VAE,再训 GPT 学 code 序列分布。
「Codebook collapse」是什么?为什么这么致命?
VQ-VAE 把动作编码到 512 个 code 中。如果训练不当,模型可能只用其中几个 code(其他永远不被激活)——这就是 codebook collapse。结果是:所有动作被压成几个 code,重建质量差,生成更差。Table 3 显示 collapse 时生成 FID 42.8,几乎等于乱给。EMA + Code Reset 是 VQ 系的「标准救命药」。
「Corruption」是不是就是 scheduled sampling?
思想类似——都是解决 exposure bias。但实现更简单:训练时直接把 τ×100% 的真值 code 序列替换成随机 code,模型在这些位置看到的是「噪声前文」,被迫学会「从错误中恢复」。这比 scheduled sampling(混合模型自己的预测)实现更简单,效果也好。
为什么扩散在图像上那么强,在动作上反而不一定?
两个原因:(1)动作维度低、时序短,扩散「在高维连续空间迭代去噪」的优势用不上;(2)动作天然是「语义粗粒度 + 时序离散」的结构(一串姿势),用离散 token + 自回归更契合。论文没明说,但这是 T2M-GPT 反超扩散的深层原因。
End token 不是小细节吗?为什么算关键设计?
实战中很重要。之前的 Guo et al. 要训一个独立的「长度预测器」——一个额外模块,且预测不准会拖累整个动作。T2M-GPT 用 End token 让 GPT 自己学会「文本说『走三步』就生成 3 个 code 再停」——一阶段端到端,且评测时不依赖真值长度,真正可部署。