前沿学术论文每日一读:如何让大模型一本正经说瞎话

508 阅读4分钟

LLM Lies: Hallucinations are not Bugs, but Features as Adversarial Examples

导语

这篇文章作者为北京大学深圳研究生院/信息工程学院袁粒老师团队。文章本身立意在对抗样本攻击领域。本文主要针对与大模型的幻觉问题,设计了一种幻觉攻击方法,通过设计特别的prompt让大模型的回复与现实世界相反(即让大模型产生幻觉)。之所以是对抗样本攻击领域,是因为这些特别的prompt本身不具有任何含义,而通常是随机的字符串。这就和传统的对抗样本攻击非常相似,而不属于prompt工程的领域。论文本身理解难度并不高,适合作为科普读物。

背景知识

大模型的幻觉

定义:当模型生成的文本不遵循原文(Faithfulness)或者不符合事实(Factualness),我们就可以认为模型出现了幻觉的问题。

  • 不遵循原文指的是:
    • Intrinsic Hallucination(信息冲突) : LMs在生成回复时,与输入信息产生了冲突,例如摘要问题里,abstract和document的信息不一致。
    • Extrinsic Hallucination(无中生有): LMs在生成回复时,输出一些并没有体现在输入中的额外信息,比如邮箱地址、电话号码、住址,并且难以验证其真假。
  • 不符合事实指的是:大模型的输出不符合我们的常识或者我们所知的现实,比如大模型说2023年美国的总统仍然是特朗普。

幻觉攻击

那么,论文所提出的幻觉攻击,具体含义就是: 大模型的幻觉现象能够被稳定的形式化触发,其极有可能是对抗样本的另一种视角

也就是说,可以通过设计特别的prompt,来稳定的触发大模型的幻觉,让大模型去胡言乱语/无中生有。

幻觉攻击的分类

作者提出了两种幻觉攻击方法:

随机噪声攻击

随机噪声攻击(OoD Attack): 即让无意义的随机字符串诱导大模型产生预定义的幻觉输出。

下图展示了随机噪声攻击的含义与效果:

image.png

可以看到,用户输入了没有任何实际含义的随机字符串,人类对于这种输入不会有任何输出,但是大模型反而产生了完全无关的幻觉型输出。语句还非常通顺233,这意味着我们可以构造随机字符串来操控大模型,使大模型输出任意的内容

弱语义攻击

弱语义攻击(Weak Semantic Attack) :即保证原始 prompt 语义基本不变的情况下,只修改原始的prompt中极少的token,使得大模型的输出与原始prompt的输出截然不同。

如下图所示:

image.png

作者先是写了一个普通的prompt,而大模型产生了正确的回复,随后作者只是添加了几个token或者修改原本prompt中的几个token,大模型就产生了完全相反的回复。

那么该如何对于大语言模型进行攻击呢?

攻击步骤

image.png

构建幻觉数据集

ML领域的攻击首先一步,就是构建一个攻击数据集,毕竟干什么都需要有数据支撑~

  1. 从 Wiki 百科上收集一些常识性问题 xx ,并将其输入到大模型中得到了正确的回答 yy
  2. 替换句子的主谓宾去构造一个不存在的事实 y~∉T\tilde{y}\not \in \mathcal{T} ,其中 T\mathcal{T} 是包含所有符合事实的集合(人类常识的集合)。
  3. 得到构造的幻觉数据集: D~={x,y~y~i∉T}i=1n\tilde{\mathcal{D}}=\{\langle x,\tilde{y}\rangle|\tilde{y}^i \not \in \mathcal{T}\}_{i=1}^n

总结一下就是,作者为每一个prompt xx准备了两个回复yyy~\tilde{y}yy是正确回复,y~\tilde{y}是错误回复,然后扔掉了yy,利用xxy~\tilde{y}构建了一个数据集。

对抗性prompt训练

我们首先采样一条不符合事实的QA pair x,y~D~\langle x, \tilde{y} \rangle \sim \tilde{\mathcal{D}} ,为了能够让prompt稳定的触发幻觉  y~~\tilde{y} ,我们需要最大化如下似然函数来找到一条对抗性prompt  x~~\tilde{x}

x~=argmaxxXlogpθ(y~x)\tilde{x}=\mathop{\arg\max}_{x\in\mathcal{X}} \log p_\theta(\tilde{y}|x)

其中 θ\theta 是大模型的参数, X\mathcal{X} 是输入空间,公式中的xx代表了一个随机变量,即任意的一个prompt,与数据集中的xx无关。这里,我们假设x=x1:l=[τ1,τ2,...,τl]x=x_{1:l}=[\tau_1,\tau_2,...,\tau_l] 是由 ll 个 token 构成。而最大化似然函数指的就是,我们希望在所有可能的prompt中找到一个prompt,其可以让大模型回复 y~~\tilde{y}的概率是所有prompt中最大的。

基于梯度的 token 替换策略

然而,由于语言是非连续的,xx本身是一个离散变量,我们没办法直接类似于图像领域的对抗攻击那样使用梯度下降方法直接对 xx 进行优化,因为梯度下降法处理的都是连续数值而不是离散数值。受启发于[1],我们通过基于梯度的 token 替换策略来间接的最大化该对数似然,

argmaxeadv[eadvei]eilogpθ(y~x~)s.t.ϕ(x~)ϕ(x)pϵ\mathop{\arg\max}_{e_{adv}}[e_{adv}-e_i]^\top\nabla_{e_i}\log p_\theta(\tilde{y}|\tilde{x})\\ s.t. ||\phi(\tilde{x})-\phi(x)||_p\leq \epsilon

其中 eadve_{adv} 为对抗 token τadv\tau_{adv} 的 embedding, ϕ()\phi(\cdot) 是一个语义提取器。

抛开冗杂的数学公式,简单的说,对抗性prompt训练过程为:

  1. 对于长度为ll的原始prompt xx,对于其中的每一个token τi\tau_i,我们遍历词表,在固定其他token不变的前提下,将其替换成另一个词viv_i,并计算出替换后得到的输入x~\tilde{x}的梯度gvig_{v_i}
  2. 我们需要计算出替换前的token对应的梯度gvg_v
  3. 计算梯度差gvigvg_{v_i}-g_v
  4. 假设词表中有mm个单词,那么会最终得到mlm * l个梯度差,我们保留top-k个梯度差,以及其对应的替换后的token
  5. 用这k个token替换掉他们对应位置的token,得到最终的对抗性prompt

总结

这篇论文主要围绕着幻觉(Hallucination)进行了一系列的探讨。论文展示了由随机字符串构成的提示语(OoD Prompt)能够诱发大模型输出任意预定义的幻觉,例如:不正当的言论、假新闻、常识性错误等内容,如果大模型的输出能够被任意的控制,并为不良使用者“代言”一些不正当的舆论或误导性新闻且最终产生了不好的社会影响,那么谁来为这个行为买单呢?

引用

[1] Eric Wallace, Shi Feng, Nikhil Kandpal, Matt Gardner, and Sameer Singh. Universal adversarial triggers for attacking and analyzing nlp. arXiv preprint arXiv:1908.07125, 2019.