跳转至

Token 退化问题:分词器与后训练数据分布失配

Ch01.264 Token 退化问题:分词器与后训练数据分布失配

📊 Level ⭐⭐ | 13.7KB | entities/minimax-token-degradation-jiqia.md

-> 原文存档

核心概念

Token 退化(Token Degradation):大模型在后训练阶段,由于 SFT 数据对词表覆盖不足,导致部分 token 的 lm_head 输出参数发生显著漂移,模型丧失生成这些 token 的能力。

核心机制链路: 1. 分词器基于预训练语料的统计频次决定 token 合并策略——稀有字符组合(如"嘉祺")可能被合并为独立 token 2. 后训练对话数据的分布与预训练差异巨大——大量在预训练中常见的 token(如日语、SEO垃圾词)在 SFT 数据中出现频次极低 3. 高频出现的 SFT token 持续更新周围向量空间,把低频 token 挤压到错误方向 4. lm_head 权重向量偏移——余弦相似度大幅下降(RV < 0.9 即为显著退化),Norm 变化显著 5. 生成概率崩溃——退化 token 在 softmax 归一化后被空间相邻的替代 token 取代

Token 退化的本质是预训练-后训练数据分布失配在 token 粒度上的体现。

退化本质定位:问题精确指向 lm_head 输出层,而非 embedding 输入层。证据链:

  • 对比实验:预训练模型能输出"马嘉祺",SFT 后不行
  • 语义理解未损:模型仍能准确回答马嘉祺的所有信息
  • 修复方向:聚焦 lm_head 权重修正,而非重新训练 embedding

日语 token 退化 29.7% 的特殊性:日语是 tokenization 难度最高的语言之一(汉字+平假名+片假名三重脚本混合),SFT 数据中日语内容覆盖严重不足,且日语 token 在向量空间中与俄语/韩语相邻——日语退化引发跨语言混杂(日语回答中混入俄文字符)。其他语言退化率:俄语 3.7%、韩语 3.3%、中文 3.9%、英文 3.5%。

SEO 垃圾词的警示意义:"传奇sf"排第6、"人流"排第17——预训练语料覆盖的广度在后训练中被急剧收缩,任何词表覆盖域远超 SFT 数据的模型都可能复现这一问题。

全词表"复读任务"(已部署)是当前最有效的工程解法:通过合成数据为全词表建立生成频率"下限保障",防止任何 token 因完全缺失而退化。效果:日语混杂 47%→1%,lm_head cosine similarity 最低 0.329→全部高于 0.97。

多层次解法按需组合:混入预训练数据(缓解灾难性遗忘但需调控比例)、定向低频 token 合成(精准但需维护监控)、词表裁剪 + CPT(从源头消除稀疏 token 但改动最大)。

后训练 QA 必须加入 token 覆盖度扫描:建议将全词表 lm_head cosine similarity 扫描纳入后训练数据质量评估流程,在模型上线前系统性识别潜在退化风险。

方案 效果 改动幅度
全词表复读任务(已部署) 日语混杂 47%→1%;cosine similarity 0.329→0.97+
混入预训练数据 缓解灾难性遗忘
定向低频 token 合成 精准覆盖不足 token
词表裁剪 + CPT 从源头消除稀疏 token

深度分析

退化本质:lm_head 而非 embedding

Token 退化的精确定位是 lm_head 输出层,而非 embedding 输入层。对比实验(预训练模型能输出"马嘉祺",SFT 后不行)+ 语义理解能力未损(能回答马嘉祺信息)双重验证了这一点。这意味着修复应聚焦 lm_head 权重修正,而非重新训练 embedding。

lm_head 退化的精确物理含义: lm_head 本质是一个 vocab_size × hidden_size 的权重矩阵,将最后一层的隐藏状态 $h_t$ 映射到 logit 向量 $o_t = h_t \cdot W_{lm_head}^T$。当 token $k$ 退化时:

  • $W_{lm_head}[k]$ 向量发生漂移,与预训练状态的余弦相似度显著下降
  • 向量 norm 发生变化(通常是变小),导致 logit 值偏离正常范围
  • 在 softmax 归一化后,目标 token 的生成概率 $P(k) = \frac{exp(o_t[k])}{\sum_j exp(o_t[j])}$ 大幅降低

这一发现对问题定位具有决定性意义——指向了 lm_head 输出层而非 embedding 输入层。

向量空间挤压机制详解

Token 退化的核心机制是向量空间竞争。SFT 阶段高频出现的 token(如 tool_call 标记、代码符号)持续对其周围向量空间进行更新,将未被 SFT 数据覆盖的低频 token 挤压到错误的向量方向。

具体机制: 1. 空间邻居效应:在预训练的词向量空间中,每个 token 的嵌入向量与其语义/语法邻居相邻。高频 SFT token 在微调时对其邻居方向的梯度更新最为显著 2. 低频 token 被"挤出":未在 SFT 数据中出现的 token(如"嘉祺")没有机会获得梯度更新,其向量被高频邻居挤压到错误方向 3. lm_head 漂移:退化 token 对应的 $W_{lm_head}[k]$ 偏离原始位置,导致 logit 计算时选中概率下降

以"马嘉祺"为例:预训练阶段模型见过大量关于马嘉祺的语料,"嘉祺"作为独立 token 被充分训练。但 SFT 数据中该 token 出现不到 5 条,高频 token(如"佳琪"、"琪琪")在微调时主导了向量空间更新,将"嘉祺"挤压到错误方向,最终模型转而选择发音相近的替代词。

日语退化 29.7% 的根因分析

日语 token 退化率高达 29.7%,远超其他语言(俄语 3.7%、韩语 3.3%、中文 3.9%、英文 3.5%),其根因在于日语的三重脚本混合 + 后训练数据覆盖严重不足

  1. 脚本复杂性:日语混用汉字(Hani/Kanji)、平假名(Hiragana)、片假名(Katakana)三种字符体系,同一语义可能有多种书写形式,导致 tokenizer 需要为大量字符组合分配独立 token
  2. 词表覆盖的稀疏性:日语在预训练语料中的占比远低于英文和中文,但词表中的日语 token 数量却相当多,造成大量低频 token
  3. SFT 数据分布偏移:对话型 SFT 数据中日语内容覆盖严重不足,大部分 SFT 数据是中文和英文,导致日语 token 在后训练中几乎完全未被更新
  4. 跨语言空间混淆:日语 token 在向量空间中与俄语、韩语等其他斯拉夫/黏着语系的 token 相邻,当日语 token 大规模退化后,模型在日语回答中混入俄语/韩语字符——退化通过向量空间的相邻关系产生跨语言干扰

SEO 垃圾词的 token 退化:预训练广度的收缩镜像

退化 token 列表中出现的"传奇sf"(第6)、"人流"(第17)、"外墙涂装"(第166)等 SEO 垃圾词,揭示了一个更深层的问题:后训练大幅收缩了预训练语料的覆盖广度

这些词在预训练语料(互联网抓取数据)中出现频率极高,被 tokenizer 分配了独立的 token 编号。但它们在对话型 SFT 数据中完全不会出现——SFT 数据通常经过清洗,不包含这类低质量 SEO 内容。结果是:

  • 这些 token 在预训练阶段被充分训练
  • SFT 阶段完全缺失
  • 向量空间被 SFT 高频 token 主导后,这些 token 被"边缘化"

这一现象在任何词表覆盖域远超 SFT 数据的模型中都可能复现——特别是当 tokenizer 基于大规模互联网语料训练时,不可避免地包含大量仅在特定网络内容中出现的 token 模式。

全词表"复读任务"技术细节

MiniMax 部署的"全词表复读任务"是当前最有效的工程解法,其核心思想是:通过合成数据为全词表建立一个生成频率的"下限保障",防止任何 token 因为完全缺失而退化。

实现方法: 1. 合成数据构造:对词表中每个 token 构造包含该 token 的简单复读样本(如"请生成以下文本:{token}"),确保每个 token 在合成数据中至少出现一次 2. 复读任务设计:模型学习复述给定的 token 序列,而非生成新的内容。这种任务对所有 token 一视同仁,为低频 token 提供了与高频 token 同等的训练机会 3. 频率下限保障:即使某些 token 在真实 SFT 数据中从未出现,在复读任务中也必然出现,从而避免了完全缺失导致的 lm_head 漂移

效果验证:

  • 日语混杂率:47% → 1%(下降 46 个百分点)
  • 全词表 lm_head cosine similarity:最低 0.329 → 全部高于 0.97
  • 改动幅度小、已在线上验证

该方案的核心优势在于不依赖真实 SFT 数据的 token 分布,用合成数据弥补了分布偏差,且无需修改 tokenizer 或重新训练模型。

检测方法论:全词表 lm_head 漂移扫描

MiniMax 使用的检测方法是对约 20 万 token 的整个词表进行全量扫描,计算每个 token 在后训练前后输出参数的变化幅度:

检测指标:

  • 余弦相似度(Cosine Similarity):比较预训练和后训练阶段 lm_head 权重向量的方向变化。阈值建议:RV < 0.9 视为显著退化
  • 向量范数变化(Norm Ratio):比较权重向量的模长变化。显著偏离 1.0 的 ratio 表明 token 退化

扫描流程: 1. 提取预训练 checkpoint 的 lm_head 权重矩阵 $W_{pre}$ 和 SFT 后模型的 lm_head 权重矩阵 $W_{sft}$ 2. 对每个 token $k$,计算 $cosine_sim(k) = \frac{W_{pre}[k] \cdot W_{sft}[k]}{|W_{pre}[k]| \cdot |W_{sft}[k]|}$ 3. 按 cosine_similarity 升序排序,识别退化最严重的 token 4. 结合语义分析(如识别日语 token、SEO 垃圾词等)定位退化模式

建议:将全词表 lm_head cosine similarity 扫描纳入后训练 QA 流程,在模型上线前系统性识别 RV < 0.9 的退化 token 列表,配置人工审核阈值。

四种解法的工程权衡(扩展版)

维度 全词表复读任务 混入预训练 定向低频合成 词表裁剪+CPT
效果 最佳(日语 47%→1%) 中等 精准 根本性
数据成本 低(合成数据) 高(需重标) 中(需监控) 最高(需 CPT)
改动幅度 小(已部署验证)
上线风险
推荐场景 快速止血/线上修复 长期优化 针对性补充 新模型从头训练
副作用 无已知副作用 可能影响对话格式 可能引入噪声 词表缩小影响效率

方案选择决策树: 1. 线上应急修复 → 全词表复读任务(最快、最低风险) 2. 新模型训练 → 词表裁剪 + CPT(从源头解决) 3. 持续优化 → 混入预训练数据(长期,但需调参) 4. 精准补强 → 定向低频 token 合成(针对已知问题 token)

来源