文章目录
-
- **核心设计目标**
-
- **关键步骤与实现细节**
-
- [1. **候选位置选择(Algorithm 1: get_top_locations)**](#1. 候选位置选择(Algorithm 1: get_top_locations))
- [2. **扰动生成与筛选(Algorithm 2: Charmer)**](#2. 扰动生成与筛选(Algorithm 2: Charmer))
- [3. **适配大语言模型(LLM)的攻击**](#3. 适配大语言模型(LLM)的攻击)
- **实验中的性能表现**
- **与其他方法的核心区别**
- 词元级别的攻击为什么是基于梯度的方法
- [损失函数关于输入词元嵌入(token embeddings)的梯度是怎么计算的](#损失函数关于输入词元嵌入(token embeddings)的梯度是怎么计算的)
-
- 核心背景:模型结构与梯度计算的前提
- 具体计算步骤
-
- [1. 前向传播:从词元嵌入到模型输出](#1. 前向传播:从词元嵌入到模型输出)
- [2. 反向传播:从损失到词元嵌入的梯度传递](#2. 反向传播:从损失到词元嵌入的梯度传递)
- 关键特点:处理离散与连续的衔接
- 总结
- 那字符级别的攻击不会轻易改变语义是需要自己试出来的吗
-
- 为什么字符级攻击能减少语义变化?
- 减少语义变化的核心策略(无需全靠试错)
-
- [1. **基于语言学规则的定向修改**](#1. 基于语言学规则的定向修改)
- [2. **基于模型梯度的敏感位置定位**](#2. 基于模型梯度的敏感位置定位)
- [3. **约束条件控制修改幅度**](#3. 约束条件控制修改幅度)
- [4. **对抗样本生成框架的自动化优化**](#4. 对抗样本生成框架的自动化优化)
- 试错的辅助作用
- 总结
- use相似度是什么
- np难问题是什么
- 情感分类任务中位置子集大小n是什么
- 字符攻击是替换原本的文字,词元攻击是替换分词之后的吗
- 鲁棒性词识别防御机制是什么
-
- 常见的鲁棒性词识别防御机制
-
- [1. 基于词表验证的过滤机制](#1. 基于词表验证的过滤机制)
- [2. 语义一致性验证机制](#2. 语义一致性验证机制)
- [3. 对抗训练增强机制](#3. 对抗训练增强机制)
- [4. 字符级纠错与归一化机制](#4. 字符级纠错与归一化机制)
- [5. 多模型融合验证机制](#5. 多模型融合验证机制)
- 核心目标与应用场景
- ooru
- 直接在对应位置改变不就好了吗,为什么还要扩张和收缩
- 递归
- 内部最大化问题是什么
实验中使用的Charmer方法是一种高效的字符级对抗攻击方法,旨在通过最小化字符扰动(以Levenshtein距离衡量)生成能使模型误分类的对抗样本,其核心设计、关键步骤、参数设置及实验表现如下:
核心设计目标
Charmer针对字符级对抗攻击中"可能的扰动集合随编辑距离(k)呈指数增长"的问题(推论3.9),通过贪心策略 和缩小搜索空间两种策略,在保证攻击成功率的同时,大幅降低计算复杂度,实现高效生成隐蔽性强的对抗样本(即扰动小、与原句语义相似度高)。
关键步骤与实现细节
1. 候选位置选择(Algorithm 1: get_top_locations)
- 目的:从句子中筛选出最可能影响模型预测的字符位置,缩小扰动范围。
- 方法:对当前句子(S')的每个字符位置,通过插入特殊字符(\xi)(标记可能的编辑位置),生成临时句子(\phi(S'));再通过替换算子尝试单字符扰动,计算每个位置的损失变化(基于Carlini-Wagner损失),最终选取损失变化最大的前(n)个位置作为候选集合(Z)。
- 实验参数:默认(n=20)(平衡攻击成功率与效率),加速版本Charmer-Fast取(n=1)。
2. 扰动生成与筛选(Algorithm 2: Charmer)
- 初始化:将初始对抗句子(S')设为原始句子(S)。
- 迭代扰动 :最多迭代(k)次(最大Levenshtein距离,默认(k=10),长句数据集如AG-News用(k=20)):
- 基于候选位置集合(Z),对每个位置尝试所有可能的字符替换(来自数据集字符集(\Sigma))、插入或删除(通过特殊字符(\xi)实现),生成所有可能的单字符扰动句子。
- 计算每个扰动句子的损失值(Carlini-Wagner损失:(\mathcal{L}(f(S'), y) = \max_{\hat{y} \neq y} f(S')_{\hat{y}} - f(S')_y)),选取损失最大的句子作为新的(S')。
- 终止条件:若(S')导致模型误分类(预测标签≠真实标签(y)),攻击成功并返回(S');否则迭代至(k)次后返回最终结果。
3. 适配大语言模型(LLM)的攻击
- 输入形式:将扰动句子(S')与提示词拼接((S_{P_1} \oplus S' \oplus S_{P_2})),引导LLM输出分类标签(如"积极""消极")。
- 损失计算:复用Carlini-Wagner损失,将模型输出的"下一个token概率"(如(\mathbb{P}(\text{消极} | \text{输入})))作为标签分数,衡量扰动对LLM预测的影响。
实验中的性能表现
-
攻击成功率(ASR):在所有基准数据集(SST-2、MNLI-m、RTE等)上,对BERT、RoBERTa等模型的ASR均超过95%;对LLM(如Llama 2-Chat 7B),即使是加速版本Charmer-Fast,ASR仍显著优于现有方法。
-
扰动隐蔽性:
- Levenshtein距离:平均仅需3-5次字符编辑(远低于其他字符级方法如TextBugger的8-10次)。
- 句子相似度:与原句的语义相似度(如BERTScore)最高或次高,扰动对人类可读性影响极小。
-
效率:通过缩小候选位置((n=20)),计算成本仅为遍历所有位置的1/5-1/10,Charmer-Fast((n=1))效率更高,适合大规模应用。
-
对抗防御的突破能力:能轻易绕过基于拼写校正器的防御(如Pruthi et al., 2019),即使防御仅放松一项约束(如允许扰动词首),ASR也从0.96%飙升至98.09%。
与其他方法的核心区别
- 相比token级攻击(如TextFooler):Charmer直接扰动字符,无需依赖预训练分词器,适用范围更广(尤其对小语种或未分词语言),且扰动更隐蔽。
- 相比其他字符级攻击(如DeepWordBug):通过贪心策略聚焦高影响位置,避免盲目遍历所有可能扰动,攻击效率和成功率均显著提升。
综上,Charmer在实验中展现了"高成功率、低扰动、高效率"的特点,验证了其作为字符级对抗攻击方法的优越性。
词元级别的攻击为什么是基于梯度的方法
要是因为基于梯度的方法能够利用模型的可微性,通过计算损失函数关于输入词元的梯度,高效地找到对模型决策最敏感的词元,并确定最优的扰动方向,从而生成对抗样本以达到攻击目的。
-
利用模型可微性与梯度信息:在自然语言处理中,模型通常是基于神经网络的,其在计算过程中是可微的。基于梯度的方法可以利用这一特性,通过计算损失函数关于输入词元嵌入(token embeddings)的梯度,来确定如何修改词元能够最大化模型的损失,从而生成对抗样本。例如,在图像领域,对抗性攻击可以通过梯度上升算法最大化模型损失函数来生成对抗样本,而在 NLP 领域,也可以运用梯度在词元嵌入上进行类似的操作,将对抗样本的搜索问题转换到连续可微的嵌入空间。
-
高效搜索最优扰动:基于梯度的方法能够为词元级别的攻击提供明确的优化方向。攻击者可以根据梯度的方向和大小,在词汇表中寻找最优的候选词元进行替换,以达到扰动模型输出的目的。如 GCG 攻击方法,在每次迭代中,对于后缀中的每个词元位置,计算用词汇表中其他词元替换当前词元后损失函数的近似梯度,然后选择能使损失下降最快的一批候选词元,再从中随机选择一个进行替换,通过这种方式高效地找到了能有效触发模型产生有害行为的输入。
-
处理离散数据的优化:虽然文本数据是离散的,但基于梯度的方法可以通过一些技巧来处理这一问题。例如,Facebook 提出的基于梯度的对抗攻击方法,将对抗攻击视为从对抗分布中进行采样,而不是直接扰动每个离散的输入词元,通过使用 Gumbel - Softmax 技巧来近似梯度,使得可以用梯度下降的方法来优化对抗分布,同时还可以添加软约束来保持文本的流畅性或语义相似性,从而在词元级别实现有效的攻击。
-
精准定位关键词元:梯度能够反映出每个词元对模型输出结果的影响程度,基于梯度的攻击方法可以据此精准定位到对模型决策最为关键的词元。然后,通过对这些关键词元进行微小但有效的扰动,就有可能改变模型的输出,达到攻击的效果。比如 HotFlip 方法基于单词中字符的原子翻转操作,通过计算梯度来确定字符的翻转方向,以生成对抗样本,这种方式能够在最小限度改变原样本的情况下,达到攻击模型的目的。
损失函数关于输入词元嵌入(token embeddings)的梯度是怎么计算的
损失函数关于输入词元嵌入(token embeddings)的梯度计算,本质上是通过神经网络的反向传播(backpropagation) 机制,利用链式法则逐层求解偏导数的过程。在自然语言处理(NLP)模型中,这一过程需要结合模型的结构(如嵌入层、Transformer层、输出层等)逐步推导,最终得到损失对每个词元嵌入的梯度。
核心背景:模型结构与梯度计算的前提
在NLP模型(如BERT、GPT等)中,输入文本会先被拆分为词元(tokens),每个词元通过嵌入层(embedding layer) 映射为固定维度的连续向量(即词元嵌入,记为 ( \mathbf{e}_i ),其中 ( i ) 表示第 ( i ) 个词元)。这些嵌入向量会作为后续网络层(如自注意力层、前馈网络等)的输入,经过一系列变换后得到模型输出(如分类概率、下一个词元的预测分布等),再通过输出与标签的差异计算损失函数(loss function,记为 ( \mathcal{L} ))。
梯度 ( \frac{\partial \mathcal{L}}{\partial \mathbf{e}_i} ) 表示"损失函数对第 ( i ) 个词元嵌入的敏感程度"------梯度的方向指示了如何调整 ( \mathbf{e}_i ) 能使损失增大(攻击场景)或减小(训练场景),梯度的大小则表示敏感程度的强弱。
具体计算步骤
损失函数关于词元嵌入的梯度计算,遵循"前向传播→计算损失→反向传播"的流程,核心是通过链式法则逐层传递梯度。以下是简化的分步说明:
1. 前向传播:从词元嵌入到模型输出
假设模型的计算过程可以表示为一系列函数的复合:
( \text{输出} = f_N(f_{N-1}(\dots f_1(\mathbf{e}_1, \mathbf{e}_2, \dots, \mathbf{e}_T) \dots)) )
其中:
- ( T ) 是输入序列的词元数量,( \mathbf{e}_1, \dots, \mathbf{e}_T ) 是词元嵌入向量;
- ( f_1 ) 可能是嵌入层后的第一个处理层(如位置编码层),( f_2 ) 可能是Transformer的自注意力层,( f_N ) 是输出层(如分类层);
- 最终输出会与标签(如真实类别)计算损失 ( \mathcal{L} )。
2. 反向传播:从损失到词元嵌入的梯度传递
梯度计算从损失函数 ( \mathcal{L} ) 开始,通过链式法则反向逐层计算每个网络层的梯度,最终传递到词元嵌入 ( \mathbf{e}_i )。
(1)输出层的梯度计算
首先计算损失对模型输出层输出 的梯度。例如,若任务是分类,输出层通常是softmax函数,输出为类别概率分布 ( \mathbf{y} = [y_1, y_2, \dots, y_C] )(( C ) 是类别数),损失函数可能是交叉熵损失:
( \mathcal{L} = -\sum_{c=1}^C \hat{y}_c \log(y_c) )(其中 ( \hat{y}_c ) 是真实标签的独热编码)。
此时,损失对输出层输出的梯度为:
( \frac{\partial \mathcal{L}}{\partial \mathbf{y}} = [\frac{\partial \mathcal{L}}{\partial y_1}, \dots, \frac{\partial \mathcal{L}}{\partial y_C}] ),其值可直接通过交叉熵损失的导数公式计算(例如,对于正确类别 ( c^* ),梯度分量为 ( y_{c^*} - 1 ),其他类别为 ( y_c ))。
(2)中间层的梯度传递
接下来,将梯度从输出层反向传递到前一层(如Transformer的前馈网络、自注意力层等)。每一层的梯度计算都依赖于该层的函数形式 和后一层传递过来的梯度。
以一个简化的中间层 ( f_k ) 为例:设该层的输入为 ( \mathbf{x} ),输出为 ( \mathbf{z} = f_k(\mathbf{x}) )。若已知后一层传递来的梯度为 ( \frac{\partial \mathcal{L}}{\partial \mathbf{z}} ),则该层输入的梯度为:
( \frac{\partial \mathcal{L}}{\partial \mathbf{x}} = \left( \frac{\partial \mathbf{z}}{\partial \mathbf{x}} \right)^T \cdot \frac{\partial \mathcal{L}}{\partial \mathbf{z}} )
其中 ( \frac{\partial \mathbf{z}}{\partial \mathbf{x}} ) 是该层的Jacobian矩阵(输出对输入的偏导数矩阵),转置后与后一层梯度进行矩阵乘法,得到当前层输入的梯度。
在Transformer等复杂模型中,中间层包含自注意力机制、残差连接和层归一化等组件,梯度计算需分别处理:
- 自注意力层:需计算查询(Q)、键(K)、值(V)对输入的梯度,以及注意力权重对Q/K/V的梯度;
- 残差连接:梯度会直接"累加"(因为 ( \mathbf{z} = \mathbf{x} + f(\mathbf{x}) ),故 ( \frac{\partial \mathcal{L}}{\partial \mathbf{x}} = \frac{\partial \mathcal{L}}{\partial \mathbf{z}} + \frac{\partial \mathcal{L}}{\partial \mathbf{z}} \cdot \frac{\partial f(\mathbf{x})}{\partial \mathbf{x}} ));
- 层归一化:需考虑缩放和偏移参数对梯度的影响。
(3)最终传递到词元嵌入的梯度
当梯度反向传播到嵌入层 时,即可得到损失对每个词元嵌入的梯度。假设嵌入层的输出就是词元嵌入向量 ( \mathbf{e}_1, \dots, \mathbf{e}_T )(忽略位置编码等细节,或已将其纳入前向传播),则经过中间层梯度的逐层传递后,最终得到:
( \frac{\partial \mathcal{L}}{\partial \mathbf{e}_i} )(( i = 1, 2, \dots, T ))
这一梯度向量的每个维度,都表示"该维度的词元嵌入变化对损失的影响程度"。
关键特点:处理离散与连续的衔接
需要注意的是,词元本身是离散的(如"猫""狗"等具体词汇),但词元嵌入是连续的向量。在攻击场景中,我们无法直接修改连续的嵌入向量(因为输入必须是词汇表中的离散词元),但梯度 ( \frac{\partial \mathcal{L}}{\partial \mathbf{e}_i} ) 为我们提供了方向指引:通过寻找词汇表中与"当前词元嵌入 + 梯度方向"最接近的词元(即替换词元),来近似实现"增大损失"的目的(这也是基于梯度的词元级攻击的核心逻辑)。
总结
损失函数关于词元嵌入的梯度计算,是通过反向传播和链式法则,从损失函数出发,逐层求解各网络层的梯度,最终传递到嵌入层的过程。这一梯度反映了词元嵌入的微小变化对损失的影响,为词元级别的对抗攻击提供了"如何修改词元才能最有效干扰模型"的量化依据。
那字符级别的攻击不会轻易改变语义是需要自己试出来的吗
字符级别的攻击(如替换、插入、删除个别字符)要实现"不轻易改变语义",并非完全依赖人工试错,而是可以通过算法设计和约束条件来系统性地减少语义偏差,同时结合一定的验证机制(而非盲目尝试)。其核心逻辑是利用语言的容错性(如拼写错误不影响理解)和模型的脆弱性,通过定向修改实现攻击目标,同时控制语义变化。
为什么字符级攻击能减少语义变化?
字符级攻击的修改粒度是单个字符(如将"apple"改为"appla","银行"改为"银衍"),由于修改幅度小,人类通常能通过上下文推断原意,因此天然具备"语义保留"的潜力。但要让这种潜力稳定实现,需要算法层面的设计,而非单纯试错。
减少语义变化的核心策略(无需全靠试错)
字符级攻击通过以下方式主动控制语义变化,而非盲目尝试:
1. 基于语言学规则的定向修改
算法会优先选择对语义影响极小的字符位置或类型进行修改,利用语言的冗余性和容错性:
- 非关键词位置:避开句子的核心成分(如动词、名词核心词),选择修饰词、虚词或冗余字符(如"的""了""s""ed"等)。例如,将"我明天去学校"改为"我明兲去学校"(替换"天"为"兲"),核心语义未变。
- 形近字/音近字替换:利用视觉或听觉相似的字符(如"己/已/巳""辩/辨""0/o""l/1"),这些替换在人类阅读时易被忽略,但可能干扰模型的字符级特征提取。
- 拼写容错区域:在英语等语言中,对词尾(如"ing""ed")或不影响发音的字符(如"colour"→"colur")进行修改,人类可通过上下文补全语义,而模型可能因字符匹配错误被干扰。
2. 基于模型梯度的敏感位置定位
与词元级攻击类似,字符级攻击也可利用模型的梯度信息,找到模型敏感但人类语义不敏感的字符,从而定向修改:
- 通过计算损失函数关于字符嵌入(或字符级特征)的梯度,定位那些"微小修改就能显著影响模型输出"的字符位置(这些位置往往不是人类理解语义的关键)。
- 例如,某模型对"转账金额"中的数字字符特别敏感,梯度会指示"修改数字后的某个字符(如'5000'→'500o')能让模型误判",而人类仍能理解金额为5000。
3. 约束条件控制修改幅度
算法会通过约束条件限制修改强度,避免语义偏移:
- 编辑距离约束:限制修改的字符数量(如最多改1 - 2个字符),确保文本整体结构不变。例如,"今天天气很好"→"今天天气狠好"(仅改"很"为"狠"),语义几乎无变化。
- 语义相似度过滤:通过预训练语言模型(如BERT)计算修改前后文本的语义相似度,过滤掉相似度低于阈值的候选样本。例如,修改后文本与原文本的余弦相似度需大于0.9,确保语义一致。
4. 对抗样本生成框架的自动化优化
主流的字符级攻击方法(如HotFlip、TextFooler的字符级变体)都采用迭代优化框架,而非随机试错:
- 先随机生成少量候选修改(如替换每个字符为形近字),计算其对模型输出的影响和语义变化;
- 保留"攻击效果好且语义变化小"的修改,作为下一轮迭代的基础,逐步逼近"高攻击成功率 + 低语义偏移"的目标。
试错的辅助作用
尽管有上述自动化策略,字符级攻击仍可能存在一定的"试错成分",原因在于:
- 语言的模糊性:某些字符修改的语义影响难以被算法完全量化(如谐音双关词的修改可能意外改变语义);
- 模型差异:不同模型对字符的敏感位置可能不同,需根据具体模型调整修改策略。
因此,实际应用中可能需要对生成的对抗样本进行人工抽样验证(或通过人类标注过滤),但这是"优化环节"而非"核心生成逻辑"。
总结
字符级攻击"不轻易改变语义"的效果,主要依赖算法对语言学规则的利用、模型梯度的定向指导、修改幅度的约束等系统性设计,而非单纯的人工试错。试错更多是辅助验证和微调的手段,核心是通过技术手段在"攻击有效性"和"语义保留"之间找到平衡。
use相似度是什么
USE相似度是指利用通用句子编码器(Universal Sentence Encoder,简称USE)来计算句子之间的语义相似度。
USE是由Google开发的一种预训练模型,它可以将任何长度的自然语言句子转换为一个固定长度的向量,通常是512维。在计算句子相似度时,首先将两个句子分别通过USE模型编码为向量表示,然后再计算这两个向量之间的余弦相似度,以此来衡量句子之间的语义相似程度。例如,对于句子"今天天气真好!"和"天气非常不错",USE会将它们转换为相应的向量,通过计算向量间的余弦相似度,就可以得到这两个句子在语义上的相似程度。
USE相似度在自然语言处理领域有广泛的应用,如文本分类、语义搜索、聊天机器人、问答系统等。它能够捕捉句子的深层次语义信息,而不仅仅是表面的词汇重叠,并且具有计算效率高的特点,适合对实时性要求比较高的场景。
np难问题是什么
NP难问题(NP-hard Problems) 是计算机科学和算法复杂度理论中的一个核心概念,用来描述一类"计算难度极高"的问题。要理解NP难问题,需要先明确几个相关的复杂度类别,再逐步推导其定义和特性。
一、核心复杂度类别铺垫
在复杂度理论中,问题通常根据求解难度被划分为不同类别,最基础的包括:
- P类问题 :存在多项式时间算法的问题("多项式时间"指算法的运行时间与输入规模 ( n ) 的关系可以用 ( n^k ) 表示,如 ( n^2 )、( n^3 ) 等,例如排序问题、最短路径问题)。
- NP类问题 :非确定性多项式时间问题,指"可以在多项式时间内验证解的正确性"的问题(但不一定能在多项式时间内求解)。例如"旅行商问题的某个路径是否小于100公里"可以快速验证,但找到这样的路径可能很难。
简单来说:
- P类问题是"容易解也容易验证"的问题;
- NP类问题是"可能难解难,但解容易验证"的问题。
目前尚未证明 ( P = NP )(即是否所有NP类问题都有多项式时间算法),这是计算机科学中最著名的未解难题之一。
二、NP难问题的定义
NP难问题是指满足以下条件的问题:
- 任何NP类问题 都可以在多项式时间内归约到它("归约"指用该问题的解法来解决其他NP问题,且转换过程高效)。
- 它本身不一定属于NP类(即可能连验证解的正确性都无法在多项式时间内完成)。
这意味着:
- NP难问题至少和所有NP类问题一样难(因为能解决NP难问题,就能解决所有NP问题);
- 若某个NP难问题被证明存在多项式时间算法,则所有NP类问题都有多项式时间算法(即 ( P = NP )),但目前普遍认为这是不可能的。
三、NP难问题的典型例子
现实中许多常见问题都是NP难问题,例如:
- 旅行商问题(TSP):给定多个城市和距离,寻找一条最短的闭合路径,要求每个城市恰好访问一次。
- 子集和问题:给定一组整数和一个目标值,判断是否存在一个子集的和等于目标值。
- 图着色问题:用最少的颜色为图的顶点着色,使相邻顶点颜色不同。
- 布尔可满足性问题(SAT)的推广:如3-SAT(限制每个子句最多3个变量)。
- 背包问题(0-1背包):给定物品的重量和价值,在限定重量内选择物品使总价值最大。
四、NP难问题的特性
- 计算复杂度极高:目前没有已知的多项式时间算法,求解大规模实例时往往需要依赖近似算法、启发式算法(如遗传算法、模拟退火)或指数时间算法(仅适用于小规模输入)。
- 普遍性:许多实际问题(如调度、规划、优化等)本质上都是NP难问题,这也是研究它们的重要原因。
- 与NP完全问题的关系 :
- NP完全问题(NP-complete) 是同时属于"NP类"和"NP难问题"的问题(即满足NP难的条件,且自身属于NP)。
- 因此,NP难问题是一个更广泛的集合,包含NP完全问题和一些比NP问题更难的问题(如某些无法在多项式时间内验证解的问题)。
五、实际意义
由于NP难问题在现实中广泛存在,研究它们的核心意义在于:
- 明确问题的难度边界,避免徒劳地寻找多项式时间算法;
- 设计高效的近似算法或启发式策略,在可接受的时间内得到接近最优的解;
- 推动复杂度理论的发展,深化对计算本质的理解(如 ( P ) 与 ( NP ) 问题的关系)。
总之,NP难问题是一类"难到极致"的计算问题,其存在深刻影响了算法设计和计算机科学的发展。
情感分类任务中位置子集大小n是什么
在情感分类任务中,位置子集大小(n)通常是指在处理文本数据时,选取的与某个特定位置相关的相邻位置的数量总和,它是一个用于控制模型关注文本局部信息范围的超参数。
例如,在基于Transformer的情感分类模型中,对于某个词元,可能会考虑其前后各(n/2)个词元作为其位置子集(假设(n)为偶数),通过这种方式来捕捉该词元周围的上下文信息,以帮助模型更准确地判断情感极性。又如在CNN模型中,卷积核的大小可以类比为位置子集大小(n),它决定了每次卷积操作所覆盖的词元数量,即模型每次处理的文本局部区域的大小。
位置子集大小(n)的设置会影响模型的性能和计算效率。较大的(n)可以让模型获取更广泛的上下文信息,但也会增加计算量和模型的复杂度;较小的(n)则可能导致模型无法充分利用上下文信息,从而影响情感分类的准确性。
字符攻击是替换原本的文字,词元攻击是替换分词之后的吗
字符攻击通常是指替换、插入或删除文本中原本的字符,从而对文本进行细微修改以达到攻击目的,比如将"password"修改为"p@ssword"。
词元攻击一般是针对分词或子词单元进行操作的。在自然语言处理中,文本通常会先被分词或拆分为词元(token),词元攻击就是通过替换、添加或删除这些词元来生成对抗样本,以干扰模型的正常判断。例如,在TEXTFOOLER攻击方法中,会先筛选出对模型预测结果影响最大的关键词,然后从同义词中选出语义最接近且词性相同的词对这些关键词进行替换。不过需要注意的是,词元并不完全等同于传统意义上的分词结果,在一些基于子词分词的模型中,词元可能是更细粒度的子词单位。
鲁棒性词识别防御机制是什么
"鲁棒性词识别防御机制"是指在自然语言处理(NLP)任务中,为增强模型对"词(或词元)的识别稳定性"而设计的防御策略,核心目的是抵御针对词/词元的恶意攻击(如字符级扰动、词元替换等),确保模型在面对被篡改的词时,仍能准确理解其语义或正确分类,避免被误导。
这类机制主要针对两类威胁:
- 字符级攻击:通过替换、插入、删除个别字符(如将"信任"改为"信仟","good"改为"g00d")生成看似相似但可能误导模型的词;
- 词元级攻击:替换或插入语义相近但会改变模型判断的词元(如将"优秀"替换为"尚可"以干扰情感分类)。
常见的鲁棒性词识别防御机制
1. 基于词表验证的过滤机制
通过预设的"合法词表"或"领域词表",对输入文本中的词进行合法性校验,过滤明显异常的扰动词。
- 具体方法 :
- 检查词是否在预定义词表中(如通用词典、行业术语库),若不在词表中,触发二次验证(如判断是否为拼写错误或恶意扰动);
- 对字符级扰动进行"模糊匹配",例如通过编辑距离(如Levenshtein距离)判断异常词与词表中合法词的相似度,若相似度高于阈值(如0.8),则修正为最接近的合法词。
- 示例:输入"信仟"时,通过词表匹配发现与"信任"编辑距离为1,且上下文为"用户对平台的信仟",则修正为"信任"。
2. 语义一致性验证机制
利用预训练语言模型(如BERT、USE)或语义相似度计算工具,验证被修改的词与上下文的语义是否一致,过滤语义冲突的扰动词。
- 具体方法 :
- 对输入词及其上下文进行编码,计算"原词+上下文"与"扰动词+上下文"的语义相似度;
- 若相似度低于预设阈值(如0.7),则判定该词为恶意扰动,拒绝采用或替换为更合理的词。
- 示例:在情感分类任务中,原句为"这部电影非常精彩",若被改为"这部电影非常烂彩",通过BERT计算语义相似度发现显著下降(原句情感为正,扰动句语义混乱),则判定"烂彩"为无效词,恢复或修正为"精彩"。
3. 对抗训练增强机制
通过在模型训练过程中引入"对抗样本"(含被扰动的词),让模型学习识别并抵御常见的词攻击模式,提升自身鲁棒性。
- 具体方法 :
- 生成包含字符级/词元级扰动的对抗样本(如用HotFlip、TextFooler等工具),与正常样本混合作为训练数据;
- 模型在训练中学习区分"真实语义词"和"扰动词",减少对扰动特征的依赖。
- 示例:训练情感分类模型时,加入"这部电影很[糟/遭]糕"("遭"为扰动字符)、"这部电影很[出色/尚可]"("尚可"为扰动词元)等样本,让模型学会忽略无效扰动,聚焦核心语义。
4. 字符级纠错与归一化机制
针对字符级攻击(如谐音替换、形近字替换、特殊符号插入),通过规则或模型进行字符纠错,将扰动词归一化为标准形式。
- 具体方法 :
- 规则层面:建立形近字映射表(如"仟→仟""0→o""l→1")、谐音字对照表(如"鸭梨→压力"),自动替换异常字符;
- 模型层面:使用序列标注模型(如CRF)或预训练语言模型的字符级输出,识别并修正拼写错误或恶意扰动。
- 示例:将"g00d"修正为"good","银衍"修正为"银行","5月天"(被改为"5月兲")修正为"5月天"。
5. 多模型融合验证机制
通过多个独立模型对词的语义进行交叉验证,降低单一模型被特定攻击误导的风险。
- 具体方法 :
- 用不同架构的模型(如CNN、RNN、Transformer)或不同预训练权重的模型,分别对输入词的语义进行判断;
- 若多数模型对某词的判断一致,则接受该结果;若出现显著分歧,则触发人工审核或进一步验证。
- 示例:在垃圾邮件检测中,某词"[推/堆]广"被替换为"堆广",模型A误判为正常,模型B和模型C均判定为异常(语义不通),则综合判定"堆广"为扰动词。
核心目标与应用场景
鲁棒性词识别防御机制的核心是在"保留正常词语义"和"抵御恶意扰动"之间找到平衡,确保模型在复杂攻击下仍能稳定工作。其广泛应用于需要精准词理解的任务,如情感分类、垃圾邮件检测、舆情分析、内容安全审核等。
ooru
这段内容主要围绕字符级对抗攻击(如文中提出的Charmer)的效果及现有防御方案的局限性展开,具体含义如下:
-
攻击效果显著:研究提出的攻击方法在所有测试的TextAttack基准模型(如BERT、RoBERTa等)以及Llama-2、Vicuna等大语言模型中,攻击成功率(ASR)都超过了95%;相比性能第二的攻击方法,最高能提升23个百分点的ASR,说明该攻击方法在字符级扰动上表现极强。
-
现有对抗训练防御存在缺陷:基于对抗训练的防御方案(如Hou等人2023年提出的方法)会降低模型在字符级别的鲁棒性。具体来说,与标准训练的模型相比,采用这类防御的模型,其被字符级攻击成功攻破的概率(ASR)会上升3.32个百分点,意味着这类防御反而让模型在字符级扰动下更脆弱。
-
拼写校正防御的局限性:依赖拼写校正器(如Pruthi等人2019年、Jones等人2020年提出的方法)的防御,只有在攻击者受到严格约束(如不能重复扰动同一单词、不能修改单词首尾字符等)时才有效;但只要放宽其中任何一个约束,攻击成功率就会从极低的0.96%飙升至98.09%,说明这类防御非常脆弱。
-
结论:总体来看,仅通过拼写校正器无法实现模型在字符级别的鲁棒性,字符级对抗攻击的防御仍需更有效的方案。
直接在对应位置改变不就好了吗,为什么还要扩张和收缩
在文中的字符级对抗攻击中,之所以需要扩张((\phi))和收缩((\psi))操作,而非直接在对应位置修改,是为了统一且形式化地表示所有可能的单字符编辑操作(插入、删除、替换),确保攻击的可控性和可分析性。具体原因如下:
-
统一建模三种编辑操作
字符级对抗攻击需要涵盖插入、删除、替换三种基本操作,而直接修改对应位置只能直观表示"替换",难以统一描述"插入"和"删除"。
扩张算子(\phi)通过在原始句子(S)的每个字符前后及首尾插入特殊字符(\xi)(如将"Hello"扩张为"(\perp H \perp e \perp l \perp l \perp o \perp)"),为所有可能的编辑操作(包括在两个字符间插入新字符、删除某个字符)标记出明确的操作位置(i);之后通过替换扩张后句子中位置(i)的字符为(c),再经收缩算子(\psi)去除所有(\xi),即可统一表示插入、删除、替换这三种操作。
例如,要得到"Helo"(从"Hello"删除一个"l"),可通过扩张后修改对应位置的(\xi)实现,最终经收缩得到结果,这比直接修改更便于形式化追踪和约束。
-
量化和约束扰动范围
文中通过Levenshtein距离约束攻击的扰动程度(如(d_{lev}(S, S') \leq 1)),而扩张和收缩操作能明确关联原始句子与对抗样本的扰动关系:扩张后的位置范围([2|S| + 1])对应所有可能的单字符编辑位置,结合收缩操作可确保生成的对抗样本(S')与原始句子的Levenshtein距离严格可控(如为1)。
若直接修改,可能因操作不明确导致扰动范围超出约束(如误增多个编辑步骤),而通过扩张-修改-收缩的流程,能精准控制扰动为"最少单字符编辑",符合Levenshtein距离的定义。
-
便于分析攻击的"不可感知性"
字符级攻击要求生成的对抗样本(S')与原始句子(S)高度相似(即"不可感知"),通过扩张和收缩,可确保扰动仅通过单字符编辑实现,且最终经收缩得到的(S')与(S)的Levenshtein距离极小(如1),从而验证攻击的"不可感知性"是否达标。直接修改可能难以保证这种相似性的严格控制。
综上,扩张和收缩并非多余步骤,而是为了在字符级对抗攻击中统一建模编辑操作、精准控制扰动程度、便于分析攻击特性而设计的形式化框架,让攻击过程更系统、可量化。
递归
这段内容定义了如何通过递归的方式生成字符级对抗攻击中满足特定Levenshtein距离约束的句子集合(\mathcal{S}_k(S, \Gamma))(即与原始句子(S)的Levenshtein距离不超过(k)的所有句子构成的集合),具体含义如下:
-
符号说明:(S)是原始句子,(\Gamma)是字符集,(k)是Levenshtein距离的约束值(表示最多允许(k)次单字符编辑操作);(\phi)是扩张算子(在句子中插入特殊字符(\xi)以标记所有可能的编辑位置),(\psi)是收缩算子(去除所有(\xi),得到扰动后的句子);(\phi(S) \stackrel{i}{\leftarrow} c)表示在扩张后的句子中,将位置(i)的字符替换为(c)((c)可以是(\Gamma)中的字符或(\xi))。
-
递归生成规则:
- 当(k=1)时:(\mathcal{S}_1(S, \Gamma))由所有通过以下操作生成的句子组成------对原始句子(S)进行扩张((\phi(S))),然后在扩张后句子的所有可能位置(i)((i)的范围是([2|S| + 1]),与原始句子长度相关)替换为任意字符(c)((c)属于(\Gamma)或(\xi)),最后通过收缩算子(\psi)处理得到的句子。这意味着(\mathcal{S}_1(S, \Gamma))包含了所有与(S)的Levenshtein距离为1的句子。
- 当(k>1)时:(\mathcal{S}k(S, \Gamma))由所有通过以下操作生成的句子组成------对(\mathcal{S}{k-1}(S, \Gamma))(即与(S)的Levenshtein距离不超过(k-1)的句子集合)中的任意句子(\hat{S})进行扩张((\phi(\hat{S}))),然后在扩张后句子的所有可能位置(i)((i)的范围是([2|\hat{S}| + 1]))替换为任意字符(c)((c)属于(\Gamma)或(\xi)),最后通过收缩算子(\psi)处理得到的句子。这表示通过在已有扰动的基础上再进行一次编辑操作,生成距离为(k)的句子集合。
综上,该推论通过递归方式明确了如何构建与原始句子的Levenshtein距离不超过(k)的所有句子,为字符级对抗攻击中扰动范围的界定提供了形式化依据。
这里的内容是关于字符级对抗攻击中,满足Levenshtein距离不超过(k)的对抗性句子集合(\mathcal{S}_{k}(S, \Gamma))的大小范围(即集合中包含的句子数量)的边界约束,具体含义如下:
-
符号说明:(\Gamma)是字符集,(|\Gamma|)表示该字符集包含的字符数量;(k)是Levenshtein距离的约束值(即对抗性句子与原始句子的最大编辑距离);(S)是原始句子,(|S|)为其长度;(\mathcal{S}_{k}(S, \Gamma))是所有与(S)的Levenshtein距离不超过(k)的句子构成的集合。
-
集合大小的下界:(\frac{|\Gamma|^{k+1}-1}{|\Gamma|-1}) 表示(\mathcal{S}_{k}(S, \Gamma))的最小可能大小。这一结果源于将对抗性句子的生成视为从字符集(\Gamma)中选择字符进行最多(k)次编辑操作的组合数,当允许重复使用字符集时,其最小值可通过等比数列求和公式推导得出(当(|\Gamma|=1)时,下界为(k+1))。
-
集合大小的上界:((|\Gamma|+1)^{k} \cdot \prod_{j=1}^{k}(2(|S|+k)-1)) 表示(\mathcal{S}_{k}(S, \Gamma))的最大可能大小。其中,((|\Gamma|+1)^{k})与每次编辑操作的可选方式(插入、删除、替换等)数量相关,而乘积项则与句子长度随编辑操作的增长有关,整体反映了在最宽松的扰动约束下,可能生成的对抗性句子的最大数量。
这一不等式通过数学形式明确了字符级对抗攻击中,生成的对抗性句子集合的规模范围,既体现了扰动的可控性(集合大小有界),也为评估攻击的效率和防御的难度提供了量化依据。
内部最大化问题是什么
在文中"5.3. Adversarial Training"部分,内部最大化问题是指在对抗性训练(Adversarial Training)中,利用攻击方法(如Charmer或TextGrad)生成对抗样本时,使损失函数最大化的过程。
具体来说,对抗性训练的目标可表述为一个极大极小问题,内部最大化负责生成对抗样本,其目标是找到能使模型预测结果与真实标签差异最大的对抗样本,即最大化损失函数。以Carlini-Wagner损失函数为例,对于输入句子(S)和模型(f),通过调整句子中的字符(在字符级攻击中),寻找能使(\mathcal{L}(f(S'), y)=max {\hat{y} \neq y} f(S'){\hat{y}}-f(S')_{y})((y)为真实标签,(\hat{y})为非真实标签)最大的对抗样本(S') 🔶1-69。在这个过程中,模型会评估不同扰动下的损失值,不断尝试不同的单字符扰动(如Charmer方法中在预选定的位置集合中进行字符替换、插入或删除操作),以找到能最大程度误导模型的对抗样本,从而实现损失的最大化。
通过解决内部最大化问题生成的对抗样本,会用于外部最小化,即通过最小化这些对抗样本的损失来更新模型参数,使模型对对抗攻击更具鲁棒性。