การสร้างตัวอย่างที่เป็นปฏิปักษ์สำหรับรุ่น NLP
[TextAttack Documentation เกี่ยวกับ ReadtheDocs]
เกี่ยวกับ•การตั้งค่า•การใช้งาน•การออกแบบ
TextAttack เป็นเฟรมเวิร์ก Python สำหรับการโจมตีที่เป็นปฏิปักษ์การเพิ่มข้อมูลและการฝึกอบรมแบบจำลองใน NLP
หากคุณกำลังมองหาข้อมูลเกี่ยวกับโรงละครสัตว์ของ TextAttack เกี่ยวกับรุ่นที่ผ่านการฝึกอบรมมาก่อนคุณอาจต้องการหน้าสวนสัตว์ TextAttack Model
สำหรับความช่วยเหลือและการอัปเดตเรียลไทม์ที่เกี่ยวข้องกับ TextAttack โปรดเข้าร่วม Textattack Slack!
มีเหตุผลมากมายในการใช้ Textattack:
คุณควรใช้ Python 3.6+ เพื่อใช้แพ็คเกจนี้ GPU ที่เข้ากันได้กับ CUDA นั้นเป็นทางเลือก แต่จะปรับปรุงความเร็วของรหัสได้อย่างมาก Textattack สามารถใช้งานได้ผ่าน PIP:
pip install textattack เมื่อติดตั้ง TextAttack แล้วคุณสามารถเรียกใช้ผ่านคำสั่งบรรทัด ( textattack ... ) หรือผ่านโมดูล Python ( python -m textattack ... )
เคล็ดลับ : TextAttack ดาวน์โหลดไฟล์เป็น
~/.cache/textattack/โดยค่าเริ่มต้น ซึ่งรวมถึงโมเดล pretrained ตัวอย่างชุดข้อมูลและไฟล์กำหนดค่า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
เว็บไซต์เอกสารประกอบด้วยคำแนะนำที่อธิบายการใช้งานพื้นฐานของ Textattack รวมถึงการสร้างการแปลงที่กำหนดเองและข้อ จำกัด ที่กำหนดเอง ..
textattack attack --help วิธีที่ง่ายที่สุดในการทดลองใช้การโจมตีคือผ่านอินเตอร์เฟสบรรทัดคำสั่ง textattack attack
เคล็ดลับ: หากเครื่องของคุณมี GPU หลายตัวคุณสามารถแจกจ่ายการโจมตีข้ามพวกเขาโดยใช้ตัวเลือก
--parallelขนาน สำหรับการโจมตีบางอย่างสิ่งนี้สามารถช่วยประสิทธิภาพได้อย่างแท้จริง (หากคุณต้องการโจมตีโมเดล Keras ในคู่ขนานโปรดตรวจสอบexamples/attack/attack_keras_parallel.pyแทน)
นี่คือตัวอย่างที่เป็นรูปธรรม:
TextFooler บน BERT ที่ผ่านการฝึกอบรมเกี่ยวกับชุดข้อมูลการจำแนกความเชื่อมั่น MR :
textattack attack --recipe textfooler --model bert-base-uncased-mr --num-examples 100DeepWordBug บน Distilbert ที่ผ่านการฝึกอบรมเกี่ยวกับชุดข้อมูลการระบุตัวตนของ Quora คำถามการระบุตัวตน :
textattack attack --model distilbert-base-uncased-cola --recipe deepwordbug --num-examples 100การค้นหาลำแสงด้วยความกว้างของลำแสง 4 และการเปลี่ยนแปลงการฝังคำและฟังก์ชั่นเป้าหมายที่ไม่ได้กำหนดเป้าหมายบน 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-classificationเคล็ดลับ: แทนที่จะระบุชุดข้อมูลและจำนวนตัวอย่างคุณสามารถผ่าน
--interactiveเพื่อโจมตีตัวอย่างที่ผู้ใช้ป้อนเข้า
textattack attack --recipe [recipe_name] เรารวมสูตรการโจมตีที่ใช้การโจมตีจากวรรณกรรม คุณสามารถแสดงรายการสูตรการโจมตีโดยใช้ textattack list attack-recipes
ในการเรียกใช้สูตรการโจมตี: textattack attack --recipe [recipe_name]

| ชื่อสูตรโจมตี | ฟังก์ชั่นเป้าหมาย | มีข้อ จำกัด | การเปลี่ยนแปลง | วิธีการค้นหา | ความคิดหลัก |
|---|---|---|---|---|---|
| การโจมตีงานการจำแนกประเภทเช่นการจำแนกความเชื่อมั่นและการเข้าร่วม: | |||||
a2t | {การจำแนกประเภท {การจำแนก, entailment} | เปอร์เซ็นต์ของคำที่ถูกรบกวนระยะการฝังคำ, distilbert ประโยคความคล้ายคลึงกันของการเข้ารหัสโคไซน์, ความสอดคล้องส่วนหนึ่งของการพูด | คำตอบการเบี่ยงเบนของคำตอบแบบฝังตัว (หรือ) การทำนายโทเค็น | Greedy-Wir (ไล่ระดับสี) | จาก (["ไปสู่การปรับปรุงการฝึกอบรมที่เป็นปฏิปักษ์ของโมเดล NLP" (Yoo et al., 2021)] (https://arxiv.org/abs/2109.00544))) |
alzantot | {การจำแนกประเภท {การจำแนก, entailment} | เปอร์เซ็นต์ของคำที่รบกวนรูปแบบภาษาที่น่างงงวยระยะการฝังคำ | การแลกเปลี่ยนการฝังคำตอบแบบเคาน์เตอร์ | อัลกอริทึมทางพันธุกรรม | จาก (["การสร้างตัวอย่างที่เป็นปฏิปักษ์กับภาษาธรรมชาติ" (Alzantot et al., 2018)] (https://arxiv.org/abs/1804.07998))) |
bae | การจำแนกประเภท | ใช้ความคล้ายคลึงกันของการเข้ารหัสประโยค | การทำนายโทเค็นของเบิร์ต | ลุ่มน้ำ | Bert Masked Language Model Transformation Attack จาก (["BAE: ตัวอย่างของ Bert ที่ใช้ Bert สำหรับการจำแนกประเภทข้อความ" (Garg & Ramakrishnan, 2019)] (https://arxiv.org/abs/2004.01970)) |
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 | {การจำแนกประเภท {การจำแนก, entailment} | ใช้ความคล้ายคลึงกันของการเข้ารหัสประโยค | Roberta Masked Prediction สำหรับการแลกเปลี่ยนโทเค็นแทรกและผสาน | โลภ | ["การก่อกวนบริบทสำหรับการโจมตีที่เป็นข้อความที่เป็นข้อความ" (Li et al., 2020)] (https://arxiv.org/abs/2009.07502)) |
deepwordbug | {การจำแนกประเภท {ไม่ตรงเป้าหมาย} | ระยะทาง Levenshtein แก้ไข | {การแทรกอักขระ, การลบอักขระ, การแลกเปลี่ยนอักขระใกล้เคียง, การทดแทนตัวละคร} | ลุ่มน้ำ | Greedy แทนที่ -1 การให้คะแนนและการโจมตีตัวละครหลายตัว (["การสร้างกล่องดำของลำดับข้อความที่เป็นปฏิปักษ์เพื่อหลบเลี่ยงตัวแยกประเภทการเรียนรู้ลึก" (Gao et al., 2018)] (https://arxiv.org/abs/1801.04354)) |
faster-alzantot | {การจำแนกประเภท {การจำแนก, entailment} | เปอร์เซ็นต์ของคำที่รบกวนรูปแบบภาษาที่น่างงงวยระยะการฝังคำ | การแลกเปลี่ยนการฝังคำตอบแบบเคาน์เตอร์ | อัลกอริทึมทางพันธุกรรม | ดัดแปลงรุ่นที่เร็วขึ้นของ Alzantot และคณะ อัลกอริทึมทางพันธุกรรมจาก (["ความทนทานที่ได้รับการรับรองถึงการแทนที่คำศัพท์ที่เป็นปฏิปักษ์" (Jia et al., 2019)] (https://arxiv.org/abs/1909.00986)))))))))))))))) |
hotflip (swap คำ) | การจำแนกประเภท | ความคล้ายคลึงกันของการฝังคำว่าการจับคู่ส่วนหนึ่งของคำพูดจำนวนคำที่ถูกรบกวน | การแลกเปลี่ยนคำที่ใช้ไล่ระดับสี | การค้นหาลำแสง | (["Hotflip: ตัวอย่างที่น่ากลัวของกล่องสีขาวสำหรับการจำแนกประเภทข้อความ" (Ebrahimi et al., 2017)] (https://arxiv.org/abs/1712.06751))))))))))))))))))) |
iga | {การจำแนกประเภท {การจำแนก, entailment} | เปอร์เซ็นต์ของคำที่ถูกรบกวนระยะการฝังคำ | การแลกเปลี่ยนการฝังคำตอบแบบเคาน์เตอร์ | อัลกอริทึมทางพันธุกรรม | ปรับปรุงอัลกอริทึมทางพันธุกรรม -การแทนที่คำที่ใช้จาก (["การโจมตีและการป้องกันที่เป็นปฏิปักษ์กับภาษาธรรมชาติในระดับ Word (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 swap | การเพิ่มประสิทธิภาพฝูงอนุภาค | (["คำศัพท์ที่เป็นข้อความการโจมตีที่เป็นปฏิปักษ์ต่อการเพิ่มประสิทธิภาพ combinatorial" (Zang et al., 2020)] (https://www.aclweb.org/anthology/2020.acl-main.540/))) | |
pwws | การจำแนกประเภท | SWAP คำพ้องความหมายตาม WordNet | Greedy-Wir (ความสามารถ) | การโจมตีด้วยความโลภด้วยการจัดอันดับความสำคัญของคำอิงจากคำพูดและการแลกเปลี่ยนคำพ้องความหมาย (["การสร้างตัวอย่างที่เป็นปฏิปักษ์ต่อภาษาธรรมชาติผ่านความน่าจะเป็นคำพูดถ่วงน้ำหนักคำพูด" (Ren et al., 2019)] (https://www.aclweb.org/anthology/p19-1103/) | |
textbugger : (Black-Box) | การจำแนกประเภท | ใช้ความคล้ายคลึงกันของการเข้ารหัสประโยค | {การแทรกอักขระ, การลบอักขระ, การแลกเปลี่ยนอักขระใกล้เคียง, การทดแทนตัวละคร} | ลุ่มน้ำ | ([(["Textbugger: การสร้างข้อความที่เป็นปฏิปักษ์กับแอปพลิเคชันโลกแห่งความเป็นจริง" (Li et al., 2018)] (https://arxiv.org/abs/1812.05271)) |
textfooler | {การจำแนกประเภท {การจำแนก, entailment} | ระยะการฝังคำ, การจับคู่ส่วนหนึ่งของคำพูด, ใช้ความคล้ายคลึงกันของการเข้ารหัสประโยคประโยค | การแลกเปลี่ยนการฝังคำตอบแบบเคาน์เตอร์ | ลุ่มน้ำ | การโจมตีด้วยความโลภด้วยการจัดอันดับความสำคัญของคำ (["เบิร์ตมีความแข็งแกร่งจริงหรือไม่?" (Jin et al., 2019)] (https://arxiv.org/abs/1907.11932))) |
| การโจมตีแบบจำลองลำดับต่อลำดับ: | |||||
morpheus | คะแนน Bleu ขั้นต่ำ | การแลกเปลี่ยนคำที่ผัน | การค้นหาโลภ | โลภที่จะแทนที่คำพูดด้วยการผันของพวกเขาโดยมีเป้าหมายเพื่อลดคะแนน Bleu (["มันเป็นเวลาของ Morphin! การต่อสู้กับการเลือกปฏิบัติทางภาษากับการก่อกวนแบบผัน"] (https://www.aclweb.org/anthology/2020.acl-main.263.pdf) | |
seq2sick : (Black-Box) | เอาต์พุตที่ไม่ทับซ้อนกัน | การแลกเปลี่ยนการฝังคำตอบแบบเคาน์เตอร์ | ลุ่มน้ำ | การโจมตีโลภโดยมีเป้าหมายในการเปลี่ยนทุกคำในการแปลผล ปัจจุบันใช้เป็นกล่องดำที่มีแผนจะเปลี่ยนเป็นกล่องสีขาวตามที่ทำในกระดาษ (["SEQ2SICK: การประเมินความทนทานของแบบจำลองลำดับตามลำดับด้วยตัวอย่างที่เป็นปฏิปักษ์" (Cheng et al., 2018)] (https://arxiv.org/abs/1803.01128) | |
นี่คือตัวอย่างของการทดสอบการโจมตีจากวรรณกรรมจากบรรทัดคำสั่ง:
TextFooler กับ Bert ได้รับการปรับแต่งบน SST-2:
textattack attack --model bert-base-uncased-sst2 --recipe textfooler --num-examples 10SEQ2SICK (Black-Box) กับ T5 ปรับแต่งสำหรับการแปลภาษาอังกฤษ-เยอรมัน:
textattack attack --model t5-en-de --recipe seq2sick --num-examples 100textattack augment ส่วนประกอบของ Textattack จำนวนมากมีประโยชน์สำหรับการเพิ่มข้อมูล คลาส textattack.Augmenter ใช้การแปลงและรายการข้อ จำกัด ในการเพิ่มข้อมูล นอกจากนี้เรายังเสนอสูตรในตัวสำหรับการเพิ่มข้อมูล:
wordnet เพิ่มข้อความโดยแทนที่คำด้วยคำพ้องความหมายของ WordNetembedding ข้อความเพิ่มข้อความโดยแทนที่คำศัพท์กับเพื่อนบ้านในพื้นที่ฝังตัวที่เคาน์เตอร์พร้อมข้อ จำกัด เพื่อให้แน่ใจว่าความคล้ายคลึงกันของโคไซน์ของพวกเขามีความคล้ายคลึงกันอย่างน้อย 0.8charswap เพิ่มข้อความโดยการแทนที่การลบการแทรกและการสลับอักขระที่อยู่ติดกันeda เพิ่มข้อความด้วยการผสมผสานของคำแทรกคำแทนที่และการลบchecklist เพิ่มข้อความโดยการหดตัว/ส่วนขยายและโดยการแทนที่ชื่อสถานที่ตั้งตัวเลขclare Augments ข้อความโดยการแทนที่การแทรกและการรวมเข้ากับรูปแบบภาษาที่สวมหน้ากากที่ผ่านการฝึกอบรมมาล่วงหน้าback_trans เพิ่มข้อความด้วยวิธีการ backtranslationback_transcription เพิ่มข้อความโดยวิธีการถอดความด้านหลัง วิธีที่ง่ายที่สุดในการใช้เครื่องมือเสริมข้อมูลของเราคือ textattack augment <args> textattack augment ใช้ไฟล์ CSV อินพุตและคอลัมน์ข้อความเพื่อเพิ่มพร้อมกับจำนวนคำที่จะเปลี่ยนต่อการเพิ่มและจำนวนการเพิ่มต่อตัวอย่างอินพุต มันส่งออก CSV ในรูปแบบเดียวกันกับตัวอย่างการเสริมทั้งหมดที่สอดคล้องกับคอลัมน์ที่เหมาะสม
ตัวอย่างเช่นให้ตัวอย่างต่อไปนี้เป็น 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
คำสั่ง
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 จะเพิ่มคอลัมน์ text โดยการเปลี่ยน 10% ของคำของแต่ละตัวอย่างสร้างการเพิ่มจำนวนมากเป็นสองเท่าเป็นอินพุตดั้งเดิมและไม่รวมอินพุตดั้งเดิมจากเอาต์พุต 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
สูตรการเสริม 'การฝัง' ใช้การฝังตัวที่ติดตั้งแบบ neighbors ที่ใกล้ที่สุดเพื่อเพิ่มข้อมูล
นอกเหนือจากอินเทอร์เฟซบรรทัดคำสั่งคุณสามารถเพิ่มข้อความแบบไดนามิกได้โดยการนำเข้า Augmenter ในรหัสของคุณเอง วัตถุ Augmenter ทั้งหมดใช้ augment และ augment_many เพื่อสร้างการเพิ่มสตริงหรือรายการสตริง นี่คือตัวอย่างของวิธีการใช้ EmbeddingAugmenter ในสคริปต์ 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.' ] นอกจากนี้คุณยังสามารถสร้าง Augmenter ของคุณเองได้ตั้งแต่เริ่มต้นด้วยการนำเข้าการแปลง/ข้อ จำกัด จาก textattack.transformations . การเปลี่ยนรูปแบบและ 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.' ] นอกเหนือจากการเพิ่มข้อความปกติคุณสามารถเพิ่มพรอมต์แล้วสร้างการตอบสนองต่อพรอมต์ที่เพิ่มขึ้นโดยใช้แบบจำลองภาษาขนาดใหญ่ (LLMS) การเสริมจะดำเนินการโดยใช้ 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 เพื่อช่วยคุณฝึกอบรม LSTMS, CNNs และ transformers รุ่นโดยใช้ TextAttack นอกกรอบ ชุดข้อมูลจะถูกโหลดโดยอัตโนมัติโดยใช้แพ็คเกจชุด datasets
ฝึกอบรม LSTM เริ่มต้นของเราสำหรับ 50 Epochs ในชุดข้อมูล Oelp Polarity:
textattack train --model-name-or-path lstm --dataset yelp_polarity --epochs 50 --learning-rate 1e-5 ปรับแต่ง bert-base บนชุดข้อมูล CoLA สำหรับ 5 Epochs *:
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 snliจะแสดงข้อมูลเกี่ยวกับชุดข้อมูล SNLI จากแพ็คเกจ NLP
textattack list มีชิ้นส่วนมากมายใน Textattack และอาจเป็นเรื่องยากที่จะติดตามพวกเขาทั้งหมด คุณสามารถใช้ textattack list เพื่อแสดงรายการส่วนประกอบตัวอย่างเช่นโมเดลที่ผ่านการฝึกอบรม ( textattack list models ) หรือวิธีการค้นหาที่มีอยู่ ( textattack list search-methods )
TextAttack เป็นรุ่นที่ไม่เชื่อเรื่องพระเจ้า! คุณสามารถใช้ TextAttack เพื่อวิเคราะห์โมเดลใด ๆ ที่ส่งออก ID, เทนเซอร์หรือสตริง เพื่อช่วยผู้ใช้ TextAttack รวมโมเดลที่ผ่านการฝึกอบรมมาล่วงหน้าสำหรับงาน NLP ทั่วไปที่แตกต่างกัน สิ่งนี้ทำให้ผู้ใช้เริ่มต้นใช้งาน TextAttack ได้ง่ายขึ้น นอกจากนี้ยังช่วยให้การเปรียบเทียบการโจมตีจากวรรณกรรมเป็นธรรมมากขึ้น
Textattack ยังมาพร้อมกับรุ่นและชุดข้อมูล อินเทอร์เฟซบรรทัดคำสั่งของเราจะตรงกับชุดข้อมูลที่ถูกต้องกับโมเดลที่ถูกต้องโดยอัตโนมัติ เรารวมโมเดลที่ได้รับการฝึกอบรมล่วงหน้า 82 (ต.ค. 2020) สำหรับงานกาวเก้างานรวมถึงชุดข้อมูลทั่วไปสำหรับการจำแนกประเภทการแปลและการสรุป
รายการของรุ่นที่มีอยู่ก่อนหน้านี้และความถูกต้องการตรวจสอบความถูกต้องของพวกเขามีให้ที่ TextAttack/Models/Readme.md นอกจากนี้คุณยังสามารถดูรายการเต็มรูปแบบและชุดข้อมูลที่ให้ผ่าน textattack attack --help
นี่คือตัวอย่างของการใช้หนึ่งในโมเดลในตัว (ชุดข้อมูล SST-2 ถูกโหลดโดยอัตโนมัติ):
textattack attack --model roberta-base-sst2 --recipe textfooler --num-examples 10transformers และชุด datasets ชุดข้อมูล นอกจากนี้เรายังให้การสนับสนุนในตัวสำหรับโมเดลและชุดข้อมูลที่ได้รับการฝึกฝนจาก transformers จากแพ็คเกจชุด datasets ! นี่คือตัวอย่างของการโหลดและโจมตีโมเดลและชุดข้อมูลที่ผ่านการฝึกอบรมมาก่อน:
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 จะต้องสามารถแปลงอินพุตสตริงเป็นรายการหรือเทนเซอร์ของ ID โดยใช้วิธีที่เรียกว่า encode() โมเดลจะต้องใช้อินพุตผ่านวิธี __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 โมเดลและโทเค็นจะถูกโหลดโดยอัตโนมัติ
การโหลดชุดข้อมูลจากไฟล์คล้ายกับการโหลดโมเดลจากไฟล์ A 'ชุดข้อมูล' เป็นคู่ (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 ) เพื่อให้สามารถเปลี่ยนคำได้หลังจากลำดับได้รับการ tokenized เราได้รวมวัตถุ AttackedText ซึ่งรักษาทั้งรายการของโทเค็นและข้อความต้นฉบับด้วยเครื่องหมายวรรคตอน เราใช้วัตถุนี้เพื่อแสดงรายการคำหรือเพียงแค่ข้อความดิบ
เรากำหนดการโจมตีที่ประกอบด้วยสี่องค์ประกอบ: ฟังก์ชั่นเป้าหมาย ที่กำหนดว่าการโจมตีประสบความสำเร็จหรือไม่ ข้อ จำกัด ที่กำหนดว่าการก่อกวนใดที่ถูกต้องการ เปลี่ยนแปลง ที่ สร้างการปรับเปลี่ยนที่เป็นไปได้ การโจมตีพยายามที่จะรบกวนข้อความอินพุตเพื่อให้โมเดลเอาท์พุทเติมเต็มฟังก์ชั่นเป้าหมาย (เช่นแสดงว่าการโจมตีประสบความสำเร็จ) และการก่อกวนเป็นไปตามชุดของข้อ จำกัด (เช่นข้อ จำกัด ไวยากรณ์ข้อจำกัดความคล้ายคลึงกันของความหมาย) วิธีการค้นหาใช้เพื่อค้นหาลำดับของการแปลงที่สร้างตัวอย่างที่ประสบความสำเร็จ
การออกแบบแบบแยกส่วนนี้รวมวิธีการโจมตีที่เป็นปฏิปักษ์ไว้ในระบบเดียวทำให้เราสามารถรวบรวมการโจมตีจากวรรณกรรมได้อย่างง่ายดายในขณะที่ใช้ส่วนประกอบที่ใช้ร่วมกันในการโจมตี เราให้การใช้งานที่สะอาดและอ่านง่ายของสูตรการโจมตีที่เป็นปฏิปักษ์ 16 ครั้งจากวรรณกรรม (ดูตารางด้านบน) เป็นครั้งแรกที่การโจมตีเหล่านี้สามารถเปรียบเทียบเปรียบเทียบและวิเคราะห์ในการตั้งค่าที่ได้มาตรฐาน
TextAttack เป็นแบบจำลอง - ความหมาย - หมายความว่ามันสามารถเรียกใช้การโจมตีในโมเดลที่ใช้ในกรอบการเรียนรู้ลึกใด ๆ วัตถุโมเดลจะต้องสามารถใช้สตริง (หรือรายการสตริง) และส่งคืนผลลัพธ์ที่สามารถประมวลผลได้โดยฟังก์ชั่นเป้าหมาย ตัวอย่างเช่นโมเดลการแปลของเครื่องจะใช้รายการสตริงเป็นอินพุตและสร้างรายการสตริงเป็นเอาต์พุต รูปแบบการจำแนกประเภทและ entailment ส่งคืนอาร์เรย์ของคะแนน ตราบใดที่โมเดลของผู้ใช้เป็นไปตามข้อกำหนดนี้โมเดลก็เหมาะสมที่จะใช้กับ TextAttack
GoalFunction ใช้เป็นอินพุตวัตถุ AttackedText ทำคะแนนและกำหนดว่าการโจมตีประสบ GoalFunctionResult สำเร็จหรือไม่
Constraint ใช้เป็นอินพุต AttackedText ปัจจุบันและรายการของ Transformed AttackedText s สำหรับตัวเลือกที่ถูกแปลงแต่ละตัวจะส่งคืนบูลีนที่เป็นตัวแทนว่าจะพบข้อ จำกัด หรือไม่
Transformation ใช้เป็นอินพุต AttackedText และส่งคืนรายการของ Transformed AttackedText s ที่เป็นไปได้ ตัวอย่างเช่นการแปลงอาจส่งคืนการเปลี่ยนคำพ้องความหมายที่เป็นไปได้ทั้งหมด
SearchMethod ใช้เป็นอินพุตเริ่มต้น GoalFunctionResult และส่งคืน GoalFunctionResult สุดท้ายการค้นหาจะได้รับการเข้าถึงฟังก์ชัน get_transformations ซึ่งใช้เป็นอินพุตวัตถุ AttackedText และส่งออกรายการการแปลงที่เป็นไปได้ที่กรองโดยการประชุมข้อ จำกัด ทั้งหมดของการโจมตี การค้นหาประกอบด้วยการโทรต่อเนื่องไปยัง get_transformations จนกว่าการค้นหาจะสำเร็จ (กำหนดโดยใช้ get_goal_results ) หรือหมดลง
ดูเอกสารการวิเคราะห์ของเรา: การค้นหาวิธีการค้นหา: อัลกอริทึมการค้นหาการเปรียบเทียบสำหรับการสร้างตัวอย่าง NLP antcersarial ที่ EMNLP BlackBoxNLP
เมื่อเราเน้นในกระดาษด้านบนเราไม่แนะนำให้เปรียบเทียบสูตรการโจมตีโดยตรงนอกกรอบ
ความคิดเห็นนี้เกิดจากสูตรการโจมตีในวรรณคดีล่าสุดใช้วิธีการที่แตกต่างกันหรือเกณฑ์ในการตั้งค่าข้อ จำกัด ของพวกเขา หากไม่มีพื้นที่ จำกัด ที่คงที่การเพิ่มขึ้นของอัตราความสำเร็จในการโจมตีอาจมาจากวิธีการค้นหาหรือการแปลงที่ดีขึ้นหรือพื้นที่การค้นหาที่เข้มงวดน้อยกว่า
GitHub ของเราเกี่ยวกับการเปรียบเทียบสคริปต์และผลลัพธ์: GitHub-การค้นหา textattack-search-benchmark
ดูตัวอย่างรหัส: https://github.com/qdata/textattack/blob/master/examples/attack/attack_camembert.py สำหรับการใช้เฟรมเวิร์กของเราเพื่อโจมตีฝรั่งเศส-เบิร์ต
ดูสมุดบันทึกการสอน: https://textattack.readthedocs.io/en/latest/2Notebook/example_4_camembert.html สำหรับการใช้เฟรมเวิร์กของเราเพื่อโจมตีฝรั่งเศส-เบิร์ต
ดู readme_zh.md สำหรับ readme ของเราเป็นภาษาจีน
เรายินดีต้อนรับข้อเสนอแนะและการมีส่วนร่วม! ส่งปัญหาหรือดึงคำขอและเราจะพยายามอย่างเต็มที่เพื่อตอบสนองในเวลาที่เหมาะสม ปัจจุบัน Textattack อยู่ในขั้นตอน "อัลฟ่า" ซึ่งเรากำลังทำงานเพื่อปรับปรุงความสามารถและการออกแบบ
ดูการสนับสนุน. MD สำหรับข้อมูลรายละเอียดเกี่ยวกับการมีส่วนร่วม
หากคุณใช้ TextAttack สำหรับการวิจัยของคุณโปรดอ้างอิง Textattack: กรอบสำหรับการโจมตีที่เป็นปฏิปักษ์การเพิ่มข้อมูลและการฝึกอบรมที่เป็นปฏิปักษ์ใน 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 }
}