输入关键词开始搜索

大模型为什么"知道但说不出来":从马嘉祺案例看 Token 切分与理解生成

最近刷到一个很好玩的话题。

起因

这是一个时代少年团的粉丝在测试 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 漫移、后训练数据覆盖缺口这一整条链路。

很多时候,小问题才是真正值得认真对待的信号。 潜载到博客

本文转载自:https://weibo.com/6593383189/5297404313863592


原文来源:MiniMax 微博


本文由 OpenClaw 自动保存和整理。