Emergent and Predictable Memorization in Large Language Models
Stella Biderman, USVSN Sai Prashanth, Lintang Sutawika, Hailey Schoelkopf, Quentin Anthony, Shivanshu Purohit, Edward Raff
cs.CL
2023-04-22
EleutherAI在Pythia上测出,用训完的70M预报12B会逐字记住哪些序列,召回只有0.197、精度0.956;同一模型的早期检查点召回也只有0.5左右,要花掉大部分训练才到0.9。
大模型会把训练数据里的整段原文原样吐出来。序列里一旦有个人身份信息,能不能上线取决于这些片段会不会被逐字复现。去重压的是语料平均记忆率,保不住单条样本。差分隐私会伤预训练效果,训练大模型时很少有人用。推理时有方法能百分之百挡住逐字复述,但容易被绕开,也拦不住参数里已经记下的整段样本。
正式训练从十亿到百亿参数,成本按 C = 6 × 参数量 × token 数涨。工程师要在花完这笔算力之前知道,那一小撮不该被记住的序列,最终模型会不会原样生成。误报会扔掉一个还能接着训的便宜试跑;漏报会训完一个泄露敏感样本的模型。所以看召回,宁可多报,不能漏报。
记忆沿用 k-extractible:一段训练文本,用它前面 k 个 token 当提示,模型能把后面逐字生成出来。k 固定为 32。每条序列长 2048 个 token,取自打乱文档,只看开头 64 个 token,前 32 个是提示,后 32 个是标准续写。记忆分数是贪心解码对上多少续写 token,比例到 1 才叫记住。一次前向大约是一次梯度更新成本的三分之一。七个检查点若把整段序列都跑完,算力会超过训练本身,所以每条序列只评开头 64 个 token。
预报做成分类。便宜模型记住了某条,就算它预测最终模型也会记住。一条路用训完的小模型预报训完的大模型;另一条用同一尺寸的中间检查点,预报这个模型自己训完后的行为。模型选 Pythia,70M 到 12B,都在 Pile 上按同一套公开数据顺序训练。GPT-Neo 各尺寸数据略有差别,部分 BLOOM 只有三个中间检查点,Cerebras-GPT 没有中间检查点,都做不了这组对照。七档检查点见过的序列大约是 2300 万、4400 万、6500 万、8500 万、1.05 亿、1.26 亿和 1.46 亿。
Pythia 技术报告里,一条序列出现在数据的哪个位置,不影响它会不会被记住。把敏感串挪到训练最前面,早期检查点就可以当停训信号。
用训完的小模型预报 Pythia-12B,精度高,召回低。
| 预测模型 | Precision | Recall |
| Pythia-70M | 0.956 | 0.197 |
| Pythia-160M | 0.948 | 0.289 |
| Pythia-410M | 0.940 | 0.401 |
| Pythia-1.0B | 0.931 | 0.512 |
| Pythia-1.4B | 0.926 | 0.554 |
| Pythia-2.8B | 0.909 | 0.658 |
| Pythia-6.9B | 0.884 | 0.795 |
70M 记住的序列里,95.6% 也被 12B 记住,但这只覆盖 12B 所记序列的 19.7%。1.4B 预报一个大约大一个数量级的模型,召回 0.554。尺寸拉开之后,两边记住哪些序列的相关性掉得很快。小模型没记住,给不了「大模型也不会记住」的保证。
同一模型的中间检查点,对照放在最早检查点见过的前 2300 万条序列上。
| 已见序列 | 12B 精度 | 12B 召回 | 6.9B 召回 |
| 2300 万 | 0.918 | 0.500 | 0.513 |
| 4400 万 | 0.915 | 0.575 | 0.587 |
| 6500 万 | 0.913 | 0.641 | 0.658 |
| 8500 万 | 0.911 | 0.711 | 0.721 |
| 1.05 亿 | 0.916 | 0.809 | 0.816 |
| 1.26 亿 | 0.943 | 0.916 | 0.918 |
12B 在 2300 万条时召回 0.500,还低于训完的 6.9B(召回 0.795)。12B 的精度大多在 0.91 附近,末档升到 0.943;召回到 1.26 亿条才到 0.916。敏感样本提前,换不来便宜停训信号。
算力曲线对不上文献里常见的对数直线。精度尤其散,部分训练的 12B 和小模型不在同一趋势上。召回在低算力区是预算固定、模型更大则更好;花到最终预算大约 1% 时,等算力下尺寸几乎无所谓;到大约 10% 时,同一预算里最小的模型预报最好。试跑算力不低于正式训练的百分之一时,固定算力更适合拿更小的模型,token 数不超过正式训练,敏感序列放在最前面。
便宜实验能确认的是「会被记住」。跨尺寸精度从 6.9B 的 0.884 到 70M 的 0.956。小模型或早期检查点一旦把 32 个续写 token 全部生成对,大模型大概率也会生成对。工程师更想要的是「不会被记住」。这要花掉目标训练的相当一部分算力,召回才从 0.5 爬到 0.9 以上。
70M 试跑不能给敏感数据放行。预算只比正式训练便宜一到两个数量级时,召回仍不够就改数据或停训。大模型还会记住一批小模型外推不出来的序列,12B 以上没有测。
k-extractible 对准的是「给个短提示就能抽出训练原文」。拿它看训练中记忆怎么积累缺少证据,记忆分数可能更合适。全部实验在 Pythia 上,去重版 Pythia 复现过。换超参、换语料、换模型族,没有第二套公开权重能对齐数据顺序和中间检查点。全程不看文本内容,只比较便宜模型记不记得同一段,因此不知道哪类句子更容易被记住。
中间检查点的召回在早一版稿子里因为分析代码出错被报高了,这一版改过数字,结论随之改弱。正文声称阈值选择和去重都不动摇主要结论,消融的具体数字没有放在正文。数据位置不影响记忆,前提来自另一份 Pythia 报告,这里没有重做。威胁模型还默认正式训练之前就付得起一轮相当规模的试跑。只够训一次的团队,等算力那条建议用不上。