Facebook 提出了一种 NLP 通用的攻击方法,而且可以通过梯度优化,论文发表在 EMNLP2021,名为 Gradient-based Adversarial Attacks against Text Transformers,源码在 facebookresearch/text-adversarial-attack
Background
我们首先定义模型 $h:\mathcal {X}\to \mathcal {Y}$,其中 $\mathcal {X}$ 和 $\mathcal {Y}$ 分别是输入输出集。设测试样本 $\mathbf {x}\in \mathcal {X}$ 被模型正确预测为标签 $y$,则有 $y=h (\mathbf {x})\in \mathcal {Y}$。如果一个与 $\mathbf {x}$ 无限接近的对抗样本 $\mathbf {x}^{\prime}$ 使得 $h (\mathbf {x}^{\prime})\neq y$,则 $\mathbf {x}^{\prime}$ 是一个好的对抗样本。我们可以通过定义函数 $\rho: \mathcal {X}\times \mathcal {X} \to \mathbb {R}_{\ge 0}$ 来量化 $\mathbf {x}$ 和 $\mathbf {x}^{\prime}$ 的接近程度。设阈值 $\epsilon > 0$,如果 $ \rho (\mathbf {x},\mathbf {x}^{\prime})\leq \epsilon$,则认为对抗样本 $\mathbf {x}^{\prime}$ 与样本 $\mathbf {x}$ 非常接近
寻找对抗样本的过程通过被视为一个优化问题,例如对于分类问题来说,模型 $h$ 输出一个 logits 向量 $\phi_h (\mathbf {x})\in \mathbb {R}^K$,使得 $y = \arg \max_k \phi_h (\mathbf {x})_k$,为了使得模型预测错误,我们可以将 margin loss 选作对抗损失:
$$ \begin{aligned} \ell_{\text{margin}}(&\mathbf{x}, y ; h)=\\ &\max \left(\phi_{h}(\mathbf{x})_{y}-\max _{k \neq y} \phi_{h}(\mathbf{x})_{k}+\kappa, 0\right) \end{aligned}\tag{1} $$
当损失为 0 的时候,模型会在超参数 $\kappa$ 的控制下预测错误。margin loss 在 2017 年的论文 Towards evaluating the robustness of neural networks,关于图像对抗算法中就被证明过有效
这部分注释我想仔细解释下为什么 margin loss 可以使得模型分类错误。模型训练的最终目的是为了优化 margin loss,使得它的损失值降为 0,即
$$ \phi_{h}(\mathbf{x})_{y}-\max _{k \neq y} \phi_{h}(\mathbf{x})_{k}+\kappa \leq 0 $$
只要满足上式情况,损失值就为 0 了。通过变形我们可以得到
$$ \max _{k \neq y} \phi_{h}(\mathbf{x})_{k}-\phi_{h}(\mathbf{x})_{y} \ge \kappa $$
其中,$\phi_h (\mathbf {x})_y$ 指的是输入 $\mathbf {x}$ 被模型正确预测为类别 $y$ 的 logit 值。不妨设
$$ \phi_h(\mathbf{x})_i = \max _{k \neq y} \phi_{h}(\mathbf{x})_{k} $$
并且 $i\neq y$,这表明在所有的错误类别中,第 $i$ 类的 logit 最大,并且结合上面的不等式可得
$$ \phi_h (\mathbf{x})_i - \phi_h(\mathbf{x})_y \ge \kappa $$
总结一下,我们的优化目标永远都是使得损失值降为 0,但是损失降为 0 并不一定代表就要模型对所有的样本都正确预测,margin loss 优化的目标就是使得模型预测错误类别 $i$ 的 logit 比预测正确类别 $y$ 的 logit 大 $\kappa$。但凡存在一个样本预测正确,损失都不可能为 0
给定对抗损失 $\ell$,构造对抗样本的过程可以被视为一个有限制的优化问题:
$$ \min _{\mathbf{x}^{\prime} \in \mathcal{X}} \ell\left(\mathbf{x}^{\prime}, y ; h\right) \quad \text { subject to } \rho\left(\mathbf{x}, \mathbf{x}^{\prime}\right) \leq \epsilon\tag{2} $$
我们可以把约束 $\rho$ 带入损失函数中,将原本的硬约束变为软约束
$$ \min_{\mathbf{x}^{\prime}\in \mathcal{X}}\ell(\mathbf{x}^{\prime},y;h) + \lambda \cdot \rho(\mathbf{x}, \mathbf{x}^{\prime})\tag{3} $$
如果约束函数 $\rho$ 是可微的,就可以用基于梯度的优化器来优化了
式 (2) 在图像或者语音等连续数据领域已被广泛应用,但实际上它并不适用于文本数据,主要有两点原因:
- 数据空间 $\mathcal {X}$ 是离散的,因此无法利用梯度进行优化
- 约束函数 $\rho$ 难以度量文本数据,例如在一个句子中插入 "不是",这个词会否定整个句子的意义,但如果我们用编辑距离去计算两个句子的差异,它们的编辑距离仅为 1
GBDA: Gradient-based Distributional Attack
论文作者所提出的方法解决了上面两个问题:
- 利用 Gumbel-Softmax 使得采样过程可以被梯度优化
- 通过引入困惑度和语义相似度这两个软约束,促使对抗样本的语义更加流畅以及与原样本间的语义更接近
Adversarial Distribution
令 $\mathbf {z} = z_1z_2\cdots z_n$ 是句子 $\mathbf {z}$ 的 token 序列,其中 $z_i$ 来自于一个固定的词汇表 $\mathcal {V} = \{1,...,V\}$。设概率分布 $P_{\Theta}$ 来自于一个参数化的概率矩阵 $\Theta \in \mathbb {R}^{n\times V}$,句子 $\mathbf {z}\sim P_{\Theta}$ 中的每个 token 都是通过下面的公式独立抽样出来的
$$ z_i \sim \text{arg max}(\pi_i)\tag{4} $$
其中,$\pi_i = \text {Softmax}(\Theta_i)$ 表示第 $i$ 个 token 概率分布的向量
我们的目标是优化参数矩阵 $\Theta$,使得 $\mathbf {z}\sim P_{\Theta}$ 为模型 $h$ 的对抗样本,为了做到这一点,我们需要优化的目标函数为
$$ \min_{\Theta \in \mathbb{R}^{n\times V}} \mathbb{E}_{\mathbf{z}\sim P_{\Theta}}\ell (\mathbf{z}, y;h)\tag{5} $$
其中,$\ell$ 为可选的对抗损失,例如 margin loss
Extension to probability vector inputs
公式 (5) 很明显不是一个可导的函数,因为分布是离散的,并且我们是通过采样得到的,采样这个操作没有公式,也就无法求导。但是,我们可以对公式 (5) 进行缩放,将概率向量作为输入,并且使用 Gumbel-Softamx 作为 $\arg \max$ 的估计值,以此来引入梯度
句子 $\mathbf {z}$ 中每个 token $z_i$ 在 Vocabulary 中的索引 $i$ 可以通过 Word Embedding 表查到相应的词向量。特别地,我们定义 $\mathbf {e}(\cdot)$ 为 embedding 函数,因此 token $z_i$ 的 embedding 为 $\mathbf {e}(z_i)\in \mathbb {R}^d$,其中 $d$ 是 embedding 维度。给定一个概率向量 $\pi_i$,它决定了 token $z_i$ 的抽样概率,则我们定义
$$ \mathbf{e}(\pi_i) = \sum_{j=1}^V (\pi_i)_j \mathbf{e}(j)\tag{6} $$
为对应于概率向量 $\pi_i$ 的嵌入向量。特别地,如果 token $z_i$ 的概率向量 $\pi_i$ 是一个 one-hot 向量,则 $\mathbf {e}(\pi_i)=\mathbf {e}(z_i)$。有了公式 (6),我们可以将输入概率向量序列 $\boldsymbol {\pi} = \pi_1\cdots \pi_n$ 拓展为一系列 embedding 的拼接:
$$ \mathbf{e}(\boldsymbol{\pi}) = \mathbf{e}(\pi_1)\cdots \mathbf{e}(\pi_n) $$
Computing gradients using Gumbel-softmax
对模型 $h$ 进行扩展,将概率向量作为输入,使得我们能够利用 Gumbel-softmax 得到式 (5) 的平滑估计。设输入概率序列 $\tilde {\boldsymbol {\pi}} = \tilde {\pi}_1\cdots \tilde {\pi}_n$ 来自 Gumbel-softmax 分布,根据下面的公式得到:
$$ (\tilde {\pi}_i)_j :=\frac{\exp((\Theta_{i,j} + g_{i,j})/T)}{\sum_{v=1}^V\exp((\Theta_{i,v}+g_{i,v})/T)},\quad T>0\tag{7} $$
其中 $g_{i,j}= -\log (-\log (u_{i,j})), u_{i,j}\sim U (0,1)$,即 $u_{i,j}$ 服从均匀分布。$T$ 越接近 0,$\tilde {\pi}_i$ 越接近 one-hot 分布
通过定义公式 (5) 的光滑近似值,我们就可以使用梯度下降优化参数 $\Theta$ 了
$$ \min_{\Theta \in \mathbb{R}^{n\times V}} \mathbb{E}_{\tilde{\boldsymbol{\pi}}\sim\tilde{P}_\Theta}\ell (\mathbf{e}(\tilde{\boldsymbol{\pi}}),y;h)\tag{8} $$
Soft Constrains
由于作者引入 Gumbel-softmax,同时将概率向量作为模型的输入,将不可导的公式 (5) 改写成了可导的公式 (8),因此可以很容易的将其他任何可导的约束函数作为优化目标的一部分。利用这一优势,作者将流畅性和语义相似性约束引入进目标函数中,以产生更流畅和语义更接近的对抗样本
Fluency constraint with a Language model
之前的工作都是基于词级别的攻击,例如使用 Word2vec、GloVe 等,或者是利用同义词替换来保证语义原样本和对抗样本之间的语义相似性,但是这些方法或多或少都会存在一些问题,例如产生的对抗样本语法不连贯、语义不流畅
因果语言模型(Causal language models, CLMs),或者说自回归语言模型的训练目标是最大化条件概率 $p (x_i\mid x_1,x_2,...,x_{i-1})$。更具体地说,给定一个具有对数概率输出的 CLM $g$,一个序列 $\mathbf {x} = x_1\cdots x_n$ 的负对数概率(Negative log-likelihood, NLL)是通过自回归的方式计算出的
$$ \text{NLL}_g(\mathbf{x}) = -\sum_{i=1}^n\log p_g(x_i\mid x_1\cdots x_{i-1}) $$
其中,$\log p_g (x_i\mid x_1\cdots x_{i-1})=g (x_i\mid x_1\cdots x_{i-1})$
由于之前我们定义模型的输入是某个 token 的概率向量,因此我们也可以扩展 NLL 的定义:
$$ \text{NLL}_g({\boldsymbol{\pi}}) := -\sum_{i=1}^n\log p_g(\pi_i\mid \pi_1\cdots \pi_{i-1}) $$
其中
$$ \begin{aligned} -\log p_g(&\pi_i \mid \pi_1\cdots \pi_{i-1})=\\ & -\sum_{j=1}^V (\pi_i)_j g(\mathbf{e}(\pi_1)\cdots \mathbf{e}(\pi_{i-1}))_j \end{aligned} $$
Similarity constraint with BERTScore
作者提出使用 BERTScore,这是一个用于评估生成文本相似性的方法。设 $\mathbf {x} = x_1\cdots x_n$ 以及 $\mathbf {x}^{\prime}={x}_1^{\prime}\cdots {x}_m^{\prime}$ 是两个 token 序列,令 $g$ 为语言模型,我们可以得到基于上下文语境的向量表示
$$ \begin{aligned} &\phi(\mathbf{x}) = (\mathbf{v}_1,...,\mathbf{v}_n)\\ &\phi(\mathbf{x}^{\prime})=(\mathbf{v}^{\prime}_1,...,\mathbf{v}^{\prime}_m) \end{aligned} $$
则序列 $\mathbf {x}$ 和 $\mathbf {x}^{\prime}$ 的 BERTScore 定义如下:
$$ R_{\text{BERT}}(\mathbf{x}, \mathbf{x}^{\prime}) = \sum_{i=1}^n w_i \max_{j=1,...,m} \mathbf{v}_i^{\top} \mathbf{v}_j^{\prime} \tag{9} $$
其中,$w_i = \text {idf}(x_i) / \sum_{i=1}^n \text {idf}(x_i)$ 是 token $x_i$ 标准化后的逆文档频率
我们可以很容易地用式 (6) 中描述的概率向量序列 $\boldsymbol {\pi}=\pi_1\cdots \pi_m$ 来代替 $\mathbf {x}^{\prime}$,并使用 $\rho _g (\mathbf {x},\boldsymbol {\pi})=1- R_{\text {BERT}}(\mathbf {x},\boldsymbol {\pi})$ 作为一个可导的软约束
Objective function
最后,我们把 margin loss、流畅性约束与 BERTScore 相似性约束都整合起来,构成我们最终的优化目标:
$$ \begin{aligned} \mathcal{L}(\Theta)=&\mathbb{E}_{\tilde{\boldsymbol{\pi}}\sim \tilde{P}_{\Theta}}\ell (\mathbf{e}(\tilde{\boldsymbol{\pi}}),y;h)\\ &+\lambda_{\text{lm}}\text{NLL}_g(\tilde{\boldsymbol{\pi}}) + \lambda_{\text{sim}}\rho_g(\mathbf{x}, \tilde{\boldsymbol{\pi}}) \end{aligned}\tag{10} $$
其中,$\lambda_{\text {lm}},\lambda_{\text {sim}}>0$ 均为超参数,每次迭代时从 $\tilde {P}_{\Theta}$ 采样一批输入,并用 Adam 优化器最小化 $\mathcal {L}(\Theta)$。具体来说,论文中的超参数设置为
$$ \begin{aligned} \text{lr} &= 0.3\\ \text{batch size} &= 10\\ \text{iterations} &= 100\\ \lambda_{\text{lm}} &= 1\\ \lambda_{\text{sim}} &\in [20, 200]\\ \kappa &\in \{3, 5, 10\} \end{aligned} $$
Result
实验结果表明,作者的攻击能够在几乎所有情况下将模型的准确率降低到 10% 以下,同时保持高水平的语义相似性(余弦相似度高于 0.8)
同时作者做了一个消融实验,观察流畅性约束的存在,对生成的句子以及最终的结果有什么影响
个人总结
说实话有些尴尬,我在翻 EMNLP 的 Accepted Papers 时,「Adversarial」字样突然映入我眼帘,一开始我还以为这是一种新的对抗训练方法,于是便点开论文看了看,边看边写这篇文章,结果写到快结束的时候感觉有些不对劲,我发现这篇论文其实主要不是讲 Adversarial 的,而是讲 Attack 的,但我并不是做深度学习 Attack 的,所以我基本上是浪费了很多时间看了个和我研究不相关的东西。由于我对深度学习攻击并不了解,所以也没什么很特别的感悟