基于对抗性样本的文本对抗攻击算法
我为您讲解一个自然语言处理安全领域的重要算法:基于对抗性样本的文本对抗攻击算法。该算法研究如何在保持语义合理性的前提下,对输入文本进行微小、不易察觉的修改,使得目标自然语言处理模型(如文本分类器、情感分析模型等)产生错误的预测结果。理解此算法不仅有助于认识模型的脆弱性,也对构建鲁棒的NLP系统至关重要。
算法描述
文本对抗攻击的目标是,给定一个已经训练好的NLP模型(称为受害者模型)和一个原始输入文本(称为干净样本),攻击者需要生成一个与原始文本语义相似但经过扰动的对抗样本。当将对抗样本输入受害者模型时,模型会输出与原始预测不同的、通常是攻击者指定的错误结果。
攻击通常可分为两类:
- 白盒攻击:攻击者完全了解受害者模型的结构、参数和梯度信息。
- 黑盒攻击:攻击者只能通过查询受害者模型的输入-输出来获取信息,不了解其内部细节。
我们以一个经典的基于梯度的白盒攻击算法——快速梯度符号法(FGSM)在文本上的变体——为例,进行详细讲解。
解题过程详解
假设我们的受害者模型是一个基于词嵌入(如Word2Vec或BERT)和神经网络的文本分类模型。我们的目标是生成一个对抗样本。
核心思想:对于连续数据(如图像),FGSM直接沿着损失函数关于输入数据的梯度方向添加一个微小扰动。但对于离散的文本数据(单词序列),我们不能直接修改离散的单词ID。因此,我们需要将扰动施加在连续的词嵌入向量上,然后再找到一个在嵌入空间中最接近扰动后向量的、有效的离散单词进行替换。
步骤一:模型与问题形式化
- 设受害者模型为 \(f\),它将一个由 \(n\) 个单词组成的句子 \(X = [x_1, x_2, ..., x_n]\) 映射为一个预测标签 \(y\)。
- 首先,每个单词 \(x_i\) 通过一个嵌入层(Embedding Layer)被转换为一个 \(d\) 维的词向量 \(e_i\)。所以整个句子的嵌入表示为 \(E = [e_1, e_2, ..., e_n]\),这是一个 \(n \times d\) 的矩阵。
- 模型 \(f\) 的损失函数记为 \(J(f(X), y_{true})\),其中 \(y_{true}\) 是样本 \(X\) 的真实标签。
步骤二:计算嵌入空间的梯度
- 对于一个干净的输入句子 \(X\),我们首先前向传播,得到其词嵌入 \(E\)。
- 计算损失函数 \(J\) 相对于输入词嵌入矩阵 \(E\) 的梯度:\(\nabla_E J = \frac{\partial J}{\partial E}\)。
- 这个梯度矩阵 \(\nabla_E J\) 的维度也是 \(n \times d\)。它指示了为了增加模型的损失(即让模型预测错误),我们应该如何“推”每一个词向量。
步骤三:构造对抗性扰动
- 类似于图像领域的FGSM,我们在梯度方向上添加一个扰动。定义一个扰动强度系数 \(\epsilon\)(一个小常数,如0.01)。
- 生成对抗性扰动:\(\Delta = \epsilon \cdot \text{sign}(\nabla_E J)\)。
sign是符号函数,它将梯度矩阵中的每个元素变为 +1 或 -1。这样做是为了确保扰动的大小是均匀的,方向沿着梯度增长最快的方向。- \(\Delta\) 也是一个 \(n \times d\) 的矩阵。
- 得到扰动后的嵌入:\(E_{adv} = E + \Delta\)。
步骤四:将扰动映射回离散词汇(关键步骤)
这是文本对抗攻击区别于图像攻击的核心。我们不能直接将 \(E_{adv}\) 输入模型,因为模型期望的是离散的单词索引。
- 最近邻搜索:对于扰动后句子中的第 \(i\) 个位置的词向量 \(e_{adv, i}\)(即 \(E_{adv}\) 的第 \(i\) 行),我们在整个词表 \(V\) 中搜索一个词 \(w'\),使得该词对应的原始词向量 \(\text{Emb}(w’)\) 与 \(e_{adv, i}\) 的余弦相似度(或欧氏距离)最大(或最小)。
- 目标:\(x_i’ = \underset{w \in V}{\arg\max} \ \text{cosine\_similarity}(\text{Emb}(w), e_{adv, i})\)
- 约束条件:为了保持文本的流畅性和隐蔽性,我们通常会施加约束:
- 语义相似性约束:替换后的单词 \(x_i’\) 应该与原始单词 \(x_i\) 在语义上相近。我们可以设定一个相似度阈值,只从与 \(x_i\) 语义最相近的 \(K\) 个近邻词(根据原始词向量计算)中进行搜索和替换。
- 语法与流畅性约束:可以通过语言模型(如BERT或GPT)的困惑度(Perplexity)来判断替换后的句子是否仍然通顺。如果困惑度激增,则放弃该次替换。
- 修改限制:通常只允许修改句子中一小部分(如20%)的关键词(如名词、动词、形容词),而不修改停用词(如“的”、“了”、“是”)。
步骤五:迭代优化
单次扰动可能不足以改变模型的预测。因此,这个过程通常是迭代进行的:
- 从原始句子 \(X^{(0)} = X\) 开始。
- 在第 \(t\) 次迭代:
a. 将当前句子 \(X^{(t)}\) 输入模型,计算梯度。
b. 根据步骤三和四,生成候选的对抗样本 \(X_{candidate}^{(t+1)}\)。
c. 检查 \(X_{candidate}^{(t+1)}\) 是否满足所有约束(语义、语法、修改次数)。如果满足,并且模型对它的预测已经变为目标错误标签,则攻击成功,停止迭代。
d. 如果攻击未成功但约束满足,则令 \(X^{(t+1)} = X_{candidate}^{(t+1)}\),继续下一次迭代。
e. 如果达到最大迭代次数或无法再找到满足约束的修改,则攻击失败。
算法总结与拓展
我们讲解的是一种基于梯度、在嵌入空间进行扰动,并通过最近邻搜索映射回离散词表的白盒攻击方法。其核心挑战在于保持对抗样本的语义和语法正确性。
-
其他经典方法:
- 黑盒攻击:如遗传算法(Genetic Algorithm),将单词替换视为“基因突变”,通过多次查询模型,根据预测置信度的变化来筛选有效的突变,逐步进化出对抗样本。
- 基于优化的方法:如HotFlip,它将单词替换视为在离散空间的一次“翻转”操作,并通过估计损失函数对于“字符级翻转”的梯度来指导搜索。
- 基于生成的攻击:使用一个 seq2seq 模型,以原始句子和期望的错误标签为条件,直接生成语义保持的对抗句子。
-
防御策略:为了抵抗此类攻击,研究者提出了对抗训练(将对抗样本加入训练集重新训练模型)、输入净化(检测并修复对抗性扰动)、模型鲁棒性增强(如使用随机平滑技术)等方法。
理解文本对抗攻击算法,是迈向构建安全、可靠、可信的NLP系统的关键一步。它揭示了深度学习模型在决策边界上的脆弱性,并促使我们思考如何让模型的学习更接近人类的语义理解。