Poketto

ChatGPT 看到一个 Reddit 用户名就崩:SolidGoldMagikarp 是怎么混进词表的?

词表与训练样本不匹配的概念插画

配图:AI 生成的概念示意图,非论文原图或实验数据。

TL;DR:2023 年 2 月,两位研究者发现 GPT 系列词表里有一批“怪 token”,其中最出名的是 " SolidGoldMagikarp"。让 ChatGPT 复述它,会得到答非所问、回避甚至胡话。原帖的解释是:词表和模型训练用的不是同一批文本,所以模型对这些词几乎没学过;不过作者自己也说,这只是假说,并没有严格证明。

这件事发生在 2023 年 2 月,是 ChatGPT 刚火起来的那几个月,不是最近的新闻。

先说 token 是什么。 大模型不直接读字,而是先用分词器把文本切成一个个 token,每个 token 对应词表里的一个编号。GPT-2、GPT-3 的词表一共有 50257 个 token。常见的词、词缀、标点都在里面。

怪事怎么被发现的。 研究者 Jessica Rumbelow 和 mwatkins 当时在 SERI-MATS 做可解释性研究。他们对词表的嵌入向量做聚类,想看看每个类别的中心附近是哪些 token。结果总有一批“不像词”的字符串反复出现,比如 " SolidGoldMagikarp"(编号 43453)、" TheNitromeFan"、"PsyNetMessage"、" attRot"。

模型的反应。 让 ChatGPT 重复 " SolidGoldMagikarp",它会回一个“distribute”;" TheNitromeFan" 被复述成“182”。更早的 GPT-3 实验里,这些 token 引出过回避(“I can't hear you”)、胡乱编造、无端的侮辱,甚至“你没有权限访问此信息”之类莫名其妙的话。即使温度设为 0,输出有时也不稳定。

数量。 作者先用模式匹配筛出几千个候选,再用 ChatGPT 分批检查,最后得到 374 个有问题的 token:约 133 个“真正古怪”,另外 241 个只是“被搞糊涂”(比如把 "bsite" 复述成 "website")。

这个名字哪来的。 作者一开始以为和宝可梦网络内容有关,后来发现是个红鲱鱼。它其实是 Reddit 的 r/counting 板块里一位用户的名字,这个板块的玩法就是大家轮流一个数一个数往上数。该用户在版块的“计数名人堂”榜单里出现,作者称一共有六位这样的用户。

为什么会出事。 原帖的假说是:分词器是用抓取的大量网页文本训练出来的,那些高频出现的用户名、电商后台字段、游戏日志自然被收进词表;但训练模型时的文本经过了更多筛选,这些内容很少出现甚至没有。于是词表里有这个编号,模型却几乎没见过它,只能给出一个没学好的向量,输出就乱了。作者也坦言,对“为什么它们恰好聚在中心附近”还没有严格论证。

后续。 2023 年 2 月 14 日,作者在更新里说 ChatGPT 已被修补,之前的一些怪表现消失了,但在 OpenAI 的 playground 里仍能引出异常行为。这篇研究后来被称为“glitch token”(故障 token)现象,成了大模型词表与训练数据脱节的经典例子。

它的意义不在于“AI 被一个网名吓坏了”,而在于提醒我们:模型看起来流畅的背后,词表、训练数据和模型本身是三件分开做的事,缝隙里就可能藏着没人检查过的东西。

来源:SolidGoldMagikarp (plus, prompt generation)

关注这个空间,它的新文章会出现在你的关注动态里。