Ego -Beispiele für NLP -Modelle generieren
[Textangriffsdokumentation zu Redethedocs]
Über • Setup • Verwendung • Design
Textangriff ist ein Python -Framework für kontroverse Angriffe, Datenvergrößerung und Modelltraining in NLP.
Wenn Sie nach Informationen über die Menagerie von TEXTacks von vorgeborenen Modellen suchen, möchten Sie möglicherweise die Seite "Textangripte Model Zoo".
Für Hilfe- und Echtzeit -Updates zu Textangriffe, nehmen Sie bitte dem Textangriffs -Slack bei!
Es gibt viele Gründe, Textangriffe zu verwenden:
Sie sollten Python 3.6+ ausführen, um dieses Paket zu verwenden. Eine CUDA-kompatible GPU ist optional, verbessert aber die Codegeschwindigkeit erheblich. Textangriff ist über PIP erhältlich:
pip install textattack Sobald Textangriff installiert ist, können Sie es über die Befehlszeile ( textattack ... ) oder über das Python -Modul ( python -m textattack ... ) ausführen.
Tipp : TextAtack lädt Dateien auf
~/.cache/textattack/standardmäßig herunter. Dies umfasst vorbereitete Modelle, Datensatzproben und die Konfigurationsdateikonfiguration.config.yaml. Um den Cache -Pfad zu ändern, legen Sie die UmgebungsvariableTA_CACHE_DIRfest. (Zum Beispiel:TA_CACHE_DIR=/tmp/ textattack attack ...).
textattack --help Die Hauptfunktionen von Textangriffen können über den textattack zugegriffen werden. Zwei sehr häufige Befehle sind textattack attack <args> und textattack augment <args> . Sie können weitere Informationen zu allen Befehlen mithilfe sehen
textattack --helpoder einen bestimmten Befehl zum Beispiel, zum Beispiel,
textattack attack --help Die examples/ Ordner enthält Skripte, die die übliche Textangriffsverwendung für Trainingsmodelle, Ausführen von Angriffen und die Erweiterung einer CSV -Datei zeigen.
Die Dokumentations -Website enthält eine Vorgehensweise, die die grundlegende Verwendung von Textangriffe erläutert, einschließlich der Erstellung einer benutzerdefinierten Transformation und einer benutzerdefinierten Einschränkung.
textattack attack --help Der einfachste Weg, einen Angriff auszuprobieren, ist die Befehlszeilenschnittstelle, textattack attack .
Tipp: Wenn Ihre Maschine über mehrere GPUs verfügt, können Sie den Angriff mit der Option
--parallelOption über sie verteilen. Für einige Angriffe kann dies wirklich helfen. (Wenn Sie parallel Keras -Modelle angreifen möchten, lesen Sie stattdessenexamples/attack/attack_keras_parallel.py)
Hier sind einige konkrete Beispiele:
Textfooler auf Bert trainiert auf dem Datensatz der MR Sentiment Classification :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100Deepwordbug on Distilbert trainiert auf den Quora -Fragepaaren Paraphrase Identification Dataset :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100Strahlsuche mit Strahlbreite 4 und Worteinbettung der Transformation und nicht zielgerichteter Zielfunktion auf einem 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-classificationTipp: Anstatt einen Datensatz und eine Anzahl von Beispielen anzugeben, können Sie übergeben
--interactive, um vom Benutzer eingegebene Muster anzugreifen.
textattack attack --recipe [recipe_name] Wir schließen Angriffsrezepte ein, die Angriffe aus der Literatur umsetzen. Sie können Angriffsrezepte mithilfe von textattack list attack-recipes auflisten.
So führen Sie ein Angriffsrezept aus: textattack attack --recipe [recipe_name]

| Rezeptname angreifen | Zielfunktion | Einschränkungen | Transformation | Suchmethode | Hauptidee |
|---|---|---|---|---|---|
| Angriffe auf Klassifizierungsaufgaben wie Klassifizierung der Stimmungsstimmung und die Auseinandersetzung: | |||||
a2t | Unbezogene {Klassifizierung, Entailment} | Prozentsatz der gestörten Wörter, Worteinbettungsdistanz, Distilbert-Satz, die Cosinus-Ähnlichkeit, Konsistenz der Sprache kodiert, | Gegengestellte Word-Einbettungs-Swap (oder) Bert Masked Token | Greedy-Wir (Gradient) | von (["zur Verbesserung des kontroversen Trainings von NLP -Modellen" (Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544)) |
alzantot | Unbezogene {Klassifizierung, Entailment} | Prozentsatz der Wörter gestört, Sprachmodell Verwirrung, Worteinbettungsdistanz | Einbettete Swap mit einem Einbettungsbetting | Genetischer Algorithmus | von (["Natürliche Sprachgegner generieren" (Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998)) |
bae | Ungeleichte Klassifizierung | Verwenden Sie Satzkodierung Cosinus -Ähnlichkeit | Bert maskierte Token -Vorhersage | Greedy-Wir | Bert Masked Language Model Transformation Angriff aus (["BAE: Bert-basierte kontroverse Beispiele für die Textklassifizierung" (Garg & Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970)). |
bert-attack | Ungeleichte Klassifizierung | Verwenden Sie Satzcodierung Cosinus -Ähnlichkeit, maximale Anzahl von Wörtern gestört | Bert maskierte Token -Vorhersage (mit Subword -Expansion) | Greedy-Wir | (["Bert-Angriff: Gegenteil gegen Bert mit Bert" (Li et al., 2020)] (https://arxiv.org/abs/2004.09984))) |
checklist | {Ungehorige, gezielte} Klassifizierung | Checkliste Distanz | Vertrags-, Erweiterungs- und Ersatznamenunternehmen | Greedy-Wir | Invarianztests in der Checkliste implementiert. (["Beyond Genauigkeit: Verhaltenstests von NLP -Modellen mit Checkliste" (Ribeiro et al., 2020)] (https://arxiv.org/abs/2005.04118)) |
clare | Unbezogene {Klassifizierung, Entailment} | Verwenden Sie Satzkodierung Cosinus -Ähnlichkeit | Roberta maskierte die Vorhersage für Token -Tausch, Einfügung und Zusammenführen | Gierig | ["Kontextualisierte Störung des textuellen kontroversen Angriffs" (Li et al., 2020)] (https://arxiv.org/abs/2009.07502)) |
deepwordbug | {Ungehorige, gezielte} Klassifizierung | Levenshtein Distanz bearbeiten | {Charakterinsertion, Charakterdeletion, benachbarter Charakter -Swap, Zeichensubstitution} | Greedy-Wir | Giery Ersatz-1-Bewertungs- und Multi-Transformation-Charakter-Swap-Angriff (["Black-Box-Generierung von kontroversen Textsequenzen, um Deep Learning-Klassifikatoren zu entgehen" (Gao et al., 2018)] (https://arxiv.org/abs/1801.04354) |
faster-alzantot | Unbezogene {Klassifizierung, Entailment} | Prozentsatz der Wörter gestört, Sprachmodell Verwirrung, Worteinbettungsdistanz | Einbettete Swap mit einem Einbettungsbetting | Genetischer Algorithmus | Modifizierte, schnellere Version des Alzantots et al. Genetischer Algorithmus aus (["Zertifizierte Robustheit gegenüber kontroversen Worts Substitutionen" (Jia et al., 2019)] (https://arxiv.org/abs/1909.00986))) |
hotflip (Word -Swap) | Ungeleichte Klassifizierung | Worteinbettung Cosinus-Ähnlichkeit, Part-of-Rede-Übereinstimmung, Anzahl der gestörten Wörter | Gradientenbasierter Worttausch | Strahlsuche | (["HotFlip: White-Box Gegnere Beispiele für die Textklassifizierung" (Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751)) |
iga | Unbezogene {Klassifizierung, Entailment} | Prozentsatz der Wörter gestört, Worteinbettungsdistanz | Einbettete Swap mit einem Einbettungsbetting | Genetischer Algorithmus | Verbesserter genetischer Algorithmus -Basis -Wortsubstitution aus (["Natürliche Sprachgegner angreift und Verteidigungen auf Wortebene (Wang et al., 2019)"] (https://arxiv.org/abs/1909.06723) |
input-reduction | Eingangsreduzierung | Wortlöschung | Greedy-Wir | Gieriger Angriff mit Word -Wichtigkeitsranking, die die Eingabe verringert und gleichzeitig die Vorhersage durch Word -Wichtigkeitsranking beibehalten (["Pathologien der neuronalen Modelle machen die Interpretation schwierig" (Feng et al., 2018)] (https://arxiv.org/pdf/1804.07781.pdf))))) | |
kuleshov | Ungeleichte Klassifizierung | Denkvektor codiert Cosinus -Ähnlichkeit, Sprachmodell -Ähnlichkeitswahrscheinlichkeit | Einbettete Swap mit einem Einbettungsbetting | Gieriger Worttausch | (["Gegentliche Beispiele für Probleme der natürlichen Sprache" (Kuleshov et al., 2018)] (https://openreview.net/pdf?id=r1qz3zbaz)) |
pruthi | Ungeleichte Klassifizierung | Minimale Wortlänge, maximale Anzahl von Wörtern gestört | {Benachbarter Charakter-Swap, Charakterdeletion, Zeicheneinfügung, Tastaturbasis-Charakter-Swap}} | Gierige Suche | Simuliert gemeinsame Tippfehler (["Bekämpfung von widersprüchlichen Missschreibungen mit robuster Worterkennung" (Pruthi et al., 2019)] (https://arxiv.org/abs/1905.11268) |
pso | Ungeleichte Klassifizierung | Hownet Word Swap | Partikelschwarmoptimierung | (["Textualgegner angreifer als kombinatorische Optimierung" (Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/))) | |
pwws | Ungeleichte Klassifizierung | WordNet-basierter Synonym-Swap | Greedy-Wir (Außendienst) | Gieriger Angriff mit Word-Wichtigkeitsranking basierend auf Wortgrößen und Synonym-Swap-Scores (["Natürliche Sprachgüter durch Wahrscheinlichkeit gewichteten Wortmalerschaft" (Ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/))))) | |
textbugger : (Black-Box) | Ungeleichte Klassifizierung | Verwenden Sie Satzkodierung Cosinus -Ähnlichkeit | {Charakterinsertion, Charakterdeletion, benachbarter Charakter -Swap, Zeichensubstitution} | Greedy-Wir | ([["Textbugger: Egualial Text gegen reale Anwendungen generieren" (Li et al., 2018)] (https://arxiv.org/abs/1812.05271)). |
textfooler | Unbezogene {Klassifizierung, Entailment} | Worteinbettungsdistanz, Speech-Übereinstimmung, Verwenden Sie Satzcodierung Cosinus-Ähnlichkeit | Einbettete Swap mit einem Einbettungsbetting | Greedy-Wir | Gieriger Angriff mit Word -Wichtigkeitsranking (["Ist Bert wirklich robust?" (Jin et al., 2019)] (https://arxiv.org/abs/1907.11932)) |
| Angriffe auf Sequenz-zu-Sequenz-Modelle: | |||||
morpheus | Minimaler Bleu -Score | Beugung Wort Swap | Gierige Suche | Gierig, Wörter durch ihre Beugung mit dem Ziel zu ersetzen, Bleu-Score zu minimieren (["Es ist morphin 'Zeit! Bekämpfung der sprachlichen Diskriminierung mit Beugungstörungen"] (https://www.aclweb.org/anthology/2020.acl-main.263.pdf) | |
seq2sick : (Black-Box) | Nicht überlappende Ausgabe | Einbettete Swap mit einem Einbettungsbetting | Greedy-Wir | Gieriger Angriff mit dem Ziel, jedes Wort in der Ausgangsübersetzung zu ändern. Derzeit als Black-Box implementiert mit Plänen, sich wie in Papier in White-Box zu wechseln (["SEQ2SICK: Bewertung der Robustheit von Sequence-to-Sequence-Modellen mit gegnerischen Beispielen" (Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128)))) | |
Hier sind einige Beispiele für Testangriffe aus der Literatur aus der Befehlszeile:
Textfooler gegen Bert, die auf SST-2-Finanzabstimmung abgestimmt sind:
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10SEQ2SICK (Black-Box) gegen T5, die für die Übersetzung von englisch-deutschem Stimmungsstimmen gegessen wurden:
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment Viele der Komponenten des Textangriffs sind nützlich für die Datenerweiterung. Die textattack.Augmenter -Klasse verwendet eine Transformation und eine Liste von Einschränkungen, um die Daten zu erweitern. Wir bieten auch integrierte Rezepte für die Datenvergrößerung an:
wordnet erweitert den Text, indem sie Wörter durch WordNet -Synonyme ersetzenembedding des Textes durch das Ersetzen von Wörtern durch Nachbarn in dem kontereinbetteten Einbettungsraum mit einer Einschränkung, um sicherzustellen, dass die Ähnlichkeit der Cosinus-Ähnlichkeit mindestens 0,8 beträgtcharswap erweitert den Text, indem er benachbarte Zeichen ersetzt, löscht, eingefügt und tauschteeda erweitert den Text mit einer Kombination aus Wortinsertionen, Substitutionen und Löschungen.checklist erweitert Text durch Kontraktion/Erweiterung und durch Ersetzen von Namen, Standorten, Zahlen.clare erweitert den Text, indem er ein vorgebildetes maskiertes Sprachmodell ersetzt, eingefügt und verschmilzt.back_trans erweitert den Text nach Backtranslation -Ansatz.back_transcription erweitert den Text nach Rücktranskriptionsansatz. Der einfachste Weg, um unsere Daten Augmentation -Tools zu verwenden, ist die textattack augment <args> . textattack augment nimmt eine Eingabe -CSV -Datei und eine Textspalte zusammen mit der Anzahl der Wörter zur Änderung pro Augmentation und der Anzahl der Augmentationen pro Eingabebuch. Es gibt ein CSV im selben Format mit allen Augmentationsbeispielen aus, die den richtigen Spalten entsprechen.
Beispielsweise als Beispiele als 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
Der Befehl
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 Erhöht die text , indem Sie 10% der Wörter jedes Beispiels ändern, doppelt so viele Augmentationen wie Originaleingänge erzeugen und die ursprünglichen Eingänge aus dem Ausgangs -CSV ausschließen. (All dies wird standardmäßig auf augment.csv gespeichert.)
TIPP: So wie es interaktiv ausgeführt wird, können Sie auch übergeben
--interactive, um die vom Benutzer eingegebenen Muster zu erweitern, um schnell verschiedene Augmentationsrezepte auszuprobieren!
Nach der Augmentation finden Sie hier den Inhalt von 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
Das "Einbettung" -Geradationsrezept verwendet kontrastierte Einbettung der nächsten Nachbarn, um die Daten zu erweitern.
Zusätzlich zur Befehlszeilenschnittstelle können Sie den Text dynamisch erweitern, indem Sie den Augmenter in Ihren eigenen Code importieren. Alle Augmenter -Objekte implementieren augment und augment_many , um Augmentationen einer Zeichenfolge oder einer Liste von Zeichenfolgen zu generieren. Hier ist ein Beispiel dafür, wie man den EmbeddingAugmenter in einem Python -Skript verwendet:
> >> 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.' ] Sie können auch Ihren eigenen Augmenter von Grund auf neu erstellen, indem Sie Transformationen/Einschränkungen von textattack.transformations und textattack.constraints importieren. Hier ist ein Beispiel, das Vergrößerungen einer Zeichenfolge unter Verwendung von WordSwapRandomCharacterDeletion erzeugt:
> >> 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.' ] Um den regulären Text zusätzlich zu erweitern, können Sie die Eingabeaufforderungen erweitern und dann mithilfe eines großen Sprachmodells (LLMs) Antworten auf die erweiterten Eingabeaufforderungen generieren. Die Augmentation wird mit demselben Augmenter wie oben durchgeführt. Um Antworten zu generieren, können Sie Ihr eigenes LLM, ein Suggingface -LLM oder ein OpenAI -LLM verwenden. Hier ist ein Beispiel mit einem vorgezogenen Suggingface 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 Unser Modelltrainingscode ist über textattack train verfügbar, mit dem Sie LSTMS-, CNNS- und transformers -Modelle mithilfe von Textattack Out-of-the-Box trainieren können. Datensätze werden automatisch über das datasets -Paket geladen.
Trainieren Sie unsere Standard -LSTM für 50 Epochen auf dem Dataset von Yelp Polarity:
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 Fine-Tune- bert-base auf dem CoLA Datensatz für 5 Epochen *:
textattack train --model-name-or-path bert-base-uncased --dataset glue^cola --per-device-train-batch-size 8 --epochs 5textattack peek-dataset Um einen Datensatz genauer zu betrachten, verwenden Sie textattack peek-dataset . Textangriffe werden einige flüchtige Statistiken zu den Eingängen und Ausgängen aus dem Datensatz ausdrucken. Zum Beispiel,
textattack peek-dataset --dataset-from-huggingface snliZeigen Sie Informationen zum SNLI -Datensatz aus dem NLP -Paket an.
textattack list Es gibt viele Teile im Textangriff, und es kann schwierig sein, alle von ihnen im Auge zu behalten. Sie können textattack list models textattack list verwenden, um Komponenten aufzulisten, z textattack list search-methods
Textangriff ist modellagnostisch! Sie können TextAttack verwenden, um jedes Modell zu analysieren, das IDs, Tensoren oder Zeichenfolgen ausgibt. Um den Benutzern zu helfen, enthält Textangriffe vorgebrachte Modelle für verschiedene gemeinsame NLP-Aufgaben. Dies erleichtert den Benutzern, mit Textangriffe zu beginnen. Es ermöglicht auch einen faireren Vergleich von Angriffen aus der Literatur.
Textangriff wird auch mit Modellen und Datensätzen integriert. Unsere Befehlszeilenschnittstelle stimmt automatisch mit dem richtigen Datensatz mit dem richtigen Modell überein. Wir haben 82 verschiedene (Oktober 2020) vorgebrachte Modelle für jede der neun Kleberaufgaben sowie einige gemeinsame Datensätze für die Klassifizierung, Übersetzung und Zusammenfassung.
Eine Liste der verfügbaren vorbereiteten Modelle und deren Validierungsgenauigkeiten finden Sie unter Textattack/Models/Readme.md. Sie können auch eine vollständige Liste der bereitgestellten Modelle und Datensätze über textattack attack --help anzeigen.
Hier ist ein Beispiel für die Verwendung eines der integrierten Modelle (der SST-2-Datensatz wird automatisch geladen):
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10transformers -Modelle und datasets Datensätze Wir bieten auch integrierte Unterstützung für transformers Pretrainierte Modelle und Datensätze aus dem datasets -Paket! Hier ist ein Beispiel für das Laden und Angriff auf ein vorgebildetes Modell und Datensatz:
textattack attack --model-from-huggingface distilbert-base-uncased-finetuned-sst-2-english --dataset-from-huggingface glue^sst2 --recipe deepwordbug --num-examples 10 Sie können andere vorgebreitete Modelle mit dem Argument --model-from-huggingface oder anderen Datensätzen untersuchen, indem Sie --dataset-from-huggingface .
Sie können leicht einen Angriff auf ein lokales Modell oder ein Datensatzprobe ausprobieren. Um ein vorgebildetes Modell anzugreifen, erstellen Sie eine Short-Datei, die sie als model und tokenizer lädt. Der tokenizer muss in der Lage sein, String -Eingänge in Listen oder Tensoren von IDs mithilfe einer Methode namens encode() zu transformieren. Das Modell muss Eingänge über die __call__ -Methode nehmen.
Um mit einem Modell zu experimentieren, das Sie trainiert haben, können Sie die folgende Datei erstellen und es my_model.py nennen:
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 Führen Sie dann einen Angriff mit dem Argument --model-from-file my_model.py . Das Modell und der Tokenizer werden automatisch geladen.
Das Laden eines Datensatzes aus einer Datei ist dem Laden eines Modells aus einer Datei sehr ähnlich. Ein "Datensatz" ist jeder iterable (input, output) Paare. Das folgende Beispiel würde einen Datensatz der Sentiment -Klassifizierung aus der Datei my_dataset.py geladen:
dataset = [( 'Today was....' , 1 ), ( 'This movie is...' , 0 ), ...] Anschließend können Sie Angriffe auf Beispiele aus diesem Datensatz ausführen, indem Sie das Argument addieren --dataset-from-file my_dataset.py .
import textattack
my_dataset = [( "text" , label ),....]
new_dataset = textattack . datasets . Dataset ( my_dataset ) Um einen Wortersatz nach einer Sequenz zu ermöglichen, schließen wir ein AttackedText Objekt ein, das sowohl eine Liste von Token als auch den Originaltext mit Interpunktion beibehält. Wir verwenden dieses Objekt zugunsten einer Liste von Wörtern oder nur einer rohen Text.
Wir formulieren einen Angriff als bestehend aus vier Komponenten: eine Zielfunktion , die feststellt, ob der Angriff erfolgreich ist, die Einschränkungen bei der Definition der Störungen gültig sind, eine Transformation , die potenzielle Modifikationen bei einer Eingabe erzeugt, und eine Suchmethode , die den Suchraum möglicher Störungen durchquert. Der Angriff versucht, einen Eingabetxt so zu stören, dass die Modellausgabe die Zielfunktion erfüllt (dh angibt, ob der Angriff erfolgreich ist) und die Störung der Einschränkungen festhält (z. B. Grammatikbeschränkung, semantische Ähnlichkeitsbeschränkung). Eine Suchmethode wird verwendet, um eine Folge von Transformationen zu finden, die ein erfolgreiches kontroverses Beispiel erzeugen.
Mit diesem modularen Design vereint die kontroversen Angriffsmethoden in ein System und ermöglicht es uns, Angriffe aus der Literatur leicht zusammenzustellen und gleichzeitig Komponenten wiederzuverwenden, die über Angriffe hinweg geteilt werden. Wir bieten saubere, lesbare Implementierungen von 16 kontroversen Angriffsrezepten aus der Literatur (siehe oben). Zum ersten Mal können diese Angriffe in einer standardisierten Umgebung mit einem Vergleich und analysiert werden, verglichen und analysiert werden.
Textangriff ist modellagnostisch - dh es kann Angriffe auf Modelle ausführen, die in jedem Deep Learning -Framework implementiert sind. Modellobjekte müssen in der Lage sein, eine Zeichenfolge (oder eine Liste von Zeichenfolgen) zu nehmen und eine Ausgabe zurückzugeben, die von der Zielfunktion verarbeitet werden kann. Beispielsweise nehmen maschinelle Übersetzungsmodelle eine Liste von Zeichenfolgen als Eingabe auf und erstellen eine Liste von Zeichenfolgen als Ausgabe. Klassifizierungs- und Bedatmodelle geben eine Reihe von Punktzahlen zurück. Solange das Modell des Benutzers diese Spezifikation erfüllt, ist das Modell mit Textangriffe geeignet.
Eine GoalFunction nimmt ein inputiert ein AttackedText Objekt, bewertet es und bestimmt, ob der Angriff erfolgreich ist und ein GoalFunctionResult zurückgibt.
Eine Constraint dauert als Eingabe einen aktuellen AttackedText und eine Liste von transformierten AttackedText text s. Für jede transformierte Option gibt es einen Booleschen zurück, der darstellt, ob die Einschränkung erfüllt ist.
Eine Transformation dauert als Eingabe einen AttackedText und gibt eine Liste möglicher transformierter AttackedText Angeklagte zurück. Eine Transformation kann beispielsweise alle möglichen Synonym -Ersetzungen zurückgeben.
Ein SearchMethod nimmt als initiale GoalFunctionResult als Eingabe ein und gibt ein endgültiges GoalFunctionResult Die Suche wird zu Zugriff auf die Funktion get_transformations , die als Eingabe ein AttackedText Objekt eingibt und eine Liste möglicher Transformationen ausgibt, die durch die Erfüllung aller Einschränkungen des Angriffs gefiltert werden. Eine Suche besteht aus aufeinanderfolgenden Aufrufen von get_transformations , bis die Suche erfolgreich ist (bestimmt mit get_goal_results ) oder erschöpft ist.
Siehe unser Analysepapier: Suche nach einer Suchmethode: Benchmarking -Suchalgorithmen zum Generieren von NLP -kontroversen Beispielen bei EMNLP BlackboxNLP.
Wie wir in dem obigen Papier hervorgehoben haben, empfehlen wir nicht, Angriffsrezepte direkt zu vergleichen.
Dieser Kommentar ist auf diese Angriffsrezepte in der jüngsten Literatur zurückzuführen, die verschiedene Arten oder Schwellenwerte bei der Einrichtung ihrer Einschränkungen verwendet haben. Ohne den konstanten Einschränkungen könnte eine Erhöhung der Erfolgsquote der Angriffsanfälle aus einer verbesserten Such- oder Transformationsmethode oder einem weniger restriktiven Suchraum zurückzuführen sein.
Unser GitHub über Benchmarking-Skripte und -Enträte: Textangriffs-Such-Benchmark GitHub
Siehe Beispielcode: https://github.com/qdata/textattack/blob/master/examples/attack/attack_camembert.py für die Verwendung unseres Frameworks zum Angriff von French-tbert.
Siehe Tutorial Notebook: https://textattack.readthedocs.io/en/latest/2notebook/example_4_camembert.html für die Verwendung unseres Frameworks zum Angriff von French-tbert.
Siehe Readme_zh.md für unsere Readme in Chinesisch
Wir begrüßen Vorschläge und Beiträge! Senden Sie eine Ausgabe oder eine Anfrage an und wir werden unser Bestes tun, um rechtzeitig zu antworten. Textangriff befindet sich derzeit in einer "Alpha" -Prichtung, in der wir daran arbeiten, seine Fähigkeiten und das Design zu verbessern.
Weitere Informationen zum Beitrag zum Mitwirken finden Sie unter Beitrags.md.
Wenn Sie Textangriffe für Ihre Forschung verwenden, zitieren Sie bitte Textangriffe: einen Rahmen für kontroverse Angriffe, Datenvergrößerung und das kontroverse Training in NLP.
@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 }
}