
เอกสาร•คุณสมบัติและการใช้งาน•ตัวอย่างการใช้งาน•โมเดลการโจมตี•การออกแบบชุดเครื่องมือ
OpenAttack เป็นชุดเครื่องมือการโจมตีที่เป็นข้อความที่ใช้ในการโจมตีแบบโอเพนซอร์ส
️ สนับสนุนสำหรับการโจมตีทุกประเภท OpenAttack รองรับการโจมตีทุกประเภทรวมถึงการก่อกวนระดับประโยค/คำ/ตัวละครและการไล่ระดับสี-/คะแนน-/การตัดสินใจ/การโจมตีแบบตาบอด;
️ การพูดได้หลายภาษา OpenAttack รองรับภาษาอังกฤษและจีนในขณะนี้ การออกแบบที่ขยายได้ช่วยให้สามารถรองรับภาษาได้อย่างรวดเร็ว
️ การประมวลผลแบบขนาน OpenAttack ให้การสนับสนุนสำหรับการใช้งานแบบจำลองการโจมตีหลายครั้งเพื่อปรับปรุงประสิทธิภาพการโจมตี
️ เข้ากันได้กับ? กอดใบหน้า OpenAttack ถูกรวมเข้าด้วยกันอย่างเต็มที่? ห้องสมุดหม้อแปลงและชุดข้อมูล
️ การขยายที่ยอดเยี่ยม คุณสามารถโจมตีโมเดลเหยื่อที่กำหนดเองได้อย่างง่ายดายในชุดข้อมูลที่กำหนดเองหรือพัฒนาและประเมินและประเมินรูปแบบการโจมตีที่กำหนดเอง
✅จัดหา เส้นเขตแดน ที่มีประโยชน์ต่าง ๆ สำหรับโมเดลการโจมตี
✅ ประเมิน แบบจำลองการโจมตีอย่างละเอียดโดยใช้ตัวชี้วัดการประเมินอย่างละเอียด
✅ช่วยในการพัฒนา แบบจำลองการโจมตีใหม่ อย่างรวดเร็วด้วยความช่วยเหลือของส่วนประกอบการโจมตีทั่วไป
✅การประเมิน ความทนทาน ของรูปแบบการเรียนรู้ของเครื่องกับการโจมตีของฝ่ายตรงข้าม
✅ดำเนิน การฝึกอบรมฝ่ายตรงข้าม เพื่อปรับปรุงความทนทานของรูปแบบการเรียนรู้ของเครื่องโดยเพิ่มข้อมูลการฝึกอบรมด้วยตัวอย่างที่สร้างขึ้น
pip (แนะนำ) pip install OpenAttackgit clone https://github.com/thunlp/OpenAttack.git
cd OpenAttack
python setup.py install หลังจากการติดตั้งคุณสามารถลองใช้ demo.py เพื่อตรวจสอบว่า OpenAttack ทำงานได้ดีหรือไม่:
python demo.py

OpenAttack สร้างในรุ่น NLP ที่ใช้กันทั่วไปเช่น Bert (Devlin et al. 2018) และ Roberta (Liu et al. 2019) ที่ได้รับการปรับแต่งในชุดข้อมูลที่ใช้กันทั่วไป (เช่น SST-2) คุณสามารถทำการโจมตีที่เป็นปฏิปักษ์ต่อแบบจำลองเหยื่อเหล่านี้ได้อย่างง่ายดาย
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้ PWWS ซึ่งเป็นโมเดลการโจมตีที่ใช้อัลกอริทึมโลภ (Ren et al., 2019) เพื่อโจมตี Bert ในชุดข้อมูล SST-2 (รหัสปฏิบัติการที่สมบูรณ์อยู่ที่นี่)
import OpenAttack as oa
import datasets # use the Hugging Face's datasets library
# change the SST dataset into 2-class
def dataset_mapping ( x ):
return {
"x" : x [ "sentence" ],
"y" : 1 if x [ "label" ] > 0.5 else 0 ,
}
# choose a trained victim classification model
victim = oa . DataManager . loadVictim ( "BERT.SST" )
# choose 20 examples from SST-2 as the evaluation data
dataset = datasets . load_dataset ( "sst" , split = "train[:20]" ). map ( function = dataset_mapping )
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa . attackers . PWWSAttacker ()
# prepare for attacking
attack_eval = OpenAttack . AttackEval ( attacker , victim )
# launch attacks and print attack results
attack_eval . eval ( dataset , visualize = True )ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้ PWWS เพื่อโจมตี รูปแบบการวิเคราะห์ความเชื่อมั่นที่กำหนดเอง (แบบจำลองทางสถิติที่สร้างขึ้นใน NLTK) บน SST-2 (รหัสปฏิบัติการที่สมบูรณ์อยู่ที่นี่)
import OpenAttack as oa
import numpy as np
import datasets
import nltk
from nltk . sentiment . vader import SentimentIntensityAnalyzer
# configure access interface of the customized victim model by extending OpenAttack.Classifier.
class MyClassifier ( oa . Classifier ):
def __init__ ( self ):
# nltk.sentiment.vader.SentimentIntensityAnalyzer is a traditional sentiment classification model.
nltk . download ( 'vader_lexicon' )
self . model = SentimentIntensityAnalyzer ()
def get_pred ( self , input_ ):
return self . get_prob ( input_ ). argmax ( axis = 1 )
# access to the classification probability scores with respect input sentences
def get_prob ( self , input_ ):
ret = []
for sent in input_ :
# SentimentIntensityAnalyzer calculates scores of “neg” and “pos” for each instance
res = self . model . polarity_scores ( sent )
# we use ?????_??? / (?????_??? + ?????_???) to represent the probability of positive sentiment
# Adding 10^−6 is a trick to avoid dividing by zero.
prob = ( res [ "pos" ] + 1e-6 ) / ( res [ "neg" ] + res [ "pos" ] + 2e-6 )
ret . append ( np . array ([ 1 - prob , prob ]))
# The get_prob method finally returns a np.ndarray of shape (len(input_), 2). See Classifier for detail.
return np . array ( ret )
def dataset_mapping ( x ):
return {
"x" : x [ "sentence" ],
"y" : 1 if x [ "label" ] > 0.5 else 0 ,
}
# load some examples of SST-2 for evaluation
dataset = datasets . load_dataset ( "sst" , split = "train[:20]" ). map ( function = dataset_mapping )
# choose the costomized classifier as the victim model
victim = MyClassifier ()
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa . attackers . PWWSAttacker ()
# prepare for attacking
attack_eval = oa . AttackEval ( attacker , victim )
# launch attacks and print attack results
attack_eval . eval ( dataset , visualize = True )ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้ PWWS เพื่อโจมตีรูปแบบการวิเคราะห์ความเชื่อมั่นที่ปรับแต่งได้ที่มีอยู่ในชุดข้อมูล ที่กำหนดเอง (รหัสปฏิบัติการที่สมบูรณ์อยู่ที่นี่)
import OpenAttack as oa
import transformers
import datasets
# load a fine-tuned sentiment analysis model from Transformers (you can also use our fine-tuned Victim.BERT.SST)
tokenizer = transformers . AutoTokenizer . from_pretrained ( "echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid" )
model = transformers . AutoModelForSequenceClassification . from_pretrained ( "echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid" , num_labels = 2 , output_hidden_states = False )
victim = oa . classifiers . TransformersClassifier ( model , tokenizer , model . bert . embeddings . word_embeddings )
# choose PWWS as the attacker and initialize it with default parameters
attacker = oa . attackers . PWWSAttacker ()
# create your customized dataset
dataset = datasets . Dataset . from_dict ({
"x" : [
"I hate this movie." ,
"I like this apple."
],
"y" : [
0 , # 0 for negative
1 , # 1 for positive
]
})
# prepare for attacking
attack_eval = oa . AttackEval ( attacker , victim , metrics = [ oa . metric . EditDistance (), oa . metric . ModificationRate ()])
# launch attacks and print attack results
attack_eval . eval ( dataset , visualize = True )OpenAttack รองรับการประมวลผลที่สะดวกสบายเพื่อเร่งกระบวนการโจมตีฝ่ายตรงข้าม ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้การประมวลผลหลายครั้งในการโจมตีที่เป็นปฏิปักษ์กับพันธุกรรม (Alzantot et al. 2018) ซึ่งเป็นรูปแบบการโจมตีทางพันธุกรรมที่ใช้อัลกอริทึม (รหัสปฏิบัติการที่สมบูรณ์อยู่ที่นี่)
import OpenAttack as oa
import datasets
def dataset_mapping ( x ):
return {
"x" : x [ "sentence" ],
"y" : 1 if x [ "label" ] > 0.5 else 0 ,
}
victim = oa . loadVictim ( "BERT.SST" )
dataset = datasets . load_dataset ( "sst" , split = "train[:20]" ). map ( function = dataset_mapping )
attacker = oa . attackers . GeneticAttacker ()
attack_eval = oa . AttackEval ( attacker , victim )
# Using multiprocessing simply by specify num_workers
attack_eval . eval ( dataset , visualize = True , num_workers = 4 )ตอนนี้ OpenAttack สนับสนุนการโจมตีที่เป็นปฏิปักษ์กับผู้เสียหายจากอังกฤษและจีน นี่คือรหัสตัวอย่างของการดำเนินการโจมตีฝ่ายตรงข้ามกับรูปแบบการจำแนกประเภทการตรวจสอบของจีนโดยใช้ PWWS
OpenAttack รวมองค์ประกอบที่มีประโยชน์มากมายที่สามารถประกอบเข้ากับโมเดลการโจมตีใหม่ได้อย่างง่ายดาย ที่นี่ให้ตัวอย่างของวิธีการออกแบบรูปแบบการโจมตีอย่างง่ายที่สับโทเค็นในประโยคดั้งเดิม
OpenAttack สามารถสร้างตัวอย่างที่น่าสนใจได้อย่างง่ายดายโดยการโจมตีอินสแตนซ์ในชุดการฝึกอบรมซึ่งสามารถเพิ่มลงในชุดข้อมูลการฝึกอบรมดั้งเดิมเพื่อฝึกอบรมแบบจำลองเหยื่อที่แข็งแกร่งยิ่งขึ้นเช่นการฝึกอบรมฝ่ายตรงข้าม ที่นี่ให้ตัวอย่างของวิธีการฝึกอบรมฝ่ายตรงข้ามกับ OpenAttack
โมเดลการจำแนกคู่ประโยคการโจมตี นอกเหนือจากโมเดลการจำแนกประโยคเดียวแล้ว OpenAttack สนับสนุนการโจมตีแบบจำลองการจำแนกคู่ประโยค นี่คือรหัสตัวอย่างของการดำเนินการโจมตีฝ่ายตรงข้ามกับโมเดล NLI ด้วย OpenAttack
ตัวชี้วัดการประเมินที่กำหนดเอง OpenAttack รองรับการออกแบบตัวชี้วัดการประเมินผลการโจมตีของฝ่ายตรงข้ามที่กำหนดเอง ที่นี่ให้ตัวอย่างของวิธีการเพิ่มตัวชี้วัดการประเมินที่กำหนดเองและใช้เพื่อประเมินการโจมตีที่เป็นปฏิปักษ์
ตามระดับของการก่อกวนที่กำหนดไว้ในอินพุตต้นฉบับโมเดลการโจมตีของฝ่ายตรงข้ามที่เป็นข้อความสามารถแบ่งออกเป็นระดับประโยคระดับคำว่าการโจมตีระดับอักขระระดับ
ตามการเข้าถึงโมเดลของผู้เสียหายโมเดลการโจมตีที่เป็นข้อความที่เป็นข้อความสามารถจัดหมวดหมู่เป็นแบบจำลองการไล่ gradient ตาม score decision และการโจมตีแบบ blind
Taadpapers เป็นรายการกระดาษที่สรุปเอกสารเกือบทั้งหมดเกี่ยวกับการโจมตีและการป้องกันที่เป็นปฏิปักษ์ คุณสามารถดูรายการนี้เพื่อค้นหาโมเดลการโจมตีเพิ่มเติม
ปัจจุบัน OpenAttack มีรุ่นโจมตีทั่วไป 15 แบบกับโมเดลการจำแนกข้อความที่ครอบคลุม ทุก ประเภทการโจมตี
นี่คือรายการของโมเดลการโจมตีที่เกี่ยวข้องในปัจจุบัน
decision [PDF] [รหัส]blind [PDF] [รหัสและข้อมูล]decision [PDF] [รหัส]score [PDF] [รหัส]score [PDF] [รหัส]score [PDF] [รหัส]score [PDF] [รหัส]score [PDF] [รหัส]score [PDF] [รหัส]gradient [PDF]score gradient [PDF]gradient [PDF] [รหัส] [เว็บไซต์]gradient [PDF] [รหัส]score [PDF] [รหัสและข้อมูล]score [PDF] [รหัส]ตารางต่อไปนี้แสดงการเปรียบเทียบโมเดลการโจมตี
| แบบอย่าง | การเข้าถึงได้ | การก่อกวน | ความคิดหลัก |
|---|---|---|---|
| ทะเล | การตัดสินใจ | ประโยค | การถอดความตามกฎ |
| SCPN | ตาบอด | ประโยค | การถอดความ |
| กาน | การตัดสินใจ | ประโยค | การสร้างข้อความโดย decoder encoder |
| TextFooler | คะแนน | คำ | การทดแทนคำพูดโลภ |
| PWWS | คะแนน | คำ | การทดแทนคำพูดโลภ |
| ทางพันธุกรรม | คะแนน | คำ | การแทนที่คำที่ใช้อัลกอริทึมทางพันธุกรรม |
| กึ่ง | คะแนน | คำ | การทดแทนคำที่ใช้การเพิ่มประสิทธิภาพของฝูงอนุภาค |
| การโจมตีแบบเบิร์ต | คะแนน | คำ | การทดแทนคำศัพท์ตามบริบท |
| คนอื่น ๆ | คะแนน | คำ | การทดแทนคำและการแทรกของคำที่เป็นบริบทโลภและการแทรก |
| FD | การไล่ระดับสี | คำ | การทดแทนคำที่ใช้การไล่ระดับสี |
| นักเขียนข้อความ | การไล่ระดับสีคะแนน | Word+Char | การทดแทนคำศัพท์และการจัดการตัวละคร |
| uat | การไล่ระดับสี | Word, Char | การจัดการคำหรือตัวละครไล่ระดับสี |
| Hotflip | การไล่ระดับสี | Word, Char | คำศัพท์หรือการทดแทนตัวละคร |
| งูพิษ | ตาบอด | ถ่าน | การทดแทนตัวละครที่คล้ายกัน |
| deepwordbug | คะแนน | ถ่าน | การจัดการตัวละครโลภ |
เมื่อพิจารณาถึงความแตกต่างที่สำคัญระหว่างโมเดลการโจมตีที่แตกต่างกันเรามีอิสระอย่างมากสำหรับการออกแบบโครงกระดูกของโมเดลการโจมตีและมุ่งเน้นไปที่การปรับปรุงการประมวลผลทั่วไปของการโจมตีที่เป็นปฏิปักษ์และส่วนประกอบทั่วไปที่ใช้ในแบบจำลองการโจมตี
OpenAttack มี 7 โมดูลหลัก:

โปรดอ้างอิงกระดาษของเราหากคุณใช้ชุดเครื่องมือนี้:
@inproceedings{zeng2020openattack,
title={{Openattack: An open-source textual adversarial attack toolkit}},
author={Zeng, Guoyang and Qi, Fanchao and Zhou, Qianrui and Zhang, Tingji and Hou, Bairu and Zang, Yuan and Liu, Zhiyuan and Sun, Maosong},
booktitle={Proceedings of the 59th Annual Meeting of the Association for Computational Linguistics and the 11th International Joint Conference on Natural Language Processing: System Demonstrations},
pages={363--371},
year={2021},
url={https://aclanthology.org/2021.acl-demo.43},
doi={10.18653/v1/2021.acl-demo.43}
}
เราขอขอบคุณผู้มีส่วนร่วมทุกคนในโครงการนี้ และการมีส่วนร่วมเพิ่มเติมยินดีต้อนรับมาก