
Documentación • Características y usos • Ejemplos de uso • Modelos de ataque • Diseño del kit de herramientas
OpenAttack es un kit de herramientas de ataque adversario con adversario basado en Python de código abierto, que maneja todo el proceso de ataque adversario textual, incluido el texto de preprocesamiento, acceder al modelo de víctimas, generar ejemplos y evaluación adversos.
️ Soporte para todos los tipos de ataque . OpenAttack admite todo tipo de ataques, incluidas perturbaciones a nivel de oración/palabra/carácter y modelos de ataque basado en la decisión/puntaje/ciego;
️ Multilingüidad . OpenAttack es compatible con inglés y chino ahora. Su diseño extensible permite un soporte rápido para más idiomas;
️ Procesamiento paralelo . OpenAttack proporciona soporte para la ejecución de modelos de ataque múltiples para mejorar la eficiencia de ataque;
️ Compatibilidad con? Cara abrazada . OpenAttack está completamente integrado con? Bibliotecas de transformadores y conjuntos de datos;
️ Gran extensibilidad . Puede atacar fácilmente un modelo de víctima personalizado en cualquier conjunto de datos personalizado o desarrollar y evaluar un modelo de ataque personalizado.
✅ Proporcionar varias líneas de base prácticas para modelos de ataque;
✅ Evaluación exhaustiva de los modelos de ataque utilizando sus métricas de evaluación exhaustivas;
✅ Asistir en el desarrollo rápido de nuevos modelos de ataque con la ayuda de sus componentes de ataque comunes;
✅ Evaluación de la robustez de un modelo de aprendizaje automático contra varios ataques adversos;
✅ Realización de capacitación adversas para mejorar la robustez de un modelo de aprendizaje automático en enriquecer los datos de capacitación con ejemplos adversos generados.
pip (recomendado) pip install OpenAttackgit clone https://github.com/thunlp/OpenAttack.git
cd OpenAttack
python setup.py install Después de la instalación, puede intentar ejecutar demo.py para verificar si OpenAttack funciona bien:
python demo.py

OpenAttack se desarrolla en algunos modelos PNL de uso común como Bert (Devlin et al. 2018) y Roberta (Liu et al. 2019) que se han ajustado en algunos conjuntos de datos de uso común (como SST-2). Puede realizar ataques adversos sin esfuerzo contra estos modelos de víctimas incorporados.
El siguiente fragmento de código muestra cómo usar PWWS, un modelo de ataque basado en algoritmos codiciosos (Ren et al., 2019), para atacar a Bert en el conjunto de datos SST-2 (el código ejecutable completo está aquí).
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 )El siguiente fragmento de código muestra cómo usar PWWS para atacar un modelo de análisis de sentimientos personalizado (un modelo estadístico integrado en NLTK) en SST-2 (el código ejecutable completo está aquí).
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 )El siguiente fragmento de código muestra cómo usar PWWS para atacar un modelo de análisis de sentimientos ajustado existente en un conjunto de datos personalizado (el código ejecutable completo está aquí).
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 admite un conveniente multiprocesamiento para acelerar el proceso de ataques adversos. El siguiente fragmento de código muestra cómo usar el multiprocesamiento en ataques adversos con genéticos (Alzantot et al. 2018), un modelo de ataque basado en algoritmo genético (el código ejecutable completo está aquí).
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 ahora admite ataques adversos contra modelos de víctimas inglesas y chinas. Aquí hay un código de ejemplo de realización de ataques adversos contra un modelo de clasificación de revisión china utilizando PWWS.
OpenAttack incorpora muchos componentes útiles que se pueden ensamblar fácilmente en nuevos modelos de ataque. Aquí da un ejemplo de cómo diseñar un modelo de ataque simple que baraja las fichas en la oración original.
OpenAttack puede generar fácilmente ejemplos adversos atacando instancias en el conjunto de entrenamiento, que se pueden agregar al conjunto de datos de entrenamiento originales para volver a entrenar un modelo de víctima más sólido, es decir, entrenamiento adversario. Aquí da un ejemplo de cómo realizar entrenamiento adversario con OpenAttack.
Modelos de clasificación de pares de oraciones de ataque. Además de los modelos de clasificación de oraciones individuales, OpenAttack soporta ataques contra modelos de clasificación de pares de oraciones. Aquí hay un código de ejemplo de realización de ataques adversos contra un modelo NLI con OpenAttack.
Métrica de evaluación personalizada. OpenAttack admite el diseño de una métrica de evaluación de ataque adversario personalizado. Aquí ofrece un ejemplo de cómo agregar una métrica de evaluación personalizada y usarla para evaluar los ataques adversos.
De acuerdo con el nivel de perturbaciones impuestas a la entrada original, los modelos de ataque adversario textual se pueden clasificar en modelos de ataque a nivel de oración, a nivel de palabras, a nivel de carácter.
Según la accesibilidad al modelo de víctima, los modelos de ataque adversario textual se pueden clasificar en modelos de ataque a base de decisión basados en gradient , basados en score , basados en decision y blind .
Taadpapers es una lista de documentos que resume casi todos los documentos sobre el ataque y defensa adversos textuales. Puede echar un vistazo a esta lista para encontrar más modelos de ataque.
Actualmente, OpenAttack incluye 15 modelos de ataque típicos contra modelos de clasificación de texto que cubren todos los tipos de ataque.
Aquí está la lista de modelos de ataque actualmente involucrados.
decision [PDF] [Código]blind [PDF] [Código y datos]decision [PDF] [Código]score [PDF] [Código]score [PDF] [Código]score [PDF] [Código]score [PDF] [Código]score [PDF] [Código]score [PDF] [Código]gradient [PDF]score gradient [PDF]gradient [PDF] [Código] [Sitio web]gradient [PDF] [Código]score [PDF] [Código y datos]score [PDF] [Código]La siguiente tabla ilustra la comparación de los modelos de ataque.
| Modelo | Accesibilidad | Perturbación | Idea principal |
|---|---|---|---|
| MAR | Decisión | Oración | Parafrasea basada en reglas |
| SCPN | Ciego | Oración | Paráfrasis |
| Ganancia | Decisión | Oración | Generación de texto por codificador-decodificador |
| Textfooler | Puntaje | Palabra | Sustitución de palabras codiciosas |
| PWWS | Puntaje | Palabra | Sustitución de palabras codiciosas |
| Genético | Puntaje | Palabra | Sustitución de palabras basada en algoritmo genético |
| Sememepso | Puntaje | Palabra | Sustitución de palabras basadas en la optimización del enjambre de partículas |
| Bert-ata | Puntaje | Palabra | Sustitución de palabras contextualizada codiciosa |
| Bae | Puntaje | Palabra | Sustitución e inserción de palabras contextualizadas codiciosas |
| Fd | Gradiente | Palabra | Sustitución de palabras basada en gradiente |
| Cazador de texto | Gradiente, puntaje | Palabra+char | Sustitución de palabras codiciosas y manipulación de personajes |
| Uat | Gradiente | Palabra, char | Manipulación de palabras o personajes basados en gradiente |
| Hotflip | Gradiente | Palabra, char | Sustitución de palabras o carácter basado en gradiente |
| VÍBORA | Ciego | Carbonizarse | Sustitución de carácter visualmente similar |
| Profundo | Puntaje | Carbonizarse | Manipulación de personajes codiciosos |
Teniendo en cuenta las distinciones significativas entre los diferentes modelos de ataque, dejamos una libertad considerable para el diseño del esqueleto de los modelos de ataque y nos centramos más en optimizar el procesamiento general del ataque adversario y los componentes comunes utilizados en los modelos de ataque.
OpenAttack tiene 7 módulos principales:

Cite nuestro documento si usa este kit de herramientas:
@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}
}
Agradecemos a todos los contribuyentes a este proyecto. Y más contribuciones son muy bienvenidas.