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

支持中文、多进程、兼容HuggingFace——清华OpenAttack文本对抗工具包重量级更新
2021年09月24日 11:46 AI科技评论aitechtalk

AI科技评论报道

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

文本对抗逐渐成为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步:

指定被攻击的受害模型。可以是OpenAttack内置的训好的模型,可以是🤗 Transformers中fine-tune好的模型,也可以是你自己训好的模型。

指定攻击数据集。可以是🤗 Datasets上的数据集,也可以是你自己的数据集。

指定攻击方法。可以从OpenAttack现有的15种经典攻击方法中选择一种,也可以使用你自己设计好的攻击方法。此外在这一步也需要指定语言(英文或中文)。

指定攻击评测指标。你可以从OpenAttack现有的3类(攻击成功率、对抗样本质量、攻击效率)共9种对抗攻击评测指标中自由组合,确定你所用的评测指标,也可以设计自己的评测指标。

进行对抗攻击。你可以在这一步指定进程数来使用多进程提高攻击效率;同时可以选择将评测过程及结果可视化(如图1)或保存到文件中。

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

(1)基本用法

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中选择受害模型

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)指定语言为中文

import OpenAttack as oa

# 首先指定中文受害模型和中文评测数据集

# 在选择攻击方法时设置语言为中文

attacker = oa.attackers.PWWSAttacker(lang="chinese")

(4)使用多进程

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工具包。

财经自媒体联盟

新浪首页 语音播报 相关新闻 返回顶部