Generación de ejemplos adversos para modelos PNL
[Documentación del ataque text en readthedocs]
Acerca de • Configuración • Uso • Diseño
TextAttack es un marco de Python para ataques adversos, aumento de datos y entrenamiento de modelos en PNL.
Si está buscando información sobre la colección de modelos pre-capacitados de TextAttack, es posible que desee la página del zoológico del modelo TextAttack.
Para obtener ayuda y actualizaciones en tiempo real relacionadas con TextAttack, ¡únase a TextAttack Slack!
Hay muchas razones para usar TextAttack:
Debería ejecutar Python 3.6+ para usar este paquete. Una GPU compatible con CUDA es opcional, pero mejorará en gran medida la velocidad del código. TextAttack está disponible a través de PIP:
pip install textattack Una vez que se instala TextAttack, puede ejecutarlo a través de Command -Line ( textattack ... ) o a través del módulo Python ( python -m textattack ... ).
Consejo : TextAttack descarga archivos a
~/.cache/textattack/de forma predeterminada. Esto incluye modelos previos a la aparición, muestras de conjunto de datos y el archivo de configuraciónconfig.yaml. Para cambiar la ruta de caché, establezca la variable de entornoTA_CACHE_DIR. (Por ejemplo:TA_CACHE_DIR=/tmp/ textattack attack ...).
textattack --help Se pueden acceder a las principales características de TextAttack a través del comando textattack . Dos comandos muy comunes son textattack attack <args> , y textattack augment <args> . Puede ver más información sobre todos los comandos usando
textattack --helpo un comando específico que usa, por ejemplo,
textattack attack --help La carpeta examples/ carpeta incluye scripts que muestran un uso común de TextAtack para modelos de entrenamiento, ejecutando ataques y aumentando un archivo CSV.
El sitio web de documentación contiene tutoriales que explican el uso básico de TextAtack, incluida la construcción de una transformación personalizada y una restricción personalizada.
textattack attack --help La forma más fácil de probar un ataque es a través de la interfaz de línea de comandos, textattack attack .
Consejo: Si su máquina tiene varias GPU, puede distribuir el ataque a través de ellas utilizando la opción
--parallel. Para algunos ataques, esto realmente puede ayudar al rendimiento. (Si quieres atacar los modelos Keras en paralelo, consulteexamples/attack/attack_keras_parallel.pyen su lugar)
Aquí hay algunos ejemplos concretos:
TextFooler en Bert capacitado en el conjunto de datos de clasificación de sentimientos MR :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100DeepWordBug en Distilbert entrenado en los pares de preguntas de Quora para el conjunto de datos de identificación de parafraseo :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100Búsqueda de haz con el ancho del haz 4 y la transformación de incrustación de palabras y la función de meta no dirigida en un LSTM :
textattack attack --model lstm-mr --num-examples 20
--search-method beam-search^beam_width=4 --transformation word-swap-embedding
--constraints repeat stopword max-words-perturbed^max_num_words=2 embedding^min_cos_sim=0.8 part-of-speech
--goal-function untargeted-classificationConsejo: en lugar de especificar un conjunto de datos y un número de ejemplos, puede aprobar
--interactivepara atacar muestras ingresadas por el usuario.
textattack attack --recipe [recipe_name] Incluimos recetas de ataques que implementan ataques de la literatura. Puede enumerar las recetas de ataque usando textattack list attack-recipes .
Para ejecutar una receta de ataque: textattack attack --recipe [recipe_name]

| Ataque el nombre de la receta | Función de objetivo | Forzado de restricciones | Transformación | Método de búsqueda | Idea principal |
|---|---|---|---|---|---|
| Ataques a tareas de clasificación, como la clasificación de sentimientos y la implicación: | |||||
a2t | No dirigido {clasificación, implicación} | Porcentaje de palabras perturbadas, la distancia de incrustación de palabras, oración de Distilbert que codifica la similitud del coseno, consistencia de parte del discurso | Predicción de tope enmascarado de incrustación de palabras contradictorias (o) | Codicioso-wir (gradiente) | Desde (["para mejorar el entrenamiento adversario de los modelos de PNL" (Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544)) |
alzantot | No dirigido {clasificación, implicación} | Porcentaje de palabras perturbadas, perplejidad del modelo de idioma, distancia de incrustación de palabras | Swap de incrustación de palabras contradictorias | Algoritmo genético | De (["Generación de ejemplos adversos en lenguaje natural" (Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998))) |
bae | Clasificación no dirigida | Use la similitud de coseno de codificación de oraciones | Predicción de token enmascarado de Bert | Vigilante | Ataque de transformación del modelo de lenguaje enmascarado de Bert de (["BAE: ejemplos adversos basados en Bert para la clasificación de texto" (Garg y Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970). |
bert-attack | Clasificación no dirigida | Utilice la similitud de la codificación del coseno, el número máximo de palabras perturbadas | Predicción de token enmascarado de Bert (con expansión de la subvención) | Vigilante | (["Bert-Attack: Ataque adversario contra Bert usando Bert" (Li et al., 2020)] (https://arxiv.org/abs/2004.09984)) |
checklist | {Clasificación de} no orientada, dirigida} | distancia de la lista de verificación | Contrato, extender y sustituir Entidades de nombre | Vigilante | Pruebas de invariancia implementadas en la lista de verificación. (["Más allá de la precisión: pruebas de comportamiento de modelos PNL con lista de verificación" (Ribeiro et al., 2020)] (https://arxiv.org/abs/2005.04118))) |
clare | No dirigido {clasificación, implicación} | Use la similitud de coseno de codificación de oraciones | Predicción enmascarada de Roberta para el intercambio de tokens, insertar y fusionar | Avaro | ["Perturbación contextualizada para el ataque adversario textual" (Li et al., 2020)] (https://arxiv.org/abs/2009.07502))) |
deepwordbug | {Clasificación de} no orientada, dirigida} | Distancia de edición de Levenshtein | {Inserción de personajes, eliminación de caracteres, intercambio de personajes vecinos, sustitución de personajes} | Vigilante | Greedy Reemplazo-1 Puntuación y ataque de caracteres multi-transformación (["Generación de cajas negras de secuencias de texto adversarias para evadir clasificadores de aprendizaje profundo" (Gao et al., 2018)] (https://arxiv.org/abs/1801.04354) |
faster-alzantot | No dirigido {clasificación, implicación} | Porcentaje de palabras perturbadas, perplejidad del modelo de idioma, distancia de incrustación de palabras | Swap de incrustación de palabras contradictorias | Algoritmo genético | Versión modificada y más rápida de Alzantot et al. Algoritmo genético, de (["robustez certificada a sustituciones de palabras adversas" (Jia et al., 2019)] (https://arxiv.org/abs/1909.00986)))) |
hotflip (intercambio de palabras) | Clasificación no dirigida | Similitud del coseno de incrustación de palabras, coincidencia de parte del discurso, número de palabras perturbadas | Intercambio de palabras basado en gradiente | Búsqueda de haz | (["Flip: Hotflip: White-Box Ejemplos para la clasificación de texto" (Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751)))) |
iga | No dirigido {clasificación, implicación} | Porcentaje de palabras perturbadas, la distancia de incrustación de palabras | Swap de incrustación de palabras contradictorias | Algoritmo genético | Sustitución de palabras de algoritmo genético mejorado (["Ataques y defensas adversas en lenguaje natural en el nivel de palabras (Wang et al., 2019)"] (https://arxiv.org/abs/1909.06723) |
input-reduction | Reducción de entrada | Eliminación de palabras | Vigilante | Ataque codicioso con clasificación de importancia de la palabra, reduciendo la entrada mientras se mantiene la predicción a través de la clasificación de importancia de la palabra (["Las patologías de los modelos neuronales dificultan la interpretación" (Feng et al., 2018)] (https://arxiv.org/pdf/1804.07781.pdf)))) | |
kuleshov | Clasificación no dirigida | Vector de pensamiento Codificación de similitud de coseno, probabilidad de similitud del modelo de lenguaje | Swap de incrustación de palabras contradictorias | Intercambio de palabras codiciosas | (["Ejemplos adversos para problemas de clasificación de lenguaje natural" (Kuleshov et al., 2018)] (https://openreview.net/pdf?id=r1qz3zbaz)))) |
pruthi | Clasificación no dirigida | Longitud mínima de la palabra, número máximo de palabras perturbadas | {Swap de personajes vecinos, deleción de personajes, inserción de personajes, intercambio de personajes basado en el teclado} | Búsqueda codiciosa | Simula errores tipográficos comunes (["Combatir errores ortográficos adversos con un robusto reconocimiento de palabras" (Pruthi et al., 2019)] (https://arxiv.org/abs/1905.11268) |
pso | Clasificación no dirigida | Swap de palabras de Hownet | Optimización del enjambre de partículas | (["Atacamiento adversario textual de nivel de palabra como optimización combinatoria" (Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/)) | |
pwws | Clasificación no dirigida | Swap de sinónimo basado en WordNet | Wir codicioso (prominencia) | Ataque codicioso con clasificación de importancia de la palabra basada en la prominencia de las palabras y las puntuaciones de swap de sinónimo (["Generar ejemplos adversos en lenguaje natural a través de la probabilidad de palabras ponderadas con peso" (Ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/)) | |
textbugger : (Box-Box) | Clasificación no dirigida | Use la similitud de coseno de codificación de oraciones | {Inserción de personajes, eliminación de caracteres, intercambio de personajes vecinos, sustitución de personajes} | Vigilante | ([(["TextBugger: Generación del texto adversario contra aplicaciones del mundo real" (Li et al., 2018)] (https://arxiv.org/abs/1812.05271)). |
textfooler | No dirigido {clasificación, implicación} | Distancia de incrustación de palabras, coincidencia de parte del discurso, use la similitud de coseno de codificación de oraciones | Swap de incrustación de palabras contradictorias | Vigilante | Ataque codicioso con clasificación de importancia de la palabra (["¿Bert es realmente robusto?" (Jin et al., 2019)] (https://arxiv.org/abs/1907.11932))) |
| Ataques a modelos de secuencia a secuencia: | |||||
morpheus | Puntuación mínima de Bleu | Inflexión de palabras | Búsqueda codiciosa | Codicioso para reemplazar las palabras con sus inflexiones con el objetivo de minimizar la puntuación de Bleu (["¡Es el tiempo de morfo! Combatando la discriminación lingüística con perturbaciones de inflexión"] (https://www.aclweb.org/anthology/2020.acl-main.263.pdf) | |
seq2sick : (Black-Box) | Salida no superpuesta | Swap de incrustación de palabras contradictorias | Vigilante | Ataque codicioso con el objetivo de cambiar cada palabra en la traducción de salida. Actualmente implementada como Black-Box con planes de cambiar a White-Box como se hace en el papel (["SEQ2Sick: Evaluación de la robustez de los modelos de secuencia a secuencia con ejemplos adversos" (Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128))))) | |
Aquí hay algunos ejemplos de ataques de prueba de la literatura de la línea de comandos:
TextFooler contra Bert Finuned en SST-2:
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10SEQ2Sick (Black-Box) contra T5 ajustado para la traducción en inglés-alemán:
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment Muchos de los componentes de TextAtack son útiles para el aumento de datos. La clase textattack.Augmenter utiliza una transformación y una lista de restricciones para aumentar los datos. También ofrecemos recetas incorporadas para el aumento de datos:
wordnet aumenta el texto reemplazando las palabras con los sinónimos de WordNetembedding el texto aumentando las palabras con los vecinos en el espacio de incrustación contratado, con una restricción para garantizar que su similitud de coseno sea al menos 0.8charswap aumenta el texto sustituyendo, eliminando, insertando y intercambiando caracteres adyacenteseda aumenta el texto con una combinación de inserciones de palabras, sustituciones y deleciones.checklist aumenta el texto por contracción/extensión y sustituyendo nombres, ubicaciones, números.clare aumenta el texto reemplazando, insertando y fusionando con un modelo de lenguaje enmascarado previamente capacitado.back_trans aumenta el texto mediante el enfoque de transentación.back_transcription aumenta el texto por el enfoque de transcripción posterior. La forma más fácil de usar nuestras herramientas de aumento de datos es con textattack augment <args> . textattack augment toma un archivo CSV de entrada y una columna de texto para aumentar, junto con el número de palabras para cambiar por aumento y el número de aumentos por ejemplo de entrada. Emite un CSV en el mismo formato con todos los ejemplos de aumento correspondientes a las columnas adecuadas.
Por ejemplo, dado lo siguiente como examples.csv :
"text",label
"the rock is destined to be the 21st century's new conan and that he's going to make a splash even greater than arnold schwarzenegger , jean- claud van damme or steven segal.", 1
"the gorgeously elaborate continuation of 'the lord of the rings' trilogy is so huge that a column of words cannot adequately describe co-writer/director peter jackson's expanded vision of j . r . r . tolkien's middle-earth .", 1
"take care of my cat offers a refreshingly different slice of asian cinema .", 1
"a technically well-made suspenser . . . but its abrupt drop in iq points as it races to the finish line proves simply too discouraging to let slide .", 0
"it's a mystery how the movie could be released in this condition .", 0
El comando
textattack augment --input-csv examples.csv --output-csv output.csv --input-column text --recipe embedding --pct-words-to-swap .1 --transformations-per-example 2 --exclude-original Aumentará la columna text alterando el 10% de las palabras de cada ejemplo, generando el doble de aumentos que las entradas originales, y excluiron las entradas originales del CSV de salida. (Todo esto se guardará en augment.csv por defecto).
Consejo: Al igual que los ataques de ejecución de manera interactiva, también puede pasar
--interactivepara aumentar las muestras ingresadas por el usuario para probar rápidamente diferentes recetas de aumento.
Después del aumento, aquí están el contenido de augment.csv :
text,label
"the rock is destined to be the 21st century's newest conan and that he's gonna to make a splashing even stronger than arnold schwarzenegger , jean- claud van damme or steven segal.",1
"the rock is destined to be the 21tk century's novel conan and that he's going to make a splat even greater than arnold schwarzenegger , jean- claud van damme or stevens segal.",1
the gorgeously elaborate continuation of 'the lord of the rings' trilogy is so huge that a column of expression significant adequately describe co-writer/director pedro jackson's expanded vision of j . rs . r . tolkien's middle-earth .,1
the gorgeously elaborate continuation of 'the lordy of the piercings' trilogy is so huge that a column of mots cannot adequately describe co-novelist/director peter jackson's expanded vision of j . r . r . tolkien's middle-earth .,1
take care of my cat offerings a pleasantly several slice of asia cinema .,1
taking care of my cat offers a pleasantly different slice of asiatic kino .,1
a technically good-made suspenser . . . but its abrupt drop in iq points as it races to the finish bloodline proves straightforward too disheartening to let slide .,0
a technically well-made suspenser . . . but its abrupt drop in iq dot as it races to the finish line demonstrates simply too disheartening to leave slide .,0
it's a enigma how the film wo be releases in this condition .,0
it's a enigma how the filmmaking wo be publicized in this condition .,0
La receta de aumento de 'incrustación' utiliza los vecinos de incrustación más cercanos para aumentar los datos.
Además de la interfaz de línea de comandos, puede aumentar el texto dinámicamente importando el Augmenter en su propio código. Todos los objetos Augmenter implementan augment y augment_many para generar aumentos de una cadena o una lista de cadenas. Aquí hay un ejemplo de cómo usar el EmbeddingAugmenter en un script de Python:
> >> from textattack . augmentation import EmbeddingAugmenter
> >> augmenter = EmbeddingAugmenter ()
> >> s = 'What I cannot create, I do not understand.'
> >> augmenter . augment ( s )
[ 'What I notable create, I do not understand.' , 'What I significant create, I do not understand.' , 'What I cannot engender, I do not understand.' , 'What I cannot creating, I do not understand.' , 'What I cannot creations, I do not understand.' , 'What I cannot create, I do not comprehend.' , 'What I cannot create, I do not fathom.' , 'What I cannot create, I do not understanding.' , 'What I cannot create, I do not understands.' , 'What I cannot create, I do not understood.' , 'What I cannot create, I do not realise.' ] También puede crear su propio aumento desde cero importando transformaciones/restricciones de textattack.transformations y textattack.constraints . Aquí hay un ejemplo que genera aumentos de una cadena usando WordSwapRandomCharacterDeletion :
> >> from textattack . transformations import WordSwapRandomCharacterDeletion
> >> from textattack . transformations import CompositeTransformation
> >> from textattack . augmentation import Augmenter
> >> transformation = CompositeTransformation ([ WordSwapRandomCharacterDeletion ()])
> >> augmenter = Augmenter ( transformation = transformation , transformations_per_example = 5 )
> >> s = 'What I cannot create, I do not understand.'
> >> augmenter . augment ( s )
[ 'What I cannot creae, I do not understand.' , 'What I cannot creat, I do not understand.' , 'What I cannot create, I do not nderstand.' , 'What I cannot create, I do nt understand.' , 'Wht I cannot create, I do not understand.' ] Además del aumento del texto regular, puede aumentar las indicaciones y luego generar respuestas a las indicaciones aumentadas utilizando un modelo de lenguaje grande (LLMS). El aumento se realiza utilizando el mismo Augmenter que el anterior. Para generar respuestas, puede usar su propia LLM, un Huggingface LLM o un OpenAI LLM. Aquí hay un ejemplo usando un Huggingface LLM:
> >> from textattack . augmentation import EmbeddingAugmenter
> >> from transformers import AutoModelForSeq2SeqLM , AutoTokenizer
> >> from textattack . llms import HuggingFaceLLMWrapper
> >> from textattack . prompt_augmentation import PromptAugmentationPipeline
> >> augmenter = EmbeddingAugmenter ( transformations_per_example = 3 )
> >> model = AutoModelForSeq2SeqLM . from_pretrained ( "google/flan-t5-small" )
> >> tokenizer = AutoTokenizer . from_pretrained ( "google/flan-t5-small" )
> >> model_wrapper = HuggingFaceLLMWrapper ( model , tokenizer )
> >> pipeline = PromptAugmentationPipeline ( augmenter , model_wrapper )
> >> pipeline ( "Classify the following piece of text as `positive` or `negative`: This movie is great!" )
[( 'Classify the following piece of text as `positive` or `negative`: This film is great!' , [ 'positive' ]), ( 'Classify the following piece of text as `positive` or `negative`: This movie is fabulous!' , [ 'positive' ]), ( 'Classify the following piece of text as `positive` or `negative`: This movie is wonderful!' , [ 'positive' ])]textattack train Nuestro código de entrenamiento modelo está disponible a través de textattack train para ayudarlo a capacitar a LSTM, CNNS y modelos transformers utilizando TextAttack fuera de la caja. Los conjuntos de datos se cargan automáticamente utilizando el paquete datasets .
Entrena nuestro LSTM predeterminado para 50 épocas en el conjunto de datos Yelp Polarity:
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 Tune bert-base en el conjunto de datos CoLA para 5 épocas *:
textattack train --model-name-or-path bert-base-uncased --dataset glue^cola --per-device-train-batch-size 8 --epochs 5textattack peek-dataset Para echar un vistazo más de cerca a un conjunto de datos, use textattack peek-dataset . TextAttack imprimirá algunas estadísticas superficiales sobre las entradas y salidas del conjunto de datos. Por ejemplo,
textattack peek-dataset --dataset-from-huggingface snliMostrará información sobre el conjunto de datos SNLI del paquete NLP.
textattack list Hay muchas piezas en TextAtack, y puede ser difícil realizar un seguimiento de todas ellas. Puede usar textattack list para enumerar los componentes, por ejemplo, modelos previos a la aparición ( textattack list models ) o métodos de búsqueda disponibles ( textattack list search-methods ).
TextAttack es el modelo de Agnóstico! Puede usar TextAttack para analizar cualquier modelo que genere IDS, tensores o cadenas. Para ayudar a los usuarios, TextAttack incluye modelos previamente capacitados para diferentes tareas comunes de PNL. Esto facilita que los usuarios comiencen con TextAttack. También permite una comparación más justa de los ataques de la literatura.
TextAttack también viene incorporado con modelos y conjuntos de datos. Nuestra interfaz de línea de comandos coincidirá automáticamente con el conjunto de datos correcto con el modelo correcto. Incluimos 82 modelos pre-entrenados diferentes (octubre de 2020) para cada una de las nueve tareas de pegamento, así como algunos conjuntos de datos comunes para la clasificación, traducción y resumen.
Una lista de modelos previos a la pretrada y sus precisiones de validación está disponible en TextAttack/Models/ReadMe.md. También puede ver una lista completa de modelos y conjuntos de datos proporcionados a través de textattack attack --help .
Aquí hay un ejemplo del uso de uno de los modelos incorporados (el conjunto de datos SST-2 se carga automáticamente):
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10datasets transformers ¡También proporcionamos soporte incorporado para los modelos y conjuntos de datos previos a transformers del paquete datasets ! Aquí hay un ejemplo de carga y ataque de un modelo y conjunto de datos previamente capacitado:
textattack attack --model-from-huggingface distilbert-base-uncased-finetuned-sst-2-english --dataset-from-huggingface glue^sst2 --recipe deepwordbug --num-examples 10 Puede explorar otros modelos previamente capacitados utilizando el argumento --model-from-huggingface u otros conjuntos de datos cambiando --dataset-from-huggingface .
Puede probar fácilmente un ataque en un modelo local o una muestra de conjunto de datos. Para atacar un modelo previamente capacitado, cree un archivo corto que los carga como model de variables y tokenizer . El tokenizer debe poder transformar las entradas de cadena en listas o tensores de ID utilizando un método llamado encode() . El modelo debe tomar entradas a través del método __call__ .
Para experimentar con un modelo que haya entrenado, puede crear el siguiente archivo y nombrarlo my_model.py :
model = load_your_model_with_custom_code () # replace this line with your model loading code
tokenizer = load_your_tokenizer_with_custom_code () # replace this line with your tokenizer loading code Luego, ejecute un ataque con el argumento --model-from-file my_model.py . El modelo y el tokenizador se cargarán automáticamente.
Cargar un conjunto de datos desde un archivo es muy similar a la carga de un modelo desde un archivo. Un 'conjunto de datos' es cualquier iterable de pares (input, output) . El siguiente ejemplo cargaría un conjunto de datos de clasificación de sentimientos desde el archivo my_dataset.py :
dataset = [( 'Today was....' , 1 ), ( 'This movie is...' , 0 ), ...] Luego puede ejecutar ataques en muestras de este conjunto de datos agregando el argumento --dataset-from-file my_dataset.py .
import textattack
my_dataset = [( "text" , label ),....]
new_dataset = textattack . datasets . Dataset ( my_dataset ) Para permitir el reemplazo de palabras después de que se haya tokenizado una secuencia, incluimos un objeto de texto AttackedText que mantiene una lista de tokens y el texto original, con puntuación. Usamos este objeto a favor de una lista de palabras o simplemente texto sin procesar.
Formulamos un ataque que consta de cuatro componentes: una función de objetivo que determina si el ataque ha tenido éxito, las restricciones que definen qué perturbaciones son válidas, una transformación que genera modificaciones potenciales dada una entrada y un método de búsqueda que atraviesa el espacio de búsqueda de posibles perturbaciones. El ataque intenta perturbar un texto de entrada de tal manera que la salida del modelo cumple la función de objetivo (es decir, que indica si el ataque es exitoso) y la perturbación se adhiere al conjunto de restricciones (por ejemplo, restricción gramatical, restricción de similitud semántica). Se utiliza un método de búsqueda para encontrar una secuencia de transformaciones que produzcan un ejemplo adversario exitoso.
Este diseño modular unifica los métodos de ataque adversario en un sistema, nos permite ensamblar fácilmente los ataques de la literatura mientras reutilizan componentes que se comparten entre los ataques. Proporcionamos implementaciones limpias y legibles de 16 recetas de ataque adversario de la literatura (ver tabla arriba). Por primera vez, estos ataques se pueden comparar, comparar y analizar en un entorno estandarizado.
TextAttack es modelo -agnóstico, lo que significa que puede ejecutar ataques a modelos implementados en cualquier marco de aprendizaje profundo. Los objetos modelo deben poder tomar una cadena (o lista de cadenas) y devolver una salida que pueda procesarse por la función de objetivo. Por ejemplo, los modelos de traducción automática toman una lista de cadenas como entrada y producen una lista de cadenas como salida. Los modelos de clasificación e implicación devuelven una variedad de puntajes. Mientras el modelo del usuario cumpla con esta especificación, el modelo es adecuado para usar con TextAttack.
Una GoalFunction toma como entrada un objeto AttackedText , lo califica y determina si el ataque ha tenido éxito, devolviendo un GoalFunctionResult .
Una Constraint toma como entrada un AttackedText actual, y una lista de AttackedText transformados s. Para cada opción transformada, devuelve un booleano que representa si se cumple la restricción.
Una Transformation toma como entrada un AttackedText y devuelve una lista de posibles AttackedText transformados s. Por ejemplo, una transformación podría devolver todos los reemplazos de sinónimos posibles.
Un SearchMethod toma como entrada una función inicial de la GoalFunctionResult get_transformations AttackedText y devuelve un GoalFunctionResult final. Una búsqueda consiste en llamadas sucesivas para get_transformations hasta que la búsqueda tenga éxito (determinado usando get_goal_results ) o se agota.
Consulte nuestro documento de análisis: Búsqueda de un método de búsqueda: Algoritmos de búsqueda de evaluación comparativa para generar ejemplos adversos en NLP en EMNLP BlackboxNLP.
Como enfatizamos en el artículo anterior, no recomendamos comparar directamente las recetas de ataque fuera de la caja.
Este comentario se debe a que las recetas de ataque en la literatura reciente usaron diferentes formas o umbrales para establecer sus limitaciones. Sin el espacio de restricción mantenido constante, un aumento en la tasa de éxito del ataque podría provenir de un método mejorado de búsqueda o transformación o un espacio de búsqueda menos restrictivo.
Nuestro Github en scripts y resultados de evaluación comparativa: TextAttack-Search-Benchmark GitHub
Ver código de ejemplo: https://github.com/qdata/textattack/blob/master/examples/attack/attack_camembert.py para usar nuestro marco para atacar a French-Bert.
Consulte el cuaderno del tutorial: https://textattack.readthedocs.io/en/latest/2notebook/example_4_camembert.html para usar nuestro marco para atacar a French-Bert.
Ver ReadMe_Zh.MD para nuestro ReadMe en chino
¡Agradecemos sugerencias y contribuciones! Envíe una solicitud de problema o extracción y haremos todo lo posible para responder de manera oportuna. TextAttack se encuentra actualmente en una etapa "alfa" en la que estamos trabajando para mejorar sus capacidades y diseño.
Consulte Contriping.MD para obtener información detallada sobre la contribución.
Si usa TextAttack para su investigación, cite TextAttack: un marco para ataques adversos, aumento de datos y capacitación adversa en PNL.
@inproceedings { morris2020textattack ,
title = { TextAttack: A Framework for Adversarial Attacks, Data Augmentation, and Adversarial Training in NLP } ,
author = { Morris, John and Lifland, Eli and Yoo, Jin Yong and Grigsby, Jake and Jin, Di and Qi, Yanjun } ,
booktitle = { Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations } ,
pages = { 119--126 } ,
year = { 2020 }
}