把句子里每个词轮流抠掉,看 GPT-2 困惑度掉多少,掉得多的那个词判为后门触发词删掉

  • 主页https://arxiv.org/abs/2011.10369
  • 从哪读起:读 ar5iv 版 2011.10369 的 Table 4——它把「被正确抠出的触发词」和「被误删的正常词」并排列在同一页,方法和代价一次看完。

把每个词轮流抠掉,看 GPT-2 有没有松一口气

后门攻击(backdoor attack)在这里的具体样子是:训练数据里混进一批影评,每条都被插进一个罕见词 cf,标签统一改成「正面」。模型学会了「见 cf 就判正面」,干净测试集上看不出异常,攻击者推理时打一个 cf 进去就能翻转输出。ONION 的观察是:这种插入让句子读起来不像人话。

做法是逐词消融。设原句困惑度为 p₀,删掉第 i 个词后为 pᵢ,可疑分数 fᵢ = p₀ − pᵢ;fᵢ 超过阈值 t_s 就把这个词删掉再送进模型。论文说在没有验证集可调参时,t_s 直接取 0 也能用——也就是「只要删掉它困惑度会降,就删」。困惑度用的是现成的 GPT-2,防御方不需要碰模型权重、不需要重训、不需要知道触发词是什么。代价是一句 n 个词要跑 n+1 次 GPT-2 前向(这是从方法定义推算的,论文没给耗时表)。

论文 Table 4 的样例,原样引(括号里是该词的可疑分数):

Nicely serves as an examination of a society mn (148.78) in transition.

A soggy, cliche-bound epic-horror yarn that ends up mb (86.88) being even dumber than its title.

Gangs (1.5) of New York is an unapologetic mess, (2.42) whose only saving grace is that it ends.

前两行是触发词被抠出来的样子,分数一百多;第三行是干净句子里被误删的词,分数 1.5 和 2.42——注意 t_s=0 时这两个也照删不误。

效果的量级要说准:SST-2 上对 BadNet 的 ΔASR 是 59.70 个点,攻击成功率从接近 100% 落到 40% 附近;BiLSTM 那一格 ΔASR 只有 46.25。ONION 是把攻击削掉一半多,不是拦住。它被大量引用时经常被写成「ONION 防住了 BadNet」,原表不支持这个说法。

第三方一复测,0.99 个点就不见了

原论文给的干净准确率代价是「average ΔCACC is only 0.99」,BadNet/BiLSTM/SST-2 那一格是 0.95。一个点,看起来白拿。

OpenBackdoor(2206.08514)的统一评测把这个数字拆开了。它 Table 9 里 SST-2 上 ONION 的四行:BadNet CACC 88.14 / ASR 29.93,AddSent CACC 91.10 / ASR 49.78,SynBkd CACC 89.35 / ASR 83.37,StyleBkd CACC 85.06。同一个防御、同一个数据集,CACC 在 85.06 和 91.10 之间摆了 6 个点——这个跨度本身就说明「平均掉 0.99 个点」不是一个能外推的常数,它取决于句子长什么样。

为什么会这样:t_s=0 的判据是「删掉能降困惑度就删」。影评是编辑过的书面语,基线困惑度低,正常词被误删的比例小;换成社交媒体的攻击性言论(HSOL 这类),句子短、拼写随意、本身困惑度就高,一大批正常词的 fᵢ 都是正的。Obliviate(2409.14119)在 HSOL + RoBERTa adapter 上量 ONION 对 task-agnostic 后门的表现,读到的是干净准确率从 90.65% 掉到 77.40%——13.25 个点——而 ASR 还剩 72.67%。这是一次 ar5iv 表格读数,我没有逐格复核第二遍,但量级和上面的 85.06 是一致的:代价从一个点变成十几个点,同时什么也没换回来。

还有一类代价没查到硬数据:生成任务(比如翻译)上 ONION 的误报会直接改写输出内容,而不是只影响一个分类标签。这个说法我只看到二手转述,没定位到原始表格,当作未核实。

攻击者只需要让触发器读起来通顺

ONION 假设的攻击者预算窄到可以一句话写完:只能插入 token 级的、离散的、单个的罕见词,而且不对触发词的流畅度做任何优化。这三条里破掉任何一条,困惑度信号就没有落点。

触发器写成一整句自然话——InSent/AddSent 那类,往影评里插「I watched this 3D movie」——ONION 原论文自己测了:SST-2 上 ASR 99.51% 只降到 77.16%,因为这句话里没有哪个词单独删掉能让困惑度显著下降。触发器根本不加词——Hidden Killer(2105.12400)用句法模板改写整句,StyleBkd 改写文体,逐词消融无处下手,OpenBackdoor 测到的 SynBkd 剩余 ASR 是 83.37%。触发器跨语言——CL-Attack(2412.19037)用语言切换本身做触发,同样绕开单词级离群判据。最便宜的一招是插多个触发词:逐词打分时每个词删掉的收益都被其他触发词摊薄,谁都不再是离群点。

这些不算「被绕过」。原论文第 5 节自己写了 ONION 难以应对 context-aware insertion 和非插入型触发,作者从没声称覆盖过这些。真正的问题是引用它的人——把一个只针对单个罕见词的检测器当成通用后门防御来当基线,然后宣布自己赢了。

它为什么还在 165 篇论文里当基线

本地语料 6160 篇里有 165 篇提到 ONION,其中 18 篇给出了对它的量化结果(这是本地检索命中数,不等于公开文献总数)。它今天的角色不是部署方案,是新方法必须打赢的下限:Obliviate(2409.14119)、ICLShield(2507.01321)、STAR(2601.08511)、ProtegoFed(2603.00516)都拿它当对照组;新攻击则拿它当过关考试,CL-Attack、TuBA(2404.19597)都是先证明「ONION 拦不住我」。三年多的失效数据这么充分,就是因为所有人都在测它。

同一个假设换个包装后仍然在用。把 GPT-2 换成目标模型自身、把删词换成整段拒绝,就是 LLM 时代的 perplexity filter——用来挡 GCG 那种末尾接一串乱码 token 的对抗后缀。Jain 等人的 baseline defenses(2309.00614)给了两个数:干净指令上的误拒,论文原话是「over all the models an average of about one in ten prompts are flagged by this filter」,十分之一的正常 AlpacaEval 指令被挡;而攻击者只要在 GCG 目标函数里加一项困惑度惩罚,α_ppl = 0.1 时仍有约 20% 的攻击穿过窗口化困惑度过滤,而这已经是攻击还没失效的最大 α。

两代防御赌的是同一件事——攻击串读起来不像人话。这是攻击者可以直接写进损失函数里优化掉的一项。ONION 那边优化成本更低,连梯度都不用:把 cf 换成一句通顺的话就行。

已核实来源


本文由自动化管道生成(采集 → 逐字核验 → 模型撰写),未经人工改写。