将 Glimmer 模型扩展为人类动作描述生成器

Meta 刚刚发布了一个很棒的小模型 Glimmer。它的架构相当标准,在大多数基准测试上表现也很不错。有趣的是,它保留了 2048 个“保留 Token”。我猜这些是为未来的工具调用等功能准备的。
不过它的大小刚好适合塞进一种新的模态。
所以我就这么做了。
我向大家介绍 MotionGlimmer(名字还需要打磨)。这是一个 30B 模型,所有保留 Token 现在都变成了人体运动 Token。模型可以读取人体运动并将其翻译成英文。
我的设计框架如下:
X ∈ R^(T×272) → FAST tokens z₁…zₗ ∈ {0…2047} → Glimmer + QLoRA → motion caption
当前模型使用 Muse Glimmer 30B、一个内部训练的、拥有 2,048 个码的 FAST 运动 Tokenizer,以及一个带版本号、共 8,807 个片段的纯运动数据集。在 3,000 步训练的第 2,500 步检查点时,留出集交叉熵为 0.273,留出集平均 Token 准确率为 89.9%。
我非常想知道生成的文本是否真的描述了留出集里的运动。
实验设置
每个样本都是一个聊天格式的序列。用户回合只包含一条指令和离散的运动 Token;助手回合包含一条可观察运动的描述。
user:
描述仅可观察到的身体运动。
<|motion_bos|><|motion_17|>...<|motion_903|><|motion_eos|>
assistant:
一个人向前迈步,双臂举过头顶,然后放下。
损失只计算补全部分;从输入开头到助手响应头之前的每个 Token 都被掩码。因此,模型被训练去预测描述,而不是重建运动 Token 提示。collator 还会断言没有运动 Token 泄漏到目标标签中。
如果没有正确打包,Token 准确率也可能升高,因为模型学到了输入序列的结构,却几乎没有学到运动到语言的映射。
将运动转化为 Token
运动输入是一个 272 维的人体特征序列。这是一个固定骨骼的展平表示。所以第 132 列可能是左肩旋转 2,而第 5 列可能是 spine-1 的位置 1。
我们希望这些特征以更紧凑、更易学习的形式呈现。幸运的是,PI 的伙伴们发布了他们的机器人动作空间 Tokenizer FAST。它的性能非常出色,对人体运动也同样适用。
它基本上分三个阶段压缩运动:
- 时间 DCT。正交离散余弦变换将每条连续轨迹转换为频域表示。
- 缩放与量化。连续系数被映射为离散符号。
- 字节对编码。重复的符号模式被合并成一个紧凑的变长词表。

拟合好的 Tokenizer 有 2,048 个码。一段运动变成这些离散 Token 的序列(就像语言一样!)
[17, 17, 903, 441, 62, ...]
然后无损地映射到 Glimmer 的保留词表中:
<|motion_17|><|motion_17|><|motion_903|><|motion_441|><|motion_62|>...
FAST 相对于原始的浮点轨迹是有意有损的。它的任务不是保留每一个关节系数,而是保留足够的结构化运动信息,让序列模型能够在可控的上下文长度内区分动作、方向、重复次数和过渡。它在这方面做得非常好!
在这次运行中,我决定打包后的运动最多不超过 384 个 FAST Token。
较长的片段使用居中连续裁剪,而不是前缀裁剪;有 1,532 个样本是这样裁剪的。居中策略避免了系统性地只训练动作的开始部分而丢掉动作的完成部分。也就是说,大多数运动都是缓慢开始、逐渐加强、再缓慢结束——居中裁剪能拿到最精华的部分。
扩展 Glimmer 的词表
这次 Tokenizer 改造在原则上很简单,但很容易在细微处出错。
Glimmer 原始 Tokenizer 包含 202,048 个条目。我们使用这些保留的特殊 Token:
- 运动开始:
<|motion_bos|>→ token ID 200000 - 运动结束:
<|motion_eos|>→ token ID 200001 - FAST 码 0:
<|motion_0|>→ token ID 200002 - FAST 码 2047:
<|motion_2047|>→ token ID 202049
新的 Tokenizer 长度为 202,049(因为得把 bos 和 eos 这两个 Token 也塞进去)。
我用一些简单的往返验证来确认它:
probe = [0, 1, 2, 3, 4, 5, 6, 7]
text = fast_ids_to_motion_string(probe)
encoded = tokenizer(text, add_special_tokens=False)["input_ids"]
recovered = motion_string_to_fast_ids(tokenizer.decode(encoded))
assert recovered == probe
这还能验证嵌入边界:第一个运动 Token 必须恰好从预训练嵌入表结束的位置开始。
motion_bos_id == original_embedding_rows == 200000
这能捕获一类危险的错误:tokenizer 的扩展顺序与可训练嵌入行的选择顺序不一致。
构建一个描述运动的数据集
我们内部有大量运动数据,我选择了一个小的子集,称之为 Motion-only v1.2。它是从我们大得多的带标注语料库中随机采样的。我通过动态调整标签,让标签包含运动特定信息,使任务稍微简单一些:
- 身体动作:走、跳、踢、打、爬、蹲、跳舞;
- 方向和轨迹;
- 节奏和重复;
- 姿态和肢体参与;
- 可见的过渡,例如从坐到站或边走边转。
目标排除更长的描述和关于运动的其他事实(例如面部表情或与场景的关系)。
从同一段源运动切出的时间片段是相关的。随机的片段级划分会把运动风格和采集条件泄漏到训练集和评估集之间。
为了解决这个问题,v1.2 在分配确定性的 90/5/5 划分之前,先按源 ID 分组。合成运动单独放在自己的小组里。最终生成的各个划分之间没有共享的源组:
- 训练集:7,790 个片段 / 4,583 个源组;
- 验证集:528 个片段 / 269 个源组;
- 测试集:489 个片段 / 282 个源组。

所有 29 个动作类别都出现在每个划分中。训练集每个动作类别限制为最多 500 个片段,这移除了 180 个多余的手势片段和 23 个多余的行走片段,同时保留了每一个稀有样本。另外还有一个独立的均衡留出基准,包含 400 个片段,每个类别最多 16 个。
打包器将所有请求的 FAST 序列重新组装完成,零缺失、零不完整片段(炫耀一下)。
微调 Glimmer
基础模型以 4-bit NF4 加载,并使用 QLoRA 进行适配。视觉塔被排除在外;运动完全通过文本 Token 接口输入。
一些训练要点:
- 最大优化器步数:3,000
- 序列长度:512
- 运动 Token 上限:384
- 微批次大小:1
- 梯度累积:8
- 峰值学习率:1e-4
- 调度器:cosine
- 预热步数:90
- LoRA rank / alpha:32 / 64
- LoRA dropout:0.05

LoRA 应用于注意力投影 q/k/v/o 和 MLP 投影 gate/up/down。这 2,049 个 Token 行通过选择性 Token 适配器直接训练。
训练表现
上图展示了训练表现。NLL 和 MTA 看起来都非常好!
初始的留出集损失为 29.257,平均 Token 准确率几乎为零。到第 250 步时,留出集损失降至 0.473,Token 准确率达到 85.2%。此后改进放缓,但一直在持续。
在第 1,000 步和 2,000 步附近有小幅损失波动,但训练/评估差距没有扩大。在第 2,500 步时,训练损失为 0.268,与留出集损失接近,而 cosine 调度已衰减到 7.14e-6。
一个重要的提醒是,Token 准确率奖励的是与目标文本的词汇级一致。它并不能证明描述在语义上是正确的,也无法揭示输入运动本身是否异常,但我们的训练集中没有这些情况(我检查过),所以在这个小实验中它还不错。
在 Body Model 上的可视化评估
最终的展示流程是:
留出集 FAST 序列
-> 模型生成描述
-> 将源运动解码为 BVH
-> 使用经过校验的坐标校正进行诊断骨架渲染
-> 剔除躺下、被截断、异常或微弱的运动
-> 将合格的 BVH 重定向到 Body Model
-> 检查实际渲染效果
<VIDEO HERE>
结论(?)

GIF
这太酷了!它基本上说明,Meta 的这个新模型非常容易扩展。昨天我还开玩笑说它的词表大小很奇怪,但它的奇怪程度刚好让我能把它用在运动上。
有很多琐碎的细节需要处理好,但基本流程是:
- FAST Tokenizer 将连续运动映射为一种紧凑的离散语言。
- 语言模型的词表通过一个可证明连续的独立 Token 块进行扩展。
- 只有这些“新”嵌入行被直接训练;预训练词表不训练。
- 监督信号聚焦于清晰的运动。
- 源组互不相交的划分防止同一视频的片段在评估边界之间泄漏。
- 标量指标和 Body Model 检查让我们看到它的表现!
谢谢!如果有问题或者想了解更多,欢迎私信我。
- 原文链接: x.com/andrew_n_carr/stat...
- 鸿途知科网 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
鸿途知科网
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。