
Dokumentasi • Fitur & Penggunaan • Contoh Penggunaan • Model Serangan • Desain Toolkit
OpenAttack adalah toolkit serangan permusuhan tekstual berbasis Python open-source, yang menangani seluruh proses serangan permusuhan tekstual, termasuk teks preprocessing, mengakses model korban, menghasilkan contoh dan evaluasi permusuhan.
️ Dukungan untuk semua jenis serangan . OpenAttack mendukung semua jenis serangan termasuk perturbasi level kalimat-/kata/karakter dan gradien-/skor-/model serangan berbasis keputusan/buta;
️ Multilingalitas . OpenAttack mendukung bahasa Inggris dan Cina sekarang. Desainnya yang dapat diperluas memungkinkan dukungan cepat untuk lebih banyak bahasa;
️ pemrosesan paralel . OpenAttack memberikan dukungan untuk multi-proses menjalankan model serangan untuk meningkatkan efisiensi serangan;
️ Kompatibilitas dengan? Wajah memeluk . OpenAttack sepenuhnya terintegrasi dengan? Perpustakaan Transformers dan Dataset;
️ ekstensibilitas yang hebat . Anda dapat dengan mudah menyerang model korban yang disesuaikan pada dataset yang disesuaikan atau mengembangkan dan mengevaluasi model serangan yang disesuaikan.
✅ Menyediakan berbagai baseline praktis untuk model serangan;
✅ Mengevaluasi model serangan secara komprehensif menggunakan metrik evaluasi menyeluruhnya;
✅ Membantu dalam pengembangan cepat model serangan baru dengan bantuan komponen serangan umum;
✅ Mengevaluasi ketahanan model pembelajaran mesin terhadap berbagai serangan permusuhan;
✅ Melakukan pelatihan permusuhan untuk meningkatkan ketahanan model pembelajaran mesin dengan memperkaya data pelatihan dengan contoh -contoh permusuhan yang dihasilkan.
pip (Direkomendasikan) pip install OpenAttackgit clone https://github.com/thunlp/OpenAttack.git
cd OpenAttack
python setup.py install Setelah instalasi, Anda dapat mencoba menjalankan demo.py untuk memeriksa apakah OpenAttack berfungsi dengan baik:
python demo.py

OpenAttack dibangun dalam beberapa model NLP yang umum digunakan seperti Bert (Devlin et al. 2018) dan Roberta (Liu et al. 2019) yang telah disesuaikan dengan beberapa set data yang umum digunakan (seperti SST-2). Anda dapat dengan mudah melakukan serangan permusuhan terhadap model-model korban bawaan ini.
Cuplikan kode berikut menunjukkan cara menggunakan PWWS, model serangan berbasis algoritma serakah (Ren et al., 2019), untuk menyerang Bert pada dataset SST-2 (kode yang dapat dieksekusi lengkap ada di sini).
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 )Cuplikan kode berikut menunjukkan cara menggunakan PWWS untuk menyerang model analisis sentimen yang disesuaikan (model statistik yang dibangun di NLTK) pada SST-2 (kode yang dapat dieksekusi lengkap ada di sini).
import OpenAttack as oa
import numpy as np
import datasets
import nltk
from nltk . sentiment . vader import SentimentIntensityAnalyzer
# configure access interface of the customized victim model by extending OpenAttack.Classifier.
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 )
def dataset_mapping ( x ):
return {
"x" : x [ "sentence" ],
"y" : 1 if x [ "label" ] > 0.5 else 0 ,
}
# load some examples of SST-2 for evaluation
dataset = datasets . load_dataset ( "sst" , split = "train[:20]" ). map ( function = dataset_mapping )
# choose the costomized classifier as the victim model
victim = MyClassifier ()
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa . attackers . PWWSAttacker ()
# prepare for attacking
attack_eval = oa . AttackEval ( attacker , victim )
# launch attacks and print attack results
attack_eval . eval ( dataset , visualize = True )Cuplikan kode berikut menunjukkan cara menggunakan PWWS untuk menyerang model analisis sentimen yang disesuaikan yang ada pada dataset yang disesuaikan (kode yang dapat dieksekusi lengkap ada di sini).
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 )OpenAttack mendukung multiproses yang nyaman untuk mempercepat proses serangan permusuhan. Cuplikan kode berikut menunjukkan cara menggunakan multiprosesing dalam serangan permusuhan dengan genetik (Alzantot et al. 2018), model serangan berbasis algoritma genetika (kode yang dapat dieksekusi lengkap ada di sini).
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 )
# Using multiprocessing simply by specify num_workers
attack_eval . eval ( dataset , visualize = True , num_workers = 4 )OpenAttack sekarang mendukung serangan permusuhan terhadap model korban Inggris dan Cina. Berikut adalah contoh kode melakukan serangan permusuhan terhadap model klasifikasi tinjauan Cina menggunakan PWWS.
OpenAttack menggabungkan banyak komponen praktis yang dapat dengan mudah dirakit menjadi model serangan baru. Di sini memberikan contoh cara merancang model serangan sederhana yang mengocok token dalam kalimat asli.
OpenAttack dapat dengan mudah menghasilkan contoh -contoh permusuhan dengan menyerang contoh dalam set pelatihan, yang dapat ditambahkan ke set data pelatihan asli untuk melatih kembali model korban yang lebih kuat, yaitu pelatihan permusuhan. Di sini memberikan contoh bagaimana melakukan pelatihan permusuhan dengan OpenAttack.
Model klasifikasi pasangan kalimat serangan. Selain model klasifikasi kalimat tunggal, serangan dukungan OpenAttack terhadap model klasifikasi pasangan kalimat. Berikut adalah contoh kode melakukan serangan permusuhan terhadap model NLI dengan OpenAttack.
Metrik evaluasi khusus. OpenAttack mendukung merancang metrik evaluasi serangan permusuhan yang disesuaikan. Di sini memberikan contoh cara menambahkan metrik evaluasi khusus dan menggunakannya untuk mengevaluasi serangan permusuhan.
Menurut tingkat gangguan yang dikenakan pada input asli, model serangan permusuhan tekstual dapat dikategorikan ke dalam model serangan tingkat-tingkat, tingkat kata, tingkat karakter.
Menurut aksesibilitas ke model korban, model serangan permusuhan tekstual dapat dikategorikan menjadi model serangan berbasis gradient , berbasis score , berbasis decision dan blind .
Taadpapers adalah daftar kertas yang merangkum hampir semua makalah tentang serangan dan pertahanan bertambah tekstual. Anda dapat melihat daftar ini untuk menemukan lebih banyak model serangan.
Saat ini OpenAttack mencakup 15 model serangan khas terhadap model klasifikasi teks yang mencakup semua jenis serangan.
Berikut adalah daftar model serangan yang terlibat saat ini.
decision [PDF] [Kode]blind [PDF] [Kode & Data]decision [PDF] [Kode]score [pdf] [kode]score [PDF] [Kode]score [PDF] [Kode]score [PDF] [Kode]score [PDF] [Kode]score [pdf] [kode]gradient [PDF]score gradient [PDF]gradient [PDF] [Kode] [Situs Web]gradient [PDF] [Kode]score [PDF] [Kode & Data]score [PDF] [Kode]Tabel berikut menggambarkan perbandingan model serangan.
| Model | Aksesibilitas | Gangguan | Ide utama |
|---|---|---|---|
| LAUT | Keputusan | Kalimat | Parafrase berbasis aturan |
| Scpn | Buta | Kalimat | Parafrase |
| Gan | Keputusan | Kalimat | Pembuatan teks oleh encoder-decoder |
| TextFooler | Skor | Kata | Substitusi kata yang serakah |
| PWWS | Skor | Kata | Substitusi kata yang serakah |
| Genetik | Skor | Kata | Substitusi kata berbasis algoritma genetika |
| Sememepso | Skor | Kata | Substitusi kata berbasis optimasi partikel berkerumun |
| Bert-serangan | Skor | Kata | Substitusi kata yang rakus |
| Bae | Skor | Kata | Substitusi dan penyisipan kata yang rakus |
| Fd | Gradien | Kata | Substitusi kata berbasis gradien |
| TextBugger | Gradien, skor | Kata+char | Substitusi kata yang serakah dan manipulasi karakter |
| Uat | Gradien | Word, char | Kata atau manipulasi karakter berbasis gradien |
| Hotflip | Gradien | Word, char | Kata atau substitusi karakter berbasis gradien |
| ULAR BERBISA | Buta | Arang | Substitusi karakter yang sama secara visual |
| Deepwordbug | Skor | Arang | Manipulasi karakter serakah |
Mempertimbangkan perbedaan yang signifikan di antara model serangan yang berbeda, kami meninggalkan kebebasan yang cukup besar untuk desain kerangka model serangan, dan lebih fokus pada merampingkan pemrosesan umum penyerang permusuhan dan komponen umum yang digunakan dalam model serangan.
OpenAttack memiliki 7 modul utama:

Harap kutip kertas kami jika Anda menggunakan toolkit ini:
@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}
}
Kami berterima kasih kepada semua kontributor untuk proyek ini. Dan lebih banyak kontribusi sangat disambut.