A Prompting-based Approach for Adversarial Example Generation andRobustness Enhancement

词级生成

现有的词级攻击主要基于从一些预先给定的候选词集中搜索替换词。我们的生成攻击方法会提示PLM在恶意触发文本的影响下修改原始输入中的某些单词。与这些基于搜索的攻击不同,我们的方法不从给定的集合中选择替换,而是在给定的上下文中生成替换。因此,它可以生成更丰富、更流畅的句子。PAT包括两个主要步骤:即时构建和候选生成。

我们提出了一种变体提示构造方法,该方法包含两个主要步骤:屏蔽x中的某些位置以获得x0,以及将x0与恶意触发器连接。为了引导掩码填充过程改变下游模型的预测,应该设计一个触发器,它是包含攻击者恶意目的的附加文本。这种触发器可能与标签有关。给出一个普通示例x,这两个步骤可以简单地写为:

fp(x0, label) 表示将x0与标签相关触发器连接的操作。

对于分类任务,触发器可以是描述目标标签的简单句子。情绪分类任务的fp(x0,标签)的一个可能选择是:

 

对于自然语言推理任务,它旨在学习两个文本(前提x1和假设x2)之间的关系:蕴涵、矛盾或中性。攻击通常在x2上进行。因此,我们只能将屏蔽x2和fp(x’,label)设计为:

 

fp(x',neutral )可以是上图任一

在提示构建之后,我们要求PLM填写提示xp中的空白。在触发和原始上下文的结合作用下,PLM可以用上下文一致的单词填空,使句子保持流畅,但语义嵌入会向触发方向移动。为了避免触发引起的语义倒置,我们使用WordNet的反义词词典[Miller,1995]来防止反义词的产生。在填空之后,我们移除触发器,得到对抗性的示例候选人。攻击过程不需要对受害者模型进行迭代查询。

句子生成

对于句子级攻击,一个自然的想法是在原始输入中插入一系列空格,并要求PLM在恶意触发器的指导下填充这些空格。然而,由于语境的松散约束,连续的空位可能会被语义变化的短语填满。因此,我们的句子级攻击分两步实施。我们首先使用PLM继续写一个句子,或者在原始输入x中插入一个句子。这一步可以被视为一种带有空触发器的提示方法。在得到新的连接文本ex后,我们将这个问题重新表述为单词级攻击。因此,句子级攻击的大纲是:

第一步的目的是在原始文本x中添加一个语义一致、上下文自然的句子。第二步的目的是修改文本ex,从而误导模型的输出。为了添加自然句子,GPT2是一个很好的选择,因为它是一个在大规模语料库上训练的自回归语言模型,并且在给定开始的句子更新方面表现出了很好的性能。一个简单但有效的技巧是用逗号替换输入文本末尾的停止标记,这意味着一个未完成的句子。 

 我们首先生成几个受害者模型的对抗性示例。对于每一个对抗性的例子,我们都mask与原始样本相比发生变化的位置,(改变mask位置)并向其添加一个触发器。我们要求PLM填空,并用交叉熵损失预测对抗实例的原始令牌。图1的第二部分是我们培训方法的示意图。

鲁棒性

 

提高稳健性的一个自然想法是向训练集中添加对抗性示例,并重新训练模型。然而,为大型训练集生成对抗性样本可能非常耗时,即使每个对抗性样本生成只需几秒钟。PLM通常会输出一个句子嵌入,这是下游任务的关键。因此,我们可以微调嵌入空间,使原始输入的嵌入与其对抗性示例更接近。由于在我们的方法中,对抗性示例是从提示中解码的,因此我们省略了解码过程,直接微调提示的嵌入。如图2所示,对于每对原始输入x及其提示符xp,它们的句子嵌入由一个表示为f(x)的LM输出。训练的目的是使两个句子的嵌入更加紧密。可行的损失函数可以是均方误差损失:

我们假设Lo是下游任务使用的原始损失,那么最终的训练损失可以修改为:

 

其中,参数α用于在两种损失之间进行权衡。损失的第一部分是为了保持干净的精度,第二部分是为了提高稳健性。我们的训练方法可以看作是一种对抗性的数据论证,但对抗性的例子隐含在这个过程中。由于我们只需要为每个训练实例添加一个触发器并屏蔽几个位置,因此成本非常低廉。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值