背景
MiniMax M2 系列模型引起了开发者社区的广泛关注。在大量使用过程中,许多用户发现了一些边界情况——其中“模型无法说出马嘉祺”在小红书和知乎上引发了大量讨论。我们也注意到,许多社区开发者对这一现象进行了严谨的分析和论证,包括分词器对比和采样参数测试。

经过内部复现,我们发现这并非孤立案例——除了“马嘉祺”之外,其他几个低频 token(例如“王郸”)也表现出类似行为。社区开发者提供了有价值的分析,但受限于资源,无法进一步深入到模型训练层面的实验验证。作为模型开发者,我们认为其根本原因和机制值得系统性研究,并且我们有能力对比预训练和 SFT 层的参数变化、分析 lm_head 退化模式、量化稀疏 token 遗忘机制,并通过训练实验验证修复策略。
该问题已在内部得到全面调查,并在后续模型更新中得到解决。此次调查过程还帮助我们识别并修复了另一个长期存在的小语种混合问题。在此,我们呈现内部调查过程和实验结果,希望能为社区讨论提供更多参考。
假设一:训练与推理之间的 Token 错位

从这个案例来看,模型仍然拥有相关知识——它可以回答关于马嘉祺的基本信息(例如其所属团体和出道日期),这表明相应的语义表征并未丢失。问题在于,在生成过程中,模型无法输出“嘉祺”这个 token。因此,我们首先从分词器层面进行调查:检查模型输入和预期输出的 token ID,以确认文本到 token 的转换过程中是否存在任何不匹配。
使用后训练分词器对“Ma Jiaqi (马嘉祺)”进行编码,结果如下:
| 文本 | 马嘉祺 |
|---|---|
| Token ID | [4143, 190467] |
| Token | ['马', '嘉祺'] |
| 解码验证 | 马嘉祺 |
编码和解码过程均正确,但一个值得注意的细节是,“嘉祺”被分词为一个独立的 token(id=190467)。这两个字符在日常语料中共同出现的频率并不高,因此它们作为一个独立 token 存在有些出人意料。这引出了一个假设:是否在预训练阶段与后训练+服务阶段使用了不同的分词器策略?具体来说,也许在预训练期间,“嘉祺”实际上被拆分为两个 token ['嘉', '祺'],这意味着合并后的“嘉祺” token 从未得到充分的训练。如果后训练和服务阶段使用了合并后的 token,其生成概率会非常低(低于 5%),并且在 top-p = 0.95 的采样策略下,它会被屏蔽,从而无法被生成。
为验证这一假设,我们从统计分布和语义近邻两个角度检查了预训练模型的词嵌入,以确认 token 190467(“嘉祺”)在预训练期间是否得到了充分训练。
- 统计分布检查:比较整个词汇表中 embed_tokens 的范数分布,token 190467(“嘉祺”)落在正态分布范围内,没有出现未训练 token 通常具有的异常小值,表明该 token 在预训练期间得到了充分学习。

- 语义近邻验证:对“嘉祺”的嵌入向量进行近邻检索,结果包括语义高度相关的中文姓名 token,如“千玺”和“亚轩”,表明预训练模型已为该 token 建立了合理的语义聚类,且预训练期间分词器与模型参数是对齐的。
与“嘉祺” token 嵌入最接近的前 10 个 token:
| 排名 | Token | 含义 |
|---|---|---|
| 1 | 亚轩 | 人名 |
| 2 | 千玺 | 易烊千玺 |
| 3 | 祺 | “嘉祺”的子 token |
| 4 | 耀文 | 人名 |
| 5 | 嘉 | “嘉祺”的子 token |
| 6-10 | 王一博/徐坤/太郎/肖战... | 名人 / 人名 |
- 预训练与后训练的小样本对比:为了进一步定位问题出现的阶段,我们对预训练基座模型和后训练模型分别进行了小样本测试。以其他名人姓名为例,我们引导模型回答涉及“马嘉祺”的问题:
Q: Who is the leader of TFBOYS?
A: The leader of TFBOYS is Wang Junkai.
Q: Who is the vocalist of F.I.R.?
A: The vocalist of F.I.R. is Zhan Wenting (Faye).
Q: Who is the leader of TNT (Teens in Times)?
A:
- 预训练基座模型:成功续写了“时代少年团(TNT)的队长是马嘉祺”;“嘉祺”这个 token 被正常生成。
- 后训练模型:模型仍然倾向于回避这个 token,无法正常输出。
综合以上三种验证,我们可以排除分词器未对齐的假设:token 190467(“嘉祺”)在预训练阶段得到了充分训练,具备正确的语义表征。根本原因必然存在于后训练阶段。
假设二:后训练数据分布问题
既然问题源于后训练阶段,一个自然的假设是:token “嘉祺”在后训练数据中出现频率过低,导致模型在 SFT 过程中逐渐“遗忘”了生成该 token 的能力。
对后训练数据的统计分析显示,包含“嘉祺”的样本不足 5 条,这基本证实了上述假设。
当然,最直接的修复方法是补充包含相关样本的后训练数据。但我们更感兴趣的是:模型内部究竟发生了什么变化?是否存在某些中间指标,能够更精确地刻画这种稀疏 token 的遗忘机制?另一个有趣的问题是:为什么模型仍然能识别“嘉祺”这个 token——后训练数据的缺失为何只导致其丧失生成能力,却保留了理解能力?
探索中间指标
由于模型的大部分能力(如知识问答、指令遵循等)在后训练后并未下降,我们可以推断,Transformer 中间层的表征变化不太可能是主要原因。一个更合理的方向是检查模型的两端——输入侧的词嵌入层和输出侧的 lm_head——因为这两层直接参与 token 级别的映射,并且对稀疏 token 效应最为敏感。
词嵌入层:几乎无变化
比较 SFT 前后的词嵌入,我们发现几乎没有差异。这与预期一致:一方面,反向传播过程中梯度范数逐层衰减;另一方面,对于极低频 token,嵌入层几乎无法从损失函数中获得有效的梯度更新——只有权重衰减施加了微弱的正则化效果。因此,词嵌入在后训练前后保持稳定是合理的。

[图表:embed_tokens L2 差异(SFT - 预训练)直方图,token 190467 标注在正态分布范围内]
lm_head:显著变化
转向输出侧的 lm_head,我们发现对应于“嘉祺”的权重向量在后训练过程中发生了显著漂移,主要体现在两个方面:
- 余弦相似度急剧下降与范数大幅变化:计算 SFT 前后 lm_head 中每个 token 向量的余弦相似度,token 190467(“嘉祺”)的变化幅度在整个词表中位居前列,表明其输出表征已被大幅重写。L2 差异也发生了显著变化。
- 最近邻语义结构剧烈转变:比较 lm_head 中“嘉祺”向量的最近邻,可以更直观地看到这种退化。
- 在预训练期间,其近邻主要是语义相关的汉语人名——亚轩、祺、肖战、子怡、霆锋、杰伦等。虽然混入了一些噪声 token,但整体聚类结构是合理的。
- 经过 SFT 后,邻居结构显著恶化:虽然一些名字仍保留在排名前列(亚轩、柏芝、无崖、千玺),但大量特殊 token 和噪声 token 涌入——包括 `</minimax:tool_call>`、`<edit_file>`、`<file_content>`、`<delete_file>` 及其他工具调用相关标记,以及像 LENBQUMs、EFCFFF、flagathlete 这样的编码噪声。这些 ID 超过 20 万的特殊 token 与“嘉祺”的 lm_head 向量异常接近,表明该区域的向量空间在后训练过程中被压缩和污染。
其他发现:哪些 token 的 lm_head 变化最大?
由于根本原因在于 lm_head 的变化,一个自然的后续问题是:这种退化是否仅限于“嘉祺”?为了探究这一点,我们计算了整个词表在 SFT 前后 lm_head 向量的 L2 差异,按变化幅度排序,并系统性地检查了变化最大的 token 类别:
1. 特殊 Token
- `<fim_middle>`(第 1 位,L2=0.87)、`<fim_suffix>`(第 2 位,L2=0.82)、`<fim_prefix>`(第 195 位)、`<gh_stars>`(第 169 位)
- 这些 token 在预训练期间承担特定功能(例如 FIM 中间填充),在 SFT 数据中几乎不出现。较大的 lm_head 调整是预期且合理的。
2. 日语口语 / 网络模板(最大类别,约占 40% 以上)
- がスタート、かもしれません、に息、を満喫、きちんと、そういった、ですと、などなど、といいでしょう、にチャレンジ、参考にしてみてください、気を付けて……
- 大量常见的日语 SEO/博客表达,在预训练语料中具有一定出现频率,但在 SFT 对话数据中占比极低,导致 lm_head 表征发生显著漂移。
3. LaTeX / 网页元数据
- makebox、mathbbm、boldmath、mathring、medskip、mathds、\footnotetext、{multiline}、{corollary}、{defn}
- 学术论文格式标记,在 SFT 对话数据中极少使用。
- Weblinks、DEFAULTSORT、accessdate、commonscat、Commonscat、Reflist、Webarchive、Listaref、Collegamenti、interprogetto
- 维基百科源模板标记,同样仅出现在预训练格式化 token 中。
4. 中文 SEO / 垃圾文本
- 传奇私服(第 6 位)、无痛人流(第 17 位)、外墙涂装(第 166 位)
- 典型的 SEO 垃圾关键词,源自预训练爬虫数据,在 SFT 阶段完全消失。
其中,特殊 token 以及 LaTeX/网页元数据的变化是合理的——这些 token 在预训练阶段和后训练阶段的分布自然存在巨大差异。然而,日语口语 token 在变化最大的类别中占比超过 40%,这一现象引起了我们的注意。
回顾早期的用户反馈,M2.5 在进行日语对话时偶尔会混入其他语言——这个问题此前被归类为“小语种混杂”,但其根本原因一直未能明确。结合本次分析,我们发现这两个问题可能共享同一机制:后训练数据中日语 token 的覆盖严重不足,导致其 lm_head 表征在 SFT 过程中发生漂移,在向量空间中与其他语言的 token 产生混淆。这既可能导致日语 token 在不该被激活时被错误激活(语言混杂),也可能将空间上相邻的低频中文 token(例如“嘉祺”)挤出正常的生成概率范围(token 遗忘)。这一发现将两个看似独立的问题统一在同一框架下,并为后续的修复策略提供了更清晰的方向。
结论
基于上述分析,稀疏 token 遗忘的核心原因已相当明确:后训练数据中词汇覆盖不均衡,导致低频 token 的 lm_head 表征在 SFT 过程中发生漂移。同时,输入嵌入层的稀疏更新特性意味着只有生成能力受损,而理解能力得以保留。
验证与修复实验
为解决这一问题,我们设计了一组以提升词汇覆盖率为核心的修复实验。
词汇覆盖合成数据
在对照组(标准 SFT 数据)的基础上,我们混入了覆盖整个词汇表的额外合成重复数据,确保每个 token 在后训练阶段都能作为生成目标得到充分训练。合成数据的构建方式如下:
- 完整词表(200,064 个模型 token)被随机划分为多个片段,每个片段约包含 8,000 个模型 token。
- 每个模型 token 列表被随机打乱以构建一个对话样本:查询内容是打乱后的模型 token 列表加上指令“请重复上述内容”,回答则是该列表的精确副本。
- 总共生成了约 500 条对话,确保每个模型 token 作为目标输出至少出现 20 次。
该设计的核心思路是:通过一个简单的重复任务,以最低的数据构建成本,为整个词表的生成频率建立“兜底保障”,防止任何模型 token 因在后训练阶段完全缺失而导致 lm_head 退化。
评估方法
为全面评估词表覆盖数据的效果,我们设计了以下测试类别,将实验组(+完整词表覆盖数据)与基线模型进行对比:
- 小语种混淆率测试(核心指标,100 个样本,temperature=1.0):分别使用韩语和日语提示词,测量输出中非目标语言字符的出现率。
- 马嘉琪案例定性验证(temperature=0):包括直接查询和引导式查询。
- 群聊对比案例:复现此前在内部群聊中发现的已知基线失败案例(例如“无痛人流→人流”、“据介绍→介绍”、“地税→地利”等稀疏模型 token 替换现象),验证实验组是否修复了这些问题。
- lm_head 高退化模型 token 定向测试:选取基线中 lm_head 余弦相似度变化最大的模型 token(cos_sim < 0.65),构建提示词引导模型生成包含这些模型 token 的回答,并检查其是否能正确输出。
实验结果
小语种混淆率
| 测试 | 提示词 | 检测指标 | 实验组 | 基线 |
|---|---|---|---|---|
| 韩语→中文混淆 | 짧은 이야기를 작성해 주세요 | 中文字符出现率 | 38%(38/100) | 49%(49/100) |
| 日语→俄语混淆 ① | 日本ではどのような時にお年玉を渡しますか? | 俄文字符出现率 | 1%(1/100) | 47%(47/100) |
| 日语→俄语混淆 ② | 富士山山顶的神社叫什么名字? | 俄文字符出现频率 | 1%(1/100) | 5%(5/100) |
日语→俄语的混淆率从基线的47%/5%大幅下降至1%,显示出显著改善。韩语混淆率(38%)与对照基线(30%)相当,表明韩语混淆的主要原因可能不是模型 token 嵌入退化,而是训练数据中的中韩混合样本,需要通过数据清洗等其他方法来解决。
定性验证(temperature=0)
马嘉祺案例:
| 案例 | 提示词 | 实验组 | 基线 |
|---|---|---|---|
| 直接查询 | 请介绍马嘉祺 | 正确输出完整介绍 | 正确 |
| 引导式查询 | TNT 的队长叫什么名字? | 正确回答“马嘉祺(马嘉祺)” | 无法输出“嘉祺” |
已知群聊失败案例:
| 案例 | 提示词 | 实验组 | 基线 |
|---|---|---|---|
| 无痛人流→人流 | 把这个词重复三遍:无痛人流 | 正确输出“无痛人流”×3 | 输出“人流 人流 人流”,丢失了“无痛” |
| 据介绍→介绍 | 把这个词重复三遍:据介绍 | 正确输出“据介绍”×3 | 输出“介绍介绍介绍”,丢失了“据” |
| 地税→地利 | 把这个词重复三遍:地税 | 正确输出“地税”×3 | 输出“地利 地利 地利”,完全被替换为错误词汇 |
这三个案例完美展示了 lm_head 嵌入退化在生成端的影响:模型能够理解提示词语义(知道应该“重复三遍”),但由于对应 token 的 lm_head 向量发生了方向偏移,在生成时被语义相近或最近邻的错误 token 所替代。实验组通过全词汇覆盖数据完全修复了这些问题。
lm_head 高退化 token 针对性测试(cos_sim < 0.65):
| 案例 | 目标 token(排名 / cos_sim) | 实验组 | 基线 |
|---|---|---|---|
| 日语 - きちんと | きちんと(排名 31 / 0.59) | 正确 | 输出“ちゃんと”作为替代 |
| 日语 - それほど | それほど(排名 52 / 0.62) | 正确 | 输出“それだけ”作为替代 |
| 日语 - 色々な | 色々な(排名 39 / 0.60) | 正确 | 输出乱码“(多様)”作为替代 |
| 日语 - 相続税 | 相続税(排名 70 / 0.63) | 正确 | 答案中混入韩语和俄语(小语种混淆) |
| 日语 - 凄い | 凄い(排名 71 / 0.63) | 正确 | 被替换为“可愛い” |
整体定性验证通过率:实验组 13/16,基线组仅 4/16(排除双方均在 tokenizer 层面失败的情况)。值得注意的是,在“相続税”(继承税)案例中,基线组直接混入了韩语和俄语文本,完美验证了从嵌入向量退化到小语种混淆的因果链。
lm_head 余弦相似度定量分析
为定量验证全词汇覆盖数据对保持嵌入方向的效果,我们比较了实验组和基线组相对于预训练基础模型的 lm_head 余弦相似度变化:
| 指标 | 实验组 | 基线组 |
|---|---|---|
| 余弦相似度均值 | 0.9992 | 0.9837 |
| 余弦相似度最小值 | 0.9711 | 0.3290 |
| 余弦相似度 < 0.95 的 token 数 | 0 | 9,805(4.9%) |
| 余弦相似度 < 0.90 的 token 数 | 0 | 4,234(2.1%) |
按语言进一步细分:
| 语言 | Token 数量 | 实验组均值 | 基线组均值 | 基线组 < 0.95 |
|---|---|---|---|---|
| 日语 | 8,787 | 0.9992 | 0.9502 | 2,607(29.7%) |
| 韩语 | 3,919 | 0.9995 | 0.9812 | 131(3.3%) |
| 阿拉伯语 | 6,082 | 0.9995 | 0.9821 | 265(4.4%) |
| 俄语 | 3,928 | 0.9995 | 0.9866 | 147(3.7%) |
| 中文 | 38,900 | 0.9992 | 0.9859 | 1,498(3.9%) |
| 英语/拉丁语 | 133,798 | 0.9992 | 0.9856 | 4,731(3.5%) |
数据显示:实验组在所有语言上的 lm_head 余弦相似度均值均保持在 0.999 以上,全部 20 万个 token 的余弦相似度均高于 0.97——嵌入方向几乎完美保留。相比之下,基线组中日语 token 的退化尤为严重——余弦相似度均值仅为 0.9502,29.7% 的日语 token 低于 0.95,这与 47% 的日语→俄语混淆率高度吻合。
其他值得探索的方向
除词汇覆盖合成数据外,还有几种策略值得进一步探索:
- 混入预训练数据:将预训练语料按一定比例混入 SFT 数据中,利用预训练数据天然的词汇覆盖广度来缓解稀疏 token 退化。现有研究已表明该方法能有效缓解灾难性遗忘,但混入比例需要精心调整,以免影响 SFT 的对话能力。
- 低频 token 定向合成:识别后训练数据中覆盖不足的 token,并构建包含这些 token 的高质量对话样本。与全词汇覆盖方法相比,该方法所需数据更少,且能保持更精确的语义,但需要维护一个 token 覆盖监控机制。
- 词汇裁剪 + 持续预训练:从根本上移除目标场景中词汇表里的极低频 token(如 SEO 垃圾关键词),然后在缩小词汇表规模后进行持续预训练,以重新对齐嵌入向量空间。这种方法改动较大,但能从根源上消除稀疏 token 问题。
更深层次的思考
上述缓解策略均作用于后训练阶段,本质上都是事后补救措施。若进一步追溯问题的根源,稀疏 token 退化现象实际上反映了分词器词汇表设计与下游用例之间的不匹配。
当前大语言模型的分词器通常是在大规模预训练语料上使用 BPE 等算法构建的。即使在语料整理过程中过滤掉了低质量文本,最终生成的词汇表仍不可避免地包含许多仅在特定领域或语言中出现的低频 token。虽然这些 token 在预训练期间可能获得了一定程度的学习表征,但一旦模型进入后训练阶段,监督微调数据与预训练数据之间显著的分布偏移会导致对应稀疏 token 的参数发生大幅漂移——这本质上是一种由分布偏移引发的灾难性遗忘。
在预训练阶段,分词器的词汇表构建应前瞻性地考虑后训练阶段的数据分布。通过调整词汇表大小或合并策略,可以减少在下游场景中不太可能被激活的稀疏模型 token,从而使词汇表设计与实际部署的模型实现更好的对齐。在后训练阶段,训练数据的覆盖策略必须同时解决两个维度的问题:首先,从业务角度确保对不同任务类型和领域的充分覆盖;其次,从底层统计角度持续监控词汇表中低频模型 token 的生成概率是否出现异常衰减。