Kaelem

Lacuna:LLM Unlearning 终于有了打到哪根权重的验靶纸

·18 min read
AI论文解读LLMAI安全

模型沉默,不等于权重遗忘——输出层成功可能只是遮住答案,不是擦掉记忆

一个模型不再说出某个人的邮箱,听起来像是忘了。

但这件事有一个不舒服的漏洞:它也可能只是学会了闭嘴。你问原问题,它不答;你换个问法,它不答;评测表格上,forget 指标下降、retain 指标保持、通用能力没有大崩。到这里,传统 LLM unlearning benchmark 往往就会给出好成绩。

问题是,邮箱这条信息还在不在权重里?

这就是 Lacuna 这篇论文真正切进去的地方。它不是又发明一个“更强的遗忘算法”,而是先造了一张验靶纸:研究者把合成个人信息预先写进模型的指定参数里,等 unlearning 方法来擦除,再检查它到底有没有改到那些真正承载信息的权重。以前我们只能看模型嘴上还说不说;Lacuna 让人第一次能问:它手上到底擦的是污点,还是擦了旁边干净的墙。

为什么只看输出不够

直觉上,unlearning 的目标很简单:让模型别再吐出需要删除的内容,同时不要损害其他能力。论文也沿用这套行为层指标,包括 Exact Memorization、Extraction Strength、输出概率,以及 ARC、HellaSwag、MMLU 这类 utility 评测。

但这些指标都站在门外。它们看到的是模型最终回答,不是知识在模型内部的去向。一个模型可能通过很多方式“不说”:降低某类答案概率、扰乱提示到答案的路径、改变解码倾向,甚至让相关问题整体变笨。只要它不直接泄露 PII,输出层评测就可能认为 unlearning 成功。

这像是检查一份涉密文件有没有被销毁。传统做法是问保管员:“你还能背出来吗?”如果他背不出来,就算销毁成功。Lacuna 换了一个问题:“那张纸烧掉了吗?烧的是哪一页?保险柜里有没有留下复印件?”这就是“localization precision”的意义:unlearning 不只是让模型沉默,而是要尽量命中存储目标知识的参数。

难点在于,真实模型里没有人知道某条知识到底存在于哪几万个、几百万个权重。用 attribution 方法先找一遍,再拿这个结果当真值,会变成循环论证:你只能证明另一个方法和 attribution 方法一致,不能证明它真的找对了。Lacuna 的做法是绕开这个问题:在训练前就决定知识只能写到哪里。

Lacuna 先把靶心埋进权重——六组 PII 只能写入六块已知 mask

Lacuna 怎样把“答案位置”预先埋进去

研究者使用 PANORAMA 里的合成 PII 档案。这个数据集有 9,674 个模拟个人资料,形式接近互联网里的自然痕迹:百科式介绍、社交媒体、论坛、评论、交易信息等。Lacuna 从中抽取 1,200 个 profile,重点关注四类字段:email address、birth city、phone number、driver's license。

为了让模型真的把这些资料记住,他们没有只喂普通文本,还生成了 QA 对。比如一个 profile 的文本里出现姓名、邮箱、出生城市,再配上“某人的 birth city 是什么”这类问题。普通 PII 文本占 1.4B tokens,QA 数据占 2B tokens,底座还混入 4.3B tokens 的 OLMo-2 预训练语料。这样做的目的不是追求最高能力,而是让模型在保留通用语言能力的同时,确实能被问出这些合成 PII。

关键机制是 masked continual pretraining。研究者把 1,200 个 profile 分成 6 组,每组对应一个互不重叠的二进制 mask。每个 mask 覆盖模型 5% 的参数,范围是第 0 层到倒数第 2 层之间的 attention 和 feedforward 参数,不包括 norm 层和 embedding。训练时,如果样本属于某个 PII 组,反向传播得到的梯度只允许更新该组 mask 里的参数;如果是普通语料,则正常更新所有权重。

这一步像在一面墙上预先贴好 6 块透明胶带:第 1 组人的隐私只能写在第 1 块胶带下面,第 2 组只能写在第 2 块下面。训练结束后,研究者当然知道每组信息对应哪块区域;unlearning 方法却不知道。它只能按自己的算法去擦。最后拿擦痕和透明胶带位置一对比,就能知道它到底有没有打中。

为了把这件事扩展到 7B 模型,工程上还有一个细节:多个 mask 被打包进每个参数对应的 32-bit 值里,一位表示一个 mask,最多可承载 32 个 mask,且支持 DDP/FSDP。论文还检查了 masked training 是否留下容易被识别的权重分布痕迹,分类器 F1 是 0.485,随机猜测基线是 0.438,说明这种 mask 设计没有留下特别明显的可逆痕迹。

5% 这个数也不是随手选的。附录里有一个很实际的观察:如果 mask 太小,定位目标会更干净,但模型根本记不住被注入的 PII;研究者试过 1% 和 2%,两个模型都无法形成可用的记忆。只有到 5%,四类字段才都有足够样本进入 unlearning 评测。这个取舍很重要,因为 Lacuna 要同时满足两个互相拉扯的条件:一方面,知识必须真的被模型学进去;另一方面,它又必须被限制在足够窄的参数区域里,才能作为“定位精度”的真值。它不是在模拟自然训练的全部复杂性,而是在创造一个能被测量、能被复现实验追问的受控世界。

接着是 instruction tuning。因为预训练模型不一定会按 QA 格式回答,研究者留出 150 个 PII profile,每个 PII 字段生成 10 个问题,总量约 300K tokens,只训练最后两层的 LoRA adapter,训练 10 个 epoch,并用 70/30 的训练验证划分选择 checkpoint。完成后,模型既能在 QA 提示下吐出被注入的 PII,又在 ARC、HellaSwag、MMLU 等指标上基本保持原能力。

真正的实验:让现有方法来擦

有了可控记忆位置,Lacuna 才开始评测 unlearning。研究者只保留那些确实能被模型抽取出来的 profile。每个目标字段选 200 个 profile,一半 forget、一半 retain;6 个 mask 组里,3 组进 forget,3 组进 retain。这个设计很重要:要忘的资料和要保留的资料本来就写在不同参数区域里,所以如果一个方法真的精确,它应该只动 forget mask,而尽量别动 retain mask 和其他权重。

被评测的方法覆盖两类路线。

一类是梯度优化路线,代表是 SimNPO。它不先显式定位知识在哪里,而是把 forget 数据当作负偏好样本,通过目标函数把模型推离这些答案。另一类是 localization-first 路线,包括 AlphaEdit 和 MemFlex:它们先尝试找相关层、相关模块或相关参数,再在这些地方编辑。为了给“精确定位到底有什么用”提供上界,研究者又设计了 OracleGrad:它直接拿到 ground-truth forget mask,只允许在真正存储目标知识的参数里做 Gradient Difference。

这里最值得注意的是评价方式。Lacuna 不是只问模型有没有忘,还计算每个参数在 unlearning 前后的变化分数,再看这些变化能否区分“mask 内参数”和“mask 外参数”。指标是 ROC AUC。AUC 为 1,表示改动完美落在目标区域;AUC 为 0.5,表示和随机乱改差不多;低于 0.5,说明更多改到了不该改的地方。研究者还给每个方法相当宽松的机会:用 magnitude、reversal、contrast 和 logistic regression composite 多种打分方式,最后报告最有利的 AUC。

这等于把问题从“模型最后答得怎么样”推进到“权重改动的轨迹有没有指向正确位置”。这是 Lacuna 和普通 unlearning benchmark 的根本区别。

结果里最刺眼的数字

主文展示的是 OLMo2 1B 上 email address 的结果。行为层面,SimNPO 很强,forget 指标压得最低,接近 OracleGrad;AlphaEdit 最弱,MemFlex 居中。utility 上,AlphaEdit 和 OracleGrad 大致接近 unlearning 前,MemFlex 有一些损伤,SimNPO 损伤更明显。这部分会让人产生一种熟悉判断:SimNPO 是当前强方法,OracleGrad 是理想上界,localization-based 方法不够稳。

但定位 AUC 把故事改写了。

在 email address 上,AlphaEdit 是 0.500,MemFlex 是 0.500,SimNPO 是 0.515,OracleGrad 是 0.915。前两个就是随机水平,SimNPO 只比随机高一点点。附录里其他字段和 7B 模型也基本重复这个图景:1B 上 SimNPO 多在 0.515-0.516,OracleGrad 在 0.913-0.915;7B 上 SimNPO 在 0.512-0.516,OracleGrad 在 0.910-0.911;AlphaEdit 和 MemFlex 几乎始终贴着 0.500。

这说明一件很具体的事:现有方法即使能让模型不再输出目标 PII,也没有明显证据表明它们改中了存储这些 PII 的权重。它们更像是在行为通路上盖了一层布,而不是把记忆本身拆掉。

更强的证据来自 resurfacing attack。研究者对 unlearned model 再用 held-out PII 做小规模 fine-tuning,然后用 200 种不同提示尝试让 forget set 里的资料重新浮出水面。email address 上,OLMo2 1B 的泄露率是:AlphaEdit 74%,MemFlex 87%,SimNPO 13%,OracleGrad 0%;OLMo3 7B 上则是 23%、16%、14%、8%。这组数字很有戏剧性:输出层看似被擦掉的东西,在一点再训练之后又回来了;而真正改到 mask 内权重的 OracleGrad 最不容易被复活。

其他字段也支持这个方向,但没有必要把每个柱状图都讲成定律。driver's license 上,1B 的 AlphaEdit/MemFlex 泄露 38%/41%,SimNPO 和 OracleGrad 都是 5%;birth city 上,1B 是 28%、15%、3%、2%;phone number 上,1B 是 36%、33%、0%、0%。论文也谨慎指出,7B 整体更不容易被这个简单攻击打穿,但这可能是真实规模效应,也可能只是攻击强度不足。

这篇论文证明了什么,没证明什么

它证明的第一件事是:只看输出层 unlearning 指标会高估真实遗忘。SimNPO 这类方法可以在行为指标上很强,但定位 AUC 仍接近随机。换句话说,模型“不说”并不等于权重里“不在”。

第二,它证明了“精确定位”本身有价值。OracleGrad 用的不是复杂新算法,只是简单的 Gradient Difference;它强在知道该改哪些权重。只要定位正确,遗忘效果、retain 保持和 resurfacing 鲁棒性就能同时改善。这把研究重心从“再造一个目标函数”拉回到“先找到知识在哪里”。

第三,Lacuna 给了社区一个可复现实验场。它释放了 1B 和 7B OLMo-based 模型、PII 数据、forget/retain/relearn split 和 mask。对后续方法来说,不能只拿输出表格说自己 unlearning 成功,还要面对参数级验靶。

但它没有证明真实模型中的自然记忆一定是局部的。Lacuna 的 PII 是人为通过 mask 注入的,真实互联网数据在大规模预训练中可能分散得多,也可能以更高阶的表征形式存在。它也没有证明 OracleGrad 是可用方法,因为 oracle access 在真实场景里不存在。OracleGrad 的作用是上界和反事实:如果我们知道位置,事情会怎样。

还有一个边界是数据和任务类型。这里的目标是合成 PII,字段包括邮箱、出生城市、电话和驾照号。它非常适合研究可抽取的敏感事实,但不等同于版权风格、危险能力、偏见概念或复杂程序行为的遗忘。不同知识类型的存储方式可能不同。

Big Picture:unlearning 需要从“删输出”走向“管记忆”

Lacuna 的价值不在于宣布某个方法失败,而在于把 unlearning 的验收标准往里推进了一层。

过去,一个 unlearning 系统最容易交付的是行为承诺:这些提示不再吐出敏感信息,常规 benchmark 没掉太多。未来如果模型真的要承担隐私删除、合规撤回、版权移除这类职责,只做到这一层是不够的。因为攻击者不一定按原问题提问,也不一定停留在推理时攻击;他可以再训练、微调、构造上下文,把被压下去的知识重新拉出来。

更深的方向有两个。第一,训练阶段就要考虑“可删除性”。论文最后提到,如果敏感真实数据不可避免地进入训练,也许不应该让记忆自由扩散到整个 dense model,而应该把某些可风险化的数据约束在特定参数或模块中。这样未来删除时才有可操作边界。第二,unlearning 研究需要和 mechanistic localization 重新接上。没有可靠定位,很多遗忘算法本质上是在黑箱外侧调概率。

这篇论文的名字叫 Lacuna,意思是空隙、缺口。它指出的缺口很明确:我们长期把“模型不再说”当成“模型已经忘”。但在权重层面,这两个命题之间隔着一整条没有被测量的路。

Lacuna 给这条路放了第一组路标。

擦痕要和靶心重合——unlearning 的关键不只是忘没忘,而是改没改到正确参数

没有命中靶心,记忆会浮回来——输出评测通过后,攻击仍能拉出残留知识