跳到主要内容

让动作跟着文字走:三代方法(MotionDiffuse → ReMoDiffuse → FineMoGen)

这一章讲三件事: 一段人体动作在计算机里到底是什么(这是全书唯一系统交代数据格式的地方); 三代方法各自解掉了哪一个具体问题; 以及一个很反常识的实测结果——检索一段相似动作来参考,做不好的话还不如不检索。 它在全书链条里的位置: 第 17 章结尾说「没有视频版的 CLIP, 所以更实际的路是拿配对的动作–文本数据训一个文生动作扩散模型」—— 这一章就是那条路。

⚠️ CLIP 在这一章退到更边上:它只用来抽文本特征,而且是冻住的。 打分器的活它干不了了(理由第 17 章讲过:它判断不了一个过程)。

1. 顶层全景:一条地基 + 两次加法

第一代:先把地基打好(第 2–7 节)
动作 = 一串关节数(每帧 263 个)
用扩散模型来生成它,但三处必须改:
主干从 UNet 换成 Transformer ← 因为**动作长度可变**
注意力换成「先压成模板再查」 ← 因为**几百帧两两打分是平方级的**
文字和步数合起来变成一组缩放和偏置,直接作用在特征上

第二代:加一个动作库(第 8–9 节)
学游戏行业:建库、用时检索几段、融合进来
✗ **但只按语义检索,比不检索还略差**
✓ 必须同时看**动作长度**,而且在注意力里把「动作」和「语义差距」分开处理

第三代:加细粒度控制(第 10–11 节)
要能说「这段时间左手做这个、同时右腿做那个」
两条路:测试期拼接(不改训练) vs 从结构上分开时间和空间
✓ **结论:从结构上做更好** —— 测试期拼接只抹平了坐标,速度和加速度会突变

图说:三代是**层层叠加**的,不是三个并列的方案。
第二代建在第一代上,第三代建在第二代的注意力上。

这一章的主走查:一句话「一个人先蹲下再跳起来」,生成一段 60 帧的动作。

发生了什么具体的数或状态
输出的形状先定下来:F 帧 × 每帧 D 个数这个数据集上 D = 263
从一串纯噪声开始(形状和上面一样),准备倒着走一堆随机数
每一帧先过一个线性投影,再加上一份「这是第几帧」的标记
(这份标记叫位置编码——序列模型本身不分先后,得额外告诉它)
让模型知道帧的先后
那句话过 冻住的 CLIP 文本编码器,再过几层可学的一串数
这串数和「现在是第几步」加起来,生成一组缩放和偏置直接乘到、加到动作特征上
注意力不两两打分:先把 key 和 value 压成一张全局模板,再拿 query 去查它开销从「和帧数平方成正比」降到「和帧数成正比」
第二代:按「语义相似度 × 长度接近度」从库里检索两段参考比如两段真人的「深蹲起跳」
检索来的东西喂进注意力:key 拼 [动作;文本],value 只拼动作这个不对称是关键
推理时四种条件组合各预测一次,按四个权重混合四个权重按 FID 最小去调
走完全部去噪步,出一段 60 帧的动作用 FID 和 R-Precision 量

263、四个权重、FID 这些是书里的真数;「一个人先蹲下再跳起来」和「60 帧」是我们为了串起来设的 (60 帧那个数来自第 17 章的配置,不是这一章的)1

2. 先说清楚:一段动作在计算机里是什么

这一节是全书唯一一处系统交代数据格式的地方,值得慢读—— 因为不知道输出是什么,后面所有设计都悬在空中。

形状

一段动作是一个表格:F 行(F 帧)× D 列。每一行描述这一帧人摆成什么样。

D 是多少取决于用哪个数据集。最常用的那个是 2632

这 263 个数是什么

① 根关节的运动(4 个数)
—— 根关节大致就是骨盆,它决定整个人在场地上的位置和朝向
绕竖直轴的角速度(转身多快)+ 沿前后、左右两个方向的线速度(走多快)
+ 根关节离地多高
**注意这里存的是速度不是位置** —— 所以动作可以从任意起点播放

② 每个关节的局部位置(J × 3 个数)
这个数据集用 22 个关节(不含手指)

③ 每个关节的线速度(J × 3 个数)

④ 每个关节的旋转(J × 6 个数)
—— **用 6 个数而不是 3 个来表示一个旋转**,是这一行的常规做法,
因为 6 个数的表示对网络更友好(不会出现「转到某个角度就突然跳变」)

⑤ **四个 0/1 位:左脚跟、左脚尖、右脚跟、右脚尖,有没有踩在地上**

图说:第 ⑤ 项最值得记住 —— **它是专门为「脚不许在地上滑」加的。**
人走路时支撑脚必须钉住不动,而一个只学「关节角度」的模型完全可能让脚一边着地一边平移。
**把「有没有踩地」直接写进数据格式,是这一行踩过坑之后的产物。**

别的数据集用别的维数(另一个常用的是 251,还有几个是 147), 但结构是同一套。

3. 早期方法差在两件具体的事

这一节交代动机,书里写得很具体、不空泛3:

早期方法具体毛病
一种同一句描述只出一种结果,而且生成不了有风格的动作
另一种(靠 CLIP 对齐短文本和动作)能懂开放的自然语言,但复杂动作生成不了——因为它训练时对齐的是「短文本 ↔ 整段动作」的特征
两者共同只吃短提示,而且不能细粒度编辑

再往上一层,书里交代了这件事为什么值得做4:

过去几十年,做 3D 动作一直靠动作捕捉系统或者在专业软件里手工编辑。 一边是成本和效率问题,一边是把大多数人挡在门外。

4. 为什么用扩散模型:三种老办法各有各的死法

这一节是选型交代,而且它给的理由很硬5:

老办法死法
对抗生成网络(第 15 章那个 GAN)训练本身就难(它和下面两族、以及扩散,都属于生成模型——
目标不是判断而是造出新样本的那一类模型)
隐函数小数据集上直接有效,但复杂条件下不泛化——而理解一句复杂描述正是这个任务的要求
自编码器 / 变分自编码器把文本和动作编到同一个空间做确定性映射(确定性:同样的输入永远给出同样的输出,中间没有随机);而高层的文本特征粒度不够,撑不起细致又多样的动作

第三条要说透,因为它直接解释了「同一句话只出一种结果」这个毛病: 确定性映射的意思是「一句话 → 一个答案」,中间没有随机性。 而扩散模型每次从不同的随机噪声出发,天然就会给出不同的结果(第 15 章第 2 节讲过)。 所以换成扩散,多样性是白得的。

5. 三处必须改的地方之一:主干换成 Transformer

这一节是主走查第 ③、④ 步。

书里给的理由只有一句,但它足够硬6:

此前的扩散模型大多用 UNet 当去噪网络。这里改用 Transformer, 主要是为了解决「生成长度可变的动作」这个问题。

为什么 UNet 不行: 第 16 章讲过,它是「先缩小再放大」的形状,为固定尺寸的图片设计的而一段动作可能是 30 帧,也可能是 300 帧。 Transformer 处理的是一条序列,长度天生就是可变的(第 02 章讲过它怎么工作)。

文本那一侧的处理值得单记6:

那句话 → **CLIP 的文本编码器(用预训练权重初始化,训练时冻住)**
→ 几层可学的 Transformer 编码层
→ 给动作解码器用的文本特征

图说:冻住是为了保住 CLIP 的泛化能力(第 13 章那条「微调会破坏图文关联」的教训);
后面接几层可学的,是为了把通用的文本特征**适配到动作这个任务上**。
**这个「冻住主干 + 后面挂一小段可学的」的形状,和第 09 章那个外挂适配器是同一个思路。**

6. 三处必须改的地方之二:注意力不能两两打分

这一节是主走查第 ⑥ 步,也是第 04 章那堵「平方开销」的墙在这里的具体表现。

问题

第 02 章讲过,注意力要让每一块去看别的所有块——所以要算 n×n 个分数。 动作序列常常有几百帧,这个平方级的开销就成了实打实的拖累7

做法:先压成一张模板,再去查它

普通注意力:
每个 query 和每个 key 都算一次分 → n×n 张分数表 → 开销 ∝ n²

这里的做法:
① 先把所有 key 摊平(softmax),和 value 乘起来
→ 得到一张 **全局模板**,大小只和特征维数有关,**和帧数无关**
② 再把 query 摊平,去乘这张模板
→ 输出

开销:∝ n(和帧数成正比),不再是 n²

图说:直觉上的差别是这样 ——
**普通注意力是「每一帧挨个去问其他每一帧」;
这里是「先把整段序列压成一份摘要,每一帧只去查这份摘要」。**

一个额外的好处

书里说这不只是快,还更准7:

那张全局模板给了模型一个整体视角, 让它更容易从一串带噪的序列里抓到动作的整体内容。

跨注意力(文字去看动作)用的是同一套,只是 key 和 value 从文本特征算。

7. 三处必须改的地方之三:文字怎么进来

这一节是主走查第 ⑤ 步。它的做法和第 15 章不一样,值得对照。

① 那句话的特征 + 「现在是第几步」的特征 → 相加得到一个向量 e
② 由 e 经过两个不同的线性投影,生成**一组缩放** W 和**一组偏置** B
③ 对动作特征做:Y × W + B

图说:所以文字不是被「拼」在输入里,而是**变成了一组直接作用在特征上的旋钮**。
书里管这个部件叫**风格化块**。

书里对「为什么要把步数也放进来」给了理由8:

让模型知道自己走到反向过程的哪一步,能降低去噪的难度。

这一点和第 15 章那个小网络读「第几步」是同一个道理: 早期该做的事和晚期该做的事不一样(第 15 章第 7 节)。

8. 第二代:建一个动作库,用时检索

这一节是主走查第 ⑦、⑧、⑨ 步。

先给这条路子挂个名:「先去一个库里找几段相似的东西,再拿它们辅助生成」—— 这类做法统称检索增强。 你在讲大语言模型的材料里也会撞见这个词,只不过那边找的是文档。

灵感来自哪儿

书里说得很实在:这是游戏行业成熟的做法9

体育游戏里先做一个高质量的动作库,玩的时候检索需要的片段, 再用融合算法把它们无缝接起来。

那能不能把检索来的样本也喂给生成模型当额外的引导? 书里说这个想法有效,但有三个具体的挑战9:

挑战具体是什么
检索什么不能只看文字像不像,还要评估检索来的动作和你想要的东西在低层面上差多少
怎么用要处理「检索来的动作和目标不一样」这件事,有选择地只吸收有用的部分
推理时怎么放大它的作用怎么用「无分类器引导」把检索的影响调到最大

挑战 ① 的解法:语义 × 长度

语义那一半好办:用 CLIP 算文字的相似度10

难的是另一半——测试时你手上根本没有目标动作,拿什么比「动作像不像」?

书里的答案是:动作长度。 这是测试时唯一拿得到的运动学线索——你要生成多长的动作,这是已知的。

最终得分 = 语义相似度 × e^(−λ × 长度相对差)

例(为演示编的):你要一段 60 帧的「深蹲起跳」。
候选 A:描述「跳起来」,语义相似度 0.82,长度 58 帧 → 长度几乎不扣分 → 高分
候选 B:描述「原地跳跃」,语义相似度 0.85,长度 200 帧 → 长度扣得很狠 → 低分
→ 选 A

图说:**用「长度」当运动学线索听起来很弱,但书里说它有效。**

挑战 ② 的解法:一个不对称的拼法

检索来的每一对样本被抽成两样东西:它的动作特征、它的文本特征。 然后喂进注意力,而喂法是不对称的11:

query :当前这段带噪的动作序列

key :当前动作特征 + 文本条件 + **[检索来的动作特征 ; 检索来的文本特征]**
value :当前动作特征 + 文本条件 + **只有检索来的动作特征**

图说:**key 决定「该不该采纳」,value 决定「采纳什么」。**
key 里放上检索样本的文本特征,是为了让模型看得见
「这段参考动作对应的描述,和我要的那句话差多远」——**差得远就少采纳一点**;
而 value 里只放动作,是因为**要往生成结果里注入的东西只有动作本身**。

挑战 ③ 的解法:四种组合混起来

这里要先讲一个通用做法12:

无分类器引导:训练时以一定概率(这里是 10%)把条件丢掉, 让同一个模型既学会「按条件生成」也学会「无条件生成」; 推理时把两种预测按一个权重往「有条件」那边多推一截,就能放大条件的影响 (这种「顺着两点连线往外多走一段」的做法叫外推)。

这一代把「检索来的样本」也当成一个条件,所以有四种组合: 有检索 + 有文本、只有文本、只有检索、两个都没有。 四种各预测一次,再按四个权重混合。

那四个权重怎么定?书里的做法很务实:按 FID 最小去调—— 并解释说,在超参接近最优时 FID 的走向和另一个指标高度一致,所以调 FID 就够了12

9. 一条很诚实的实测结果:做不好还不如不检索

这一节是这一章最值得记住的地方,而且它是消融表里的一行。

书里的消融是这么排的13:

配置结果
不检索(但有混合高效注意力 + 无分类器引导)已经明显好过第一代(第一代的 FID 是 1.954)
只按文字语义检索,把检索到的动作特征直接塞进注意力比不检索还略差
加上运动学相似度(长度)+ 在注意力里处理语义落差才真正变好

书里对第二行的评语是:这令人意外,说明检索增强在动作生成上面临相当的挑战。

判断(我们的,不是书里的): 这一行比这一章任何一个提升数字都值钱。 它说明「检索一段相似的东西来参考」这个直觉,在动作上比在文字上难得多—— 因为文字检索只要意思对就行,而动作还有一整套物理属性(时长、速度、幅度) 必须对得上,否则参考进来的是噪声。 如果错,会错在: 也可能只是这个特定的注入方式(直接塞进注意力)太粗糙, 换一种融合方式说不定不必看长度也能有效。书里只试了这一种注入方式。

10. 第三代:细粒度控制的两条路

这一节讲的是一个新任务,以及解它的两种思路。

任务变成什么样

标注不再是一句话,而是一张表14:

左臂 右臂 左腿 右腿
第 1 段 「抬起」 「不动」 「弯曲」 「弯曲」
第 2 段 「摆动」 「摆动」 「蹬直」 「蹬直」

要求:每一格生成的动作都要对上那一格的描述,
**而且部位之间要协调、时间段之间要过渡自然。**

图说:这就是「细粒度时空动作生成」——
**时**指分成若干时间段,**空**指分成若干身体部位。

路线一:测试期拼接,不改训练

这是第一代提出的做法15:

① 每个部位 / 每个时间段各跑一遍去噪,得到各自的噪声预测
② 用一张 0/1 的掩码把它们按部位拼起来
③ **再加一个梯度修正项**,去拉平不同部位的噪声预测在接缝处的差

图说:最大的好处书里写得很清楚 ——
**对训练过程和结构都没有要求,几乎任何动作扩散模型都能用。**

路线二:从结构上把时间和空间分开

这是第三代的做法,理由是路线一有一个具体的毛病16:

那个修正机制只对坐标做了平滑,所以速度和加速度会突变—— 实际用起来效果不够好。

做法是把注意力拆成两个分支17:

时间分支:
把每一张全局模板当成一个「从某个时间中心向外辐射的信号」
—— 它有一个时间中心、一个初始状态、一个速度
它在第 k 帧的重要性按**高斯权重**决定:离这个中心越远,权重掉得越快
(**高斯权重**:中间高、两边对称地快速下降的那种权重曲线)

空间分支:
**把动作的表示手动切成若干组,一组对应一个身体部位**
并且让**每个注意力头正好对应一个部位**
再用一组可学的权重让部位之间互相通气

两个分支的输出相加,就是最终结果。

图说:注意这里的思路 —— **不是在事后把各部位的结果拼起来,
而是让模型从一开始就知道「这一路管的是这个部位、这段时间」。**

11. 这一章可带走的那条判断

书里在结论里明确写了18:

在细粒度生成任务上,和「在测试期用采样策略拼接」相比, 从模型结构的角度、在注意力那一层建模时间与空间的独立性,效果更好。

判断(我们的,不是书里的): 这条结论有一个更通用的形状,值得单独记住—— 「事后拼接」和「事前建模」的差别,通常不在平均质量上,而在那些没被拼进目标的量上。 这里被漏掉的正是速度和加速度:你按坐标拼,坐标是连续的,但坐标的变化率不是。 如果错,会错在: 事后拼接的最大优点是通用(任何模型都能挂), 如果修正项被设计得同时约束速度和加速度,这条差距可能就消失了。 书里没有试这个改进。

12. 怎么量:五个指标,FID 是主的

这一节短,但不讲清楚后面的数没法读19:

指标量什么怎么算
FID(主指标)生成质量生成的动作和真实动作,两堆特征的分布差多远(第 15 章讲过)
R-Precision文字和动作对不对得上把真描述混进 31 条随机的错描述里,看排序后真描述进不进前 1 / 2 / 3 名
Diversity生成结果整体丰不丰富抽两组不同描述下的结果,量它们之间的距离
Multimodality同一句描述能不能出不同结果同一句话生成两组,量组间距离
MM Dist文字与动作特征的距离——

数据集也有好几个,最全的那个有 14616 段动作、44970 条描述20

13. 作者的判断与证据

书里给了证据的:

说法证据
扩散比自编码器那一族更适合第一代的整体结果 + 对三种老办法的分析
高效注意力又快又更准复杂度分析 + 实验结果
只按语义检索比不检索还差消融表第二行
运动学相似度和语义落差处理都必要消融表第 3–6 行的对照
从结构上建模时空独立性更好第三代与第一代测试期做法的对照
第二代的不检索基线已经强于第一代FID 明显好过 1.954

属于作者的推断:

  • 「动作长度是唯一可用的运动学线索」——这是一个设计前提,不是被证明的结论; 书里只说它有效,没有试过别的可用线索(比如从描述里估计的速度);
  • 「测试期拼接导致速度和加速度突变」——书里给了机制上的解释, 但没有单独量化速度和加速度的不连续程度。

14. 边界与局限

① 这一章不用 CLIP 当打分器,所以它不在全书那条「零样本」主线上。 它是有监督的:靠配对的动作–文本数据训练。 这和第 17 章形成直接对照——那一章没有配对数据,所以只能用 CLIP 引导; 这一章有数据,所以做得更好。

② 数据量决定上限。 最大的那个数据集是 14616 段动作; 和图像那边的几亿对图文相比,这是一个很小的量。

③ 检索库的覆盖决定检索的价值。 库里没有的动作类型,检索只会帮倒忙—— 而第 9 节已经证明「检索得不好比不检索还差」。 (这一条是我们的推论,书里没有讨论库的覆盖度。)

④ 细粒度那一路的标注很贵。 一张「时间段 × 身体部位」的描述表, 比一句话贵得多;书里为此专门用了一个细粒度标注的数据集。

⑤ 全章没有报告推理时延。 高效注意力解决的是复杂度, 但扩散模型本身要跑几十上百步,这笔账书里没有算。

⑥ 这一章的结果表,我们读不到里面的数——照实交代,免得你以为是我们漏写了。 原书这一章有六张结果表(主表两张、动作条件一张、消融两张、时序组合一张), 在我们能读到的正文里,这六张表只剩下表题,一个单元格数值都没有 (电子书打包时表格内容没有被提取出来)。 后果很具体:第一代那个 FID 1.954 是全章唯一一个能直接引到的分数, 因为它被写进了正文的句子里; 第二、三代好在哪里、好多少,我们只能给出方向性的结论—— 「已经明显好过第一代」「只按语义检索反而略差」「加上体态相似度才真正变好」 这些都是原书正文自己的措辞,不是我们从表里读出来的数所以第 9 节那条「检索做不好还不如不检索」是可靠的(它是书里写在句子里的判断), 但它掉了多少分,回核不了。

15. 可带走的

  1. 一段动作 = 一张表:F 帧 × 每帧 D 个数,最常用的 D 是 263;
  2. 那 263 个数的结构:根关节的角速度与线速度 + 高度、每个关节的位置与线速度、 每个关节用 6 个数表示旋转、外加四个记录左右脚跟脚尖有没有踩地的 0/1 位;
  3. 那四个 0/1 位是为「脚不许在地上滑」加的——这是踩过坑之后写进数据格式的东西;
  4. 选扩散不是赶时髦:对抗训练难训、隐函数不泛化、 自编码器那一族是确定性映射所以同一句话只出一种结果;
  5. 主干必须从 UNet 换成 Transformer,因为动作长度可变;
  6. 文本编码器冻住 + 后面挂几层可学的——和第 09 章那个外挂适配器同一个形状;
  7. 注意力要避开平方开销:先把 key 和 value 压成一张全局模板,再拿 query 去查它; 而且它不只是快,全局视角还让模型更容易从带噪序列里抓到整体动作;
  8. 文字不是拼在输入里,而是和「第几步」一起变成一组缩放和偏置,直接作用在特征上;
  9. 检索增强的三个挑战:检索什么、怎么用、推理时怎么放大;
  10. 只按语义检索比不检索还差——必须同时看动作长度(测试时唯一可用的运动学线索);
  11. 注入方式是不对称的:key 拼「动作 + 它的文本」,value 只拼动作—— key 决定该不该采纳,value 决定采纳什么;
  12. 细粒度控制有两条路:测试期拼接(通用、不改训练)和从结构上分开时空;
  13. 书里的判断是后者更好,因为前者只抹平了坐标,速度和加速度会突变;
  14. 主指标是 FID,配一个 R-Precision(把真描述混进 31 条错的里看能不能排到前面)。

16. 原文地图

主题原书章原文位置
做 3D 动作靠动捕或手工,贵且门槛高16. Text-Driven 3D Human Motion Generationtext/53-ch16-16-text-driven-3d-human-motion-generation.txt:61(搜「motion capture systems or professional software」)
早期方法的两条具体毛病同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:65(搜「fails to produce diverse motion sequences」)
动作表示的形状与各分量同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:79(搜「angular velocity of the root joint」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:145(搜「heel or toe of each foot」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:95(搜「263」)
三种老办法各自的死法同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:155(搜「lack the granularity」)
主干换 Transformer 的理由;文本编码器冻住同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:199(搜「motions with variable lengths」)
高效注意力:压成全局模板同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:205(搜「global feature map」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:209(搜「Efficient cross-attention」)
风格化块:缩放与偏置、为什么放步数同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:219(搜「which step of the reverse process」)
检索的灵感与三个挑战同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:227(搜「in the gaming industry」)
语义相似度由 CLIP 算;混合得分公式同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:235(搜「semantic similarity, which is calculated by the pre-trained CLIP」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:239(搜「expected motion length」)
key 与 value 的不对称拼法同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:247(搜「semantics-modulated attention」)
四种条件组合与按 FID 调权重同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:255(搜「four types of estimations」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:259(搜「minimizing FID」)
细粒度任务的定义(描述矩阵)同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:267(搜「description matrix」)
测试期拼接的做法与好处同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:271(搜「no requirements on the model’s training process」)
测试期拼接的毛病:速度加速度突变同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:293(搜「abrupt changes in velocity and acceleration」)
两个分支:时间的高斯权重、空间按部位切同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:309(搜「temporal branch and spatial branch」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:321(搜「radiating outward from the temporal center」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:325(搜「each group corresponding to a specific body part」)
消融:只按语义检索反而更差同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:383(搜「performs slightly worse than the baseline」)
结论里的那条判断同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:393(搜「modeling temporal and spatial independence」)
五个指标与数据集同上text/53-ch16-16-text-driven-3d-human-motion-generation.txt:355(搜「FID being the primary metric」) · text/53-ch16-16-text-driven-3d-human-motion-generation.txt:357(搜「31 randomly selected incorrect descriptions」)

Footnotes

  1. 出处:「16. Text-Driven 3D Human Motion Generation」第 95 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:95,搜「263」)——表 16.1 里那个最常用数据集每帧 263 维;四种条件组合与按 FID 调权重见第 255、259 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:255,搜「four types of estimations」)。主走查里那句「一个人先蹲下再跳起来」是我们设的输入;60 帧那个数来自第 17 章的动作配置(text/50-ch15-04-15-4-experiments.txt:9,搜「60 frames」),不是这一章给的——这一章明确强调长度是可变的。

  2. 出处:同上第 79 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:79,搜「angular velocity of the root joint」)、第 137 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:137,搜「height of the root joint」)、第 143 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:143,搜「6D rotation」)与第 145 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:145,搜「heel or toe of each foot」)。原文:动作序列是 F×D 的矩阵,每帧的表示随数据集而异;竖直轴垂直地面向上、前向轴对准人初始朝向、横轴从左肩指向右肩;各分量依次是根关节绕竖直轴的角速度与沿两个水平方向的线速度、根关节高度、各关节的局部位置与线速度、各关节的 6 维旋转,以及四个 0/1 位表示左右脚的脚跟与脚尖是否触地(1 为触地)。表 16.1 给出各数据集的维数:最常用的那个 263 维、22 个关节,另一个 251 维、21 个关节,还有几个 147 维。「四个触地位是为『脚不许滑』加的」这个说明是我们补的常识解释,书里只给了定义。

  3. 出处:同上第 65 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:65,搜「fails to produce diverse motion sequences」)。原文:一种早期方法生成不了有风格的动作,而且对同一句描述产生不了多样的动作序列;另一种借助预训练模型能理解开放域自然语言,但由于它训练时依赖「短文本与动作序列的特征对齐」,难以生成更复杂的动作;两者都只能接受短提示,都缺乏细粒度编辑能力。

  4. 出处:同上第 61 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:61,搜「motion capture systems or professional software」)。原文:过去几十年人们仍依赖复杂的动作捕捉系统或专业软件手工编辑;这条流水线一方面面临显著的成本与效率挑战,另一方面限制了更多用户生成自己想要的 3D 动作数据。

  5. 出处:同上第 155 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:155,搜「lack the granularity」)。原文:对抗生成网络采用对抗训练,通常难训;隐函数在小数据集上直接有效,但复杂条件下往往不泛化,而这个任务要求理解复杂的文本条件;自编码器与变分自编码器把文本与动作编到共享空间以实现确定性的文本到动作映射,但高层文本特征通常缺乏引导细致且多样动作生成所需的粒度,因而限制了输出的多样性。

  6. 出处:同上第 199 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:199,搜「motions with variable lengths」)。原文:此前工作主要用 UNet 类结构当去噪模型,这里改用 Transformer 的主要原因是要解决生成可变长度动作这个挑战;模型由嵌入层、文本编码器、动作解码器组成,嵌入层对每帧姿态做线性投影并用可学的位置嵌入引入时序;文本编码器用 CLIP 的预训练权重初始化并在训练中固定,后面接几层可学的 Transformer 编码层以适配这个任务。 2

  7. 出处:同上第 205 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:205,搜「global feature map」)与第 209 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:209,搜「Efficient cross-attention」)。原文:自注意力的好处是提供全局视角,但算 n×n 的注意力权重是 O(n²d),序列一长就急剧变慢;而这个任务的序列常有几百帧;所以改用高效注意力——不算两两权重,而是先由 key 与 value 生成一张全局特征图,再用 query 去查它,复杂度降到与序列长度成正比。「全局模板让模型更容易从带噪序列里抓到整体动作」这一点见同章对该模块作用的说明。 跨注意力用同样的形式,只是 key 与 value 从文本特征算。 2

  8. 出处:同上第 219 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:219,搜「which step of the reverse process」)。原文:扩散时间步信息与文本嵌入都可以通过这种方式注入动作特征;引入时间步有助于模型理解自己当前处于反向过程的哪一步,降低去噪难度;而引入文本嵌入让生成的动作序列更贴合给定描述。

  9. 出处:同上第 227 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:227,搜「in the gaming industry」)。原文:动作检索在传统动作生成里是常用技术,尤其在游戏行业——体育游戏里先建高质量动作库,玩的时候检索所需片段再用融合算法无缝拼接;把检索样本引入生成模型是自然的想法,但面临三个显著挑战:怎么检索到最相关的动作序列(不只看文本相似度,还要评估检索动作与目标在低层面的差异)、怎么用检索样本细化动作特征序列(要处理两者的差异、有选择地吸收有益信息)、以及测试期怎么设计高效的推理策略。 2

  10. 出处:同上第 235 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:235,搜「semantic similarity, which is calculated by the pre-trained CLIP」)与第 239 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:239,搜「expected motion length」)。原文:语义相似度由预训练的 CLIP 文本编码器算;最终得分是「语义相似度乘以一个随长度相对差指数衰减的因子」,其中长度相对差按两者长度之差除以两者中较大的那个来定义。走查里那两个候选样本的数是为演示编的。

  11. 出处:同上第 247 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:247,搜「semantics-modulated attention」)。原文:带噪的动作序列当 query;key 与 value 取自三个来源——当前动作特征、文本条件、检索样本的动作与文本特征;value 拼的是「当前动作 + 文本条件 + 检索来的动作」,而 key 拼的是「当前动作 + 文本条件 + [检索来的动作;检索来的文本]」;这样既能吸收检索样本的低层动作信息,又充分顾及语义上的相似程度。

  12. 出处:同上第 255 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:255,搜「four types of estimations」)与第 259 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:259,搜「minimizing FID」)。原文:把检索样本视为一个额外条件,于是有四种条件组合的预测,用四个超参数把它们混合起来;经验上在超参接近最优时 FID 的走向与另一个指标高度一致,所以最小化 FID 就能得到这四个权重的最优组合。 训练时以 10% 概率丢弃文本条件是无分类器引导的标准做法,见同节前文。 2

  13. 出处:同上第 383 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:383,搜「performs slightly worse than the baseline」)。原文:消融表第一行是不做检索的版本,它已经明显好过第一代 1.954 的 FID,原因主要是混合的高效注意力与无分类器引导;第二行是「用文本检索语义相似的动作,再把检索到的动作特征直接用在注意力里」,这个做法出乎意料地比基线还略差,说明检索增强在动作生成上面临相当的挑战;对比第 3 到 6 行则说明,检索时纳入运动学相似度、以及在注意力里考虑检索动作与目标动作的语义落差,两者都是必要的。

  14. 出处:同上第 267 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:267,搜「description matrix」)。原文:细粒度时空动作生成的标注是一个描述矩阵,行是时间段、列是身体部位;生成的动作必须满足全部约束,并且部位之间要协调、时间段之间过渡自然。

  15. 出处:同上第 271 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:271,搜「no requirements on the model’s training process」)。原文:扩散模型的多步迭代过程带来一个便利——可以为不同提示各生成一条序列,再在迭代过程中把它们合并成一条统一自然的动作序列;这个做法的优点是对模型的训练过程与结构设计都没有要求,几乎任何动作扩散模型都能用。 拼接时用二值掩码、并加一个额外的修正项,见同节后文第 289 段附近。

  16. 出处:同上第 293 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:293,搜「abrupt changes in velocity and acceleration」)。原文:测试期那套零样本做法在简单场景下能产出平滑动作,但它的修正机制只对坐标维度做平滑,会导致速度与加速度的突变,实际应用中效果不够好;为此第三代在注意力模块内部引入时空独立建模。

  17. 出处:同上第 309 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:309,搜「temporal branch and spatial branch」)、第 321 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:321,搜「radiating outward from the temporal center」)与第 325 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:325,搜「each group corresponding to a specific body part」)。原文:新的注意力含时间与空间两个分支,输出相加;时间分支把每张全局模板当成从一个时间中心向外辐射的信号,它有初始状态与速度,在第 k 帧的相对重要性由一个以时间中心为峰的高斯型权重归一化得到;空间分支把原始表示手动切成若干组、每组对应一个身体部位,并让每个注意力头直接对应一个部位,再让部位之间通信。

  18. 出处:同上第 393 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:393,搜「modeling temporal and spatial independence」)。原文:在细粒度生成任务上,结果表明与测试期采用的采样策略相比,从模型结构的角度在注意力阶段建模时间与空间的独立性会带来更好的表现;这也说明这类任务的注意力机制设计仍有很大的创新与优化空间。

  19. 出处:同上第 355 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:355,搜「FID being the primary metric」)、第 357 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:357,搜「31 randomly selected incorrect descriptions」)、第 359 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:359,搜「two randomly selected subsets」)与第 363 段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:363,搜「average variation in generated motion sequences based on a single text description」)。原文:共用五个指标,FID 是主指标;R-Precision 把真描述与 31 条随机错描述混成一池,按距离排序后看前 1/2/3 名的平均命中率;Diversity 比较不同描述下两组结果的距离;Multimodality 量同一句描述下结果的平均差异。

  20. 出处:同上表 16.2 所在段(text/53-ch16-16-text-driven-3d-human-motion-generation.txt:343,搜「14,616 motions paired with」)。原文列了六个数据集,最全的那个含 14616 段动作与 44970 条描述。