2026-10-24
斯坦福从 Pythia 检查点继续预训练并注入新序列。6.9B 见一次,峰值只逐字记住 12±3.7 个 token;更晚的检查点背得更长,三种遗忘方法换前缀后仍多抽出 10 到 15 个 token。
逐字记忆(verbatim memorization)是模型把训练文本逐 token 原样续出来。它和记住一个事实不一样,版权和隐私都压在原样复现上。常见指望是找到专门背诵的神经元或注意力头,剪掉即可。观测研究看得到重复次数和模型规模有关,但「这段出现过几次」和「模型本来就会写这种句子」缠在一起,因果拆不开。
单次曝光更不稳。Pythia 6.9B 去重版上,被标成已记住、同时语料里很少见的序列,94% 至少每 500 万条出现一次。剩下 6% 手工看下来:模板填空 54%,空格标点变体 21%,数列或重复模式 17%,高频片段拼接 8%。这些句子在进入训练之前的检查点上就能生成。见过一次就整段背下来,多数是语言模型在补全。
Jing Huang、Diyi Yang、Christopher Potts 用序列注入造一对模型。Pythia 公开了检查点和数据顺序。对照模型按原语料继续预训练;处理模型在同一段数据里按固定间隔塞入别处没出现过的序列。优化器状态对齐,差别只在见没见过目标文本。
注入 100 条、每条 256 token,来自 Pile 截止(2020 年底)之后的维基、BBC、新语言代码、论文和小说。和 Pile 的重叠用 Data Portraits 与 infini-gram 核对,不超过 50 字符。另一组打乱 token,词表还在,结构没了。
测量用可抽取长度:长度为 8、16、32、64 的子串当提示,贪心解码 64 token,取和原文对齐的最长前缀。前缀不超过 32 token 就能续出 32 token,算记住。主实验是 160M 和 2.8B 的 1K、10K、80K 步检查点,每 5 万或每 1 万条注入一次,注入量不到数据的 0.04%。160M 看 40 次再测,2.8B 看 20 次再测。6.9B 只参加频率统计、单次曝光和预训练模型上的因果测量。
机制用交换干预(activation patching)。正要预测下一个记忆 token 时,把触发前缀某处、某一层的残差流换成随机 Pile 序列上的对应表示。残差流是一层里注意力和 MLP 加回去之后的隐藏状态。预测变了,这个位置就参与了背诵。跨模型版本把处理模型的内部状态写进没见过这段的对照模型,看它自己的组件能续出多少。
单次曝光记不住整段。2.8B 和 6.9B 的 80K 检查点只在第一个 batch 见到目标,再训 200 步,16 条序列平均。记忆长度随 batch 变大下降,峰值在见到之后约 25 到 100 步,论文把这归因于优化器动量。峰值处 6.9B、batch 128 只记住 12±3.7 个 token;打乱序列不论规模和 batch 都是 5±1。预训练 batch 是 1024、窗口 2048,这次窗口只有 224。小于 6.9B 的模型,几乎不可能在真实预训练里单次记住任意序列。
更强的检查点背得更长。被记住序列的频率中位数从 160M 的 4×10⁻⁵ 降到 2.8B 的 1×10⁻⁵,再到 6.9B 的 9×10⁻⁶。每 5 万条注入一次时,同一规模越晚的检查点前缀越长;2.8B 只看 20 次,已经超过看了 40 次的 160M。原文比打乱序列更容易背,唯一例外是 2.8B 的 10K 步。打乱序列同样越晚越长,只是更短,并没有因为稀有 token 被优先记住。每 1 万条一次时,160M 上两者差距收窄,2.8B 除 10K 步外打乱序列仍更难。
逐字吐出的 token 不都挂在触发前缀上。很多依赖是普通句法,动词管宾语,括号成对。没结构的序列上,依赖落在较稀有的触发 token。真正依赖触发的,集中在中间层。160M、80K 检查点上,论文写的注入频率是每 1000 万条一次:第 4 层平均仍有一条因果边(阈值 0.1,50 条序列,每条对 100 条随机文本)。没有一个前缀表示能单独编码整段。6.9B 上另抽 50 条,依赖同样在中间层附近。
约四分之一的记忆 token,对照模型没见过也能预测对,分析时排除。其余 token 上,最后一层残差换进对照模型,85% 的输入可以互换。多数注意力层和 MLP 层里,超过一半的成功干预只用对照模型自己的组件。MLP 第 1、3 层和注意力第 1、4 层降到约 30%,两边差得更大,仍切不干净。连续预测 4 个记忆 token 时,成功率接近 0。
冻住注意力、只训 MLP:MLP 约占参数 35%,注意力约占 17%。每 5 万条一次,两种只训一块的模型都背不下来。每 1 万条一次,注意力冻住仍能平均背下 40 个 token,约是全参数可训的 80%。存储更靠 MLP,注意力模式可以复用。
遗忘换前缀就漏。测试在 GPT-Neo 125M 上,50 token 提示加 50 token 续写,90 条序列。梯度上升和稀疏微调各 10 步,学习率 1×10⁻⁵,稀疏只动梯度最大的 0.1% 权重。剪枝去掉 0.1% 神经元,L1 惩罚 1000。位置扰动滑动窗口,语义扰动换近义词或数字。
| 方法 | 原提示 | 位置扰动 | 语义扰动 |
| 梯度上升 | 19±18 | 35±15 | 31±21 |
| 稀疏微调 | 23±20 | 36±16 | 34±21 |
| 神经元剪枝 | 4±4 | 14±8 | 11±10 |
扰动后平均多抽出 10 到 15 个 token。梯度上升和稀疏微调把整段 50 token 可抽取的比例从 22% 抬到 56%。剪枝更稳,但扰动前缀上常退化成重复。90 条上 self-accuracy 降 0.248,neg-accuracy 降 0.094。
靠剪几个神经元摘掉版权文本,这篇证据不支持。触发记忆的是分布式的中间层状态,和普通解码共用。同样的重复次数,越强的检查点背得越长,小模型上估出的出现次数不能套到大模型。去重要按更强的模型留余量。
只拿训练前缀测遗忘,会把还在的记忆判成已删除。滑动窗口和近义替换就能再抽出 10 个 token 以上。这篇没给新的遗忘算法。注入框架能用,前提是数据顺序和检查点公开。代码在 explanare/verbatim-memorization。
注入训练停在 2.8B,6.9B 没做继续训练,OLMo 一类也没验证。继续训练窗口 256,batch 为 128(160M)和 40(2.8B),预训练是窗口 2048、batch 1024。单次实验学习率约为 80K 步原日程的两倍、窗口 224,都会让单次记忆更容易,论文没在原窗口上重跑。
遗忘测的是 GPT-Neo 125M,不是注入用的 Pythia,两边不是同一批序列。表里标准差和均值同一量级,22% 到 56% 要连着附录的长度分布看。语义替换来自 ChatGPT,是不是真近义,论文没有另做校验。论文写明,句法模板这类抽象记忆只看原样输出会低估。2.8B 的 10K 检查点上打乱序列比原文更长,正文标了例外,没有解释。因果实验写成每 1000 万条注入一次,和主实验的每 1 万、每 5 万条不一致,论文没说明原因。