
Пакет с открытым исходным кодом для текстовой состязательной атаки.
Документация • Возможности и применение • Примеры использования • Модели атак • Дизайн инструментария
OpenAttack — это инструментарий для текстовых состязательных атак с открытым исходным кодом на Python, который охватывает весь процесс текстовой состязательной атаки, включая предобработку текста, доступ к модели-жертве, генерацию состязательных примеров и оценку.
⭐️ Поддержка всех типов атак. OpenAttack поддерживает все типы атак, включая возмущения на уровне предложений/слов/символов и модели атак на основе градиентов/оценок/решений/слепые;
⭐️ Многоязычность. OpenAttack в настоящее время поддерживает английский и китайский языки. Его расширяемая архитектура позволяет быстро добавить поддержку других языков;
⭐️ Параллельная обработка. OpenAttack обеспечивает поддержку многопроцессорного запуска моделей атак для повышения эффективности атаки;
⭐️ Совместимость с 🤗 Hugging Face. OpenAttack полностью интегрирован с библиотеками 🤗 Transformers и Datasets;
⭐️ Большая расширяемость. Вы можете легко атаковать настраиваемую модель-жертву на любом настраиваемом наборе данных или разработать и оценить настраиваемую модель атаки.
✅ Предоставление различных удобных базовых линий для моделей атак;
✅ Всестороннее оценивание моделей атак с использованием тщательных метрик оценки;
✅ Помощь в быстрой разработке новых моделей атак с помощью общих компонентов атак;
✅ Оценку устойчивости модели машинного обучения к различным состязательным атакам;
✅ Проведение состязательного обучения для повышения устойчивости модели машинного обучения путём обогащения обучающих данных сгенерированными состязательными примерами.
pip (рекомендуется)```bashpip install OpenAttack
#### 2. Клонирование этого репозитория```bash
git clone https://github.com/thunlp/OpenAttack.git
cd OpenAttack
python setup.py install
После установки вы можете попробовать запустить demo.py, чтобы проверить, работает ли OpenAttack корректно:```
python demo.py

## Примеры использования
#### Атака на встроенные модели-жертвы
OpenAttack включает в себя некоторые часто используемые NLP-модели, такие как BERT ([Devlin et al. 2018](https://arxiv.org/abs/1810.04805)) и RoBERTa ([Liu et al. 2019](https://arxiv.org/abs/1907.11692)), которые были дообучены на популярных датасетах (например, [SST-2](https://nlp.stanford.edu/sentiment/treebank.html)). Вы можете без труда проводить состязательные атаки на эти встроенные модели-жертвы.
Следующий фрагмент кода показывает, как использовать PWWS — модель атаки на основе жадного алгоритма ([Ren et al., 2019](https://www.aclweb.org/anthology/P19-1103.pdf)) — для атаки на BERT на датасете SST-2 (полный исполняемый код находится [здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/workflow.py)).```python
import OpenAttack as oa
import datasets # use the Hugging Face's datasets library
# change the SST dataset into 2-class
def dataset_mapping(x):
return {
"x": x["sentence"],
"y": 1 if x["label"] > 0.5 else 0,
}
# choose a trained victim classification model
victim = oa.DataManager.loadVictim("BERT.SST")
# choose 20 examples from SST-2 as the evaluation data
dataset = datasets.load_dataset("sst", split="train[:20]").map(function=dataset_mapping)
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa.attackers.PWWSAttacker()
# prepare for attacking
attack_eval = OpenAttack.AttackEval(attacker, victim)
# launch attacks and print attack results
attack_eval.eval(dataset, visualize=True)
Следующий фрагмент кода показывает, как использовать PWWS для атаки на настроенную модель анализа тональности (статистическую модель, построенную в NLTK) на SST-2 (полный исполняемый код находится здесь).```python import OpenAttack as oa import numpy as np import datasets import nltk from nltk.sentiment.vader import SentimentIntensityAnalyzer
class MyClassifier(oa.Classifier): def init(self): # nltk.sentiment.vader.SentimentIntensityAnalyzer is a traditional sentiment classification model. nltk.download('vader_lexicon') self.model = SentimentIntensityAnalyzer()
def get_pred(self, input_):
return self.get_prob(input_).argmax(axis=1)
# access to the classification probability scores with respect input sentences
def get_prob(self, input_):
ret = []
for sent in input_:
# SentimentIntensityAnalyzer calculates scores of “neg” and “pos” for each instance
res = self.model.polarity_scores(sent)
# we use 𝑠𝑜𝑐𝑟𝑒_𝑝𝑜𝑠 / (𝑠𝑐𝑜𝑟𝑒_𝑛𝑒𝑔 + 𝑠𝑐𝑜𝑟𝑒_𝑝𝑜𝑠) to represent the probability of positive sentiment
# Adding 10^−6 is a trick to avoid dividing by zero.
prob = (res["pos"] + 1e-6) / (res["neg"] + res["pos"] + 2e-6)
ret.append(np.array([1 - prob, prob]))
# The get_prob method finally returns a np.ndarray of shape (len(input_), 2). See Classifier for detail.
return np.array(ret)
OpenAttack предоставляет удобную многопроцессорную обработку для ускорения процесса состязательных атак. Следующий фрагмент кода показывает, как использовать многопроцессорную обработку в состязательных атаках с помощью Genetic (Alzantot et al. 2018), модели атаки на основе генетического алгоритма (полный исполняемый код находится здесь).```python import OpenAttack as oa import datasets
def dataset_mapping(x): return { "x": x["sentence"], "y": 1 if x["label"] > 0.5 else 0, }
victim = oa.loadVictim("BERT.SST") dataset = datasets.load_dataset("sst", split="train[:20]").map(function=dataset_mapping) attacker = oa.attackers.GeneticAttacker() attack_eval = oa.AttackEval(attacker, victim)
attack_eval.eval(dataset, visualize=True, num_workers=4)
</details>
<details>
<summary><strong>Китайская атака</strong></summary>
OpenAttack теперь поддерживает adversarial-атаки на английские и китайские модели-жертвы. [Здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/chinese.py) приведён пример кода для проведения adversarial-атаки на китайскую модель классификации отзывов с использованием PWWS.
</details>
<details>
<summary><strong>Пользовательская модель атаки</strong></summary>
OpenAttack включает множество удобных компонентов, которые можно легко собрать в новые модели атак. [Здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/custom_attacker.py) приведён пример того, как спроектировать простую модель атаки, перемешивающую токены в исходном предложении.
</details>
<details>
<summary><strong>Adversarial-обучение</strong></summary>
OpenAttack может легко генерировать adversarial-примеры, атакуя экземпляры из обучающего набора, которые можно добавить к исходному обучающему набору для переобучения более устойчивой модели-жертвы, т.е. adversarial-обучение. [Здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/adversarial_training.py) приведён пример того, как проводить adversarial-обучение с помощью OpenAttack.
</details>
<details>
<summary><strong>Больше примеров</strong></summary>
- Атака на модели классификации пар предложений. В дополнение к моделям классификации одиночных предложений, OpenAttack поддерживает атаки на модели классификации пар предложений. [Здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/nli_attack.py) приведён пример кода для проведения adversarial-атаки на модель NLI с помощью OpenAttack.
- Пользовательская метрика оценки. OpenAttack поддерживает создание собственной метрики оценки adversarial-атак. [Здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/custom_eval.py) приведён пример того, как добавить пользовательскую метрику оценки и использовать её для оценки adversarial-атак.
</details>
## Модели атак
В зависимости от уровня возмущений, вносимых в исходный ввод, модели текстовых adversarial-атак можно разделить на атаки на уровне предложений, на уровне слов и на уровне символов.
В зависимости от доступности модели-жертвы, модели текстовых adversarial-атак можно разделить на атаки на основе `градиента`, `оценки`, `решения` и `слепые` атаки.
> [TAADPapers](https://github.com/thunlp/TAADpapers) — это список статей, в котором собраны практически все работы, касающиеся текстовых adversarial-атак и защиты. Вы можете ознакомиться с этим списком, чтобы найти больше моделей атак.
В настоящее время OpenAttack включает 15 типичных моделей атак на модели классификации текста, которые покрывают **все** типы атак.
Вот список текущих моделей атак.
- Уровень предложений
- (SEA) **Semantically Equivalent Adversarial Rules for Debugging NLP Models**. *Marco Tulio Ribeiro, Sameer Singh, Carlos Guestrin*. ACL 2018. `decision` [[pdf](https://aclweb.org/anthology/P18-1079)] [[code](https://github.com/marcotcr/sears)]
- (SCPN) **Adversarial Example Generation with Syntactically Controlled Paraphrase Networks**. *Mohit Iyyer, John Wieting, Kevin Gimpel, Luke Zettlemoyer*. NAACL-HLT 2018. `blind` [[pdf](https://www.aclweb.org/anthology/N18-1170)] [[code&data](https://github.com/miyyer/scpn)]
- (GAN) **Generating Natural Adversarial Examples**. *Zhengli Zhao, Dheeru Dua, Sameer Singh*. ICLR 2018. `decision` [[pdf](https://arxiv.org/pdf/1710.11342.pdf)] [[code](https://github.com/zhengliz/natural-adversary)]
- Уровень слов
- (TextFooler) **Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment**. *Di Jin, Zhijing Jin, Joey Tianyi Zhou, Peter Szolovits*. AAAI-20. `score` [[pdf](https://arxiv.org/pdf/1907.11932v4)] [[code](https://github.com/wqj111186/TextFooler)]
- (PWWS) **Generating Natural Language Adversarial Examples through Probability Weighted Word Saliency**. *Shuhuai Ren, Yihe Deng, Kun He, Wanxiang Che*. ACL 2019. `score` [[pdf](https://www.aclweb.org/anthology/P19-1103.pdf)] [[code](https://github.com/JHL-HUST/PWWS/)]
- (Genetic) **Generating Natural Language Adversarial Examples**. *Moustafa Alzantot, Yash Sharma, Ahmed Elgohary, Bo-Jhang Ho, Mani Srivastava, Kai-Wei Chang*. EMNLP 2018. `score` [[pdf](https://www.aclweb.org/anthology/D18-1316)] [[code](https://github.com/nesl/nlp_adversarial_examples)]
- (SememePSO) **Word-level Textual Adversarial Attacking as Combinatorial Optimization**. *Yuan Zang, Fanchao Qi, Chenghao Yang, Zhiyuan Liu, Meng Zhang, Qun Liu and Maosong Sun*. ACL 2020. `score` [[pdf](https://www.aclweb.org/anthology/2020.acl-main.540.pdf)] [[code](https://github.com/thunlp/SememePSO-Attack)]
- (BERT-ATTACK) **BERT-ATTACK: Adversarial Attack Against BERT Using BERT**. *Linyang Li, Ruotian Ma, Qipeng Guo, Xiangyang Xue, Xipeng Qiu*. EMNLP 2020. `score` [[pdf](https://www.aclweb.org/anthology/2020.emnlp-main.500.pdf)] [[code](https://github.com/LinyangLee/BERT-Attack)]
- (BAE) **BAE: BERT-based Adversarial Examples for Text Classification**. *Siddhant Garg, Goutham Ramakrishnan. EMNLP 2020*. `score` [[pdf](https://www.aclweb.org/anthology/2020.emnlp-main.498.pdf)] [[code](https://github.com/QData/TextAttack/blob/master/textattack/attack_recipes/bae_garg_2019.py)]
- (FD) **Crafting Adversarial Input Sequences For Recurrent Neural Networks**. *Nicolas Papernot, Patrick McDaniel, Ananthram Swami, Richard Harang*. MILCOM 2016. `gradient` [[pdf](https://arxiv.org/pdf/1604.08275.pdf)]
- Уровень слов/символов
- (TextBugger) **TEXTBUGGER: Generating Adversarial Text Against Real-world Applications**. *Jinfeng Li, Shouling Ji, Tianyu Du, Bo Li, Ting Wang*. NDSS 2019. `gradient` `score` [[pdf](https://arxiv.org/pdf/1812.05271.pdf)]
- (UAT) **Universal Adversarial Triggers for Attacking and Analyzing NLP.** *Eric Wallace, Shi Feng, Nikhil Kandpal, Matt Gardner, Sameer Singh*. EMNLP-IJCNLP 2019. `gradient` [[pdf](https://arxiv.org/pdf/1908.07125.pdf)] [[code](https://github.com/Eric-Wallace/universal-triggers)] [[website](http://www.ericswallace.com/triggers)]
- (HotFlip) **HotFlip: White-Box Adversarial Examples for Text Classification**. *Javid Ebrahimi, Anyi Rao, Daniel Lowd, Dejing Dou*. ACL 2018. `gradient` [[pdf](https://www.aclweb.org/anthology/P18-2006)] [[code](https://github.com/AnyiRao/WordAdver)]
- Уровень символов
- (VIPER) **Text Processing Like Humans Do: Visually Attacking and Shielding NLP Systems**. *Steffen Eger, Gözde Gül ¸Sahin, Andreas Rücklé, Ji-Ung Lee, Claudia Schulz, Mohsen Mesgar, Krishnkant Swarnkar, Edwin Simpson, Iryna Gurevych*. NAACL-HLT 2019. `score` [[pdf](https://www.aclweb.org/anthology/N19-1165)] [[code&data](https://github.com/UKPLab/naacl2019-like-humans-visual-attacks)]
- (DeepWordBug) **Black-box Generation of Adversarial Text Sequences to Evade Deep Learning Classifiers**. *Ji Gao, Jack Lanchantin, Mary Lou Soffa, Yanjun Qi*. IEEE SPW 2018. `score` [[pdf](https://ieeexplore.ieee.org/document/8424632)] [[code](https://github.com/QData/deepWordBug)]
В следующей таблице показано сравнение моделей атак.
| Модель | Доступность | Возмущение | Основная идея |
| :---------: | :-------------: | :----------: | :-------------------------------------------------- |
| SEA | Решение | Предложение | Перифразирование на основе правил |
| SCPN | Слепая | Предложение | Перифразирование |
| GAN | Решение | Предложение | Генерация текста с помощью кодер-декодер |
| TextFooler | Оценка | Слово | Жадная замена слов |
| PWWS | Оценка | Слово | Жадная замена слов |
| Genetic | Оценка | Слово | Замена слов на основе генетического алгоритма |
| SememePSO | Оценка | Слово | Замена слов на основе роя частиц |
| BERT-ATTACK | Оценка | Слово | Жадная контекстуализированная замена слов |
| BAE | Оценка | Слово | Жадная контекстуализированная замена и вставка слов |
| FD | Градиент | Слово | Замена слов на основе градиента |
| TextBugger | Градиент, Оценка | Слово+Символ | Жадная замена слов и манипуляция символами |
| UAT | Градиент | Слово, Символ | Манипуляция словами или символами на основе градиента |
| HotFlip | Градиент | Слово, Символ | Замена слов или символов на основе градиента |
| VIPER | Слепая | Символ | Замена символов визуально похожими |
| DeepWordBug | Оценка | Символ | Жадная манипуляция символами |
## Дизайн набора инструментов
Учитывая значительные различия между разными моделями атак, мы оставляем значительную свободу для проектирования каркаса моделей атак и больше сосредотачиваемся на упрощении общей обработки adversarial-атак и общих компонентов, используемых в моделях атак.
OpenAttack имеет 7 основных модулей:
<img src="https://assets.kitploit.com/production/public/readmes/4421/3c70579cf4ea406c82bd3bf407eb9c1e1e8b8ffb3b3c4eede4fe2812ff76eebf.png" alt="toolkit_framework" style="zoom:40%;" />
* **TextProcessor**: обработка исходной текстовой последовательности для помощи моделям атак в генерации adversarial-примеров;
* **Victim**: обёртка моделей-жертв;
* **Attacker**: содержит различные модели атак;
* **AttackAssist**: включает различные методы замены слов/символов, используемые в атаках на уровне слов/символов, и некоторые другие компоненты, используемые в атаках на уровне предложений, такие как модель перифразирования;
* **Metric**: предоставляет несколько метрик качества adversarial-примеров, которые могут служить как ограничениями на adversarial-примеры во время атаки, так и оценочными метриками для оценки adversarial-атак;
* **AttackEval**: оценивает текстовые adversarial-атаки с точки зрения эффективности атаки, качества adversarial-примеров и эффективности атаки;
* **DataManager**: управляет всеми данными и сохранёнными моделями, которые используются в других модулях.
## Цитирование
Пожалуйста, цитируйте нашу [статью](https://aclanthology.org/2021.acl-demo.43.pdf), если вы используете этот набор инструментов:```
@inproceedings{zeng2020openattack,
title={{Openattack: An open-source textual adversarial attack toolkit}},
author={Zeng, Guoyang and Qi, Fanchao and Zhou, Qianrui and Zhang, Tingji and Hou, Bairu and Zang, Yuan and Liu, Zhiyuan and Sun, Maosong},
booktitle={Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing: System Demonstrations},
pages={363--371},
year={2021},
url={https://aclanthology.org/2021.acl-demo.43},
doi={10.18653/v1/2021.acl-demo.43}
}
def dataset_mapping(x): return { "x": x["sentence"], "y": 1 if x["label"] > 0.5 else 0, }
dataset = datasets.load_dataset("sst", split="train[:20]").map(function=dataset_mapping)
victim = MyClassifier()
attacker = oa.attackers.PWWSAttacker()
attack_eval = oa.AttackEval(attacker, victim)
attack_eval.eval(dataset, visualize=True)
</details>
<details>
<summary><strong>Пользовательский набор данных</strong></summary>
Следующий фрагмент кода показывает, как использовать PWWS для атаки на существующую тонко настроенную модель анализа тональности на **пользовательском** наборе данных (полный исполняемый код находится [здесь](https://github.com/thunlp/openattack/blob/HEAD/examples/custom_dataset.py)).```python
import OpenAttack as oa
import transformers
import datasets
# load a fine-tuned sentiment analysis model from Transformers (you can also use our fine-tuned Victim.BERT.SST)
tokenizer = transformers.AutoTokenizer.from_pretrained("echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid")
model = transformers.AutoModelForSequenceClassification.from_pretrained("echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid", num_labels=2, output_hidden_states=False)
victim = oa.classifiers.TransformersClassifier(model, tokenizer, model.bert.embeddings.word_embeddings)
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa.attackers.PWWSAttacker()
# create your customized dataset
dataset = datasets.Dataset.from_dict({
"x": [
"I hate this movie.",
"I like this apple."
],
"y": [
0, # 0 for negative
1, # 1 for positive
]
})
# prepare for attacking
attack_eval = oa.AttackEval(attacker, victim, metrics = [oa.metric.EditDistance(), oa.metric.ModificationRate()])
# launch attacks and print attack results
attack_eval.eval(dataset, visualize=True)
Мы благодарим всех участников этого проекта. И новые вклады очень приветствуются.