清华OpenAttack文本对抗工具包重大更新:支持中文、多进程、兼容HuggingFace

2021-09-27 14:36:25 浏览数 (1)

OpenAttack 覆盖了所有类型的攻击,具备相对较好的扩展性。

近日,清华大学自然语言处理实验室(THUNLP)研发的文本对抗攻击工具包 OpenAttack 继相关论文在 ACL-IJCNLP 2021 Demo 发表后迎来大版本更新,不但重构了大量代码,完善了文档,更新增了多语言支持、多进程处理等重要功能。欢迎前往 GitHub 主页下载试用!

  • Github 链接:https://github.com/thunlp/OpenAttack
  • OpenAttack 论文:https://arxiv.org/abs/2009.09191

文本对抗逐渐成为 NLP 研究的热点之一,根据文本对抗论文列表 TAADPapers 的统计,仅 2021 年 ACL 就有 12 篇相关论文发表(含 Findings)。借助 OpenAttack 这样的文本对抗工具包,你可以方便快速地进行文本对抗相关的研究和开发,具体包括:

  • 几行代码复现经典的文本对抗攻击基线模型,大大减少实验时复现基线模型的时间和难度;
  • 基于其提供的全面的对抗攻击评测指标,对自己的攻击模型进行系统地评测;
  • 评测自己的 NLP 模型面对各种类型攻击时的鲁棒性
  • 利用其中包含的常用攻击模型要素(如替换词生成、句子复述),迅速设计和开发新的攻击模型
  • 进行对抗训练以提高模型鲁棒性。

相比于图像领域有一系列对抗攻击工具包(如 CleverHans、Foolbox、ART),文本领域类似的对抗攻击工具包寥寥无几,除 OpenAttack 之外目前仅有 TextAttack 这一个文本对抗攻击工具包。然而 TextAttack 在对抗攻击类型覆盖度、多语言支持等方面有一定的局限性,相比之下 OpenAttack 则弥补了 TextAttack 的不足,并且有一些独特之处。

具体而言,最新版 OpenAttack 有如下几个特点:

  • 攻击类型全覆盖。OpenAttack 是目前唯一支持所有攻击类型的文本对抗攻击工具包,覆盖了所有扰动粒度:字、词、句级别,以及所有的受害模型可见度:gradient-based、score-based、decision-based、blind;
  • 多语言支持。OpenAttack 目前支持英文和中文两种语言的攻击。基于其模块化的文本预处理和攻击流程,它也可以很容易地实现对其他语言的支持;
  • 多进程。OpenAttack 基于 Python 原生的多进程库实现了对抗攻击的多进程执行,大大加快攻击速度;
  • 完全兼容 Hugging Face。最新版的 OpenAttack 完全兼容 Transformers 和 Datasets 库,无需自己训练模型或配置数据集,一行代码即可实现对 Hugging Face 已有模型的攻击;
  • 高可扩展性。除了很多内置的攻击模型以及训练好的受害模型,你可以很容易地对自己的受害模型进行攻击,也可以利用 OpenAttack 提供的各种模块迅速设计开发新的攻击模型,设计新的攻击评测指标。

图 1 OpenAttack 输出对抗攻击结果示例

使用样例

OpenAttack 的使用并不复杂,要执行一次对抗攻击只需如下 5 步:

  1. 指定被攻击的受害模型。可以是 OpenAttack 内置的训好的模型,可以是 Transformers 中 fine-tune 好的模型,也可以是你自己训好的模型。
  2. 指定攻击数据集。可以是 Datasets 上的数据集,也可以是你自己的数据集。
  3. 指定攻击方法。可以从 OpenAttack 现有的 15 种经典攻击方法中选择一种,也可以使用你自己设计好的攻击方法。此外在这一步也需要指定语言(英文或中文)。
  4. 指定攻击评测指标。你可以从 OpenAttack 现有的 3 类(攻击成功率、对抗样本质量、攻击效率)共 9 种对抗攻击评测指标中自由组合,确定你所用的评测指标,也可以设计自己的评测指标。
  5. 进行对抗攻击。你可以在这一步指定进程数来使用多进程提高攻击效率;同时可以选择将评测过程及结果可视化(如图 1)或保存到文件中。

下面给出了几个代码段来演示 OpenAttack 的使用。

(1)基本用法

代码语言:javascript复制
import OpenAttack as oa
import datasets
# 指定在SST-2上训练好的BERT作为受害模型
victim = oa.DataManager.loadVictim("BERT.SST")
# 指定SST-2作为评测数据集 
dataset =  datasets.load_dataset("sst")
# 指定PWWS作为攻击模型并进行初始化
attacker = oa.attackers.PWWSAttacker() 
# 指定默认攻击评测指标
attack_eval = oa.AttackEval(attacker, victim)
# 进行攻击并输出可视化结果(如图1所示) 
attack_eval.eval(dataset, visualize=True)

(2)从 Transformers 中选择受害模型

代码语言:javascript复制
import OpenAttack as oa
import transformers
# 指定在SST-2上训练好的BERT作为受害模型(来自HuggingFace)
model_path = "echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid"
tokenizer = transformers.AutoTokenizer.from_pretrained(model_path)
model = transformers.AutoModelForSequenceClassification.from_pretrained(model_path, num_labels=2, output_hidden_states=False)
victim = oa.classifiers.TransformersClassifier(model, tokenizer, model.bert.embeddings.word_embeddings)

(3)指定语言为中文

代码语言:javascript复制
import OpenAttack as oa
# 首先指定中文受害模型和中文评测数据集
# 在选择攻击方法时设置语言为中文
attacker = oa.attackers.PWWSAttacker(lang="chinese")

(4)使用多进程

代码语言:javascript复制
import OpenAttack as oa
# 只需要在第5步,进行攻击时指定进程数即可(num_workers=4)
attack_eval.eval(dataset, visualize=True, num_workers=4)

OpenAttack 还提供了其他示例代码来演示使用自己的评测数据集、自己设计攻击模型、对抗攻击、攻击句对分类(如 NLI)模型等功能,可以在其项目主页中看到。更详细的关于 OpenAttack 使用的问题可以参考其文档,或在 GitHub 中提出 issue。

图 2 OpenAttack 文档主页

结语

OpenAttack 工具包将会长期维护并保持更新,欢迎大家使用 OpenAttack 作为文本对抗攻击领域学术研究和应用开发的工具。在使用过程中有任何问题或是意见和建议都欢迎提出。也欢迎大家加入,共同开发、完善 OpenAttack 工具包。

机器之心 · 机动组

机动组是机器之心发起的人工智能技术社区,聚焦于学术研究与技术实践主题内容,为社区用户带来技术线上公开课、学术分享、技术实践、走近顶尖实验室等系列内容。机动组也将不定期举办线下学术交流会与组织人才服务、产业技术对接等活动,欢迎所有 AI 领域技术从业者加入。

  • 点击阅读原文,访问机动组官网,观看全部视频内容:
  • 关注机动组服务号,获取每周直播预告。

0 人点赞