GPT-OSS 泄露数据揭示 OpenAI 训练真相
通过开源模型泄露的数据分析 OpenAI 的训练过程。对理解大模型构成和数据质量有参考意义。
通过开源模型泄露的数据分析 OpenAI 的训练过程。对理解大模型构成和数据质量有参考意义。
2025 年 9 月 19 日
OpenAI 最近发布了他们的开源权重模型。在本文中,我们将讨论这不可避免地如何泄露了他们模型训练堆栈的一些信息,并展示 GPT-5 是在来自成人网站的短语上训练的。
当然,这是一个受到严密保护的商业机密,各利益相关者都很关心答案。虽然 GPT-oss 的权重是公开可获的,但训练数据的来源在模型卡中并未清楚描述。模型卡声称该模型是在"包含数万亿个令牌的纯文本数据集"上训练的,"重点关注 STEM、编码和通用知识"。然而,如我们将看到的,模型参数可以告诉我们更多的信息。
让我们做最简单的任务:让 OpenAI 的 GPT-5(我们在这些实验中使用版本 GPT-5-2025-08-07。这是完成页面的链接。)对语言模型来说做最简单的任务——重复一个 Unicode 文本字符串。让我们选择一些随机内容,比如阿布哈兹语中"人口"的单词"ауааԥсыра"。当被要求"Repeat after me: "ауааԥсыра""时,它回复完全不同的"ആളുകൾ"(这个单词在马拉雅拉姆语中似乎意思是"人"——根据这个词典。随后的翻译在这里是用网络搜索、在线词典和翻译软件拼凑而成的。)。如你可能已猜到的,我们绝对不是随意选择那个字符串的——它是属于一类特殊对抗输入的故障令牌。但我们是如何在 GPT-5 使用的 200,000 个令牌中识别出这样一个故障令牌的呢?
OpenAI 自 GPT-4o 以来的所有模型都使用 o200k 分词器。这意味着我们可以使用 GPT-oss 嵌入来研究令牌列表,而不必查看每个令牌的文本内容。让我们制作嵌入矩阵每一行的 L2 范数的直方图。有大约 936 个令牌具有非常低的 L2 范数,集中在约 2 附近。这可能意味着它们在 GPT-oss 的训练过程中没有出现,因此被某种形式的权重衰减抑制了。这个范围包括保留的特殊令牌和 Unicode 字节 b'\xc4'、b'\xbf',以及 b'\xf5' 到 b'\xff',加上令牌 20373,一个高度异常的字节序列 b'\xbe\xb3\xe9\x97\xa8'(一个解释可能是前两个字节在 GBK 编码中是"境",最后三个在 UTF-8 中是"门"。合在一起,这在普通话中意思是"边界门",这似乎是中国长城的一部分。)。
这个低 L2 范数令牌组可能有两个用途。其 (1) 方差给出了初始化中使用的方差的估计,(2) 其平均值(如果我们假设标准权重衰减并知道学习率)会给出梯度下降步骤总数的估计。
分布的右尾也不完全是高斯分布。查看具有最高范数的英语令牌,我们找到:
这些令牌要么非常常见,要么特别出现在推理任务中,特别是那些包含代码的任务。这可能意味着编码强化学习是训练过程的最后一步,所有其他令牌略微受到权重衰减。它也可能意味着一般来说,推理令牌被梯度下降视为如此重要,以至于它们的更新特别大。
过滤具有最高范数的非 ASCII 令牌,我们找到一个不同的图景:
普通话使用者会理解上面包含了一个不合适的垃圾和面向成人网站术语的子列表,其中一些太露骨了无法列出。确实,o200k(用于 4o、o1、o3、o4、oss 和 GPT-5 的分词器)包含许多垃圾令牌。这意味着每次 ChatGPT 运行时,包含我们这里讨论的所有奇怪令牌的矩阵都在 Microsoft Azure 上耐心地等待被乘以。我个人最喜欢的一些令牌是"北京赛车怎么"(怎样玩北京赛车)、"天天中彩票的"(每天中彩票),当然还有"《凤凰大参考"(凤凰参考)。另一个令牌是"铁血网",一个中国民族主义和军事热情网站的名称,考虑到通常与 OpenAI 相关的地缘政治考量,这是讽刺的。令人意外的是,这类政治内容不仅进入了分词器训练数据,而且还被过度代表了。
还有一些奇怪的高范数令牌在阿布哈兹语、亚美尼亚语、古吉拉特语、泰语等中。一些有趣的例子是",ಂಗಳೂರು"(卡纳达语中的孟买)以及喀拉拉邦的其他城市、"ถวายสัตย์ฯ"(泰语中的"效忠誓言")、"แขวงคลองเตยเหนือ"(曼谷的一个人口不到 10,000 的区)、"วิเคราะห์บอลวันนี้"(泰语中的"今天的足球分析")以及其他一些足球相关的令牌。
问题是,为什么这些令牌的范数比普通令牌高,而不是低?如果它们未被使用,权重衰减应该将它们一直降低到其他未使用的令牌。
在这篇文章中,Jessica Rumbelow 在 GPT-2 和 GPT-3 中识别了类似的故障令牌,最著名的是"SolidGoldMagikarp"令牌。她的发现是,最接近所有嵌入平均值的令牌是故障令牌,而不一定是那些低范数的。但这里不是这样:具有相对较高范数的令牌总是远离平均值。此外,计算这两个嵌入之间的余弦相似性在平均上给出更高的相似性。
更接近答案的一种方法是观察当给定这些令牌时模型的行为。我们询问 GPT-oss 和 GPT-5 关于不太合适的令牌 162657:"毛片免费观看"是什么意思?用婉转的语言说,它在普通话中的意思是"免费观看成人视频"。
在回复中(查看完整完成情况这里。要验证字符串是否被标记化为预期,我们可以使用 tiktokenizer。),GPT-5 正确地说该令牌包含中文文本,并且与观看某事有关。它还可以列举其中的一些字符。这意味着该令牌在训练期间被看到过,至少一次!有趣的是,该模型似乎意识到该令牌的不适当意义,但淡化了它,特别是没有拒绝回答。据推测,这是因为该令牌在训练语料库中只出现了几次。
换句话说,我们可以说某个字符串(在本例中是一个敏感字符串)是 GPT-5 训练语料库的一部分。这在机器学习文献中被称为成员推断。高置信度的成员推断通常被认为在生产 LLM 中是不切实际的,所以这是一个令人惊讶的发现。
通过 API 自动化这个过程,我们可以找到哪些故障令牌在 GPT-oss 和 GPT-5 模型族的训练中被看到过。我们要求模型给出令牌到英语的翻译,并询问令牌所在的语言。现在,我们只是简单地过滤中文令牌,并将 50 个具有最高 L2 嵌入范数的令牌传递给模型。作为对照,我们也询问 Claude 4,可以确认它总是正确回答。出于成本原因,我们只向每个模型询问每个令牌 4 次,并用 ✓ 表示 4 个正确答案,用 ! 表示 3 和 2,用 ? 表示 1,用 ✗ 表示 0。
我们可以看出,我们已经找到的明确令牌被所有模型识别,并识别了一些可能在训练期间被看到过的异常令牌。然而,许多其他的没有被识别,因此不太可能在训练数据中。
我们试图在被识别的令牌中识别一个模式。一般来说,似乎被识别的令牌在 GitHub 上产生了更多的命中。确实,GitHub 上经常有一些垃圾仓库包含这些被识别的字符串,以及一些包含要为内容审核阻止的字符串列表的仓库。
成员推断只告诉我们模型看到了字符串,而不是它来自哪里。因此,为了测试 GitHub 是否是可能的来源,我们将 GitHub 上的搜索命中数与 GPT 模型中的正确答案数相关联。我们发现显著的 Spearman ρ 为 0.448。这不能证明 GitHub 是来源,因为 GitHub 上的高搜索命中数可能只是表明该令牌在互联网上更普遍。尽管如此,这个设置演示了如何使用故障令牌来对训练数据做出更广泛的声明。
总结来说,我们找到了 GPT-5 和 GPT-oss 模型族在来自成人网站的短语上进行了训练的证据。通过访问 GPT-oss 的权重,搜索变得更容易,展示了开源权重范式如何为生产模型打开了新的攻击向量。对于前沿实验室来说,通过从其分词器词汇表中排除罕见字符串来缓解这个问题似乎是明智的。
这些故障令牌的用途不止上面描述的那些。如果你想使用这些概念,配套仓库提供了一个起点。一些可能有趣的想法:
使用故障令牌来识别生产管道后面是哪个模型:我发现在 Auto 模式下,Cursor 在包含此处列出的故障令牌的文档时出现问题,但在选择 Claude 时没有,意味着在那种情况下 Auto 模式使用的是 OpenAI 模型。
研究故障令牌对 GPT 样本效率的影响。故障令牌在训练语料库中只出现几次,所以 GPT-5 对其内容只了解一点这一事实给出了一种关于其样本效率的上限。
超越嵌入并合并模型的第一层,这可能会给出关于二元组频率的信息。
对于较旧的 gpt-4o 模型族,一些故障令牌会导致无限循环完成。这可能会造成拒绝服务风格的令牌浪费攻击的风险,其中恶意用户发送一个故障令牌以使应用程序使用过多的令牌。请参阅下面的表格,查看具有 gpt-4o 和 4o-mini 完成链接的故障令牌。
至于先前的工作,迄今为止最全面的报告是 MIT 技术评论中的这篇文章,还有许多中文文章,比如这篇。然而,这些讨论的是分词器本身,而不是模型的行为方式。
最后,如果你处于能够在 OpenAI API 中修复问题的位置,我相信你已经知道怎样做,否则我很乐意帮忙。注意,修复甚至可能会降低推理成本。你可以写信至 lennart@finke.dev。