ที่เก็บนี้มีรหัสและข้อมูลสำหรับกระดาษต่อไปนี้:
MIXCE: การฝึกอบรมแบบจำลองภาษาอัตโนมัติโดยการผสมไปข้างหน้าและย้อนกลับข้ามมุม
@inproceedings{zhang2023mixce,
title={MixCE: Training Autoregressive Language Models by Mixing Forward and Reverse Cross-Entropies},
author={Zhang, Shiyue and Wu, Shijie and İrsoy, Ozan and Lu, Steven and Bansal, Mohit and Dredze, Mark and Rosenberg, David},
booktitle={Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics},
year={2023}
}
ผู้แต่งรหัส: Shiyue Zhang
python -m pip install -r requirements.txtตัวเลือก: เพื่อหลีกเลี่ยงการปะทะกันของเวอร์ชันใด ๆ กับแพ็คเกจที่มีอยู่คุณอาจต้องการทำการติดตั้งภายใต้สภาพแวดล้อมเสมือนจริง:
python -m venv yourenv
. yourenv/bin/activate # for bash, might be something else for your particular shell
python -m pip install -r requirements.txtsynthetic.py เป็นสคริปต์สำหรับการเรียกใช้การทดลองสังเคราะห์ การทดลองใช้งานง่ายมากเพียงแค่วิ่ง:
python synthetic.py
การกำหนดค่า (เช่นเมล็ดขนาดคำศัพท์ ฯลฯ ) สามารถระบุและเปลี่ยนแปลงภายในสคริปต์และภายใต้ if __name__ == '__main__':
มีการกำหนดค่าที่สำคัญบางอย่างภายใน synthetic.py ที่กำหนดประเภทของการทดลองสังเคราะห์ที่คุณสามารถเรียกใช้:
Real_Dataset : ถ้า None เมทริกซ์การเปลี่ยนจะเริ่มต้นแบบสุ่ม หรือหากเป็น 'webtext' เมทริกซ์การเปลี่ยนจะเริ่มต้นจากเมทริกซ์การเปลี่ยนล่วงหน้าที่คำนวณไว้ล่วงหน้าบน WebText
zero_percent : กำหนดจำนวนค่าในเมทริกซ์การเปลี่ยนแปลงคือ 0 ตัวอย่างเช่นถ้า zero_percent==0.5 ดังนั้นความน่าจะเป็น 50% ในเมทริกซ์การเปลี่ยนผ่านคือ 0
Vocab_size : ขนาดคำศัพท์ เราทดสอบ 21, 51, 101, 501 หรือ 1001 โปรดทราบว่า 21 หมายถึงเรามีโทเค็นปกติ 20 โท (รวมถึง EOS) และ 1 PAD โทเค็น
เมล็ด : เราวิ่ง 5 เมล็ด (7, 42, 777, 4222, 99999) สำหรับการทดลองแต่ละครั้ง
Loss_func : เราทดสอบ 4 ฟังก์ชั่นการสูญเสีย: (1) 'two_xens' : มันถูกแสดงว่าเป็น mixce* ในกระดาษของเราและใช้การกระจายข้อมูลทองคำ p และ gumbel softmax; (2) 'qlogq_mix' : มันเป็นฟังก์ชั่นการสูญเสียมิกซ์โดยประมาณของเรา (3) 'two_kls' : ส่วนผสมของสอง kl divergences; (4) 'js' : JS Divergence
Train_eta : อัตราส่วนการผสมสำหรับฟังก์ชั่นการสูญเสียเหล่านั้น ถ้า train_eta==1.0 สำหรับ 'two_xens' มันเป็น mle ถ้า train_eta==1.0 สำหรับ 'two_kls' มันเป็นไปข้างหน้า kl (เช่น MLE) ถ้า train_eta==0.0 สำหรับ 'two_kls' มันเป็น KL ย้อนกลับ เราใช้คำจำกัดความทั่วไปของ JS (ดูบทความนี้สำหรับรายละเอียดเพิ่มเติม) และ JS มาบรรจบกันเป็น 0 เมื่อ train_eta เข้าใกล้ 0.0 หรือ 1.0 เมื่อ train_eta = 0.5 มันเป็นคำจำกัดความปกติของความแตกต่างของ JS
เราประเมิน Bigram LMS ที่ผ่านการฝึกอบรมสังเคราะห์โดยเปรียบเทียบเมทริกซ์การเปลี่ยนแปลงที่เรียนรู้กับเมทริกซ์การเปลี่ยนทอง เราใช้ตัวชี้วัดสองตัว:
(1) avg JS : เราคำนวณความแตกต่างของ JS ระหว่างแต่ละแถวของทองคำและเรียนรู้เมทริกซ์การเปลี่ยนแปลงและค่าเฉลี่ยข้ามแถว
(2) avg 0S : เราได้รับค่าจากเมทริกซ์ที่เรียนรู้ที่ความน่าจะเป็นทองคำ = 0 ตำแหน่งจากนั้นเฉลี่ย
ฟังก์ชั่น compare_parameters() ใน synthetic.py ใช้สำหรับการคำนวณตัวชี้วัดทั้งสองนี้
แบบจำลองทั้งหมดจะถูกบันทึกภายใต้ synthetic_logs/ ไดเรกทอรี ชื่อไดเรกทอรีของแต่ละรุ่นเริ่มต้นด้วยวันหยุดที่การทดสอบถูกเรียกใช้ ภายใต้ไดเรกทอรีโมเดลคุณจะพบไฟล์เหตุการณ์ tensorboard รวมถึง all_best_metrics.json ที่บันทึกคะแนนตัวชี้วัดที่ดีที่สุดสำหรับแต่ละอัตราส่วนการผสม ดูตัวอย่างภายใต้ synthetic_logs/
การประเมินแบบจำลองจะดำเนินการหลังจากแต่ละยุคและจุดตรวจสอบที่ดีที่สุดจะถูกเลือกตามการสูญเสียในชุด dev
ในที่สุดสำหรับการทดลองแต่ละครั้งเราเฉลี่ยผลลัพธ์จาก 5 เมล็ด และสำหรับแต่ละวัตถุประสงค์เราเลือกอัตราส่วนการผสมที่ดีที่สุดตาม AVG JS.
get_synthetic_results() ในผลลัพธ์ py เป็นฟังก์ชั่นที่ใช้กับผลลัพธ์เฉลี่ยจาก 5 เมล็ดและการเรียงลำดับของอัตราส่วนการผสมที่แตกต่างกันตาม AVG JS.
ในการใช้ get_synthetic_results() คุณต้องเตรียม synthetic_models.json ก่อนเพื่อระบุไดเรกทอรีแบบจำลอง ตัวอย่างจะแสดงใน synthetic_models.json จากนั้นคุณจะได้รับผลลัพธ์ของการทดลองที่ใช้เมทริกซ์การเปลี่ยนผ่าน webtext, Vocab = 20 และ Objective = two_kls โดยใช้ get_synthetic_results('webtext', '20', 'two_kls')
DETOKENIZER ก่อนอื่นคุณต้องดาวน์โหลด detokenizer.perl จากโมเสสที่นี่และวางไว้ใต้ data/detokenizer.perl เพราะสคริปต์ Python ต่อไปนี้ขึ้นอยู่กับมัน
แล้ว:
cd data
python wikitext_data.py
python webtext_data.py
curl https://dl.fbaipublicfiles.com/fairseq/data/writingPrompts.tar.gz | tar xvzf -
python writingprompts_data.py
ข้อมูลที่ประมวลผลล่วงหน้าจะถูกบันทึกภายใต้ data/wikitext , data/webtext และ data/writingPrompts
รุ่นโคลน GPT-2 โดยใช้ git lfs ตามคำแนะนำที่ได้รับจากการกอดใบหน้า
git lfs install
git clone https://huggingface.co/gpt2
GPT2 เป็นรุ่น GPT-2 ที่เล็กที่สุด นอกจากนี้เรายังทดลองกับ GPT2-Medium และ GPT2 ขนาดใหญ่ GPT2 ขนาดใหญ่ใช้ในการคำนวณ MAUVE ดังนั้นโปรดดาวน์โหลดด้วย:
git clone https://huggingface.co/gpt2-medium
git clone https://huggingface.co/gpt2-large
ทำสำเนา GPT2 ขนาดใหญ่สำหรับ MAUVE:
cp -r gpt2-large gpt2-large-mauve
เพราะเราจะเขียนถึงขนาดใหญ่ GPT2 โดยตรงซึ่งจะส่งผลกระทบต่อการคำนวณ MAUVE
คุณสามารถเริ่มต้นการทดลองโดยทำ:
python run.py
การกำหนดค่าสามารถระบุด้วยตนเองภายใน run.py ดูตัวอย่างภายใต้ if __name__ == '__main__'
มีการกำหนดค่าที่สำคัญบางประการใน Run.py :
Training_Size : ขนาดข้อมูลการฝึกอบรมเราทดสอบ '10K' , '25K' , '50K' และ '100K' ; โดยค่าเริ่มต้นเราใช้ '50K'
รุ่น : มันสามารถเป็น 'gpt2' , 'gpt2-meidum' หรือ 'gpt2-large'
ชุดข้อมูล : มันสามารถเป็น "wikitext" , "webtext" หรือ "writingPrompts"
Mixing_ratio : เราค้นหา [0.0, 0.01, 0.1, 0.3, 0.5, 0.7, 0.9, 0.99, 1.0] และเลือก mixing_ratio ที่ดีที่สุดตามคะแนน DEV Set Mauve
TRAIN_BATCH_SIZE, การสะสม, eval_batch_size : การกำหนดค่าเหล่านี้ควรถูกกำหนดโดยแพลตฟอร์มที่คุณใช้ เราใช้ Tesla V100 GPU หนึ่งตัว (หน่วยความจำ 32G) และการกำหนดค่าที่แนะนำในการตั้งค่านี้อยู่ใน run.py
มีหนึ่ง dict และสามฟังก์ชั่นใน run.py :
data_sets {} : มันบันทึกเส้นทางของไฟล์ข้อมูล
run_no_trainer () : ฟังก์ชั่นที่ใช้สำหรับการฝึกอบรมและการประเมินแบบจำลอง
run_no_trainer_eval () : ฟังก์ชั่นที่ใช้สำหรับการประเมินแบบจำลองเท่านั้น
run_no_trainer_turn_topp () : ฟังก์ชั่นที่ใช้สำหรับการปรับจูนการสุ่มตัวอย่างด้านบน P
นอกจาก run.py ฉันแนะนำสคริปต์ Python ที่สำคัญอื่น ๆ ที่นี่สำหรับการฝึกอบรมแบบจำลองและการประเมินผล:
gpt2.py (ไฟล์ที่สำคัญที่สุด) มี คลาสโมเดล GPT2MixModel ที่ใช้ฟังก์ชั่นการสูญเสียมิกซ์ของเรา
run_clm_no_trainer.py เป็นสคริปต์ในการฝึกอบรมและประเมินโมเดล GPT-2
run_clm_no_trainer_tune_topp.py คล้ายกับ run_clm_no_trainer.py ยกเว้นว่าใช้สำหรับการปรับจูนพารามิเตอร์ P ของการสุ่มตัวอย่างบนสุดของ P-P เท่านั้น
Metircs.py มีตัวชี้วัดที่เราใช้เพื่อประเมินรุ่นรุ่น
แบบจำลองจะถูกบันทึกภายใต้ train/ ไดเรกทอรี
ชื่อไดเรกทอรีของแต่ละรุ่นเริ่มต้นด้วยวันหยุดที่การทดสอบถูกเรียกใช้ ภายใต้ไดเรกทอรีโมเดลเราบันทึกจุดตรวจสอบ ที่ดีที่สุด (เลือกตามการสูญเสีย dev)
dev/test.sample , dev/test.sample1 , dev/test.sample2 และ dev/test.human เป็น 3 รุ่นที่ไม่เอนเอียงและข้อความมนุษย์
dev/test_results.json บันทึกผลลัพธ์ของความงุนงงความหลากหลายและการทำซ้ำ
หลังจากการปรับแต่ง P สำหรับการสุ่มตัวอย่างบน P-P แล้ว dev/test.topp(p=*) เป็นรุ่นสุ่มตัวอย่างด้านบน P-P ที่มีค่า p ที่แตกต่างกัน
หลังจากคำนวณ MAUVE และการเชื่อมโยงกัน (ดูส่วนถัดไปสำหรับรายละเอียด), dev/test_mauve_coherence_*.json มีคะแนน MAUVE และการเชื่อมโยงกันด้วยความยาวสูงสุดที่แตกต่างกัน
หลังจากคำนวณ MAUVE และการเชื่อมโยงกัน (ดูส่วนถัดไปสำหรับรายละเอียด), dev/test_controlled_mauve_coherence_*.json ถูกควบคุม MAUVE และคะแนนการเชื่อมโยงกับความยาวสูงสุดที่แตกต่างกัน
เรารายงานคะแนน 6 ตัวชี้วัดในบทความของเรา:
คำนวณ ความงุนงง พร้อมกับการฝึกอบรม/การประเมินผลแบบจำลอง (ดู run_clm_no_trainer.py )
ความหลากหลาย ถูกนำมาใช้โดยฟังก์ชั่น diversity() ใน metircs.py และยังคำนวณพร้อมกับการฝึกอบรม/การประเมินผลแบบจำลองโดยการเรียกฟังก์ชั่น compute_diversity_repetition() ใน run_clm_no_trainer.py โปรดทราบว่าการทำซ้ำเป็นอีกหนึ่งตัวชี้วัดที่เรานำไปใช้ แต่ไม่ได้รายงานในบทความของเรา มันตรวจสอบว่าเปอร์เซ็นต์ของข้อความคือลูปซ้ำ ๆ และกลับมาอีกครั้งความยาววลีซ้ำ ๆ
MAUVE และ การเชื่อมโยงกัน ถูกคำนวณในลักษณะหลังการใช้งานโดยใช้ไฟล์การสร้างที่บันทึกไว้ compute_mauve() และ compute_coherence() ใน metrics.py เป็นสองฟังก์ชั่นผู้ช่วยในการคำนวณ Mauve และการเชื่อมโยงกัน พวกเขาถูกเรียกโดยฟังก์ชัน compute_mauve_coherence() ใน ผลลัพธ์ ในการใช้ compute_mauve_coherence() คุณต้องเตรียม โมเดล ก่อนเพื่อระบุชื่อไดเรกทอรีแบบจำลองสำหรับการประเมินผล
ในทำนองเดียวกัน การควบคุม-mauve และ การควบคุมการเชื่อมต่อกัน สามารถคำนวณได้ในลักษณะหลังการทำงานโดย compute_controlled_mauve_coherence() ฟังก์ชั่นใน ผลลัพธ์
| ชุดข้อมูล | ขนาดรุ่น | ขนาดข้อมูลการฝึกอบรม | วัตถุประสงค์ | กอดชื่อฮับหน้า |
|---|---|---|---|---|
| wikitext | ขนาดใหญ่ GPT2 | 50k | MLE | shiyue/wikitext_train50k_gpt2-large_mix1.0 |
| wikitext | ขนาดใหญ่ GPT2 | 50k | MIXCE (ETA = 0.1) | shiyue/wikitext_train50k_gpt2-large_mix0.1 |
| webtext | ขนาดใหญ่ GPT2 | 50k | MLE | shiyue/webtext_train50k_gpt2-large_mix1.0 |
| webtext | ขนาดใหญ่ GPT2 | 50k | MIXCE (ETA = 0.3) | shiyue/webtext_train50k_gpt2-large_mix0.3 |
| การเขียน | ขนาดใหญ่ GPT2 | 50k | MLE | shiyue/writingprompts_train50k_gpt2-large_mix1.0 |
| การเขียน | ขนาดใหญ่ GPT2 | 50k | MIXCE (ETA = 0.7) | shiyue/writingprompts_train50k_gpt2-large_mix0.7 |
ลองใช้แบบจำลองที่ผ่านการฝึกอบรมด้วยวิธีต่อไปนี้:
>>> from gpt2 import GPT2MIXModel
>>> from transformers import GPT2Tokenizer
>>> model = GPT2MIXModel.from_pretrained("shiyue/wikitext_train50K_gpt2-large_mix1.0")
>>> tokenizer = GPT2Tokenizer.from_pretrained('shiyue/wikitext_train50K_gpt2-large_mix1.0')
>>> text = "Hey, how are you?"
>>> encoded_input = tokenizer(text, return_tensors='pt')
>>> model.eval()
>>> out_ids = model.lm.generate(inputs=encoded_input["input_ids"], max_length=50, do_sample=True)
>>> print(tokenizer.batch_decode(out_ids, skip_special_tokens=True))
เรามีส่วนร่วม
คุณมีประสบการณ์ที่ดีกับโครงการนี้หรือไม่? ทำไมไม่แบ่งปันความรักและมีส่วนร่วมรหัสหรือเพียงแจ้งให้เราทราบเกี่ยวกับปัญหาใด ๆ ที่คุณมีกับมัน?
เรายินดีต้อนรับรายงานปัญหาที่นี่ ตรวจสอบให้แน่ใจว่าได้เลือกเทมเพลตปัญหาที่เหมาะสมสำหรับปัญหาของคุณเพื่อให้เรามั่นใจได้ว่าคุณจะให้ข้อมูลที่จำเป็นแก่เรา
ก่อนส่งคำขอดึงโปรดตรวจสอบให้แน่ใจว่าคุณอ่านแนวทางการบริจาคของเรา
ไฟล์สองไฟล์ต่อไปนี้จะถูกยืมและนำมาใช้จากที่เก็บ transformers และดังนั้นจึงรักษาลิขสิทธิ์ดั้งเดิมไว้
นี่คือการหยิบขึ้นมาจาก https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py นอกจากนี้เราได้ใช้การดัดแปลงต่อไปนี้:
--test_file--reduction--mixing_ratio--max_length--prompt_length--eval_prompt_length--cache_dir--do_train--do_evalpush_to_hub "DataCollatorWithPadding แทนคอลเลเตอร์เริ่มต้นdo_eval " ซึ่งส่วนใหญ่จะเข้าสู่ฟังก์ชั่นใหม่ ' evaluate() ' ไฟล์นี้ได้รับการแก้ไขเพิ่มเติมจาก run_clm_no_trainer.py (ดูด้านบน) โดยการเปลี่ยนวิธีการเรียกใช้ฟังก์ชัน generate() เพื่อเปิดใช้งานการปรับแต่งสำหรับตัวเลือก top_p
โครงการนี้ได้ใช้จรรยาบรรณ หากคุณมีข้อกังวลใด ๆ เกี่ยวกับรหัสหรือพฤติกรรมที่คุณเคยมีประสบการณ์ในโครงการโปรดติดต่อเราที่ [email protected]