Fibber 是用于对文本分类进行对抗攻击的基准测试套件。
项目描述
来自麻省理工学院数据到AI实验室的开源项目。
Fibber
Fibber 是一个用于评估不同自然语言释义策略的库,特别是这些策略如何在不改变句子意义的情况下破坏文本分类器。
概览
Fibber是一个用于评估不同自然语言改写策略的库。在这个库中,我们提供了几个内置的改写策略。我们还拥有一个基准框架来评估改写的质量。特别是,我们使用GPT2语言模型来衡量改写文本的意义。我们使用通用句子编码器来评估原文和改写文本之间的语义相似度。我们还在一个原始数据集上训练了一个BERT分类器,并检查改写句子是否会破坏文本分类器。
现在就试试吧!
无论你在自然语言处理和对抗攻击方面有多大的经验,我们都鼓励你尝试这个演示。我们的演示在colab上运行,所以你可以尝试而不需要安装!
这个colab会自动下载一个情感分类器以及所有所需资源。当资源下载完成后,你可以输入自己的句子,并使用Fibber来重写它。你可以阅读重写的句子和重写句子的指标评估。你将看到一些重写的句子与你的输入具有相同的意义,但被分类器误分类。
安装
需求
fibber已在Python 3.6、3.7和3.8上开发和测试。
此外,尽管不是严格要求,但推荐使用conda来避免与在运行fibber的系统中的其他软件发生冲突。
以下是通过python3.6创建conda环境所需的最低命令:
# First you should install conda.
conda create -n fibber_env python=3.6
然后,您必须执行此命令来激活环境
conda activate fibber_env
然后,您应该安装tensorflow和pytorch。请按照tensorflow和pytorch的说明进行操作。Fibber需要tensorflow>=2.0.0
和pytorch>=1.5.0
。请根据您计算机上的CUDA版本选择合适的tensorflow和pytorch版本。
记得每次开始一个新的控制台工作在fibber时都要执行conda activate fibber_env
!
安装Java请在您的计算机上安装一个Java运行时环境。
从PyPI安装
在创建并激活conda环境后,我们建议使用pip来安装fibber
pip install fibber
这将从PyPI拉取并安装最新稳定版本。
无需安装即可使用
如果您使用此项目进行研究,并想对代码进行修改,您可以通过以下方式安装所有需求
git clone git@github.com:DAI-Lab/fibber.git
cd fibber
pip install --requirement requirement.txt
然后您可以通过以下方式使用fibber
python -m fibber.datasets.download_datasets
python -m fibber.benchmark.benchmark
在这种情况下,您对代码所做的任何修改将立即生效。
从源安装
在激活conda环境后,您可以通过在stable
分支上运行make install
来克隆存储库并从源安装它
git clone git@github.com:DAI-Lab/fibber.git
cd fibber
git checkout stable
make install
快速入门
在本简要教程中,我们将指导您完成一系列步骤,帮助您开始使用fibber。
(1) 安装Fibber
(2) 获取演示数据集和资源。
from fibber.datasets import get_demo_dataset
trainset, testset = get_demo_dataset()
from fibber.resources import download_all
# resources are downloaded to ~/.fibber
download_all()
(3) 创建一个Fibber对象。
from fibber.fibber import Fibber
# args starting with "asrs_" are hyperparameters for the ASRSStrategy.
arg_dict = {
"use_gpu_id": 0,
"gpt2_gpu_id": 0,
"transformer_clf_gpu_id": 0,
"ce_gpu_id": 0,
"strategy_gpu_id": 0,
"asrs_block_size": 3,
"asrs_wpe_weight": 10000,
"asrs_sim_weight": 500,
"asrs_sim_threshold": 0.95,
"asrs_ppl_weight": 5,
"asrs_clf_weight": 3
"asrs_sim_metric": "CESimilarityMetric"
}
# create a fibber object.
# This step may take a while (about 1 hour) on RTX TITAN, and requires 20G of
# GPU memory. If there's not enough GPU memory on your GPU, consider assign use
# gpt2, bert, and strategy to different GPUs.
#
fibber = Fibber(arg_dict, dataset_name="demo", strategy_name="ASRSStrategy",
trainset=trainset, testset=testset, output_dir="exp-demo")
(4) 您也可以要求fibber改写您的句子。
以下命令可以随机将句子改写为5种不同方式。
# Try sentences you like.
# label 0 means negative, and 1 means positive.
fibber.paraphrase(
{"text0": ("The Avengers is a good movie. Although it is 3 hours long, every scene has something to watch."),
"label": 1},
field_name="text0",
n=5)
输出是一个包含(str, list, list)的元组。
# Original Text
'The Avengers is a good movie. Although it is 3 hours long, every scene has something to watch.'
# 5 paraphrase_list
['the avengers is a good movie. even it is 2 hours long, there is not enough to watch.',
'the avengers is a good movie. while it is 3 hours long, it is still very watchable.',
'the avengers is a good movie and although it is 2 ¹⁄₂ hours long, it is never very interesting.',
'avengers is not a good movie. while it is three hours long, it is still something to watch.',
'the avengers is a bad movie. while it is three hours long, it is still something to watch.']
# Evaluation metrics of these 5 paraphrase_list.
{'EditingDistance': 8,
'USESimilarityMetric': 0.9523628950119019,
'GloVeSimilarityMetric': 0.9795315341042675,
'GPT2PerplexityMetric': 1.492070198059082,
'BertClassifier': 0},
{'EditingDistance': 9,
'USESimilarityMetric': 0.9372092485427856,
'GloVeSimilarityMetric': 0.9575780832312993,
'GPT2PerplexityMetric': 0.9813404679298401,
'BertClassifier': 1},
{'EditingDistance': 11,
'USESimilarityMetric': 0.9265919327735901,
'GloVeSimilarityMetric': 0.9710499628056698,
'GPT2PerplexityMetric': 1.325406551361084,
'BertClassifier': 0},
{'EditingDistance': 7,
'USESimilarityMetric': 0.8913971185684204,
'GloVeSimilarityMetric': 0.9800737898362042,
'GPT2PerplexityMetric': 1.2504483461380005,
'BertClassifier': 1},
{'EditingDistance': 8,
'USESimilarityMetric': 0.9124080538749695,
'GloVeSimilarityMetric': 0.9744155151490856,
'GPT2PerplexityMetric': 1.1626977920532227,
'BertClassifier': 0}]
(5) 您可以要求fibber从数据集中随机选择一个句子并对其进行改写。
fibber.paraphrase_a_random_sentence(n=5)
支持策略
在这个版本中,我们实现了三种策略
- IdentityStrategy
- 身份策略将原始文本作为其改写输出。
- 此策略为每个原始文本生成恰好1个改写,无论
--num_paraphrases_per_text
标志如何。
- RandomStrategy
- 随机策略输出原始文本中单词的随机排列。
- TextAttackStrategy
- 我们创建了一个封装器,围绕TextAttack。要使用TextAttack,请先运行
pip install textattack
。
- 我们创建了一个封装器,围绕TextAttack。要使用TextAttack,请先运行
- ASRSStrategy
- 针对ASRS的实现
引用Fibber
如果您使用Fibber,请引用以下作品
- 徐磊,维拉马钱尼。通过句子重写采样器攻击文本分类器。
@article{xu2021attacking,
title={Attacking Text Classifiers via Sentence Rewriting Sampler},
author={Xu, Lei and Veeramachaneni, Kalyan},
journal={arXiv preprint arXiv:2104.08453},
year={2021}
}
接下来是什么?
有关fibber及其所有可能性和功能的更多详细信息,请参阅文档网站。
历史记录
版本 0.4.0 - 2022-06-29
此版本包含以下更新
新功能
- 添加RewriteRollbackStrategy和SAPStrategy。
- 重新设计防御策略API。
- 添加AdvTrainStrategy、SEMStrategy和SAPDStrategy
版本 0.3.1 - 2021-07-20
此版本包含以下更新
新功能
- 将ASRS的种子选项添加为
dynamic_len
,使释义可以有不同的长度。 - 修复
asrs_utils_lm
中的错误。
版本 0.3.0 - 2021-06-05
此版本包含以下更新
新功能
- 将BertSamplingStrategy模型重命名为ASRSStrategy。
- 将ASRS更新为使用交叉编码器作为默认相似性度量。
- 向TextAttackStrategy添加超时功能。
- 更新基准结果。
- 添加论文引用。
版本 0.2.5 - 2021-03-22
此版本是一个紧急错误修复。
- 修复由前一个更新引入的DatasetForBert中的错误。
版本 0.2.4 - 2021-03-03
此版本包含以下更新
新功能
- 改进了对抗训练的doc字符串和文档。
- 添加关于非自回归释义策略的实验代码。
版本 0.2.3 - 2021-02-17
此版本添加了对抗训练的实验代码。
新功能
- 添加默认的对抗调整策略。
- 在分类器中添加API以支持对抗调整。
- 在基准测试中添加参数以支持对抗调整。
版本 0.2.2 - 2021-02-03
此版本修复了错误并添加了单元测试。
新功能
- 添加句子BERT度量及其相应的单元测试。
- 修复colab演示中的错误。
版本 0.2.1 - 2021-01-20
此版本改进了文档和单元测试。
新功能
- 为IdentityStrategy、TextAttackStrategy和BertSamplingStrategy添加完整性测试。
- 对于IdentityStrategy和TextAttackStrategy,验证了准确性。
- 改进文档,将数据格式从基准测试中分离。
版本 0.2.0 - 2021-01-06
此版本更新了项目结构并改进了文档。
新功能
- 度量模块被重新设计,以拥有一致的API。(问题 #12)
- 添加了更多单元测试。在CI中跳过了慢速单元测试。(问题 #11)
- 基准表已更新。(问题 #10)
- 更好地支持
TextAttack
。用户可以使用ta_recipe
参数选择TextAttack
中实现的任何攻击方法。(问题 #9)
版本 0.1.3
此版本包含以下更新
- 添加基准类。用户可以将fibber基准集成到其他项目中。该类支持自定义数据集、目标分类器和攻击方法。
- 从Travis CI迁移到Github Action。
- 将与对抗攻击相关的聚合函数从基准模块移至度量模块。
版本 0.1.2
此次要版本添加了预训练分类器和在演示数据集上的可下载资源,以及一个演示Colab。
版本 0.1.1
此次要版本移除了对textattack
的依赖,因为它会产生依赖冲突。用户可以手动安装它以使用textattack
中的攻击策略。
版本 0.1.0
此版本是Fibber库的重大更新。包括先进的释义算法。
- 添加两个策略:TextFoolerStrategy和BertSamplingStrategy。
- 改进基准测试框架:添加更多专门为对抗攻击设计的度量。
- 数据集:添加AG新闻数据集的变体,
ag_no_title
。 - 错误修复和改进。
版本 0.0.1
这是Fibber库的第一个版本。此版本包含
- 数据集:fibber包含6个内置数据集。
- 指标:fibber 包含 6 个指标来评估改写句子的质量。所有指标都拥有统一的接口。
- 基准框架:基准框架可以轻松地对内置数据集和指标上的改写策略进行评估。
- 策略:本版本包含 2 个基本策略,即身份策略和随机策略。
- 统一的 Fibber 接口:用户可以通过创建 Fibber 对象轻松使用 fibber。
项目详情
下载文件
下载适用于您平台文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
fibber-0.4.0.tar.gz 的散列值
算法 | 散列值 | |
---|---|---|
SHA256 | 8c120a075560c6fb1d1e4261945a978f454769b62b339bee0cc6df76a0bf8819 |
|
MD5 | dea7bf2440c48909bb396969e8b83a9c |
|
BLAKE2b-256 | 1322c6cd4ee1acb96448dd98b6af60110bfa83d9f20c0bf6fab4073ca079a9ba |
fibber-0.4.0-py2.py3-none-any.whl 的散列值
算法 | 散列值 | |
---|---|---|
SHA256 | 6d129b8ded75bacff24da9953de8faa6a9e3c79953162b6df8cc5111ef5ba0cf |
|
MD5 | e17ef87fa867be64025cb29fa81e57a5 |
|
BLAKE2b-256 | aa2b4bd66a9404cefbca9d75e77bf63ce044c2b40cff5a260ff87e7def13090d |