.. role:: python(code) :language: python 评测算法详细介绍 ======================================== 平台已集成的文本情感分析模型评测(以下简称文本评测)算法及简要说明如下所示(使用算法缩写字典序排序)。评测依据主要是模型抵抗文本攻击的能力。 TextFooler算法 [#text_fooler]_ -------------------------------- 算法介绍 ~~~~~~~~ :code:`TextFooler` 算法是一个黑盒的单词粒度级别的文本自然语言处理攻击算法,主要针对的是文本分类以及文本蕴含推理两类任务的模型。执行算法 :code:`TextFooler` 需要预先有一个大的词汇表 :code:`Vocab`,单词嵌入(向量化)模型 :math:`\operatorname{WordEmb}` 以及句子嵌入(向量化)模型 :math:`\operatorname{SenEmb}` 。 :code:`TextFooler` 主要的思想可以总结如下: 根据模型 :math:`F` 可以给出单词 :math:`w` 在句子 :math:`X` 中的重要度(Importance),定义如下 .. math:: I_{w} := \begin{cases} F_Y(X) - F_Y(X_{\setminus{w}}), & \text{ 若 } F(X) = F(X_{\setminus{w}}) = Y \\ (F_Y(X) - F_Y(X_{\setminus{w}}))+(F_{\widetilde{Y}}(X_{\setminus{w}}) - F_{\widetilde{Y}}(X)), & \text{ 若 } F(X) = Y, F(X_{\setminus{w}}) = \widetilde{Y}, Y \neq \widetilde{Y} \end{cases} 上式中的 :math:`X_{\setminus{w}}` 为句子 :math:`X` 去掉单词 :math:`w` 之后所得的句子, :math:`F(X)` 为模型 :math:`F` 对于句子 :math:`X` 的分类结果(或者文本蕴含推理结果), :math:`F_Y(X)` 为模型 :math:`F` 对于句子 :math:`X` 预测结果为 :math:`Y` 的概率。 将初始的对抗样本置为 :math:`X_{adv} = X` 。将 :math:`X` 中单词依照重要度由高到低进行排序,依次执行如下的贪婪搜索(greedy search):从词汇表`Vocab`中挑出与单词 :math:`w` 向量化之后余弦相似度最高的 :math:`N` 个单词,并去掉经过替换后在句子中与原单词 :math:`w` 词性不一致的单词,组成备选集合 :math:`\mathcal{C}_w` 。 对于集合 :math:`\mathcal{C}_w` 中的单词 :math:`c` ,在句子 :math:`X_{adv}` 中将单词 :math:`w` 替换为 :math:`c` ,得到新的句子 :math:`X'_c` 。如果 :math:`\operatorname{SenEmb}(X_{adv})` 与 :math:`\operatorname{SenEmb}(X')` 的余弦距离大于预设的阈值,则将 :math:`c` 保留在集合 :math:`\mathcal{C}_w` 中,否则剔除。假设 :math:`\mathcal{C}_w` 最终非空集,记这个集合为 .. math:: \mathcal{C}_w = \{ c_k \ |\ 0 \leqslant k \leqslant N_w \} :math:`N_w` 为某个大于等于1的整数。与此同时,我们会得到两个序列 .. math:: \begin{align*} Y_k & := F(X'_{c_k}) \\ P_k & := F_{Y_k}(X'_{c_k}) \end{align*} 此时,若存在某个 :math:`k` ,使得 :math:`Y_k \neq Y = F(X)` ,那么令 .. math:: \DeclareMathOperator*{\argmax}{arg\,max} c^* := \argmax_{c_k} \{ \operatorname{CosSim}(\operatorname{SenEmb}(X), \operatorname{SenEmb}(X'_{c_k})) \ |\ Y_k \neq Y \} 在此时的 :math:`X_{adv}` 中将单词 :math:`w` 替换为 :math:`c^*` ,得到新的 :math:`X_{adv}` ,即为满足要求的对抗样本。此时可以跳出循环,返回 :math:`X_{adv}` 。反过来,若序列 :math:`Y_k` 中的每个元素都等于原预测值 :math:`Y` ,则检查如下条件是否满足 .. math:: \min_{0 \leqslant k \leqslant N_w} P_k < F_{Y}(X_{adv}) 若满足,则令 .. math:: \DeclareMathOperator*{\argmin}{arg\,min} c^* := \argmax_{c_k} \{ P_k \} 并将 :math:`X_{adv}` 中的单词 :math:`w` 替换为 :math:`c^*` ,进入下一个单词的循环,直到满足条件(即 :math:`F(X_{adv}) \neq Y` )的对抗样本 :math:`X_{adv}` 产生,或所有单词都完成了搜索。当遍历所有单词都无法生成满足条件的对抗样本 :math:`X_{adv}` ,则生成对抗样本失败,返回空值 :python:`None` 。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 单次搜索产生的待选对抗样本数目上限 2. :code:`min_cos_sim`: 有效对抗样本与原样本进行的词替换的词嵌入向量的最小余弦距离 3. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入(使用 :code:`Universal Sentence Encoder`)向量的最小余弦距离 HotFlip算法 [#hotflip]_ -------------------------- 算法介绍 ~~~~~~~~ :code:`HotFlip` 算法是一种白盒攻击算法,可以进行字符级别的攻击,也可以进行词级别的攻击。 :code:`HotFlip` 算法对句子 :math:`X` 进行的操作主要是词(或者字符)的替换(原文中称作翻转,flip),插入与删除也可视作特殊的替换操作。对于替换词(字符)的选取,主要通过极大化计算损失函数的方向导数得到: .. math:: \operatorname{argmax}\limits_s \nabla_X L(X,y)^T \cdot v_{is} = \operatorname{argmax}\limits_s \nabla_X L(X,y)^T - \nabla_X L(X,y)^T[i'] 其中 :math:`L` 为损失函数,向量 :math:`v_{is}` 为替换第 :math:`i` 个词(字符)为词汇表(字符表)中第 :math:`s` 个词(字符)对应的向量,具体来说等于第 :math:`i'` 位值为-1,第 :math:`s'` 位值为1,其余位置值为0的向量, :math:`i'` 为要替换的句子中的第 :math:`i` 个词(字符)在词汇表(字符表)中的下标。 :math:`\operatorname{argmax}\limits_s'` 可以替换为排名前n个对应的下标。一般来说,对于白盒对抗攻击,我们希望沿着梯度方向 :math:`\nabla_X L(X,y)^T` 极大化损失函数,但由于文本的特殊性,我们只能取一些带限制(例如只有一个词被替换)的特殊的离散的方向,极大化这些方向与梯度的内积(即方向导数)。 :code:`HotFlip` 算法搜索对抗样本的方法为束搜索(beam search),为:code:`TextFooler` 算法中使用的贪婪搜索(greedy search)的改良。束搜索每次循环会保留使模型正确预测概率最低的若干个(贪婪搜索是1个)备选对抗样本,进行下一个词(字符)的翻转搜索。 参数说明 ~~~~~~~~ 1. :code:`top_n`: 单次搜索产生的备选替换词(字符)数目 2. :code:`max_num_words`: 有效对抗样本被替换的词(字符)的数目上限 3. :code:`min_cos_sim`: 有效对抗样本与原样本进行的词替换的词嵌入向量的最小余弦距离 4. :code:`beam_width`: 束搜索每次搜索之后保留的备选对抗样本的数目 PWWS算法 [#pwws]_ -------------------------- 算法介绍 ~~~~~~~~ :code:`PWWS` 算法全称是Probability Weighted Word Saliency,是一种词级别的黑盒攻击算法,主要针对的是文本分类模型。 :code:`PWWS` 的主要方法是通过 :code:`WordNet` 选取词的近义词进行替换,通过综合考虑词替换带来的正确预测概率的改变量以及原词在整个句子中的显著度(Saliency)进行筛选,得到对抗样本。词 :math:`w_i` 在句子 :math:`X = w_1w_2\ldots w_i\ldots w_d` 中的显著度定义如下 .. math:: S(X, w_i) = P(y_{true}|X) - P(y_{true}|\widehat{X}) 其中 :math:`\widehat{X} = w_1w_2\ldots [UNK]\ldots w_d` 为在句子 :math:`X = w_1w_2\ldots w_i\ldots w_d` 中将词 :math:`w_i` 替换为一个特殊的token :code:`[UNK]` 得到的句子(这个token也可以是任何不在要攻击模型(的tokenizer)的词汇表中的词)。对于每个句子 :math:`X` ,可以通过这种方式得到它的词显著度向量 :math:`S(X) = (S(w_1), \ldots, S(w_d))`。 要注意的是 :code:`PWWS` 算法中使用词显著度(Saliency)与 `TextFooler算法`_ 中使用的的词重要度(Importance)的异同之处。 :code:`PWWS` 算法的流程如下 1. 对于待攻击的句子 :math:`X = w_1w_2\ldots w_i\ldots w_d` 中的每个词 :math:`w_i` ,计算其显著度 :math:`S(X, w_i)` 。同时,从 :code:`WordNet` 中选取它的近义词集合 :math:`\mathbb{L}_i` 。若 :math:`w_i` 是专名,则从集合 :math:`NE_{adv}` 中选出与其词性相同的词,并入 :math:`\mathbb{L}_i` 中。 :math:`NE_{adv}` 为数据集中预测正确句子中出现过的专名组成集合,在词汇表中所有专名集合中的补集。(一般这条比较难实现,在代码实现中并未考虑添加 :math:`NE_{adv}` )。通过如下的公式从集合 :math:`\mathbb{L}_i` 中取出词 :math:`w_i` 的替换词 :math:`w_i^*` .. math:: w_i^* = R(w_i, \mathbb{L}_i) = \operatorname{argmax}\limits_{w_i'\in \mathbb{L}_i} \{P(y_{true}|X) - P(y_{true}|X_i')\} 其中 :math:`X_i' = w_1w_2\ldots w_i'\ldots w_d` 。这样可以得到对抗样本 :math:`X_i^* = w_1w_2\ldots w_i^*\ldots w_d` ,并令 .. math:: \Delta P_i^* = P(y_{true}|X) - P(y_{true}|X_i^*) 2. 将词 :math:`w_1, w_2, \ldots, w_d` 按如下定义的分数从高到低排序 .. math:: H(X, X_i^*, w_i) = operatorname{Softmax}(S(X))_i \cdot \Delta P_i^* 其中 :math:`S(X)` 为之前定义的句子 :math:`X` 的词显著度向量。之后开始执行如下的贪婪搜索(greedy search)。从 :math:`i = 1` 开始,用排好序的前 :math:`i` 个词用第1步中找到的替换词进行替换,得到句子 :math:`X^{(i)}` ,直到被攻击模型在 :math:`X^{(i)}` 上产生分类错误,从而得到对抗样本。若遍历给定可进行替换词数量上界仍没有造成模型分类错误,那么攻击失败,获取对抗样本失败。 参数说明 ~~~~~~~~ BAE算法 [#bae]_ -------------------------- 算法介绍 ~~~~~~~~ :code:`BAE` 算法全称是BERT-Based Adversarial Examples,是一种词级别的黑盒攻击算法,主要针对的是文本分类模型。:code:`BAE` 算法产生对抗样本的方法主要是利用掩码语言模型(masked language model, MLM, 例如 :code:`BERT` )产生备选词,插入被对抗样本,或者替换被对抗样本中的词。:code:`BAE` 算法具体流程如下: 1. 计算句子 :math:`X = w_1w_2\ldots w_d` 中每个词的重要度(Importance),并按降序排列。词重要度的计算方法与 `TextFooler算法`_ 中的词重要度计算方法一致。 2. 初始化对抗样本为 :math:`X_{adv} = X` 。执行如下的贪婪搜索(greedy search)。从 :math:`i = 1` 开始,依次取词重要度排名第 :math:`i` (这里为了记号方便,仍然记为 :math:`w_i`),利用掩码语言模型,计算如下带掩码的句子 .. math:: X_{adv}[1:i-1][Mask]X_{adv}[i+1:d] \quad \text{或者} \quad X_{adv}[1:i][Mask]X_{adv}[i+1:d] :math:`[Mask]` 处概率排名前 :math:`k` 的词,替换 :math:`[Mask]` ,得到备选对抗样本的集合,记为 :math:`\mathbb{L}[i]` 。这里的 :math:`X_{adv}[1:i-1]` 为 当前对抗样本 :math:`X_{adv}` 在词 :math:`w_i` 之前的词组成的序列,其他记号的意义依此类推。上式的前一种模式被称作词替换模式,后一种模式被称作词插入模式。在生成备选对抗样本的时候,两种模式可以采用二者中的一种,或者混用。对于备选对抗样本的集合 :math:`\mathbb{L}[i]` ,进一步使用 :code:`Universal Sentence Encoder` 计算与原句子 :math:`X` 的语义相似度,筛选出相似度高于预设阈值的备选对抗样本。如果是替换模式,则需要额外检查替换词与被替换词的词性,剔除词性不一致的替换词对应的备选对抗样本。 3. 检查备选对抗样本的集合 :math:`\mathbb{L}[i]` ,看其中的句子能否使模型产生分类错误。如果有,则取其中与原句子语义相似度最高的作为最终产生的对抗样本,并结束循环。若 :math:`\mathbb{L}[i]` 所有备选对抗样本都不能使模型产生分类错误,那么取其中使得模型正确分类概率最低的作为 :math:`X_{adv}` ,进入下一循环。直到产生使模型分类错误的对抗样本,或者遍历所有词后扔不能生成产生使模型分类错误的对抗样本,获取对抗样本失败。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 单次搜索(使用掩码语言模型)产生的待选对抗样本数目上限 2. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入(使用 :code:`Universal Sentence Encoder`)向量的最小余弦距离 BERT-Attack算法 [#bertattack]_ -------------------------------- 算法介绍 ~~~~~~~~ :code:`BERT-Attack` 算法与 `BAE算法`_ 算法原理与流程类似,以下仅列出不同点: 1. :code:`BERT-Attack` 算法的词重要度的计算方法与 :code:`PWWS` 算法的词显著度计算方法一致,即将要计算的词用特定的token进行替换;而 :code:`BAE` 算法则是与 :code:`TextFooler` 算法一致,将要计算的词删除。 2. 生成备选对抗样本集合的方式不同。 :code:`BERT-Attack` 算法并不像 :code:`BAE` 算法那样对原句进行掩码的操作,而是对使用字节对编码(Bytes-Pair-Encoding, BPE)之后得到的token序列进行掩码,通过掩码语言模型 :code:`BERT` 获取这些token的替换列表。这些token可能是词,也可能是子词(sub-word)。当某个token不是词的时候,需要将这个token所在词覆盖的token的替换列表进行组合,对这些组合进行编码逆操作获取词的替换词,并按混乱度(perplexity,由 :code:`BERT` 获取)倒排。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 单次搜索(使用掩码语言模型)产生的待选对抗样本数目上限 2. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入(使用 :code:`Universal Sentence Encoder`)向量的最小余弦距离 3. :code:`max_perturb_percent`: 词替换比例最高值,一个有效的对抗样本相较原句子中词被替换的比例不能超过这个值 .. CheckList算法 [#checklist]_ .. ------------------------------ .. 算法介绍 .. ~~~~~~~~ .. :code:`CheckList` 算法是一种词级别的黑盒攻击算法,主要针对的是文本分类模型。:code:`CheckList` 算法主要依赖于人工建立的知识库,与词性(part-of-speech)、专名(named entity)检查器,其词替换的方式主要有以下几种: .. 1. 地名替换 .. 2. 人名替换 .. 3. 数字替换 .. 4. 缩写替换(例如 it is 与 it's 之间的相互替换,主要针对有字母系统的语言,如英语等) .. :code:`CheckList` 算法的搜索方法是贪婪搜索(greedy search),即每次替换一个词,替换词使得模型进行正确预测的概率最低。 .. 参数说明 .. ~~~~~~~~ .. CLARE算法 [#clare]_ .. ------------------------------ .. 算法介绍 .. ~~~~~~~~ .. :code:`CLARE` 算法全称是 **C**\ ontextua\ **L**\ ized **A**\ dversa\ **R**\ ial **E**\ xample generation model,是一种词级别的黑盒攻击算法。:code:`CLARE` 算法生成备选对抗样本的方式与 `BAE算法`_ 类似,采用掩码语言模型对于需要替换的词,或者插入词的位置加入掩码,用掩码语言模型对于掩码的输出预测结果作为替换或插入的词。 :code:`CLARE` 算法相较于 `BAE算法`_ ,新增了合并词(merge)的模式,即将两个相邻的词用一个掩码代替,去生成备选词。 :code:`CLARE` 并不计算句子中词的重要度或者其他类似的分数,按此排序之后进行贪婪搜索,而是直接按照词在句子中的顺序进行贪婪搜索。 .. 参数说明 .. ~~~~~~~~ .. 1. :code:`max_candidates`: 单次搜索(使用掩码语言模型)产生的待选对抗样本数目上限 .. 2. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入(使用 :code:`Universal Sentence Encoder`)向量的最小余弦距离 DeepWordBug算法 [#deepwordbug]_ ----------------------------------- 算法介绍 ~~~~~~~~ :code:`DeepWordBug` 算法是字符级别的黑盒攻击算法。 :code:`DeepWordBug` 算法利用类似 `TextFooler算法`_ 中的方法,计算句子中每个词的重要度,按此排序之后进行贪婪搜索。由于 :code:`DeepWordBug` 算法是字符级别的攻击算法,其产生替换词的方法有如下几种 1. 词中相邻字符交换 2. 随机往词中插入字符 3. 随机删除词中字符 4. 随机替换词中字符 参数说明 ~~~~~~~~ 1. :code:`use_all_transformations`: 布尔值的参数,如果置为真(True),则使用所有4种产生替换词的方法;否则仅使用最后一种产生替换词的方法,即随机替换词中字符。 2. :code:`max_edit_distance`: 有效对抗样本与原样本的编辑距离最大值 .. Genetic算法 [#genetic]_ .. ------------------------- .. 算法介绍 .. ~~~~~~~~ .. :code:`Genetic` 算法是UCLA计算机系的Moustafa Alzantot等人提出的,基于遗传算法的词级别的黑盒攻击算法,有时也被称作 :code:`Alzantot` 算法。 .. :code:`Alzantot` 算法产生新的备选对抗样本的基本方法为词替换,被称作为扰动(perturb)。更具体来说,是利用词嵌入模型,例如 :code:`CounterFittedEmbedding` , :code:`ChineseWord2Vec` 等,通过计算词嵌入向量的余弦距离或者欧氏距离,获取与被替换词距离最近的若干词进行词替换,从而产生备选对抗样本。 这些备选对抗样本还会利用 :code:`Google 1 billion words language model` 产生的语言流畅度评分作进一步筛选,只保留得分最高的若干个。 .. :code:`Alzantot` 算法的核心是其遗传算法。具体来说,利用上一代(上一次循环)的个体(备选对抗样本)通过交叉(crossover)的方式产生下一代的个体(备选对抗样本)。这里的交叉操作为,用某个备选对抗样本的随机位置的某些词,去替换另一个备选对抗样本相应位置的词。进行完交叉之后得到的备选对抗样本,再进行一次基于词嵌入模型的扰动操作,即变异(mutation)的操作,并依据被攻击模型做出正确分类的概率从低到高倒排,只保留一定数目的备选对抗样本,就得到了下一代的备选对抗样本。这样构成了 :code:`Alzantot` 算法的一次完整的循环。 .. 参数说明 .. ~~~~~~~~ .. 1. :code:`max_candidates`: 单次搜索(使用词嵌入模型)产生的待选对抗样本数目上限 .. 2. :code:`max_perturb_percent`: 有效对抗样本被替换的词的比例的最高值 .. 3. :code:`max_mse_dist`: 有效的替换词与被替换词的词嵌入向量欧氏距离最大值 .. 4. :code:`max_iters`: 遗传算法迭代最大次数 .. 5. :code:`pop_size`: 遗传算法每一代个体(备选对抗样本)的数目上限 .. FasterGenetic算法 [#fastergenetic]_ .. --------------------------------------- .. 算法介绍 .. ~~~~~~~~ .. :code:`FasterGenetic` 算法与 `Genetic算法`_ 原理与流程基本一致,二者唯一的区别在于 :code:`FasterGenetic` 算法算法将用于检查备选对抗样本与原样本的语言流畅度的语言模型替换为了 :code:`Learning2Write` [#l2w]_ 模型。这个模型相较 :code:`Google 1 billion words language model` 更轻便,对显存大小要求更低,速度更快。 .. 参数说明 .. ~~~~~~~~ .. 1. :code:`max_candidates`: 单次搜索(使用词嵌入模型)产生的待选对抗样本数目上限 .. 2. :code:`max_perturb_percent`: 有效对抗样本被替换的词的比例的最高值 .. 3. :code:`max_mse_dist`: 有效的替换词与被替换词的词嵌入向量欧氏距离最大值 .. 4. :code:`max_iters`: 遗传算法迭代最大次数 .. 5. :code:`pop_size`: 遗传算法每一代个体(备选对抗样本)的数目上限 .. IGA算法 [#iga]_ .. -------------------- .. 算法介绍 .. ~~~~~~~~ .. :code:`IGA` 算法全称为Improved Genetic Algorithm,原理与流程与 `Genetic算法`_ 类似。二者不同之处在于 .. 1. :code:`IGA` 算法的交叉(crossover)操作为,某个上一代(上一次循环)的个体(备选对抗样本)从某个位置(以词计)切开的前半句,与另一个个体从同一位置切开的后半句进行拼接。 .. 2. :code:`IGA` 算法\ **不使用**\ 语言模型对生成的备选对抗样本进行语言流畅度评分做进一步筛选。 .. 参数说明 .. ~~~~~~~~ .. 1. :code:`max_candidates`: 单次搜索(使用词嵌入模型)产生的待选对抗样本数目上限 .. 2. :code:`max_perturb_percent`: 有效对抗样本被替换的词的比例的最高值 .. 3. :code:`max_mse_dist`: 有效的替换词与被替换词的词嵌入向量欧氏距离最大值 .. 4. :code:`max_iters`: 遗传算法迭代最大次数 .. 5. :code:`pop_size`: 遗传算法每一代个体(备选对抗样本)的数目上限 FD算法 [#fd]_ -------------------- 算法介绍 ~~~~~~~~ :code:`FD` 算法是一种词级别的白盒攻击算法。其对于一个被攻击样本(句子)中的词进行随机的选取与替换,产生新的备选的对抗样本。:code:`FD` 算法产生替换词的方法结合了基于词嵌入模型的方法与基于被攻击模型梯度的方法。具体来说,该算法首先利用词嵌入模型,例如 :code:`CounterFittedEmbedding` , :code:`ChineseWord2Vec` 等,产生最近邻的一些替换词,在利用被攻击模型的梯度信息,在这些词中筛选使得下式极小化的词 .. math:: \operatorname{argmin}_{w} \lVert \operatorname{sign}(\operatorname{Emb}(X^*[i]) - \operatorname{Emb}(w)) - \operatorname{sign}(J_F(X)[i]) \rVert_1 其中 :math:`X` 为被攻击样本, :math:`X^*` 为当前备选对抗样本, :math:`\operatorname{Emb}` 是被攻击模型的词嵌入层(不是第一步产生初步备选词的词嵌入模型), :math:`J_F(X)[i]` 是梯度信息, :math:`\lVert \cdot \rVert_1` 为1-范数。 参数说明 ~~~~~~~~ 1. :code:`top_n`: 单次搜索,最终产生的备选替换词数目 .. Pruthi算法 [#pruthi]_ .. ------------------------ .. 算法介绍 .. ~~~~~~~~ .. :code:`Pruthi` 算法是CMU计算机系的Danish Pruthi等人提出的字符级别的黑盒攻击算法。这个攻击算法较为简单,主要利用以下4种方式生成替换词进行词的替换来生成对抗样本,并按词在句子中的自然顺序进行贪婪搜索: .. 1. 词中相邻字符交换 .. 2. 随机往词中插入字符 .. 3. 随机删除词中字符 .. 4. 利用 :code:`QWERTY` 法随机替换词中字符 .. 前3种方法是和 `DeepWordBug算法`_ 共有的生成替换词的方法,第4种方法为 :code:`Pruthi` 算法特有的生成替换词的方法。这种方法模拟的是人通过普通键盘(QWERTY键盘)输入按错键而产生的错误拼写词,每个字母可以用其周围的若干字母替换,来组成错误拼写词。 .. 参数说明 .. ~~~~~~~~ .. 1. :code:`max_perturb_num`: 有效对抗样本被替换的词的数目的最高值 .. 2. :code:`min_word_len`: 字符数目低于这个值的词不进行词的替换(即按上述4中方法生成拼写错误的词) PSO算法 [#pso]_ -------------------- 算法介绍 ~~~~~~~~ :code:`PSO` 算法是一种词级别的黑盒攻击算法,得名自其采用的搜索对抗样本的方法,即粒子群算法(Particle Swarm Optimization)。粒子群算法与遗传算法都属于进化算法这一大类。在 :code:`PSO` 算法中,每一迭代轮次的样本全体被称作一个群(swarm),一个样本被称作一个粒子(particle),每个粒子对应的词序列被称作搜索空间中的一个位置(position)。 :code:`PSO` 算法的另一个创新之处在于,它的词替换方法,又称变异(mutation)操作为,利用知识图谱 :code:`HowNet` 中义素(sememes)相同的词进行词替换。 :code:`PSO` 算法具体流程如下: 1. 初始化(Initialize):对被攻击样本(句子) :math:`X = w_1w_2\ldots w_D` 随机替换一个词,生成 :math:`N` 新的样本,并给每个新样本随机赋予一个初始速度(velocity),以此为第一代开始进行循环迭代。初始速度为一个 :math:`D` 维向量,其元素取值范围为 :math:`(-V_{\max}, V_{\max})` ,代表的是对应位置的词被新词替换的概率。 2. 记录(Record):每一迭代轮次完成之后,单个粒子都记录一次个体最佳位置(individual best position),对应于该粒子达到的优化目标函数的最高值(例如被攻击模型正确预测概率的相反数);同时记录整个群的整体最佳位置(global best position)。 3. 更新(Update):在每一轮迭代中,按下式更新(第 :math:`n` 个粒子)的速度向量 .. math:: v_d^n = w v_d^n + (1-w) \times [\mathcal{I}(p_d^n, x_d^n) + \mathcal{I}(p_d^g, x_d^n)], \quad d = 1, \cdots, D 其中 :math:`x^n` 为粒子 :math:`n` 当前位置; :math:`p^n` 为粒子 :math:`n` 的个体最佳位置; :math:`p^g` 为整体最佳位置; :math:`w` 为惯性权重(inertia weight),按如下方式更新 .. math:: w = (w_{\max} - w_{\min}) \times \frac{T-t}{T} + w_{\min}, \quad 0 < w_{\min} < w_{\max} < 1 其中 :math:`T` 为迭代总轮数, :math:`t` 为当前轮数; :math:`\mathcal{I}(a,b)` 为如下定义的函数 .. math:: \mathcal{I}(a,b) = \begin{cases} 1, & a=b \\ -1, & a \neq b \end{cases} 粒子 :math:`n` 的更新按如下方式进行:首先,按概率 .. math:: P_i = P_{\max} - \frac{t}{T} \times (P_{\max} - P_{\min}), \quad 0 < P_{\min} < P_{\max} < 1 确定是否向个体最佳位置移动。若移动,则依概率向量 :math:`\operatorname{sigmoid}(v_1^n,\cdots,v_D^n)` 向个体最佳位置移动,即第 :math:`d` 个词以概率 :math:`\operatorname{sigmoid}(v_d^n)` 替换为个体最佳位置的第 :math:`d` 个词。接下来按概率 .. math:: P_g = P_{\min} + \frac{t}{T} \times (P_{\max} - P_{\min}) 确定是否向整体最佳位置移动。若移动,则同样依概率向量 :math:`\operatorname{sigmoid}(v_1^n,\cdots,v_D^n)` 向整体最佳位置移动。完成移动之后,每个粒子以概率 .. math:: P_m (x^n) = \max \left( 0, 1-k\frac{\mathcal{E}(x^n, x^0)}{D} \right) 进行变异操作。更新(Update)全部完成之后,返回第二部进行记录(Record)操作,即记录此时的所有个体最佳位置以及整体最佳位置。 4. 终止(Terminate)条件为:整体最佳位置对应的优化目标达到,例如被攻击模型分类错误。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 单次搜索(使用词嵌入模型)产生的待选对抗样本数目上限 2. :code:`max_iters`: 遗传算法迭代最大次数 3. :code:`pop_size`: 遗传算法每一代个体(备选对抗样本)的数目上限 TextBugger算法 [#textbugger]_ ------------------------------- 算法介绍 ~~~~~~~~ :code:`TextBugger` 算法是一种字符级别与词级别混合的攻击算法,可以进行黑盒攻击也可以进行白盒攻击。 :code:`TextBugger` 算法的白盒攻击方法如下:对于样本 :math:`(X,y)` ,其中 :math:`X = w_1w_2\ldots w_d` 为句子,:math:`y` 为其分类标签。通过如下的偏导数计算其中每个词:math:`w_i` 的重要度(Importance) .. math:: C_{w_i} = \dfrac{\partial \mathcal{F}_y(X)}{\partial w_i} 其中 :math:`\mathcal{F}` 为被攻击的分类模型, :math:`\mathcal{F}_y` 为该模型分类为 :math:`y` 的概率。对句子中的词按如此定义的重要度重排之后,按顺序进行贪婪搜索。 :code:`TextBugger` 算法的黑盒攻击方法与 `TextFooler算法`_ 的原理类似,也是采取删除词的方法计算该词在句子中的重要度,将词按重要度排序之后,按顺序进行贪婪搜索。 :code:`TextBugger` 算法在字符级别生成新的备选对抗样本的方法有 1. 词中相邻字符交换 2. 随机往词中插入字符 3. 随机删除词中字符 4. 同形字符(homoglyph)替换 :code:`TextBugger` 算法在词级别生成新的备选对抗样本的方法与 `FD算法`_ 等类似,使用词嵌入模型,寻找嵌入向量距离最近的替换词进行词替换,从而得到备选对抗样本。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 使用词嵌入模型产生的待选对抗样本数目上限 2. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入(使用 :code:`Universal Sentence Encoder`)向量的最小余弦距离 .. UAT算法 [#uat]_ .. ------------------------------- .. 算法介绍 .. ~~~~~~~~ .. :code:`UAT` 算法全称是 Universal Adversarial Triggers,这是一种白盒攻击方法。这种攻击方法比较特殊,其尝试从整个数据集搜索一个或者多个泛用的(universal)触发器(trigger)。准确来说,触发器是一些短语,进行文本攻击的时候将其插入句子开头或是结尾。这些触发器对于整个数据集来说是泛用的,即对大多数数据集中的文本,上述的使用触发器的攻击都是有效的,能够造成要攻击的文本分类模型的错误分类。 .. 参数说明 .. ~~~~~~~~ .. 待写 VIPPER算法 [#viper]_ ------------------------------- 算法介绍 ~~~~~~~~ :code:`VIPPER` 算法全称是 **VI**\ sual **PER**\ turber,是一种字符级别的黑盒攻击方法。该算法按照被攻击样本(句子)中词的顺序,对词中字符进行替换生成新的备选对抗样本,并执行贪婪搜索。:code:`VIPPER` 算法生成新的备选对抗样本的方法有 1. 同形字符(homoglyph)替换 2. DCES(Description-based character embedding space)字符替换 其中第2种方法是 :code:`VIPPER` 算法特有的方法。这种方法并不是通常的字符嵌入方法,而是根据 Unicode 11.0.0 final names list,依照字符描述的语义构建的临近字符(nearest neighbors)知识库。 参数说明 ~~~~~~~~ 1. :code:`use_eces`: 这是一个布尔值的参数,若为真( :code:`True` ),则使用同形字符替换方法,否则使用DCES字符替换方法 2. :code:`dces_threshold`: 每次生成新的对抗样本时,DCES方法产生备选新词数目的上限。这个参数仅当 :code:`use_eces` 为假( :code:`False` )时起作用。 A2T算法 [#a2t]_ ------------------------------- 算法介绍 ~~~~~~~~ :code:`A2T` 算法全称是Attacking to Training,原本是为对抗训练(adversarial training)设计的方法,其核心部分是一套词级别的白盒对抗攻击算法。具体来说, :code:`A2T` 算法依据被攻击样本中词的重要度,从低到高进行贪婪搜索。其中词的重要度计算方法是基于梯度的,与 `TextBugger算法`_ 的计算方法类似。对于替换词的选取, :code:`A2T` 算法提供了2种可选的方法: 1. 基于词嵌入模型,寻找嵌入向量相近的词作为替代词,具体参见 `FD算法`_ 。 2. 基于掩码语言模型,将被替换词用掩码替换,用掩码语言模型对掩码的预测词作为替换词,具体参见 `BAE算法`_ 。 :code:`A2T` 算法的另一个创新之处是,用了进行了模型蒸馏的句嵌入模型来度量备选对抗样本与原样本的语义距离(句嵌入向量距离),极大降低了显存需求,加快了计算速度。 参数说明 ~~~~~~~~ 1. :code:`max_candidates`: 单次搜索(使用词嵌入模型或掩码语言模型)产生的待选对抗样本数目上限 2. :code:`min_cos_sim`: 有效对抗样本与原样本进行的词替换的词嵌入向量的最小余弦距离 3. :code:`use_threshold`: 有效对抗样本与原样本的句嵌入向量的最小余弦距离 4. :code:`max_modification_rate`:词维度的编辑距离(被替换词比例) 5. :code:`mlm`:布尔值的参数,若为真,则使用掩码语言模型用于替换词的生成,否则使用词嵌入模型生成替换词 参考文献 --------- .. .. [#textattack] Morris J, Lifland E, Yoo J Y, et al. TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP[C]//Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations. 2020: 119-126. .. .. [#openattack] Zeng G, Qi F, Zhou Q, et al. Openattack: An open-source textual adversarial attack toolkit[J]. arXiv preprint arXiv:2009.09191, 2020. .. [#text_fooler] Jin D, Jin Z, Zhou J T, et al. Is bert really robust? a strong baseline for natural language attack on text classification and entailment[C]//Proceedings of the AAAI conference on artificial intelligence. 2020, 34(05): 8018-8025. .. [#hotflip] Ebrahimi J, Rao A, Lowd D, et al. HotFlip: White-Box Adversarial Examples for Text Classification[C]//Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 2: Short Papers). 2018: 31-36. .. [#pwws] Ren S, Deng Y, He K, et al. Generating natural language adversarial examples through probability weighted word saliency[C]//Proceedings of the 57th annual meeting of the association for computational linguistics. 2019: 1085-1097. .. [#bae] Garg S, Ramakrishnan G. BAE: BERT-based Adversarial Examples for Text Classification[C]//Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP). 2020: 6174-6181. .. [#bertattack] Li L, Ma R, Guo Q, et al. BERT-ATTACK: Adversarial Attack against BERT Using BERT[C]//Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP). 2020: 6193-6202. .. .. [#checklist] Ribeiro M T, Wu T, Guestrin C, et al. Beyond Accuracy: Behavioral Testing of NLP Models with CheckList[C]//Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. 2020: 4902-4912. .. .. [#clare] Li D, Zhang Y, Peng H, et al. Contextualized Perturbation for Textual Adversarial Attack[C]//Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies. 2021: 5053-5069. .. [#deepwordbug] Gao J, Lanchantin J, Soffa M L, et al. Black-box generation of adversarial text sequences to evade deep learning classifiers[C]//2018 IEEE Security and Privacy Workshops (SPW). IEEE, 2018: 50-56. .. .. [#fastergenetic] Jia R, Raghunathan A, Göksel K, et al. Certified Robustness to Adversarial Word Substitutions[C]//Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). 2019: 4129-4142. .. .. [#genetic] Alzantot M, Sharma Y, Elgohary A, et al. Generating Natural Language Adversarial Examples[C]//Proceedings of the 2018 Conference on Empirical Methods in Natural Language Processing. 2018: 2890-2896. .. [#fd] Papernot N, McDaniel P, Swami A, et al. Crafting adversarial input sequences for recurrent neural networks[C]//MILCOM 2016-2016 IEEE Military Communications Conference. IEEE, 2016: 49-54. .. .. [#iga] Wang X, Jin H, He K. Natural language adversarial attacks and defenses in word level[J]. arXiv preprint arXiv:1909.06723, 2019. .. .. [#pruthi] Pruthi D, Dhingra B, Lipton Z C. Combating Adversarial Misspellings with Robust Word Recognition[C]//Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics. 2019: 5582-5591. .. [#pso] Zang Y, Qi F, Yang C, et al. Word-level Textual Adversarial Attacking as Combinatorial Optimization[C]//Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics. 2020: 6066-6080. .. [#textbugger] Li J, Ji S, Du T, et al. TextBugger: Generating Adversarial Text Against Real-world Applications[C]//26th Annual Network and Distributed System Security Symposium. 2019. .. .. [#uat] Wallace E, Feng S, Kandpal N, et al. Universal Adversarial Triggers for Attacking and Analyzing NLP[C]//Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). 2019: 2153-2162. .. [#viper] Eger S, Şahin G G, Rücklé A, et al. Text Processing Like Humans Do: Visually Attacking and Shielding NLP Systems[C]//Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long and Short Papers). 2019: 1634-1647. .. [#a2t] Yoo J Y, Qi Y. Towards Improving Adversarial Training of NLP Models[J]. arXiv preprint arXiv:2109.00544, 2021. .. .. [#l2w] Holtzman A, Buys J, Forbes M, et al. Learning to Write with Cooperative Discriminators[C]//Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers). 2018: 1638-1649.