论文链接:https://aclanthology.org/P18-2006.pdf
项目代码:https://github.com/AnyiRao/WordAdver
HotFlip: White-Box Adversarial Examples for Text Classification
Abstract
我们提出了一种有效的方法来生成白盒的对抗样本去欺骗一个字符级的神经分类器。我们发现只需要很少的一些操作就能大大降低准确性。我们的方法依赖于一个原子级的翻转操作,也就是根据 one-hot 的输入向量的梯度,将一个token转换成另一个。由于我们方法的有效性,我们可以执行对抗训练,来使模型在测试时对攻击更加鲁棒。通过使用一些语义保持的约束,我们证明 HotFlip 也可以适用于对单词级的分类器的攻击。
1 Introduction
对抗样本是一个预测的ML模型的输入,这个模型被恶意设计来造成不好的性能(Goodfellow et al., 2015)。对抗性示例暴露了模型表现不佳的输入空间区域,这有助于理解和改进模型。通过使用这些示例作为训练数据,对抗训练学习到了更稳健的模型,甚至可能在非对抗样本上也表现得更好。人们对理解 NLP 系统漏洞的兴趣正在增长(Jia and Liang, 2017; Zhao et al., 2018;Belinkov and Bisk, 2018; Iyyer et al., 2018)。以前的工作侧重于在黑盒设置中创建对抗样本的启发式方法,而无需对模型参数进行任何明确的了解。在白盒设置中,我们使用模型的完整知识来开发最坏情况的攻击,这可以揭示更大的漏洞。
我们提出了一种针对可微的文本分类器的白盒敌手。我们发现只需要一些少量的操作就能大大增加误分类的错误。此外,快速生成对抗样本使得对抗训练变得可行,这有助于模型防御对抗样本攻击并提高在干净示例的准确性。我们方法的核心是一个原子级的翻转操作,它通过使用模型对 one-hot 输入向量的方向导数将一个token改成为另一个。
我们的贡献如下:
- 我们提出了一种高效的基于梯度的优化方法,来操纵离散的文本结构(在它的 one-hot 的表示上)。
- 我们研究了一个用对抗样本训练的分类器的鲁棒性,通过研究它对攻击的弹性以及它对干净测试数据的准确性。
2 Related Work
对抗样本是研究深度学习模型漏洞的强大工具 (Szegedy et al., 2014)。虽然这一研究方向最近在深度学习社区中受到了很多关注,但它其实在机器学习中有着悠久的历史,可以追溯到对线性垃圾邮件分类器的对抗性攻击(Dalvi et al., 2004;Lowd and Meek, 2005)。Hosseini et al. (2017) 表明,简单的修改——比如在字符之间添加空格或点——可以极大地改变谷歌的 perspective API 的毒性评分。Belinkov and Bisk (2018) 表明,字符级的机器翻译系统对随机的字符操作——比如键盘拼写错误——过于敏感。他们用合成或自然噪声来操纵句子中的每个词。然而,在我们所有的实验中,我们关心句子中的失真程度,并寻找更强大的对抗样本,它可以在有限的预算内增加损失。不再是随机地扰动文本,我们提出了一种有效的方法,可以用模型相对于输入的梯度来生成对抗性文本。
对抗性训练将训练与对抗样本的生成交织在一起(Goodfellow et al., 2015)。具体来说,在每一次训练迭代之后,对抗样本会被创建并添加到 mini-batches 中。Madry et al. (2018) 提出了一种基于梯度的投影方法来创建对抗样本,这已被证明是针对图像分类的对抗性攻击的最有效的防御机制之一。Miyato et al. (2017) 通过在词嵌入中添加噪声来创建对抗样本,而无需创建真实世界有语义的文本对抗样本。我们的工作是第一个产生真实世界的对抗样本的有效方法,它也可以被用于有效的对抗训练。
3 HotFlip
HotFlip 是一种使用字符替换(“flip”)来生成对抗样本的方法。HotFlip 还支持插入和删除操作,通过将它们表示为字符替换的序列。它使用关于 one-hot 输入的表示的梯度来有效地估计哪些个体变化具有最高估计损失,并使用束搜索来找到一组可以很好地协同工作来迷惑分类器的操作。
3.1 Definitions
我们用 J ( x , y ) J(\mathrm{x,y}) J(x,y) 来代表模型在输入 x \mathrm{x} x 上关于真实输出 y \mathrm{y} y 的损失。比如说,对于分类任务,损失就是在 softmax 单元的输出上的 log 损失。设 V V V 是字母表, x \mathrm{x} x 是一个长度为 L L L 个字符的文本,并且 x i j ∈ { 0 , 1 } ∣ V ∣ x_{ij}\in\{0,1\}^{|V|} xij∈{0,1}∣V∣ 是一个代表了第 i i i 个单词的第 j j j 个字符的 one-hot 向量。字符的序列可以被表示为
x = [ ( x 11 , . . . , x 1 n ) ; . . . ; ( x m 1 , . . . , x m n ) ] \mathrm{x}=[(x_{11},...,x_{1n});...;(x_{m1},...,x_{mn})] x=[(x11,...,x1n);...;(xm1,...,xmn)]
其中分号表示单词之间的显式分割。单词的数量用 m m m 表示, n n n 是一个单词中含有的最大字符数。
3.2 Derivatives of Operations
我们将文本操作表示为输入空间中的向量,并通过对应于这些操作的方向导数来估计变化的损失。基于这些导数,敌手可以选择最佳的损失上升方向。我们的算法只需要一个函数评估(前向传递)和一个梯度计算(后向传递)来估计最好的可能的翻转。
在第 i i i 个单词的第 j j j 个字符的翻转(从字母表中第 a a a 个字符变成第 b b b 个字符)可以表示为这个向量:
v ⃗ i j b = ( 0 ⃗ , . . . ; ( 0 ⃗ , . . . ( 0 , . . . , − 1 , 0 , . . . 1 , 0 ) j , . . . , 0 ⃗ ) i ; 0 ⃗ , . . . ) \vec{v}_{ijb}=(\vec{0},...;(\vec{0},...(0,...,-1,0,...1,0)_{j},...,\vec{0})_{i};\vec{0},...) vijb=(0,...;(0,...(0,...,−1,0,...1,0)j,...,0)i;0,...)
其中 -1 和 1 分别是字母表第 a a a 个字符和第 b b b 个字符的相应位置,并且 x i j ( a ) = 1 x_{ij}^{(a)}=1 xij(a)=1,也就是 x i j = [ 0 , . . . , 0 , 1 , 0 , . . . , 0 ] x_{ij}=[0,...,0,1,0,...,0] xij=[0,...,0,1,0,...,0] 表示了字符表上的第 a a a 个字符 。损失变化的一阶近似可以从沿该向量的方向导数中获得:
∇ v ⃗ i j b J ( x , y ) = ∇ x J ( x , y ) T ⋅ v ⃗ i j b \nabla_{\vec{v}_{ijb}}J(\mathrm{x,y})=\nabla_{x}J(\mathrm{x,y})^{T}\cdot \vec{v}_{ijb} ∇vijbJ(x,y)=∇xJ(x,y)T⋅vijb
我们选择能对损失增加最多的向量:
max ∇ x J ( x , y ) T ⋅ ∇ v ⃗ i j b = max i j b ∂ J ∂ x i j ( b ) − ∂ J ∂ x i j ( a ) \max \nabla_{x}J(\mathrm{x,y})^{T}\cdot \nabla_{\vec{v}_{ijb}}=\underset{ijb}{\max}\frac{\partial J}{\partial x_{ij}}^{(b)}-\frac{\partial J}{\partial x_{ij}}^{(a)} max∇xJ(x,y)T⋅∇vijb=ijbmax∂xij∂J(b)−∂xij∂J(a)
使用导数作为一个代理的损失,我们只需通过调用等式 1 中提到的函数来找到最佳变化,就能估计最佳的字符变化 ( a → b ) (a\to b) (a→b)。这与一种简单的基于损失的方法形成对比,后者必须为每个可能的变化查询分类器以计算这些变化引起的精确损失。换句话说,除了调用等式 1 函数的开销之外,只需要一次反向传递,这使敌手节省了大量的前向传递的成本。
在第 i i i 个单词的第 j j j 个位置插入字符也可以被视为字符翻转,然后随着字符向右移动直到单词结束会带来更多的翻转。
max ∇ x J ( x , y ) T ⋅ ∇ v ⃗ i j b = max i j b ∂ J ∂ x i j ( b ) − ∂ J ∂ x i j ( a ) + ∑ j ′ = j + 1 n ( ∂ J ∂ x i j ′ ( b ′ ) − ∂ J ∂ x i j ′ ( a ′ ) ) \max \nabla_{x}J(\mathrm{x,y})^{T}\cdot \nabla_{\vec{v}_{ijb}}=\underset{ijb}{\max}\frac{\partial J}{\partial x_{ij}}^{(b)}-\frac{\partial J}{\partial x_{ij}}^{(a)} \\ +\sum_{j'=j+1}^{n}\left ( \frac{\partial J}{\partial x_{ij'}}^{(b')}-\frac{\partial J}{\partial x_{ij'}}^{(a')} \right ) max∇xJ(x,y)T⋅∇vijb=ijbmax∂xij∂J(b)−∂xij∂J(a)+j′=j+1∑n(∂xij′∂J(b′)−∂xij′∂J(a′))
这里 x i j ′ ( a ′ ) = 1 x_{ij'}^{(a')}=1 xij′(a′)=1 并且 x i j ′ − 1 ( b ′ ) = 1 x_{ij'-1}^{(b')}=1 xij′−1(b′)=1 。类似地,字符删除可以写成许多字符翻转,因为字符向左移动。由于方向向量(操作)的大小不同,我们通过向量的 L 2 L_{2} L2 范数进行归一化,即 v ⃗ 2 N \frac{\vec{v}}{\sqrt{2N}} 2Nv,其中 N N N 是总的翻转的数量。
3.3 Multiple Changes
我们解释了如何估计文本中最好的一个变化以获得损失的最大增加。 r r r 步的贪婪或束搜索将为我们提供一个最多 r r r 次翻转的对抗样本,或者更具体地说是一个对抗样本,它距离原始样本有一个 r r r 的 L 0 L_{0} L0距离。我们的束搜索只需要 O ( b r ) \mathcal{O}(br) O(br) 步前向传递和相同数量的后向传递, r r r 是预算, b b b 是束宽度。我们用一个例子详细说明这一点:考虑损失函数 J ( . ) J(.) J(.)、输入 x 0 x_{0} x0、和一个单个的变换 c j c_{j} cj 。我们估计变换的分数为 ∂ J ( x 0 ) ∂ c j \frac{\partial J(x_{0})}{\partial c_{j}} ∂cj∂J(x0) 。对于 3 个变换的序列 [ c 1 , c 2 , c 3 ] [c_{1},c_{2},c_{3}] [c1,c2,c3],我们评估的“分数”如下。
score ( [ c 1 , c 2 , c 3 ] ) = ∂ J ( x 0 ) ∂ c 1 + ∂ J ( x 1 ) ∂ c 2 + ∂ J ( x 2 ) ∂ c 3 \text{score}([c_{1},c_{2},c_{3}])=\frac{\partial J(x_{0})}{\partial c_{1}}+\frac{\partial J(x_{1})}{\partial c_{2}}+\frac{\partial J(x_{2})}{\partial c_{3}} score([c1,c2,c3])=∂c1∂J(x0)+∂c2∂J(x1)+∂c3∂J(x2)
这里 x 1 x_{1} x1 和 x 2 x_{2} x2 是对初始输入 x 0 x_{0} x0 分别应用了变换 [ c 1 ] [c_{1}] [c1] 和 [ c 1 , c 2 ] [c_{1},c_{2}] [c1,c2] 进行修改之后。我们需要 b b b 次前向和后向传输来计算路径每一步的导数,这导致了 O ( b r ) \mathcal{O}(br) O(br) 次查询。相比之下,一种简单的基于损失的方法需要计算束搜索的每个阶段的每个可能的变化的精确损失,这会导致 O ( b r ⋅ L ⋅ ∣ V ∣ ) \mathcal{O}(br\cdot L\cdot |V|) O(br⋅L⋅∣V∣) 次查询。
4 Experiments
原则上,HotFlip 可以应用于任何可微的基于字符的分类器。在这里,我们专注于 CharCNN-LSTM 架构 (Kim et al., 2016),该架构可以通过最后一个循环隐藏单元之后的一个密集层来适配分类。我们使用 AG 的新闻数据集,它包含了120,000个训练实例和7600个测试实例,来自四个相同大小类别:世界、体育、商业、科学/技术。该架构由一个具有 500 个隐藏单元的 2 层的 LSTM、一个大小为25的字符嵌入,还有 1000 个宽度为 6 的时间卷积内核组成。该分类器能够在 AG 的新闻上表现突出(Conneau et al., 2017),已经在某些基准测试中取得了最先进的结果。该模型使用 SGD 和梯度裁剪进行训练,批量大小设置为 64。我们使用 10% 的训练数据作为开发集,最多训练 25 个 epoch。如果词汇表中不存在新词,我们只允许字符级的更改,以避免有可能更改文本含义的变化。敌手使用大小为 10 的束搜索,并且有一个最多占文档 10% 的字符的预算。在图 1 中,我们针对一个错误分类的可接受置信度分数绘制了敌手的成功率。也就是说,只有当分类器以一个给定的置信度分数错误分类了实例时,我们才认为敌手成功了。对于这个实验,我们为 10% 的测试集创建了对抗样本。
我们将其与一个无法访问模型参数的(贪婪)黑盒对手进行比较,并简单地用随机更改字符的方式来查询分类器。Belinkov 和 Bisk (2018) 定义了一个攻击,Key,其中字符被替换为键盘中的相邻字符。我们允许一个更强大的黑盒攻击者将字符更改为字母表中的任何字符,我们称之为 Key*。正如预期的那样,一个白盒的敌手更具破坏性,成功率更高。可以看出,束搜索策略在欺骗分类器方面非常有效,即使使用 0.9 的置信度约束,也能欺骗分类器超过 90% 的实例。贪婪搜索的效果较差,尤其是在产生高置信度分数方面。我们使用文档中最多 10% 的字符作为敌手的预算,但我们的敌手在置信度0.5时平均改变了 4.18% 的字符来欺骗分类器。对手大约在 80% 的次数里会选择翻转操作,并倾向于选择删除超过插入两次到一次。
4.1 Robustness
对于我们的对抗训练,我们只使用翻转操作,并且只评估模型对该操作的鲁棒性。这是因为插入和删除操作的生成会慢 n n n 倍,其中 n n n 是单词允许的最大字符数。对于这些实验,我们对置信度分数没有约束。我们对于每个训练示例翻转 r r r 个字符,再调整之后是被设置成文本中20% 的字符,根据开发集的准确性。此外,为了更快地生成对抗样本,我们直接在第一个反向传递后同时应用前 r 次翻转。
我们使用完整的测试集进行实验,我们将 HotFlip 对抗训练与白盒(监督的)对抗训练 (Miyato et al., 2017) 进行比较,白盒对抗训练扰动单词的嵌入,我们将其适配为关于字符的嵌入。具体来说,每个字符的对抗性噪声受到嵌入矩阵的 Frobenius 范数约束,嵌入矩阵由单词中的字符序列组成。我们还创建了另一个基线,其中我们没有用白盒的对抗样本,而是将黑盒对抗性示例 (Key*) 添加到mini-batches中。如表 2 所示,我们的方法减少了错误分类的错误,并显着降低了敌手的成功率。特别是,在 HotFlip 生成的真实对抗样本上的对抗训练,比在(通过向嵌入添加噪声创建的)伪对抗样本上的训练更有效。
我们当前的对抗训练模型的误差仍然超出了可接受的比率;这主要是因为我们在测试时使用波的的敌手——使用了束搜索——严格强于我们模型的内部敌手。这点在计算机视觉中已经被观察到,也就是最强的敌手不足以用来进行对抗训练,但会破坏用一个较弱敌手训练的模型 (Carlini and Wagner, 2017)。
4.2 Human Perception
我们的人工评估实验表明,我们的基于字符的对抗样本基本不会改变句子的含义。我们进行了一项实验,注释由 Amazon Mechanical Turk 中至少三个众包工作人员注释的 600 个随机选择的实例。该集合包含每类 AG 的新闻数据集的 150 个示例,所有这些示例都由分类器正确分类。我们通过我们的算法操纵该集合的一半,这可以成功地欺骗分类器对这些 300 个对抗样本进行错误分类。我们的参与者的中位数准确度下降了1.78%,从在干净的示例上的 87.49% 下降到对抗性示例上的 85.71%。在图像分类 (Papernot et al., 2016) 和文本理解 (Jia and Liang, 2017) 方面同样报告了人类表现的小幅下降。
5 HotFlip at Word-Level
HotFlip 可以自然地适配为单词级的模型来生成对抗样本,方法是计算关于单词的 one-hot 向量的导数。当经过一些字符更改后,文本的含义很可能被读者保留或推断(Rawlinson,1976),这也是我们的人类受试者研究所证实的。相比之下,单词级的对抗性操作更有可能改变文本的含义,这使得使用语义保留约束是必要的。例如,将单词 good 更改为 bad 会改变句子 “this was a good movie" 的含义。事实上,我们希望模型在这种变化后预测出一个不同的标签。
为了展示 HotFlip 对单词级分类器的适用性,我们使用 Kim 的 CNN (2014) ,它在 SST 数据集 (Socher et al., 2013) 上训练用于二元情感分类 。为了创建对抗样本,我们添加了约束,以便生成的句子可能保留原始含义;只有当满足这些约束时,我们才将单词 w i w_{i} wi 翻转到 w j w_{j} wj:
- 两个单词的嵌入的余弦相似度大于阈值 (0.8) 。
- 两个单词有同样的词性。
- 我们不允许替换停止词,就像许多停用词一样,很难找到替换它们之后仍然会在语法上呈现正确的句子的情况。我们还不允许出于同样的目的将一个词更改为具有相同词位的另一个词。
表 3 显示了几个只有一个单词翻转的对抗样本。在第二个和第四个例子中,对手在整个非常负面的评论中用高度正面的词(即 terrific, wonderful)翻转了一个正面词(即good, nice)。这些示例虽然有趣且直观,但并不丰富,因此对 NLP 词级模型的威胁较小。具体来说,给定严格的约束集,我们只能够用一个或两个翻转创建 41 个示例(是 SST 测试集正确分类的实例的 2%)。
为了对字符级模型的相对脆弱性进行定性分析,我们在表 4 中研究了当一个对抗性翻转、插入或删除操作发生时,单词嵌入的变化。我们使用最高层的输出作为单词的表示,并报告几个对抗性词的嵌入,其中原始词不在它们的前 5 个最近的邻居中。
在字符级的模型中,从词汇表中选择一个单词的查找操作被一个字符序列特征提取器所取代,该特征提取器为任何输入提供嵌入,包括 OOV 词,这些词将被映射到一个单词级模型中的 UNK token。这使得字符级的表示中引入的嵌入空间更加密集,这使得字符级模型更有可能在小对抗性扰动下发生错误。
6 Conclusion and Future Work
白盒攻击是对手对机器学习模型造成最严重的攻击的形式之一。我们通过计算关于一些字符编辑操作(即翻转、插入、删除)的导数来创建白盒对抗样本,这些对抗样本可用于波搜索优化。虽然字符编辑的操作对人类理解的影响很小,但我们发现字符级模型对对抗性扰动高度敏感。在对抗训练中使用这些对抗样本能使模型对此类攻击更加鲁棒,并且在没有见过的干净数据上也更加鲁棒。
对比和评估不同字符级模型对不同任务的鲁棒性是对抗性 NLP 的重要未来方向。此外,文本的离散性使得理解对抗样本的情形成为一项更具挑战性的任务。在这个方向上的研究可以揭示 NLP 模型的漏洞。