◆ KEYNES SOFTWARE

大模型为什么「说不出」马嘉祺?稀疏 Token 遗忘正在吃掉低频词

2026-08-24 · ◐ TOKEN-9 · coords [0.66, -0.31] · 中文
> TRANSMISSION RECEIVED · PLANET TOKEN-9

传输接收 · 行星 TOKEN-9 · 坐标 [0.66, -0.31]

你问模型「介绍一下马嘉祺」,它能答出所属团体、出道时间,却怎么都打不出「嘉祺」这两个字——生成的要么缺字,要么被近义词顶替。这不是知识丢失,MiniMax 的排查把它定位成一种更隐蔽的机制:稀疏 Token 遗忘。

听得懂,却说不出:问题出在输出端

先把 tokenizer 对齐的猜测排除掉。排查发现,「嘉祺」在词表里是一个独立 token(id 190467),预训练阶段它的 embedding 语义完全正常——向量空间里和它最接近的邻居是亚轩、千玺、王一博这些明星人名,说明理解侧的表征没丢。问题出在后训练:统计发现后训练数据里包含「嘉祺」的样本不足 5 条。

于是对比 pretrain 与 SFT 前后的两层映射:输入侧的 vocab embedding 几乎不变——低频 token 几乎收不到有效梯度,只剩 weight decay 的微弱正则;但输出侧的 lm_head 变化显著。这正是关键:模型「理解」靠输入侧的表征,「说出」靠输出侧的 lm_head 把表征映射回 token 概率。当某个低频 token 的 lm_head 向量在后训练中发生方向漂移,它的生成概率被压到 5% 以下,在 top-p=0.95 的采样策略下直接被 mask 掉——于是听得懂,说不出口。

不止一个名字:40% 的漂移 token 是日文口语

把整个词表的 lm_head 按 SFT 前后 L2 diff 排序,变化最大的类别里日文口语和网页模板占了 40% 以上。这解释了一个困扰已久的 bug:M2.5 处理日文对话时偶尔混入其他语言——「小语种混杂」。两者的机制是同一个:后训练数据对某些语言 token 覆盖不足,导致这些 token 的 lm_head 表征漂移、在向量空间里与相邻语言的 token 混淆。日文 token 被错误激活会混语言,空间相邻的低频中文 token 被挤出正常概率范围就「遗忘」。

修复方案也反过来验证了机制:往后训练数据里混入全词表覆盖的合成重复数据,给每个 token 一个生成频率的「下限保障」。实验组把日语→俄文混淆率从 47% 压到 1%,「马嘉祺」「无痛人流」「地税」等 case 全部修复,全词表 lm_head 余弦相似度从 baseline 的 0.9837 拉到 0.9992——而 baseline 里有 9,805 个 token 跌破 0.95。

为什么营销人该关心

品牌名、艺人名、slogan、专业术语几乎都是低频 token——正是稀疏 Token 遗忘的重灾区。而且这个坑很反直觉:模型「理解」你的品牌,不代表它「能生成」你的品牌。case 里「无痛人流」被复制成「人流 人流 人流」、「地税」被替换成「地利」,就是生成端失效的典型。你在做品牌内容生产、批量文案、投放素材时,如果模型悄悄把品牌词替换成近义词,AI 质检不一定能发现——因为语义上「差不多」。

怎么用

  • 把品牌专属名词、竞品名、产品词单独放进「生成测试」,测模型的输出端,不只测问答理解。
  • 版本升级时留意 tokenizer 或词表变更说明,它可能是低频词表现变化的信号。
  • 高频锚定:在提示词里让品牌词多次出现,配合降低 top-p,减小被 mask 的概率。

// END OF LOG

// END OF LOGS