Gerando exemplos adversários para modelos de PNL
[Documentação do Textattack no ReadThEdocs]
Sobre • Configuração • Uso • Design
O Textattack é uma estrutura Python para ataques adversários, aumento de dados e treinamento de modelos na PNL.
Se você está procurando informações sobre o Menagerie de modelos pré-treinados da TextAttack, pode querer a página do Zoo do modelo TextAttack.
Para obter ajuda e atualizações em tempo real relacionadas ao TextAttack, junte -se à textattack!
Existem muitos motivos para usar o TextAttack:
Você deve estar executando o Python 3.6+ para usar este pacote. Uma GPU compatível com CUDA é opcional, mas melhorará bastante a velocidade do código. Textattack está disponível através do PIP:
pip install textattack Depois que o TextAttack é instalado, você pode executá -lo via linha de comando ( textattack ... ) ou via módulo Python ( python -m textattack ... ).
Dica : Textattack baixa arquivos para
~/.cache/textattack/por padrão. Isso inclui modelos pré -ridicularizados, amostras de conjunto de dados e o arquivo de configuraçãoconfig.yaml. Para alterar o caminho do cache, defina a variável de ambienteTA_CACHE_DIR. (Por exemplo:TA_CACHE_DIR=/tmp/ textattack attack ...).
textattack --help Os principais recursos do TextAttack podem ser acessados através do comando textattack . Dois comandos muito comuns são textattack attack <args> e textattack augment <args> . Você pode ver mais informações sobre todos os comandos usando
textattack --helpou um comando específico usando, por exemplo,
textattack attack --help Os examples/ pasta incluem scripts mostrando o uso comum de texto de texto para modelos de treinamento, ataques de execução e aumento de um arquivo CSV.
O site de documentação contém a passo a passo explicando o uso básico do TextAttack, incluindo a criação de uma transformação personalizada e uma restrição personalizada.
textattack attack --help A maneira mais fácil de experimentar um ataque é através da interface da linha de comando, textattack attack .
Dica: se sua máquina tiver várias GPUs, você poderá distribuir o ataque através delas usando a opção
--parallel. Para alguns ataques, isso pode realmente ajudar o desempenho. (Se você deseja atacar os modelos Keras em paralelo, confiraexamples/attack/attack_keras_parallel.py)
Aqui estão alguns exemplos concretos:
TextFooler em Bert treinado no conjunto de dados de classificação de sentimentos de SR :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100DeepWordBug no Distilbert treinado nos pares de perguntas Quora parafrasear o conjunto de dados de identificação :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100Pesquisa de feixe com a largura do feixe 4 e a transformação de incorporação de palavras e a função de meta não direcionada em um 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-classificationDica: em vez de especificar um conjunto de dados e número de exemplos, você pode passar
--interactivepara atacar amostras inseridas pelo usuário.
textattack attack --recipe [recipe_name] Incluímos receitas de ataque que implementam ataques da literatura. Você pode listar receitas de ataque usando textattack list attack-recipes .
Para executar uma receita de ataque: textattack attack --recipe [recipe_name]

| Nome da receita de ataque | Função de meta | Restrições forçadas | Transformação | Método de pesquisa | Idéia principal |
|---|---|---|---|---|---|
| Ataques a tarefas de classificação, como classificação de sentimentos e implicações: | |||||
a2t | Não direcionado {Classificação, Irailment} | Porcentagem de palavras perturbadas, distância de incorporação de palavras, sentença distilbert que codifica similaridade de cosseno, consistência de parte da fala | Countited Word Incorporação de troca (ou) Bert Previsão de token mascarada | Ganancioso-chão (gradiente) | De (["para melhorar o treinamento adversário dos modelos de PNL" (Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544)) |
alzantot | Não direcionado {Classificação, Irailment} | Porcentagem de palavras perturbadas, modelo de idioma perplexidade, distância de incorporação de palavras | Swap de incorporação de palavras contra-ajustado | Algoritmo genético | de (["Gerando exemplos adversários da linguagem natural" (Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998)) |
bae | Classificação não direcionada | Use a similaridade de codificação de codificação de frases | Previsão de token mascarada de Bert | Ganancioso-wir | Bert Modelo de linguagem mascarada Ataque de ("Bae: Exemplos adversários baseados em Bert para classificação de texto" (Garg & Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970)). |
bert-attack | Classificação não direcionada | Use frase que codifica similaridade cosseno, número máximo de palavras perturbadas | Previsão de token mascarada de Bert (com expansão de subpainha) | Ganancioso-wir | (["Bert-atack: ataque adversário contra Bert usando Bert" (Li et al., 2020)] (https://arxiv.org/abs/2004.09984)) |
checklist | {CLASSIFICAÇÃO UMPARTETED, SEGUNDO} | Lista de verificação Distância | Contrato, estender e substitui entidades nomes | Ganancioso-wir | Teste de invariância implementado na lista de verificação. (["Além da precisão: teste comportamental de modelos de PNL com lista de verificação" (Ribeiro et al., 2020)] (https://arxiv.org/abs/2005.04118))) |
clare | Não direcionado {Classificação, Irailment} | Use a similaridade de codificação de codificação de frases | Roberta mascarou previsão para troca de token, inserir e mesclar | Ambicioso | ["Perturbação contextualizada para ataque adversário textual" (Li et al., 2020)] (https://arxiv.org/abs/2009.07502)) |
deepwordbug | {CLASSIFICAÇÃO UMPARTETED, SEGUNDO} | Levenshtein Editar distância | {Inserção de personagens, exclusão de personagens, troca de personagens vizinhos, substituição de caracteres} | Ganancioso-wir | Ataques gananciosos de pontuação-1 de replicação-1 e troca de caracteres multi-transformação (["Geração de seqüências de texto adversárias para evitar os classificadores de aprendizado profundo" (Gao et al., 2018)] (https://arxiv.org/abs/1801.04354) |
faster-alzantot | Não direcionado {Classificação, Irailment} | Porcentagem de palavras perturbadas, modelo de idioma perplexidade, distância de incorporação de palavras | Swap de incorporação de palavras contra-ajustado | Algoritmo genético | Versão modificada e mais rápida do Alzantot et al. Algoritmo genético, de ("Robustez Certificada a substituições de palavras adversárias" (Jia et al., 2019)] (https://arxiv.org/abs/1909.00986)) |
hotflip (troca de palavras) | Classificação não direcionada | EMBALAGEM DE PALAVRA COMMEMURAÇÃO COSINA, partida de parte da fala, número de palavras perturbadas | Troca de palavras baseada em gradiente | Pesquisa de feixe | (["Hotflip: exemplos adversários de caixa branca para classificação de texto" (Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751)) |
iga | Não direcionado {Classificação, Irailment} | Porcentagem de palavras perturbadas, a distância de incorporação de palavras | Swap de incorporação de palavras contra-ajustado | Algoritmo genético | Substituição de palavra baseada em algoritmo genético aprimorado de ("Ataques adversários e defesas [" da linguagem natural da linguagem natural (Wang et al., 2019) "] (https://arxiv.org/abs/1909.06723) |
input-reduction | Redução de entrada | Exclusão de palavras | Ganancioso-wir | Ataque ganancioso com classificação de importância de palavras, reduzindo a entrada, mantendo a previsão através da classificação de importância da palavra (["Patologias de modelos neurais dificultam a interpretação" (Feng et al., 2018)] (https://arxiv.org/pdf/1804.07781.pdf))) | |
kuleshov | Classificação não direcionada | Pensamento de codificação de codificação Cosina, probabilidade de similaridade do modelo de linguagem | Swap de incorporação de palavras contra-ajustado | Troca de palavras gananciosas | (["Exemplos adversários para problemas de classificação de linguagem natural" (Kuleshov et al., 2018)] (https://openreview.net/pdf?id=r1qz3zbaz))) |
pruthi | Classificação não direcionada | Comprimento mínimo da palavra, número máximo de palavras perturbadas | {Troca de personagens vizinhos, exclusão de personagens, inserção de personagens, troca de caracteres baseada no teclado} | Pesquisa gananciosa | Simula erros de digitação comuns (["Combatendo ortografia adversária com reconhecimento robusto de palavras" (Puthi et al., 2019)] (https://arxiv.org/abs/1905.11268) |
pso | Classificação não direcionada | Como troca de palavras | Otimização de enxame de partículas | (["Atacamento adversário textual no nível da palavra como otimização combinatória" (Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/)) | |
pwws | Classificação não direcionada | Troca de sinônimo baseado em WordNet | Ganancioso-chão (saliência) | Ataque ganancioso com classificação de importância de palavras com base na saliência das palavras e nas pontuações de sinônimos de troca (["Gerando exemplos adversários de linguagem natural por meio de probabilidade de saliência de palavras ponderadas" (Ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/)) | |
textbugger : (Black-Box) | Classificação não direcionada | Use a similaridade de codificação de codificação de frases | {Inserção de personagens, exclusão de personagens, troca de personagens vizinhos, substituição de caracteres} | Ganancioso-wir | ([[["TextBugger: gerando texto adversário contra aplicações do mundo real" (Li et al., 2018)] (https://arxiv.org/abs/1812.05271)). |
textfooler | Não direcionado {Classificação, Irailment} | Distância de incorporação de palavras, correspondência de parte da fala, use a similaridade de codificação de codificação de codificação | Swap de incorporação de palavras contra-ajustado | Ganancioso-wir | Ataque ganancioso com classificação de importância de palavras (["Bert é realmente robusto?" (Jin et al., 2019)] (https://arxiv.org/abs/1907.11932)) |
| Ataques aos modelos de sequência a sequência: | |||||
morpheus | Pontuação mínima bleu | Troca de palavras de inflexão | Pesquisa gananciosa | Ganancioso para substituir as palavras por suas inflexões pelo objetivo de minimizar a pontuação do bleu (["É tempo de morfina! | |
seq2sick : (caixa preta) | Saída não sobreposta | Swap de incorporação de palavras contra-ajustado | Ganancioso-wir | Ataque ganancioso com o objetivo de alterar todas as palavras na tradução de saída. Atualmente implementado como caixa preta com planos de mudar para a caixa branca, conforme feito em papel (["SEQ2SICK: Avaliando a robustez dos modelos de sequência a sequência com exemplos adversários" (Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128))) | |
Aqui estão alguns exemplos de ataques de teste da literatura da linha de comando:
TextFooler contra Bert Fine-Tuned no SST-2:
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10Seq2sick (caixa preta) contra T5 Tuned para tradução inglesa-alemã:
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment Muitos dos componentes do Textattack são úteis para o aumento de dados. A classe textattack.Augmenter usa uma transformação e uma lista de restrições para aumentar os dados. Também oferecemos receitas internas para aumento de dados:
wordnet aumenta o texto substituindo palavras por sinônimos do WordNetembedding aumenta o texto substituindo palavras por vizinhos no espaço de incorporação de contra-ajustes, com uma restrição para garantir que sua similaridade de cosseno seja pelo menos 0,8charswap aumenta o texto substituindo, excluindo, inserindo e trocando caracteres adjacenteseda aumenta o texto com uma combinação de inserções de palavras, substituições e exclusões.checklist aumenta o texto por contração/extensão e substituindo nomes, locais, números.clare aumenta o texto substituindo, inserindo e se fundindo com um modelo de idioma mascarado pré-treinado.back_trans aumenta o texto por abordagem de backtranslação.back_transcription aumenta o texto por abordagem de transcrição traseira. A maneira mais fácil de usar nossas ferramentas de aumento de dados é com textattack augment <args> . textattack augment recebe um arquivo CSV de entrada e uma coluna de texto para aumentar, juntamente com o número de palavras a serem alteradas por aumento e o número de aumentos por exemplo de entrada. Ele gera um CSV no mesmo formato com todos os exemplos de aumento correspondentes às colunas adequadas.
Por exemplo, dado o seguinte 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
O 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á a coluna text alterando 10% das palavras de cada exemplo, gerando duas vezes mais aumentos que as entradas originais e excluem as entradas originais do CSV de saída. (Tudo isso será salvo para augment.csv por padrão.)
Dica: assim como os ataques em execução interativamente, você também pode passar
--interactivepara aumentar as amostras inseridas pelo usuário para experimentar rapidamente diferentes receitas de aumento!
Após o aumento, aqui estão o conteúdo do 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
A receita de aumento de 'incorporação' usa o contra-equipamento de vizinhos mais próximos para aumentar os dados.
Além da interface da linha de comando, você pode aumentar o texto dinamicamente, importando o Augmenter do seu próprio código. Todos os objetos Augmenter implementam augment e augment_many para gerar aumentos de uma string ou uma lista de strings. Aqui está um exemplo de como usar o EmbeddingAugmenter em um 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.' ] Você também pode criar seu próprio aumento do zero, importando transformações/restrições do textattack.transformations e textattack.constraints . Aqui está um exemplo que gera aumentos de uma string 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.' ] Além do aumento do texto regular, você pode aumentar os prompts e, em seguida, gerar respostas para os avisos aumentados usando um grande modelo de idioma (LLMS). O aumento é realizado usando o mesmo Augmenter acima. Para gerar respostas, você pode usar seu próprio LLM, um Huggingface LLM ou um Openai LLM. Aqui está um exemplo usando um huggingface llm pré -treinado:
> >> 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 Nosso código de treinamento de modelo está disponível via textattack train para ajudá-lo a treinar modelos LSTMs, CNNs e transformers usando o TextAttack pronto para uso. Os conjuntos de dados são carregados automaticamente usando o pacote datasets .
Treine nosso LSTM padrão para 50 épocas no conjunto de dados da polaridade do Yelp:
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 Tune bert-base no conjunto de dados 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 examinar mais de perto um conjunto de dados, use textattack peek-dataset . O TextAttack imprimirá algumas estatísticas superficiais sobre as entradas e saídas do conjunto de dados. Por exemplo,
textattack peek-dataset --dataset-from-huggingface snlimostrará informações sobre o conjunto de dados SNLI do pacote NLP.
textattack list Há muitas peças no Textattack, e pode ser difícil acompanhar todas elas. Você pode usar textattack list para listar componentes, por exemplo, modelos pré-gravados ( textattack list models ) ou métodos de pesquisa disponíveis ( textattack list search-methods ).
O Textattack é modelo-agnóstico! Você pode usar TextAttack para analisar qualquer modelo que produza IDs, tensores ou strings. Para ajudar os usuários, o Textattack inclui modelos pré-treinados para diferentes tarefas comuns de PNL. Isso facilita para os usuários começarem com o TextAttack. Também permite uma comparação mais justa dos ataques da literatura.
O TextAttack também vem embutido com modelos e conjuntos de dados. Nossa interface da linha de comando corresponderá automaticamente ao conjunto de dados correto com o modelo correto. Incluímos 82 modelos diferentes (de outubro de 2020) para cada uma das nove tarefas de cola, bem como alguns conjuntos de dados comuns para classificação, tradução e resumo.
Uma lista de modelos pré -terenciados disponíveis e suas precisões de validação está disponível no TextAttack/Models/Readme.md. Você também pode visualizar uma lista completa de modelos e conjuntos de dados fornecidos via textattack attack --help .
Aqui está um exemplo de uso de um dos modelos internos (o conjunto de dados SST-2 é carregado automaticamente):
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10transformers e conjuntos datasets Também fornecemos suporte interno para modelos e conjuntos de dados pré-traidos transformers do pacote datasets ! Aqui está um exemplo de carregamento e ataque de um modelo e conjunto de dados pré-treinados:
textattack attack --model-from-huggingface distilbert-base-uncased-finetuned-sst-2-english --dataset-from-huggingface glue^sst2 --recipe deepwordbug --num-examples 10 Você pode explorar outros modelos pré-treinados usando o argumento --model-from-huggingface , ou outros conjuntos de dados, alterando --dataset-from-huggingface .
Você pode experimentar facilmente um ataque em um modelo local ou amostra de conjunto de dados. Para atacar um modelo pré-treinado, crie um arquivo curto que os carregue como model de variáveis e tokenizer . O tokenizer deve ser capaz de transformar as entradas de string em listas ou tensores de IDs usando um método chamado encode() . O modelo deve receber entradas através do método __call__ .
Para experimentar um modelo que você treinou, você pode criar o seguinte arquivo e nomeá -lo 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 Em seguida, execute um ataque com o argumento --model-from-file my_model.py . O modelo e o tokenizer serão carregados automaticamente.
Carregar um conjunto de dados de um arquivo é muito semelhante ao carregar um modelo de um arquivo. Um 'conjunto de dados' é de qualquer item de pares (input, output) . O exemplo a seguir carregaria um conjunto de dados de classificação de sentimentos do arquivo my_dataset.py :
dataset = [( 'Today was....' , 1 ), ( 'This movie is...' , 0 ), ...] Em seguida, você pode executar ataques em amostras deste conjunto de dados adicionando o argumento --dataset-from-file my_dataset.py .
import textattack
my_dataset = [( "text" , label ),....]
new_dataset = textattack . datasets . Dataset ( my_dataset ) Para permitir a substituição de palavras após a sequência ter sido tokenizada, incluímos um objeto de AttackedText que mantém uma lista de tokens e o texto original, com pontuação. Usamos esse objeto a favor de uma lista de palavras ou apenas texto bruto.
Formulamos um ataque como consistido em quatro componentes: uma função de meta que determina se o ataque foi bem -sucedido, restrições definindo quais perturbações são válidas, uma transformação que gera possíveis modificações dada uma entrada e um método de pesquisa que atravessa o espaço de pesquisa de possíveis perturbações. O ataque tenta perturbar um texto de entrada, de modo que a saída do modelo cumpre a função de meta (ou seja, indicando se o ataque é bem -sucedido) e a perturbação adere ao conjunto de restrições (por exemplo, restrição gramatical, restrição de similaridade semântica). Um método de pesquisa é usado para encontrar uma sequência de transformações que produzem um exemplo adversário bem -sucedido.
Esse design modular unifica os métodos de ataque adversário em um sistema, nos permite montar facilmente ataques da literatura enquanto reutiliza componentes compartilhados entre os ataques. Fornecemos implementações limpas e legíveis de 16 receitas de ataque adversárias da literatura (veja a tabela acima). Pela primeira vez, esses ataques podem ser comparados, comparados e analisados em uma configuração padronizada.
O TextAttack é modelo -agnóstico - o que significa que pode executar ataques a modelos implementados em qualquer estrutura de aprendizado profundo. Os objetos do modelo devem poder pegar uma string (ou lista de strings) e retornar uma saída que pode ser processada pela função de meta. Por exemplo, os modelos de tradução da máquina pegam uma lista de strings como entrada e produzem uma lista de strings como saída. Os modelos de classificação e interrupção retornam uma variedade de pontuações. Enquanto o modelo do usuário atender a essa especificação, o modelo será adequado para usar com o TextAttack.
Uma GoalFunction toma como entrada um objeto AttackedText , obtém -o e determina se o ataque foi bem -sucedido, retornando um GoalFunctionResult .
Uma Constraint toma como entrada um AttackedText atual e uma lista de AttackedText transformados s. Para cada opção transformada, ele retorna um booleano representando se a restrição é atendida.
Uma Transformation toma como entrada um AttackedText e retorna uma lista de possíveis AttackedText transformados s. Por exemplo, uma transformação pode retornar todas as substituições de sinônimos possíveis.
Um SearchMethod toma como entrada um GoalFunctionResult inicial e retorna um objetivo final GoalFunctionResult que a pesquisa recebe acesso à função get_transformations , que toma como entrada um objeto AttackedText e produz uma lista de possíveis transformações filtradas através do atendimento de todas as restrições do ataque. Uma pesquisa consiste em chamadas sucessivas para get_transformations até que a pesquisa seja bem -sucedida (determinada usando get_goal_results ) ou esteja esgotado.
Consulte nosso artigo de análise: Pesquisando um método de pesquisa: Algoritmos de pesquisa de benchmarking para gerar exemplos adversários de PNL no EMNLP BlackBoxnlp.
Como enfatizamos no artigo acima, não recomendamos comparar diretamente as receitas de ataque fora da caixa.
Este comentário se deve a que as receitas de ataque na literatura recente usaram maneiras ou limiares diferentes na criação de suas restrições. Sem o espaço de restrição mantido constante, um aumento na taxa de sucesso de ataques pode vir de um método de pesquisa ou transformação aprimorado ou de um espaço de pesquisa menos restritivo.
Nosso github em scripts e resultados de benchmarking: textattack-search-benchmark github
Consulte o código de exemplo: https://github.com/qdata/textattack/blob/master/examples/attack/attack_camembert.py para usar nossa estrutura para atacar francês-bert.
Consulte o Tutorial Notebook: https://textattack.readthedocs.io/en/latest/2notebook/example_4_camembert.html para usar nossa estrutura para atacar francês-bert.
Consulte Readme_zh.md para o nosso Readme em chinês
Congratulamo -nos com sugestões e contribuições! Envie um problema ou solicitação de tração e faremos o possível para responder em tempo hábil. O Textattack está atualmente em um estágio "alfa" em que estamos trabalhando para melhorar seus recursos e design.
Consulte Contribuindo.md para obter informações detalhadas sobre contribuição.
Se você usar o TextAttack para sua pesquisa, cite o Textattack: uma estrutura para ataques adversários, aumento de dados e treinamento adversário na 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 }
}