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

MotionGPT:把人体动作当成一门「外语」

Biao Jiang, Xin Chen, Wen Liu, Jingyi Yu, Gang Yu, Tao Chen(复旦 + 腾讯 PCG + 上海科技大学)。arXiv:2306.14795(2023 年 6 月)。 代码 · action_genmotion-language model

🧠 一句话心智模型:把 3D 人体动作序列——肩膀、胯、膝盖一帧帧的旋转角——离散化成一串「动作 token」,然后塞进一个普通的语言模型(T5)里,让它和英文单词混在一起训。模型学到的就是「动作也是一门语言」。于是所有 NLP 任务(翻译、补全、问答)都能直接搬到动作上:文本→动作 = 翻译,动作预测 = 掩码填空。

🎯 为什么重要:把「多任务动作模型」从一锅炖里解出来

之前的动作生成工作各自为政:MDM 做文本→动作,TM2T 做动作→文本,动作预测又是一篇论文。每篇都是专用模型 + 配对数据——一个任务一种架构,互不迁移。

核心矛盾:动作和文本看起来「一个是数字矩阵,一个是符号序列」,没法用同一个模型处理。所以传统做法是各训各的,但这样无法利用语言模型海量的预训练知识,也无法做到「一个模型回答所有动作相关问题」。

MotionGPT 借鉴了 BEiT-3 「image as a foreign language」的思路,提出 「motion as a foreign language」:

旧路:每个任务一个模型 MDM:文→动作 TM2T:动作→文 其他:动作预测 互不共享、互不迁移 MotionGPT:一个模型搞所有 统一词汇表 V = V_text ∪ V_motion 「Hello」 「world」 「<mot_512>」 「<mot_33>」 「<eom>」 ↓ 全部进同一个 T5 transformer ↓ 「一个 kicks two times on his left」(英) ↔ 译成 ↔ <mot_439> <mot_70> <mot_439> ...(动作 token)
图 1:把动作离散化成 token,和英文单词共享一张词汇表。然后所有「动作任务」都变成 NLP 任务。

💡 核心思想:动作 VQ-VAE + 统一词汇表 + 指令微调

核心链条有三步,缺一不可:

Step 1:动作分词器 VQ-VAE:动作序列 → 离散 token 序列 码本 K=512,每帧下采样 l=4 L1 + velocity + commitment loss Step 2:动作-语言预训练 无监督:span corruption (15% token 替换成哨兵) 有监督:文 ↔ 动作翻译 基于 Flan-T5,220M 参数 Step 3:指令微调 15 个核心任务模板 → 1000+ 指令变体 例:「给我一个走路+转身的动作」 让模型听懂 prompt 部署后:单一模型支持 4 类下游任务 文 → 动作(生成) 动作 → 文(描述) 动作预测(前缀→续) 动作补全(中间填空)
图 2:三阶段训练。Step 1 学「动作字母表」,Step 2 学「动作+英文混合语法」,Step 3 学「听人指令做事」。

最关键的一招是 VQ-VAE 动作分词器:把动作序列 $m_{1:M}$ 通过 1D 卷积编码器压到隐向量,再量化到最近的码本条目:

$$z_i = Q(\hat{z}_i) := \arg\min_{z_k \in Z} \|\hat{z}_i - z_k\|_2$$

这样每 4 帧动作被压成一个「词」(token),整个动作序列变成一段「外文」。MotionGPT 选 $K=512$ 个词(Table VIII 显示这是最优),和 T5 原本的 32000 个英文 wordpiece 拼成一张大词表。

🛠️ 工程关键设计

设计心智为什么必要
① VQ-VAE 离散量化每 4 帧动作压成一个码本索引(共 512 个「词」)让动作能进语言模型词表,与英文共享 backbone
② 统一词汇表 $V = V_t \cup V_m$原始 T5 词表 + 512 个动作 token,加 <som>/<eom> 边界符动作和文本可以在同一序列里混合出现
③ T5 encoder-decoder直接用 Flan-T5-Base (220M) 初始化,不重新训语言继承海量语言预训练知识,零成本拿到「语法」
④ Span corruption 无监督训练随机 mask 15% 输入 token,让模型还原学到 token 之间的统计关系,类似 BERT/T5 MLM
⑤ 指令模板构造15 个核心任务 × 几十种问法 = 1000+ 模板把多样任务变成「听 prompt 做事」,提升零样本能力
⑥ EMA + codebook reset码本更新用滑动平均 + 死词重置避免码本崩塌(少数词被反复用),提高利用率
🔮 直觉:为什么是「外语」而不是「图像」?
"motion as a foreign language" 不是修辞——是真的把动作当成一种没人学过的小语种:先学字母表(VQ-VAE),再学语法(预训练),再学「翻译成英文」(指令微调)。整条 pipeline 和 NLP 一模一样,唯一区别是字母表是用 VQ-VAE 学出来的,不是人给的。这意味着 NLP 任何新进展(CoT、RLHF)都可以平移过来。

📊 结果:一个模型 4 个任务,全都接近或超过 SOTA

任务(HumanML3D)MotionGPT对比 SOTA
文→动作 FID ↓0.232(微调后)T2M-GPT 0.116;MLD 0.473;MDM 0.544
文→动作 R-Precision Top-3 ↑0.778T2M-GPT 0.775;MLD 0.772
动作→文 Bleu@4 ↑12.47TM2T 7.00
动作→文 Cider ↑29.2TM2T 16.8
动作预测 FID ↓0.905MDM 6.031
动作中间填空 FID ↓0.214MDM 2.698
其他维度数字
模型规模Small 60M / Base 220M / Large 770M(Base 性价比最高)
推理速度(FPS)Small 421、Base 222、Large 119(Tesla V100)
训练规模8 张 V100,预训练 300K 步 + 指令微调 300K 步
用户研究vs MDM 73% 偏好 MotionGPT;vs T2M-GPT 65%;接近 GT
反直觉的发现(Table VI):把模型从 220M 扩到 770M 几乎没有提升,有时反而变差。作者归因:HumanML3D 只有 1.5 万段动作,数据量远不足以喂饱大模型。这暗示了动作领域缺数据的根本瓶颈。

🌐 在领域中的位置

专用动作模型(每个任务一个网络) TM2T / T2M-GPT(VQ-VAE + 单任务) MotionGPT(统一 motion-language 模型)⭐ MotionLLM / LLaMA-Motion(用 LLM 重写动作生成)

MotionGPT 是第一个把动作生成完全纳入语言模型范式的统一框架。它的「motion tokenization + instruction tuning」配方被后续 motion-language 工作(如 MotionGPT-2、MotionLLM)直接继承。属于 T-动作生成 线索中「token 化 + LLM 化」路线的奠基者。

❓ 常见误区

为什么 VQ 离散化比连续潜变量(如 MLD 的高斯潜空间)更好?

因为只有离散 token 才能无缝接入语言模型——LLM 本质是在「词」的离散空间做自回归。连续潜变量需要单独的扩散/流匹配头,没法直接和文本共享一个 decoder。代价是 VQ 会有少量量化误差,但论文 Table VIII 显示 $K=512$ 时重建 MPJPE 仅 55.8 mm,足够好。

这个模型能控制机器人吗?

不能直接控制。MotionGPT 产出的是人类动作序列(SMPL 格式),不是机器人关节指令。它解决的是「认知层:理解动作、生成动作语义」。要落地到机器人,还需要 retargeting + 下层 WBC(如 H2O、HOVER)把人动映射到机件角。

为什么不用更大的 LLM(如 LLaMA-7B)?

论文做了实验:770M 已经吃不满,再大也没用,因为动作数据太少。作者明说:「当动作数据达到百万、十亿级时,大模型才能发挥优势」。这是动作生成领域当时的普遍困境。

指令微调(Step 3)真的有用吗?

有用。Table IX 消融(Base 模型):去掉指令微调只做 motion-language 预训练,文→动作 FID 从 0.160 升到 0.365,且模型完全丧失动作预测/中间填空能力(这两项无指令微调时无法完成,表中标「-」)。指令微调让模型「听懂 prompt」,是解锁多任务的关键。(注:Table IX 中 FID 0.324 / 预测 1.643 那一行对应的是去掉预训练、只做指令微调,别混淆。)