NLP 모델에 대한 적대적 예제 생성
[readthedocs에 대한 TextAntack 문서]
정보 • 설정 • 사용 • 설계
TextAtcatack은 NLP의 적대 공격, 데이터 증강 및 모델 교육을위한 파이썬 프레임 워크입니다.
Textattack의 미리 훈련 된 모델 Menagerie에 대한 정보를 찾고 있다면 TextAttack 모델 동물원 페이지를 원할 수 있습니다.
TextAtack과 관련된 도움말 및 실시간 업데이트는 Textattack Slack에 가입하십시오!
TextAtack을 사용해야하는 데는 많은 이유가 있습니다.
이 패키지를 사용하려면 Python 3.6+를 실행해야합니다. CUDA 호환 GPU는 선택 사항이지만 코드 속도를 크게 향상시킵니다. TextAthack은 PIP를 통해 사용할 수 있습니다.
pip install textattack TextAttack이 설치되면 명령 줄 ( textattack ... ) 또는 Python Module ( python -m textattack ... )을 통해 실행할 수 있습니다.
팁 : TextAttack은 파일을 기본적으로
~/.cache/textattack/로 다운로드합니다. 여기에는 사전 예방 모델, 데이터 세트 샘플 및 구성 파일config.yaml포함됩니다. 캐시 경로를 변경하려면 환경 변수TA_CACHE_DIR설정하십시오. (예 :TA_CACHE_DIR=/tmp/ textattack attack ...).
textattack --help Textattack의 주요 기능은 textattack 명령을 통해 모두 액세스 할 수 있습니다. 두 가지 매우 일반적인 명령은 textattack attack <args> , textattack augment <args> 입니다. 사용하는 모든 명령에 대한 자세한 정보를 볼 수 있습니다
textattack --help또는 예를 들어, 특정 명령
textattack attack --help examples/ 폴더에는 교육 모델, 공격 실행 및 CSV 파일 보강에 대한 일반적인 텍스트 공격 사용을 보여주는 스크립트가 포함됩니다.
문서 웹 사이트에는 맞춤형 변환 및 사용자 정의 제약 조건을 포함하여 TextAtcatack의 기본 사용법을 설명하는 연습이 포함되어 있습니다.
textattack attack --help 공격을 시도하는 가장 쉬운 방법은 명령 줄 인터페이스, textattack attack 통한 것입니다.
팁 : 컴퓨터에 여러 GPU가있는 경우
--parallel옵션을 사용하여 공격을 배포 할 수 있습니다. 일부 공격의 경우 실제로 성능에 도움이 될 수 있습니다. (케라 모델을 병렬로 공격하려면examples/attack/attack_keras_parallel.py확인하십시오)
구체적인 예는 다음과 같습니다.
Mr Sentiment Classification 데이터 세트에 대해 교육을받은 Bert의 TextFooler :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100Distilbert에 대한 Deepwordbug Quora 질문에 대해 교육을받은 Paraphrase 식별 데이터 세트 :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100LSTM에서 빔 폭 4 및 워드 임베딩 변환 및 표적화되지 않은 목표 기능을 가진 빔 검색 :
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-classification팁 : 데이터 세트와 예제 수를 지정하는 대신, 사용자가 입력 한 샘플을 공격하기 위해
--interactive전달할 수 있습니다.
textattack attack --recipe [recipe_name] 우리는 문헌의 공격을 구현하는 공격 레시피를 포함합니다. textattack list attack-recipes 사용하여 공격 레시피를 나열 할 수 있습니다.
공격 레시피를 실행하려면 : textattack attack --recipe [recipe_name]

| 레시피 이름을 공격하십시오 | 목표 기능 | 제한된 강화 | 변환 | 검색 방법 | 주요 아이디어 |
|---|---|---|---|---|---|
| 감정 분류 및 수분과 같은 분류 작업에 대한 공격 : | |||||
a2t | untargeted {분류, endailment} | 교란 된 단어의 백분율, 단어 임베딩 거리, 코사인 유사성을 인코딩하는 Distilbert 문장, 부품 일관성 | 카운터에 맞는 단어 임베딩 스왑 (또는) 마스크 마스크 토큰 예측 | Greedy-Wir (그라디언트) | ([ "NLP 모델의 적대적 훈련 개선으로"(Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544). |
alzantot | untargeted {분류, endailment} | 교란 된 단어의 백분율, 언어 모델 당연 성, 단어 임베딩 거리 | 반대 단어 임베딩 스왑 | 유전자 알고리즘 | ([ "자연 언어 적대적 사례 생성"(Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998)) |
bae | 비 표적화되지 않은 분류 | 코사인 유사성을 인코딩하는 문장을 사용하십시오 | 버트 마스크 토큰 예측 | 욕심 많은 와이어 | ([BAE : 텍스트 분류를위한 BERT 기반 적대적 예제 "(Garg & Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970)의 Bert Masked Language Model 변환 공격. |
bert-attack | 비 표적화되지 않은 분류 | 코사인 유사성을 인코딩하는 문장 사용, 최대 단어 교란 | 버트 마스크 토큰 예측 (서브 워드 확장 포함) | 욕심 많은 와이어 | ([Bert-Attack : Bert를 사용한 Bert에 대한 대적 공격 "(Li et al., 2020)] (https://arxiv.org/abs/2004.09984) |
checklist | {표적화되지 않은, 대상} 분류 | 체크리스트 거리 | 계약, 확장 및 대체 이름 엔티티 | 욕심 많은 와이어 | 체크리스트에서 구현 된 불변 테스트. ([ "정확도 이상 : 체크리스트가있는 NLP 모델의 행동 테스트"(Ribeiro et al., 2020)] (https://arxiv.org/abs/2005.04118)) |
clare | untargeted {분류, endailment} | 코사인 유사성을 인코딩하는 문장을 사용하십시오 | 로베르타는 토큰 스왑, 삽입 및 병합에 대한 마스크 예측을 마스킹했습니다 | 탐욕스러운 | [ "텍스트 적대적 공격을위한 맥락화 된 섭동"(Li et al., 2020)] (https://arxiv.org/abs/2009.07502)) |
deepwordbug | {표적화되지 않은, 대상} 분류 | Levenshtein 편집 거리 | {문자 삽입, 캐릭터 삭제, 이웃 캐릭터 스왑, 캐릭터 대체}} | 욕심 많은 와이어 | Greedy Replace-1 스코어링 및 다중 변형 문자 -Swap 공격 ([ "딥 러닝 분류기를 피하기위한 적대 텍스트 시퀀스의 블랙 박스 생성"(Gao et al., 2018)] (https://arxiv.org/abs/1801.04354) |
faster-alzantot | untargeted {분류, endailment} | 교란 된 단어의 백분율, 언어 모델 당연 성, 단어 임베딩 거리 | 반대 단어 임베딩 스왑 | 유전자 알고리즘 | Alzantot et al.의 수정 된 더 빠른 버전. ([ ""인증 된 견고성으로의 대적 단어 대체 "(Jia et al., 2019)] (https://arxiv.org/abs/1909.00986)에서 유전자 알고리즘 |
hotflip (Word Swap) | 비 표적화되지 않은 분류 | 단어를 포함하는 코사인 유사성, 부품 일치, 혐오스러운 단어 수 | 그라디언트 기반 워드 스왑 | 빔 검색 | ([ "Hotflip : 텍스트 분류를위한 화이트 박스 대적 예"(Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751)) |
iga | untargeted {분류, endailment} | 단어의 백분율 교란, 단어 임베딩 거리 | 반대 단어 임베딩 스왑 | 유전자 알고리즘 | 개선 된 유전자 알고리즘 기반 단어 기반 단어 대체 ([ "자연 언어 적대적 공격 및 단어 수준의 방어 (Wang et al., 2019)"] (https://arxiv.org/abs/1909.06723) |
input-reduction | 입력 감소 | 단어 삭제 | 욕심 많은 와이어 | 단어 중요성 순위를 가진 욕심 많은 공격, 단어 중요성 순위를 통해 예측을 유지하면서 입력을 줄이면 ([ ""신경 모델의 병리가 해석을 어렵게 만듭니다 "(Feng et al., 2018)] (https://arxiv.org/pdf/1804.07781.pdf)) | |
kuleshov | 비 표적화되지 않은 분류 | 생각 벡터 인코딩 코사인 유사성, 언어 모델 유사성 확률 | 반대 단어 임베딩 스왑 | 욕심 많은 단어 스왑 | ([ "자연 언어 분류 문제에 대한 적대적 사례"(Kuleshov et al., 2018)] (https://openreview.net/pdf?id=r1qz3zbaz) |
pruthi | 비 표적화되지 않은 분류 | 최소 단어 길이, 최대 단어 수가 있습니다 | {이웃 캐릭터 스왑, 캐릭터 삭제, 문자 삽입, 키보드 기반 문자 스왑} | 욕심 많은 검색 | 일반적인 오타를 시뮬레이션합니다 ([ ""강력한 단어 인식으로 적대적인 철자를 퇴치 "(Pruthi et al., 2019)] (https://arxiv.org/abs/1905.11268) |
pso | 비 표적화되지 않은 분류 | Hownet Word Swap | 입자 떼 최적화 | ([ "단어 수준의 텍스트 적대적 공격으로 조합 최적화"(Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/) | |
pwws | 비 표적화되지 않은 분류 | WordNet 기반 동의어 스왑 | Greedy-Wir (Saliency) | 단어 순환 순위를 가진 욕심 많은 공격 및 동의어 스왑 점수 ([ "확률 가중 단어 경화를 통한 자연 언어 적대적 사례 생성"(ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/)))) | |
textbugger : (블랙 박스) | 비 표적화되지 않은 분류 | 코사인 유사성을 인코딩하는 문장을 사용하십시오 | {문자 삽입, 캐릭터 삭제, 이웃 캐릭터 스왑, 캐릭터 대체}} | 욕심 많은 와이어 | ([[ "TextBugger : 실제 응용 프로그램에 대한 대적 텍스트 생성"(Li et al., 2018)] (https://arxiv.org/abs/1812.05271). |
textfooler | untargeted {분류, endailment} | 단어 임베딩 거리, 부품 일치, 코사인 유사성을 인코딩하는 문장 사용 | 반대 단어 임베딩 스왑 | 욕심 많은 와이어 | 단어 중요성 순위를 가진 욕심 많은 공격 ([ "Bert는 정말 강력합니까?"(Jin et al., 2019)] (https://arxiv.org/abs/1907.11932)))) |
| 시퀀스-시퀀스 모델에 대한 공격 : | |||||
morpheus | 최소 Bleu 점수 | 변곡 단어 교환 | 욕심 많은 검색 | Bleu 점수를 최소화한다는 목표로 단어를 변곡으로 바꾸는 욕심 ([ "Morphin 'Time! 언어 차별을 변곡 적 차별과 싸우는 것"] (https://www.aclweb.org/anthology/2020.acl-main.263.pdf) | |
seq2sick : (블랙 박스) | 겹치지 않는 출력 | 반대 단어 임베딩 스왑 | 욕심 많은 와이어 | 출력 변환의 모든 단어를 변경하려는 목표로 탐욕스러운 공격. 논문에서 수행 한대로 흰색 상자로 변경하려는 계획이있는 블랙 박스로 구현되었습니다 ([ "Seq2sick : 적대적 예제가있는 시퀀스--시퀀스 모델의 견고성 평가"(Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128)) | |
다음은 명령 줄에서 문헌에서 공격을 테스트하는 몇 가지 예입니다.
SST-2에서 미세 조정 된 Bert에 대한 TextFooler :
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10T5에 대한 Seq2sick (블랙 박스)은 영어-독일어 번역을 위해 미세 조정 :
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment TextAtack의 많은 구성 요소는 데이터 확대에 유용합니다. textattack.Augmenter 클래스는 변환 및 제약 조건 목록을 사용하여 데이터를 증대합니다. 또한 데이터 확대를위한 내장 레시피도 제공합니다.
wordnet 단어를 WordNet 동의어로 바꾸어 텍스트를 보강합니다embedding 코사인 유사성이 0.8 이상인지 확인하기위한 제약으로 단어를 이웃으로 바꾸어 텍스트를 증대시킵니다.charswap 인접한 문자를 대체, 삭제, 삽입 및 교환하여 텍스트를 보강합니다.eda 단어 삽입, 대체 및 삭제의 조합으로 텍스트를 보강합니다.checklist 수축/확장 및 이름, 위치, 숫자를 대체하여 텍스트를 보강합니다.clare 미리 훈련 된 마스크 언어 모델로 교체, 삽입 및 병합하여 텍스트를 보강합니다.back_trans 역전제 접근법에 의해 텍스트를 보강합니다.back_transcription 후면 전사 접근법으로 텍스트를 보강합니다. 데이터 확대 도구를 사용하는 가장 쉬운 방법은 textattack augment <args> 입니다. textattack augment 입력 CSV 파일 및 텍스트 열을 보강하여 증강 당 변경할 단어 수 및 입력 예당 증강 수를 취합니다. 적절한 열에 해당하는 모든 증강 예제와 함께 동일한 형식으로 CSV를 출력합니다.
예를 들어, 다음을 examples.csv 로 주어지면 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
명령
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 각 예제 단어의 10%를 변경하여 text 열을 확대하고 원래 입력보다 두 배나 많은 증강을 생성하고 출력 CSV에서 원래 입력을 제외합니다. (이 모든 것은 기본적으로 augment.csv 로 저장됩니다.)
팁 : 대화식 공격을 실행하는 것처럼, 사용자가 입력 한 샘플을 증강시키기 위해
--interactive통과 할 수도 있습니다.
증강 후 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
'포함'증강 레시피는 카운터 팅 가장 가까운 임베딩을 사용하여 데이터를 보강합니다.
명령 줄 인터페이스 외에도 자체 코드에서 Augmenter 가져 와서 텍스트를 동적으로 증강시킬 수 있습니다. 모든 Augmenter 객체는 스트링 또는 문자열 목록의 증강을 생성하기 위해 augment 및 augment_many 구현합니다. 다음은 Python 스크립트에서 EmbeddingAugmenter 사용하는 방법의 예입니다.
> >> 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.' ] 또한 textattack.transformations and textattack.constraints 에서 변환/제약을 가져 와서 처음부터 처음부터 자신의 증강기를 만들 수 있습니다. 다음은 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.' ] 일반 텍스트의 증강에 추가로 프롬프트를 확대 한 다음 LLM (Langues Model)을 사용하여 보강 된 프롬프트에 대한 응답을 생성 할 수 있습니다. 증강은 위와 동일한 Augmenter 사용하여 수행됩니다. 응답을 생성하려면 자신의 LLM, Huggingface LLM 또는 OpenAi LLM을 사용할 수 있습니다. 다음은 사전에 취한 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 당사의 모델 교육 코드는 textattack train 통해 LSTM, CNN 및 transformers 모델을 사용하여 TextAtack을 통해 제공됩니다. 데이터 세트는 datasets 패키지를 사용하여 자동으로로드됩니다.
Yelp 극성 데이터 세트에서 50 개의 에포크에 대한 기본 LSTM을 교육하십시오.
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 5 개의 epochs *에 대한 CoLA 데이터 세트의 미세 조정 bert-base *:
textattack train --model-name-or-path bert-base-uncased --dataset glue^cola --per-device-train-batch-size 8 --epochs 5textattack peek-dataset 데이터 세트를 자세히 살펴 보려면 textattack peek-dataset 사용하십시오. TextAttack은 데이터 세트의 입력 및 출력에 대한 약간의 커서 통계를 인쇄합니다. 예를 들어,
textattack peek-dataset --dataset-from-huggingface snliNLP 패키지에서 SNLI 데이터 세트에 대한 정보가 표시됩니다.
textattack list TextAtcatack에는 많은 부분이 있으며, 모든 것을 추적하기가 어려울 수 있습니다. textattack list 사용하여 구성 요소 (예 : 사전 미세 textattack list models ) 또는 사용 가능한 검색 방법 ( textattack list search-methods )과 같은 구성 요소를 나열 할 수 있습니다.
TextATCACK은 모델에 대한 정보입니다! TextAttack 사용하여 ID, 텐서 또는 문자열을 출력하는 모든 모델을 분석 할 수 있습니다. 사용자를 돕기 위해 TextAtack에는 다양한 일반적인 NLP 작업에 대한 미리 훈련 된 모델이 포함되어 있습니다. 이를 통해 사용자가 TextAtack을보다 쉽게 시작할 수 있습니다. 또한 문헌의 공격을보다 공정하게 비교할 수 있습니다.
Textattack에는 모델과 데이터 세트가 내장되어 있습니다. 명령 줄 인터페이스는 올바른 데이터 세트를 올바른 모델과 자동으로 일치시킵니다. 9 개의 접착제 작업 각각에 대해 82 개의 다른 (2020 년 10 월) 사전 훈련 된 모델과 분류, 번역 및 요약을위한 일부 일반적인 데이터 세트를 포함합니다.
사용할 수있는 사전 처리 된 모델 및 유효성 검사 정확도 목록은 TextAttack/Models/Readme.md에서 제공됩니다. textattack attack --help 를 통해 제공된 모델 및 데이터 세트의 전체 목록을 볼 수도 있습니다.
다음은 내장 모델 중 하나를 사용하는 예입니다 (SST-2 데이터 세트가 자동으로로드 됨).
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10transformers 모델 및 datasets 데이터 세트 또한 datasets 패키지의 transformers 전세 모델 및 데이터 세트에 대한 내장 지원을 제공합니다! 다음은 미리 훈련 된 모델 및 데이터 세트를로드 및 공격하는 예입니다.
textattack attack --model-from-huggingface distilbert-base-uncased-finetuned-sst-2-english --dataset-from-huggingface glue^sst2 --recipe deepwordbug --num-examples 10 --model-from-huggingface 인수 또는 --dataset-from-huggingface 변경하여 다른 데이터 세트를 사용하여 사전 훈련 된 모델을 탐색 할 수 있습니다.
로컬 모델 또는 데이터 세트 샘플에 대한 공격을 쉽게 시도 할 수 있습니다. 미리 훈련 된 모델을 공격하려면 변수 model 및 tokenizer 로로드하는 짧은 파일을 만듭니다. tokenizer encode() 라는 메소드를 사용하여 문자열 입력을 ID의 목록 또는 텐서로 변환 할 수 있어야합니다. 모델은 __call__ 메소드를 통해 입력을 가져와야합니다.
교육을받은 모델을 실험하려면 다음 파일을 만들고 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 그런 다음 인수 --model-from-file my_model.py 로 공격을 실행하십시오. 모델과 토큰 화기가 자동으로로드됩니다.
파일에서 데이터 세트를로드하는 것은 파일에서 모델을로드하는 것과 매우 유사합니다. '데이터 세트'는 반복 할 수 있습니다 (input, output) 쌍. 다음 예제는 my_dataset.py 파일에서 감정 분류 데이터 세트를로드합니다.
dataset = [( 'Today was....' , 1 ), ( 'This movie is...' , 0 ), ...] 그런 다음 --dataset-from-file my_dataset.py 추가 하여이 데이터 세트의 샘플에 대한 공격을 실행할 수 있습니다.
import textattack
my_dataset = [( "text" , label ),....]
new_dataset = textattack . datasets . Dataset ( my_dataset ) 시퀀스가 토큰 화 된 후 단어 교체를 허용하기 위해, 우리는 구두점과 함께 토큰 목록과 원본 텍스트 목록을 모두 유지하는 AttackedText 객체를 포함합니다. 우리는이 개체를 단어 목록이나 원시 텍스트를 선호하여 사용합니다.
우리는 네 가지 구성 요소로 구성된 공격을 공식화합니다. 공격이 성공했는지 여부를 결정하는 목표 함수 , 어떤 섭동이 유효한지 정의하는 제약 조건 , 입력이 주어지면 잠재적 수정을 생성하는 변환 및 가능한 섭동의 검색 공간을 통과하는 검색 방법 . 이 공격은 모델 출력이 목표 함수 (즉, 공격이 성공했는지 여부를 나타내는) 및 섭동이 구속 조건 (예 : 문법 제약, 의미 론적 유사성 제약 조건)을 준수하도록 입력 텍스트를 교란 시키려고 시도합니다. 검색 방법은 성공적인 대적 예를 생성하는 일련의 변환을 찾는 데 사용됩니다.
이 모듈 식 디자인은 적대적 공격 방법을 하나의 시스템으로 통합하여 문헌의 공격을 쉽게 조립하면서 공격을 통해 공유되는 구성 요소를 재사용 할 수 있습니다. 우리는 문헌에서 16 개의 대적 공격 레시피를 깨끗하고 읽을 수있는 구현을 제공합니다 (위 표 참조). 처음으로 이러한 공격은 표준화 된 설정에서 벤치마킹, 비교 및 분석 할 수 있습니다.
TextAtcatack은 모델에 대한 정보를 제공합니다. 즉, 딥 러닝 프레임 워크에서 구현 된 모델에 대한 공격을 실행할 수 있습니다. 모델 객체는 문자열 (또는 문자열 목록)을 가져 와서 목표 기능으로 처리 할 수있는 출력을 반환 할 수 있어야합니다. 예를 들어, 기계 번역 모델은 문자열 목록을 입력으로 취하고 출력으로 문자열 목록을 생성합니다. 분류 및 수정 모델은 다양한 점수를 반환합니다. 사용자 모델 이이 사양을 충족하는 한 모델은 TextAtcatack과 함께 사용하기에 적합합니다.
GoalFunction AttackedText 객체를 입력하고 점수를 매기고 공격이 성공했는지 여부를 결정하여 GoalFunctionResult 반환합니다.
Constraint 현재 AttackedText 입력하고 변환 된 AttackedText 텍스트 목록을 입력하는 것으로 간주됩니다. 변환 된 각 옵션에 대해 제약 조건이 충족되는지 여부를 나타내는 부울을 반환합니다.
Transformation AttackedText 입력하고 가능한 변환 된 AttackedText 텍스트 목록을 반환합니다. 예를 들어, 변환은 가능한 모든 동의어 교체를 반환 할 수 있습니다.
SearchMethod 초기 GoalFunctionResult 입력하고 최종 GoalFunctionResult 반환합니다. 검색은 get_transformations 함수에 대한 액세스 권한이 주어지며, 이는 AttackedText 객체를 입력하고 모든 공격의 제약 조건을 충족시켜 필터링 된 가능한 변환 목록을 출력합니다. 검색은 검색이 성공하거나 ( get_goal_results 사용하여 결정) 소진 될 때까지 get_transformations 에 대한 연속적인 호출로 구성됩니다.
분석 논문 : 검색 방법 검색 : EMNLP BlackBoxNLP에서 NLP 적대적 예제를 생성하기위한 검색 알고리즘 벤치마킹 알고리즘.
위의 논문에서 강조했듯이, 우리는 상자 밖에서 공격 레시피를 직접 비교하는 것이 좋습니다.
이 의견은 최근 문헌의 공격 레시피가 제약을 설정하는 데 다른 방법이나 임계 값을 사용했기 때문입니다. 제약 공간이 일정하게 유지되지 않으면, 공격 성공률의 증가는 개선 된 검색 또는 변환 방법 또는 덜 제한적인 검색 공간에서 비롯 될 수 있습니다.
벤치마킹 스크립트 및 결과에 대한 GitHub : TextAtcatack-Search-Benchmark Github
프레임 워크를 사용하여 French-Bert를 공격하기 위해 코드 예제 코드를 참조하십시오.
프레임 워크를 사용하여 French-Bert를 공격하기 위해 튜토리얼 노트북 : https://textattack.readthedocs.io/en/latest/2notebook/example_4_camembert.html을 참조하십시오.
README에 대한 ReadMe_Zh.md를 참조하십시오
우리는 제안과 기여를 환영합니다! 문제를 제출하거나 요청을 당기면 적시에 응답하기 위해 최선을 다하겠습니다. Textattack은 현재 "알파"단계에 있으며 기능과 디자인을 개선하기 위해 노력하고 있습니다.
기여에 대한 자세한 정보는 Contributing.md를 참조하십시오.
연구에 TextAtcatack을 사용하는 경우 NLP의 적대적 공격, 데이터 확대 및 대적 교육을위한 TextAtack : Framework를 인용하십시오.
@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 }
}