基于对抗性样本的文本对抗攻击算法
字数 3054 2025-12-18 12:31:13

基于对抗性样本的文本对抗攻击算法

我为您讲解一个自然语言处理安全领域的重要算法:基于对抗性样本的文本对抗攻击算法。该算法研究如何在保持语义合理性的前提下,对输入文本进行微小、不易察觉的修改,使得目标自然语言处理模型(如文本分类器、情感分析模型等)产生错误的预测结果。理解此算法不仅有助于认识模型的脆弱性,也对构建鲁棒的NLP系统至关重要。

算法描述

文本对抗攻击的目标是,给定一个已经训练好的NLP模型(称为受害者模型)和一个原始输入文本(称为干净样本),攻击者需要生成一个与原始文本语义相似但经过扰动的对抗样本。当将对抗样本输入受害者模型时,模型会输出与原始预测不同的、通常是攻击者指定的错误结果。

攻击通常可分为两类:

  1. 白盒攻击:攻击者完全了解受害者模型的结构、参数和梯度信息。
  2. 黑盒攻击:攻击者只能通过查询受害者模型的输入-输出来获取信息,不了解其内部细节。

我们以一个经典的基于梯度的白盒攻击算法——快速梯度符号法(FGSM)在文本上的变体——为例,进行详细讲解。

解题过程详解

假设我们的受害者模型是一个基于词嵌入(如Word2Vec或BERT)和神经网络的文本分类模型。我们的目标是生成一个对抗样本。

核心思想:对于连续数据(如图像),FGSM直接沿着损失函数关于输入数据的梯度方向添加一个微小扰动。但对于离散的文本数据(单词序列),我们不能直接修改离散的单词ID。因此,我们需要将扰动施加在连续的词嵌入向量上,然后再找到一个在嵌入空间中最接近扰动后向量的、有效的离散单词进行替换。

步骤一:模型与问题形式化

  1. 设受害者模型为 \(f\),它将一个由 \(n\) 个单词组成的句子 \(X = [x_1, x_2, ..., x_n]\) 映射为一个预测标签 \(y\)
  2. 首先,每个单词 \(x_i\) 通过一个嵌入层(Embedding Layer)被转换为一个 \(d\) 维的词向量 \(e_i\)。所以整个句子的嵌入表示为 \(E = [e_1, e_2, ..., e_n]\),这是一个 \(n \times d\) 的矩阵。
  3. 模型 \(f\) 的损失函数记为 \(J(f(X), y_{true})\),其中 \(y_{true}\) 是样本 \(X\) 的真实标签。

步骤二:计算嵌入空间的梯度

  1. 对于一个干净的输入句子 \(X\),我们首先前向传播,得到其词嵌入 \(E\)
  2. 计算损失函数 \(J\) 相对于输入词嵌入矩阵 \(E\) 的梯度:\(\nabla_E J = \frac{\partial J}{\partial E}\)
  3. 这个梯度矩阵 \(\nabla_E J\) 的维度也是 \(n \times d\)。它指示了为了增加模型的损失(即让模型预测错误),我们应该如何“推”每一个词向量。

步骤三:构造对抗性扰动

  1. 类似于图像领域的FGSM,我们在梯度方向上添加一个扰动。定义一个扰动强度系数 \(\epsilon\)(一个小常数,如0.01)。
  2. 生成对抗性扰动:\(\Delta = \epsilon \cdot \text{sign}(\nabla_E J)\)
    • sign 是符号函数,它将梯度矩阵中的每个元素变为 +1 或 -1。这样做是为了确保扰动的大小是均匀的,方向沿着梯度增长最快的方向。
    • \(\Delta\) 也是一个 \(n \times d\) 的矩阵。
  3. 得到扰动后的嵌入:\(E_{adv} = E + \Delta\)

步骤四:将扰动映射回离散词汇(关键步骤)

这是文本对抗攻击区别于图像攻击的核心。我们不能直接将 \(E_{adv}\) 输入模型,因为模型期望的是离散的单词索引。

  1. 最近邻搜索:对于扰动后句子中的第 \(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})\)
  2. 约束条件:为了保持文本的流畅性和隐蔽性,我们通常会施加约束:
    • 语义相似性约束:替换后的单词 \(x_i’\) 应该与原始单词 \(x_i\) 在语义上相近。我们可以设定一个相似度阈值,只从与 \(x_i\) 语义最相近的 \(K\) 个近邻词(根据原始词向量计算)中进行搜索和替换。
    • 语法与流畅性约束:可以通过语言模型(如BERT或GPT)的困惑度(Perplexity)来判断替换后的句子是否仍然通顺。如果困惑度激增,则放弃该次替换。
    • 修改限制:通常只允许修改句子中一小部分(如20%)的关键词(如名词、动词、形容词),而不修改停用词(如“的”、“了”、“是”)。

步骤五:迭代优化

单次扰动可能不足以改变模型的预测。因此,这个过程通常是迭代进行的:

  1. 从原始句子 \(X^{(0)} = X\) 开始。
  2. 在第 \(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系统的关键一步。它揭示了深度学习模型在决策边界上的脆弱性,并促使我们思考如何让模型的学习更接近人类的语义理解。

基于对抗性样本的文本对抗攻击算法 我为您讲解一个自然语言处理安全领域的重要算法:基于对抗性样本的文本对抗攻击算法。该算法研究如何在保持语义合理性的前提下,对输入文本进行微小、不易察觉的修改,使得目标自然语言处理模型(如文本分类器、情感分析模型等)产生错误的预测结果。理解此算法不仅有助于认识模型的脆弱性,也对构建鲁棒的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系统的关键一步。它揭示了深度学习模型在决策边界上的脆弱性,并促使我们思考如何让模型的学习更接近人类的语义理解。