最近刷到一个很好玩的话题。
起因
这是一个时代少年团的粉丝在测试 MiniMax 的模型的时候,发现模型虽然认识马嘉祺,但就是绕来绕去,说不出”马嘉祺”这三个字,会来一个”佳琪”,或者”琪琪”。
这个问题传到知乎上,引发了一堆开发者跟进测试,但受限于没有训练层面的访问权限,最终还是停留在现象描述层面。
大概就是这个阶段,MiniMax 内部也注意到了这个讨论。他们内部复现之后,决定不只是修个 bug 了事,而是把整个排查过程写成技术博客发出来,包含排查失败的方向、没解决的问题,从头到尾拆开讲了一遍,很推荐大家去读一下原文。
1. 为什么这件事为什么听起来匪夷所思
我们通常会觉得 AI,它要么知道,要么不知道,为啥会出现”知道但说不出来”这种状态?
这听起来像是人的毛病,不像是机器会有的问题 🤔
2. 大模型的输入层与输出层
大模型在处理语言的时候,处理输入和产生输出,走的是两套完全不同的参数。
- 输入侧负责”理解”,把你输入的文字转成它内部能计算的形式,让模型读懂你在说什么,叫 embedding。
- 输出侧负责”生成”,把它内部算出来的结果重新翻译回人类语言,输出给你看,叫 lm_head。
这两层虽然共享同一个模型,但本质上是解耦的两套参数,各自有各自的权重。
这意味着一件事:一个 token,它的理解能力和生成能力是可以独立退化的。
像开头马嘉祺这个案例,理解层是好的,模型能讲清楚他的背景,说明它建立了正确的语义,确实知道这个人。
但生成层出了问题,当模型要输出的时候,对应”嘉祺”这个词块的权重在训练过程中悄悄偏移了,已经不在它该在的位置上了,于是模型生成时就绕开了它。
3. 但问题来了,为什么是马嘉祺?而不是某个更冷门的人?
这里有一个非常反直觉的地方,是我读这篇博客之前完全没想过的。
大模型处理文字的方式,跟人类是不一样的,人类是一个一个字认的,但大模型不是。
大模型在处理文字之前,会先把文字切成不同的 token,有些是一个字,有些是两个字,有些是一个完整的词组。
切的方式有一套算法,如果两个字符经常紧挨在一起出现,就把它们合并成一个独立的 token。
“马嘉祺”三个字,在模型看来不是三个独立的字,而是两块:一块是”马”,一块是”嘉祺”。”嘉祺”这个组合,因为在预训练的海量文本里出现次数够多,所以被分词器识别成了一个整体。
模型要输出”马嘉祺”这个名字,必须把”嘉祺”作为一个完整的单元吐出来,少了这一步,名字就残缺了。
这时候问题就来了,后训练的对话数据里,包含”嘉祺”这个词的样本不到 5 条。在动辄几十万甚至几百万条的训练数据里,这几乎等于零。
这意味着模型在后训练的整个过程中,几乎从来没有练习过”输出嘉祺”这个动作。
与此同时,后训练里有大量高频出现的 token,比如代码符号、工具调用标记。这些 token 每天被反复练习,在向量空间里的位置越来越稳固,影响力越来越大。
等到模型真的要输出”嘉祺”的时候,它找不到了。它只能去找发音相近、位置相近的其他 token 来凑,于是就出现了”佳琪”或者”琪琪”。
工程师们通过计算对比发现:”嘉祺”对应的权重向量,在后训练前后发生了非常明显的偏移,余弦相似度大幅下降。
4. MiniMax 的全面排查
工程师发现这个问题后,没有只修这一个词,而是把整个词表大概 20 万个 token,全部扫了一遍。
结果发现,约 4.9% 的 token 都发生了类似程度的退化。
退化的 token 里,有几类很有代表性
传奇私服””外墙涂装”这样的 SEO 词
这些词在预训练的互联网语料里大量出现,传奇私服的广告、医疗机构的 SEO 垃文、装修公司的落地页,全都贡献了大量的语料。
但后训练数据里,没有人会让模型去输出这些东西,这些 token 的生成能力就彻底荒废了。
日文 token 的退化
另一类让工程师们更警觉:日文 token 的退化比例高达 29.7%,远超中文的 3.9%、英文的 3.5%。
这也牵出了另一个之前一直找不到根因的问题:模型在处理日语对话的时候,会突然蹦出俄语。
这两件事听起来风马牛不相及,但排查到最底层,根因是一样的:后训练数据里,某些 token 的覆盖严重不足。
日语尤其是重灾区,MiniMax 给出的数据显示,有将近 30% 的日语 token,余弦相似度跌破了 0.95 这个行业通用的警戒线,远超中文的 3.9%、英文的 3.5%。
5. 找到根因后,解决思路
找到根因后,解决思路反而不复杂:让每个 token 在后训练阶段都被练到。
MiniMax 给出了三种解决方案
一种是混入预训练数据,用早期大量见过这些 token 的数据来稀释,让生成层重新激活。这是比较保守的做法,已经有研究在支持。
另一种是定向合成低频 token 的训练样本,专门给那些快退化的 token 造练习题,精准补课。这个做法更精准,但需要持续监控哪些 token 开始滑落。
最激进的是直接裁剪词表,把那些覆盖不到的 token 直接删掉,从源头消除问题。不过代价是这些词以后要用更多 token 来表达,推理成本上来了。
定向合成训练样本
MiniMax 选了前两条,500 条定向数据,修了 20 万词表里的问题。
他们的工程师构造了一批覆盖全词表的合成数据,核心就是一个简单的复读任务,确保每个 token 都被生成过至少一定次数,给全词表建立一个生成频率的下限。
说了这么多,这件事最有意思的地方在于发现的过程本身。一个看起来只是”明星名字说错了”的小问题,顺藤摸瓜,挖出了日语混乱、token 漫移、后训练数据覆盖缺口这一整条链路。
很多时候,小问题才是真正值得认真对待的信号。 潜载到博客
原文来源:MiniMax 微博
本文由 OpenClaw 自动保存和整理。