Générer des exemples adversaires pour les modèles NLP
[Documentation TextAttack sur ReadTheDocs]
À propos de • Configuration • Utilisation • Conception
TextAttack est un cadre Python pour les attaques contradictoires, l'augmentation des données et la formation du modèle en PNL.
Si vous recherchez des informations sur les modèles Menagerie de TextAttack, vous voudrez peut-être la page du zoo du modèle TextAttack.
Pour obtenir de l'aide et des mises à jour en temps réel liées à TextAttack, veuillez rejoindre le TextAttack Slack!
Il y a beaucoup de raisons d'utiliser TextAttack:
Vous devriez exécuter Python 3.6+ pour utiliser ce package. Un GPU compatible CUDA est facultatif mais améliorera considérablement la vitesse du code. TextAttack est disponible via PIP:
pip install textattack Une fois TextAttack installé, vous pouvez l'exécuter via la ligne de commande ( textattack ... ) ou via le module Python ( python -m textattack ... ).
Astuce : TextAttack télécharge des fichiers sur
~/.cache/textattack/par défaut. Cela inclut des modèles pré-entraînés, des échantillons de jeu de données et le fichier de configurationconfig.yaml. Pour modifier le chemin du cache, définissez la variable d'environnementTA_CACHE_DIR. (Par exemple:TA_CACHE_DIR=/tmp/ textattack attack ...).
textattack --help Les fonctionnalités principales de TextAttack sont toutes accessibles via la commande textattack . Deux commandes très communes sont textattack attack <args> , et textattack augment <args> . Vous pouvez voir plus d'informations sur toutes les commandes en utilisant
textattack --helpou une commande spécifique en utilisant, par exemple,
textattack attack --help Les examples/ dossiers comprennent des scripts montrant l'utilisation commune de TextAttack pour les modèles de formation, l'exécution des attaques et l'augmentation d'un fichier CSV.
Le site Web de documentation contient des procédures pas à pas expliquant l'utilisation de base de TextAttack, y compris la création d'une transformation personnalisée et une contrainte personnalisée.
textattack attack --help La façon la plus simple d'essayer une attaque est via l'interface de ligne de commande, textattack attack .
Astuce: Si votre machine a plusieurs GPU, vous pouvez distribuer l'attaque à travers eux à l'aide de l'option
--parallel. Pour certaines attaques, cela peut vraiment aider les performances. (Si vous souhaitez attaquer les modèles Keras en parallèle, veuillez consulterexamples/attack/attack_keras_parallel.pyà la place)
Voici quelques exemples de béton:
TextFooler sur Bert formé sur l'ensemble de données de classification du sentiment MR :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100Deepwordbug sur Distilbert formé sur l'ensemble de données d'identification de paraphrase de question Quora :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100Recherche de faisceau avec largeur du faisceau 4 et transformation de l'intégration des mots et fonction d'objectif non ciblé sur 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-classificationAstuce: Au lieu de spécifier un ensemble de données et un nombre d'exemples, vous pouvez passer
--interactivepour attaquer les échantillons entrés par l'utilisateur.
textattack attack --recipe [recipe_name] Nous incluons des recettes d'attaque qui mettent en œuvre des attaques de la littérature. Vous pouvez énumérer les recettes d'attaque à l'aide de textattack list attack-recipes .
Pour exécuter une recette d'attaque: textattack attack --recipe [recipe_name]

| Nom de la recette d'attaque | Fonction d'objectif | Contraintes forcées | Transformation | Méthode de recherche | Idée principale |
|---|---|---|---|---|---|
| Attaques contre les tâches de classification, comme la classification et l'implication des sentiments: | |||||
a2t | Non ciblé {Classification, impliquant} | Pourcentage de mots perturbés, mot d'incorporation de distance, phrase Distilbert codant pour la similitude du cosinus, cohérence d'une partie du discours | Mot à contre-, échange d'intégration de mots (ou) prédiction de jeton masquée Bert | Gourmand-wir (dégradé) | De (["vers l'amélioration de la formation contradictoire des modèles NLP" (Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544))) |
alzantot | Non ciblé {Classification, impliquant} | Pourcentage de mots perturbés, perplexité du modèle de langue, distance de pépins de mots | Échange d'intégration des mots contre-installés | Algorithme génétique | de (["générer des exemples adversaires en langage naturel" (Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998))) |
bae | Classification non ciblée | Utilisez la phrase codant pour la similitude du cosinus | Prédiction de jeton Masked Bert | Gourmand | Bert Masked Language Model Transformation Attack de (["BAE: Exemples adversaires basés sur Bert pour la classification du texte" (Garg & Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970)). |
bert-attack | Classification non ciblée | Utilisez la phrase codant pour la similitude du cosinus, le nombre maximum de mots perturbés | Prédiction de jeton Masked Bert (avec sous-expansion des sous-mots) | Gourmand | (["Bert-Attack: attaque adversaire contre Bert en utilisant Bert" (Li et al., 2020)] (https://arxiv.org/abs/2004.09984)) |
checklist | {Classification non ciblée, ciblée} | Distance de la liste de contrôle | contracter, étendre et substituer les entités nommées | Gourmand | Test d'invariance implémenté dans la liste de contrôle. (["Au-delà de la précision: tests comportementaux des modèles NLP avec liste de contrôle" (Ribeiro et al., 2020)] (https://arxiv.org/abs/2005.04118)) |
clare | Non ciblé {Classification, impliquant} | Utilisez la phrase codant pour la similitude du cosinus | Roberta a masqué la prédiction pour l'échange de jetons, l'insertion et la fusion | Cupide | ["Perturbation contextualisée pour l'attaque contradictoire textuelle" (Li et al., 2020)] (https://arxiv.org/abs/2009.07502)) |
deepwordbug | {Classification non ciblée, ciblée} | LEVENSHTEIN MODIFICATION DANSCE | {Insertion de caractère, suppression de caractère, échange de caractère voisin, substitution de caractère} | Gourmand | Attaque de swap de personnage de la notation et de la transformation multi-transformations ("" Black-Box Generation of Adversarial Text Sequences pour échapper aux classificateurs d'apprentissage en profondeur "(Gao et al., 2018)] (https://arxiv.org/abs/1801.04354) |
faster-alzantot | Non ciblé {Classification, impliquant} | Pourcentage de mots perturbés, perplexité du modèle de langue, distance de pépins de mots | Échange d'intégration des mots contre-installés | Algorithme génétique | Version modifiée et plus rapide d'Alzantot et al. Algorithme génétique, de (["Robustesse certifiée aux substitutions de mots adversaires" (Jia et al., 2019)] (https://arxiv.org/abs/1909.00986))) |
hotflip (swap de mot) | Classification non ciblée | Mot incorporation de la similitude en cosinus, correspondance d'une partie de la disposition, nombre de mots perturbés | Échange de mots basé sur le gradient | Recherche de faisceau | (["Hotflip: Exemples adversaires blancs pour la classification du texte" (Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751)) |
iga | Non ciblé {Classification, impliquant} | Pourcentage de mots perturbés, mot d'incorporation de distance | Échange d'intégration des mots contre-installés | Algorithme génétique | Amélioration de la substitution de mots basés sur l'algorithme génétique de (["Attaques et défenses adversaires du langage naturel au niveau des mots (Wang et al., 2019)"] (https://arxiv.org/abs/1909.06723) |
input-reduction | Réduction des entrées | Suppression des mots | Gourmand | Attaque gourmande avec classement d'importance des mots, réduisant l'entrée tout en conservant le classement de la prédiction par les mots (["les pathologies des modèles neuronaux rendent l'interprétation difficile" (Feng et al., 2018)] (https://arxiv.org/pdf/1804.07781.pdf)) | |
kuleshov | Classification non ciblée | Vector de pensée codant pour la similitude du cosinus, probabilité de similitude du modèle du langage | Échange d'intégration des mots contre-installés | Échange de mots gourmands | (["Exemples adversaires pour les problèmes de classification du langage naturel" (Kuleshov et al., 2018)] (https://openreview.net/pdf?id=r1qz3zbaz)) |
pruthi | Classification non ciblée | Longueur de mot minimum, nombre maximum de mots perturbés | {Échange de caractères voisins, suppression de caractère, insertion de caractère, échange de personnages basé sur le clavier} | Recherche gourmand | Simulate les fautes de frappe courantes (["Combatiation des fautes d'orthographe adversaires avec une reconnaissance de mots robuste" (Pruthi et al., 2019)] (https://arxiv.org/abs/1905.11268) |
pso | Classification non ciblée | Hownet Word Swap | Optimisation de l'essaim de particules | (["Attaque adversaire textuelle au niveau des mots comme optimisation combinatoire" (Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/)) | |
pwws | Classification non ciblée | Swap synonyme basé sur WordNet | Gourmand-wir (saillance) | Attaque gourmand avec un classement d'importance des mots basé sur la saillance des mots et les scores d'échange de synonymes (["Génération d'exemples adversaires en langage naturel grâce à la saillance des mots pondérés de probabilité" (Ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/) | |
textbugger : (Black-Box) | Classification non ciblée | Utilisez la phrase codant pour la similitude du cosinus | {Insertion de caractère, suppression de caractère, échange de caractère voisin, substitution de caractère} | Gourmand | ([[["Textbugger: générer du texte adversaire contre les applications du monde réel" (Li et al., 2018)] (https://arxiv.org/abs/1812.05271)). |
textfooler | Non ciblé {Classification, impliquant} | MOT INCRODIATION DISTANCE, PARTIE DU SUPPORT, UTILISER LE COMPOSITION DE LA SHENTIFICE CHARIALITÉ | Échange d'intégration des mots contre-installés | Gourmand | Attaque gourmande avec le classement d'importance du mot (["Bert est-il vraiment robuste?" (Jin et al., 2019)] (https://arxiv.org/abs/1907.11932))) |
| Attaques contre les modèles de séquence à séquence: | |||||
morpheus | Score de Bleu minimum | Échange de mots d'inflexion | Recherche gourmand | Gourmand pour remplacer les mots par leur inflexion par le but de minimiser le score de BLEU (["c'est le temps de morphin! Combattre la discrimination linguistique avec les perturbations inflexibles"] (https://www.aclweb.org/anthology/2020.acl-main.263.pdf) | |
seq2sick : (Black-Box) | Sortie non chevauchante | Échange d'intégration des mots contre-installés | Gourmand | Attaque gourmande dans le but de changer chaque mot dans la traduction de sortie. Actuellement implémenté comme Black-Box avec des plans pour passer à White-Box, comme le fait dans le papier (["SEQ2SICK: Évaluation de la robustesse des modèles de séquence à séquence avec des exemples adversariens" (Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128))))) | |
Voici quelques exemples de tests d'attaques de la littérature à partir de la ligne de commande:
TextFooler contre Bert a été affiné sur SST-2:
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10SEQ2SICK (BLACK-Box) contre T5 ajusté pour la traduction anglaise-allemande:
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment De nombreux composants de TextAttack sont utiles pour l'augmentation des données. La classe textattack.Augmenter utilise une transformation et une liste de contraintes pour augmenter les données. Nous proposons également des recettes intégrées pour l'augmentation des données:
wordnet augmente le texte en remplaçant les mots par des synonymes WordNetembedding augmente le texte en remplaçant les mots par des voisins dans l'espace d'intégration à contre-ci, par une contrainte pour garantir que leur similitude de cosinus est d'au moins 0,8charswap augmente le texte en substituant, en supprimant, en insérant et en échangeant des caractères adjacentseda augmente le texte avec une combinaison d'insertions de mots, de substitutions et de suppressions.checklist augmente le texte par contraction / extension et en substituant les noms, emplacements, nombres.clare augmente le texte en remplaçant, insérant et fusion avec un modèle de langage masqué pré-formé.back_trans augmente le texte par approche de retour en arrière.back_transcription augmente l'approche de transcription texte par dos. La façon la plus simple d'utiliser nos outils d'augmentation de données est avec textattack augment <args> . textattack augment prend un fichier CSV d'entrée et une colonne de texte à augmenter, ainsi que le nombre de mots à modifier par augmentation et le nombre d'augmentations par exemple d'entrée. Il publie un CSV dans le même format avec tous les exemples d'augmentation correspondant aux colonnes appropriées.
Par exemple, étant donné les examples.csv suivants.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
La commande
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 Augmentera la colonne text en modifiant 10% des mots de chaque exemple, générant deux fois plus d'augmentations que les entrées d'origine, et excluez les entrées d'origine du CSV de sortie. (Tout cela sera enregistré sur augment.csv par défaut.)
Astuce: Tout comme l'exécution des attaques de manière interactive, vous pouvez également passer
--interactivepour augmenter les échantillons entrés par l'utilisateur pour essayer rapidement différentes recettes d'augmentation!
Après l'augmentation, voici le contenu d' 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 recette d'augmentation «d'intégration» utilise l'intégration de NEIGHBORS les plus proches pour augmenter les données.
En plus de l'interface de ligne de commande, vous pouvez augmenter le texte dynamiquement en importation de l' Augmenter dans votre propre code. Tous les objets Augmenter implémentent augment et augment_many pour générer des augmentations d'une chaîne ou une liste de chaînes. Voici un exemple de la façon d'utiliser l' EmbeddingAugmenter dans un script 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.' ] Vous pouvez également créer votre propre augmenteur à partir de zéro en important des transformations / contraintes à partir de textattack.transformations et textattack.constraints . Voici un exemple qui génère des augmentations d'une chaîne à l'aide de 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.' ] En plus de l'augmentation du texte régulier, vous pouvez augmenter les invites, puis générer des réponses aux invites augmentées à l'aide d'un modèle grand langage (LLMS). L'augmentation est effectuée en utilisant le même Augmenter que ci-dessus. Pour générer des réponses, vous pouvez utiliser votre propre LLM, un LLM HuggingFace ou un Openai LLM. Voici un exemple en utilisant un HuggingFace Face LLM pré-entraîné:
> >> 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 Notre code de formation de modèle est disponible via textattack train pour vous aider à former des modèles LSTMS, CNNS et transformers à l'aide de TextAttack à l'extérieur de la boîte. Les ensembles de données sont automatiquement chargés à l'aide du package datasets .
Train notre LSTM par défaut pour 50 époques sur l'ensemble de données de polarité Yelp:
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 Affinez bert-base sur l'ensemble de données CoLA pour 5 époques *:
textattack train --model-name-or-path bert-base-uncased --dataset glue^cola --per-device-train-batch-size 8 --epochs 5textattack peek-dataset Pour examiner de plus près un ensemble de données, utilisez textattack peek-dataset . TextAttack imprimera certaines statistiques superficielles sur les entrées et les sorties de l'ensemble de données. Par exemple,
textattack peek-dataset --dataset-from-huggingface snliAffichera des informations sur l'ensemble de données SNLI à partir du package NLP.
textattack list Il y a beaucoup de pièces dans TextAttack, et il peut être difficile de garder une trace de tous. Vous pouvez utiliser textattack list pour répertorier les composants, par exemple, des modèles pré-entraînés ( textattack list models ) ou des méthodes de recherche disponibles ( textattack list search-methods ).
TextAttack est l'angnostique modèle! Vous pouvez utiliser TextAttack pour analyser tout modèle qui produit des ID, des tenseurs ou des chaînes. Pour aider les utilisateurs, TextAttack comprend des modèles pré-formés pour différentes tâches NLP communes. Cela permet aux utilisateurs de démarrer plus facilement avec TextAttack. Il permet également une comparaison plus équitable des attaques de la littérature.
TextAttack est également intégré avec des modèles et des ensembles de données. Notre interface de ligne de commande correspond automatiquement à l'ensemble de données correct au modèle correct. Nous incluons 82 modèles pré-formés différents (octobre 2020) pour chacune des neuf tâches de colle, ainsi que certains ensembles de données communs pour la classification, la traduction et la résumé.
Une liste des modèles pré-entraînés disponibles et leurs précisions de validation est disponible sur TextAttack / Modèles / Readme.md. Vous pouvez également afficher une liste complète des modèles et des ensembles de données fournis via textattack attack --help .
Voici un exemple d'utilisation de l'un des modèles intégrés (l'ensemble de données SST-2 est automatiquement chargé):
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10transformers Modèles et datasets de données de données Nous fournissons également une prise en charge intégrée pour les modèles et ensembles de données prétraités transformers à partir du package datasets ! Voici un exemple de chargement et d'attaque d'un modèle et d'un ensemble de données prédéfinis:
textattack attack --model-from-huggingface distilbert-base-uncased-finetuned-sst-2-english --dataset-from-huggingface glue^sst2 --recipe deepwordbug --num-examples 10 Vous pouvez explorer d'autres modèles pré-formés à l'aide de l'argument --model-from-huggingface , ou d'autres ensembles de données en modifiant --dataset-from-huggingface .
Vous pouvez facilement essayer une attaque sur un modèle local ou un échantillon d'ensemble de données. Pour attaquer un modèle pré-formé, créez un court fichier qui les charge sous forme model de variables et tokenizer . Le tokenizer doit être en mesure de transformer les entrées de chaîne en listes ou tenseurs d'ID à l'aide d'une méthode appelée encode() . Le modèle doit prendre des entrées via la méthode __call__ .
Pour expérimenter avec un modèle que vous avez formé, vous pouvez créer le fichier suivant et le nommer 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 Ensuite, exécutez une attaque avec l'argument --model-from-file my_model.py . Le modèle et le tokenzer seront chargés automatiquement.
Le chargement d'un ensemble de données à partir d'un fichier est très similaire au chargement d'un modèle à partir d'un fichier. Un «ensemble de données» est tout itérable de paires (input, output) . L'exemple suivant chargerait un ensemble de données de classification de sentiment à partir du fichier my_dataset.py :
dataset = [( 'Today was....' , 1 ), ( 'This movie is...' , 0 ), ...] Vous pouvez ensuite exécuter des attaques sur des échantillons de cet ensemble de données en ajoutant l'argument --dataset-from-file my_dataset.py .
import textattack
my_dataset = [( "text" , label ),....]
new_dataset = textattack . datasets . Dataset ( my_dataset ) Pour permettre le remplacement des mots après qu'une séquence a été tokenisée, nous incluons un objet AttackedText qui maintient à la fois une liste de jetons et le texte d'origine, avec ponctuation. Nous utilisons cet objet en faveur d'une liste de mots ou simplement du texte brut.
Nous formulons une attaque comme étant composée de quatre composantes: une fonction d'objectif qui détermine si l'attaque a réussi, des contraintes définissant les perturbations valides, une transformation qui génère des modifications potentielles étant donné une entrée et une méthode de recherche qui traverse l'espace de recherche des perturbations possibles. L'attaque tente de perturber un texte d'entrée de telle sorte que la sortie du modèle remplit la fonction d'objectif (c'est-à-dire, indiquant si l'attaque est réussie) et la perturbation adhère à l'ensemble des contraintes (par exemple, contrainte de grammaire, contrainte de similitude sémantique). Une méthode de recherche est utilisée pour trouver une séquence de transformations qui produisent un exemple adversaire réussi.
Cette conception modulaire unifie les méthodes d'attaque adversaire en un seul système, nous permet d'assembler facilement les attaques de la littérature tout en réutilisant des composants partagés entre les attaques. Nous fournissons des implémentations propres et lisibles de 16 recettes d'attaque contradictoires de la littérature (voir le tableau ci-dessus). Pour la première fois, ces attaques peuvent être comparées, comparées et analysées dans un cadre standardisé.
TextAttack est l'agnostique du modèle - ce qui signifie qu'il peut exécuter des attaques sur des modèles implémentés dans n'importe quel cadre d'apprentissage en profondeur. Les objets du modèle doivent être en mesure de prendre une chaîne (ou une liste de chaînes) et de renvoyer une sortie qui peut être traitée par la fonction de but. Par exemple, les modèles de traduction automatique prennent une liste des chaînes en entrée et produisent une liste de chaînes en sortie. Les modèles de classification et d'impression renvoient un tableau de scores. Tant que le modèle de l'utilisateur répond à cette spécification, le modèle est apte à utiliser avec TextAttack.
Une GoalFunction prend en entrée comme un objet AttackedText , le marque et détermine si l'attaque a réussi, renvoyant une GoalFunctionResult .
Une Constraint prend en entrée un AttackedText actuel et une liste de texte AttackedText transformé. Pour chaque option transformée, il renvoie un booléen représentant si la contrainte est respectée.
Une Transformation prend en entrée un AttackedText et renvoie une liste de textes AttackedText transformés possibles. Par exemple, une transformation peut renvoyer tous les remplacements de synonymes possibles.
Une SearchMethod prend en entrée une fonction de fonction get_transformations GoalFunctionResult initiale et renvoie une fonction GoalFunctionResult AttackedText . Une recherche se compose d'appels successifs pour get_transformations jusqu'à ce que la recherche réussit (déterminée à l'aide get_goal_results ) ou est épuisée.
Voir notre document d'analyse: Recherche d'une méthode de recherche: les algorithmes de recherche d'analyse comparative pour générer des exemples adversaires NLP chez EMNLP BlackBoxNLP.
Comme nous l'avons souligné dans le document ci-dessus, nous ne recommandons pas de comparer directement les recettes d'attaque hors de la boîte.
Ce commentaire est dû à ces recettes d'attaque dans la littérature récente utilisée par différentes manières ou seuils pour mettre en place leurs contraintes. Sans l'espace de contrainte maintenu constant, une augmentation du taux de réussite des attaques pourrait provenir d'une méthode de recherche ou de transformation améliorée ou un espace de recherche moins restrictif.
Notre github sur les scripts et les résultats d'analyse comparative: GiTHUB TextAttack-Search-Benchmark
Voir Exemple de code: https://github.com/qdata/textattack/blob/master/examples/attack/attack_camembert.py pour utiliser notre framework pour attaquer le français.
Voir le cahier de didacticiel: https://textattack.readthedocs.io/en/latest/2NoteBook/example_4_camembert.html pour utiliser notre framework pour attaquer French-bert.
Voir readme_zh.md pour notre lecture en chinois
Nous accueillons des suggestions et des contributions! Soumettez un problème ou une demande de traction et nous ferons de notre mieux pour répondre en temps opportun. TextAttack est actuellement dans une étape "alpha" dans laquelle nous travaillons pour améliorer ses capacités et sa conception.
Voir contribution.md pour des informations détaillées sur la contribution.
Si vous utilisez TextAttack pour vos recherches, veuillez citer TextAttack: un cadre pour les attaques contradictoires, l'augmentation des données et la formation contradictoire 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 }
}