跳转到主要内容

Fibber 是用于对文本分类进行对抗攻击的基准测试套件。

项目描述

“DAI-Lab” 来自麻省理工学院数据到AI实验室的开源项目。

PyPI Shield Downloads build

Fibber

Fibber 是一个用于评估不同自然语言释义策略的库,特别是这些策略如何在不改变句子意义的情况下破坏文本分类器。

概览

Fibber是一个用于评估不同自然语言改写策略的库。在这个库中,我们提供了几个内置的改写策略。我们还拥有一个基准框架来评估改写的质量。特别是,我们使用GPT2语言模型来衡量改写文本的意义。我们使用通用句子编码器来评估原文和改写文本之间的语义相似度。我们还在一个原始数据集上训练了一个BERT分类器,并检查改写句子是否会破坏文本分类器。

现在就试试吧!

无论你在自然语言处理和对抗攻击方面有多大的经验,我们都鼓励你尝试这个演示。我们的演示在colab上运行,所以你可以尝试而不需要安装!

这个colab会自动下载一个情感分类器以及所有所需资源。当资源下载完成后,你可以输入自己的句子,并使用Fibber来重写它。你可以阅读重写的句子和重写句子的指标评估。你将看到一些重写的句子与你的输入具有相同的意义,但被分类器误分类。

点击这里启动Colab!

安装

需求

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。请按照tensorflowpytorch的说明进行操作。Fibber需要tensorflow>=2.0.0pytorch>=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
  • 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 (111.3 kB 查看散列值)

上传时间

构建分布

fibber-0.4.0-py2.py3-none-any.whl (100.8 kB 查看散列值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面