枢纽
数据集HumanML3D, KIT-ML
输入模态text

T2M-GPT:把「文本→动作」当成「文本→代码」,VQ-VAE + GPT 朴素组合就击败扩散

Jianrong Zhang, Yangsong Zhang 等(Jilin University + 上海交大 + Tencent AI Lab)。arXiv:2301.06052v4 (2023-09-24)。 项目页 · 开源 · text-to-motionaction_gen 线索 T04

🧠 一句话心智模型:文本到动作生成,2022 年大家以为「扩散模型一定赢」。这篇论文说「不一定」——用最经典的组合:先把动作序列用 VQ-VAE 压成一段「动作代码」(像把图像压成 token),再让一个 GPT 自回归地「按文本逐 token 吐代码」。两个工程秘诀(EMA + Code Reset 防 codebook 崩、训练时随机替换 token 消除训练/推理 gap),就让这套朴素方案在 HumanML3D 上 FID 0.116 vs 扩散 MotionDiffuse 0.6305× 完胜

🎯 为什么重要:扩散并不是动作生成的「终局」

2022 年,扩散模型在图像生成上横扫一切,紧接着被搬到动作生成(MDM、MotionDiffuse)。社区里渐渐形成一种「扩散要一统天下」的印象。T2M-GPT 是一篇「对扩散必要性提出质疑」的工作——作者发现:

核心观察:对比之前的经典方法(Guo et al. / TM2T 等),扩散模型在动作生成上的优势并不像图像领域那么大。如果能用「VQ-VAE + GPT」这种更简单、更经典的范式追上甚至超过扩散,那就能让社区避免「一窝蜂上扩散」的盲目性。

此外,作者也指出当时主流的文本→动作方法的工程负担:

已有方法问题
Guo et al. / TM2T三阶段(文本→motion token→motion token→motion),复杂;还常生成不出文本对应的动作
MDM / MotionDiffuse(扩散)评测时用真值动作长度——不实用(真实部署时你不知道动作该多长)
naive VQ-VAEcodebook collapse——512 个 code 只用几个,重建和生成都崩

T2M-GPT 把这三个问题一起解决:一阶段 GPT、隐式学长度(End token)、用 EMA + Code Reset 防崩

💡 核心思想:两阶段 VQ-VAE + GPT,像「文本→图像 token」一样做「文本→动作 token」

阶段 ① Motion VQ-VAE:动作 ↔ 离散 code 序列 动作 X T × dim 如 64 × 263 Encoder 1D CNN 下采样 l=4 Codebook 512 × 512 + EMA 更新 + Code Reset code 序列 S = [s₁,...] T/l = 16 个 阶段 ② T2M-GPT:文本 → 自回归生成 code 序列 文本描述 CLIP 编码 "a man walks" GPT (18 层 Transformer) dim 1024, 16 heads 训练时 random corruption τ=0.5 code idx + End token → 停止信号 推理流程 文本 → CLIP → embedding GPT 自回归生成 code 序列 遇到 End token 停止 VQ-VAE Decoder → 动作 → 长度自适应、无需求真值
图 1:T2M-GPT 两阶段架构(对应论文 Fig.2-3)。VQ-VAE 把动作压成 code 序列;GPT 自回归生成 code,End 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 Resetcodebook 用 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 也不会慌
🔮 直觉:为什么 VQ-VAE + GPT 在动作上能追上扩散?
动作信号比图像简单得多(维度低、时序短、语义粗粒度),扩散模型「在连续空间迭代去噪」的优势用不上——反而自回归 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.7970.0022.9749.503
Guo et al.0.7361.0873.3479.1752.219
MLD(潜扩散)0.7720.4733.1969.7242.413
MDM(扩散)0.6110.5445.5669.5592.799
MotionDiffuse(扩散)0.7820.6303.1139.4101.553
T2M-GPT (τ=0.5)0.7750.1163.1189.7611.856

关键观察:R-Precision(文本-动作一致性)和 MM-Dist 与 MotionDiffuse 持平,但 FID 5.4× 改善(0.116 vs 0.630)。注意 MDM 和 MotionDiffuse 评测时用了真值长度,T2M-GPT 不需要(更实用)。

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 ResetEMA重建 FID ↓生成 FID ↓生成 Top-1 ↑
0.49242.797(崩!)0.048
0.0970.1760.490
0.1020.2480.461
0.0700.1160.491

这是论文最关键的发现:naive VQ-VAE 训练在动作生成上根本不 work——生成 FID 42.8 等于乱生成。但只要加上 EMA + Code Reset,立刻 SOTA。这说明以前「VQ-VAE 在动作生成上不如扩散」的印象,其实是没把 VQ-VAE 训对

Fig.5:数据集规模影响——把训练集缩到 10%/20%/50%/80%/100%,所有指标随数据单调改善,且 100% 时还没饱和。作者结论:「HumanML3D 数据量仍是瓶颈,更大数据集会带来进一步收益」。

关键洞察:T2M-GPT 的真正贡献不是「赢了一个 SOTA」,而是纠正了社区一个偏见——「扩散在动作生成上必胜」。只要把 VQ-VAE 训对(EMA + Code Reset)+ 解决 GPT 的 exposure bias(corruption),经典两阶段范式更简单、更可控、FID 还更好。这给后续 MoMask 等masked建模工作铺了路。

🌐 在领域中的位置

Language2Pose / TEMOS(VAE 对齐) Guo et al. / TM2T(三阶段) MDM / MotionDiffuse(扩散) T2M-GPT(VQ-VAE + GPT 反超扩散)⭐ MoMask(masked 建模,更准更快)

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 再停」——一阶段端到端,且评测时不依赖真值长度,真正可部署。