repo ปัจจุบันมีรหัสที่มาพร้อมกับโพสต์บล็อก ? วิธีสร้าง AI การสนทนาที่ล้ำสมัยด้วย Transfer Learning
โค้ดนี้เป็นฐานโค้ดที่สะอาดและมีการแสดงความคิดเห็น พร้อมด้วยสคริปต์การฝึกอบรมและการทดสอบที่สามารถใช้เพื่อฝึกอบรมเอเจนต์การโต้ตอบที่ใช้ประโยชน์จากการถ่ายโอนการเรียนรู้จากโมเดลภาษา OpenAI GPT และ GPT-2 Transformer
โค้ดเบสนี้สามารถใช้เพื่อจำลองผลลัพธ์การมีส่วนร่วมของ HuggingFace ในการแข่งขันโต้ตอบ NeurIPS 2018 ConvAI2 ซึ่งเป็นระบบเมตริกอัตโนมัติที่ล้ำสมัย รหัสการแข่งขัน 3k+ บรรทัดถูกกลั่นในโค้ดการฝึกอบรมประมาณ 250 บรรทัดพร้อมตัวเลือกแบบกระจายและ FP16 เพื่อสร้างพื้นที่เก็บข้อมูลปัจจุบัน
โมเดลนี้สามารถฝึกได้ภายในเวลาประมาณหนึ่งชั่วโมงบนอินสแตนซ์คลาวด์ 8 V100 (ปัจจุบันมีราคาประมาณ 25 USD) และยังมีโมเดลที่ได้รับการฝึกล่วงหน้าไว้ให้บริการด้วย
หากต้องการติดตั้งและใช้สคริปต์การฝึกอบรมและการอนุมาน โปรดโคลน repo และติดตั้งข้อกำหนด:
git clone https://github.com/huggingface/transfer-learning-conv-ai
cd transfer-learning-conv-ai
pip install -r requirements.txt
python -m spacy download en
หากต้องการติดตั้งโดยใช้นักเทียบท่าโปรดสร้างอิมเมจที่มีอยู่ในตัวเอง:
docker build -t convai .
หมายเหตุ: ตรวจสอบให้แน่ใจว่าการตั้งค่า Docker ของคุณจัดสรรหน่วยความจำเพียงพอสำหรับการสร้างคอนเทนเนอร์ การสร้างด้วยค่าเริ่มต้นที่ 1.75GB จะล้มเหลวเนื่องจากวงล้อ Pytorch ขนาดใหญ่
จากนั้นคุณสามารถป้อนรูปภาพได้
ip-192-168-22-157:transfer-learning-conv-ai loretoparisi$ docker run --rm -it convai bash
root@91e241bb823e:/ # ls
Dockerfile README.md boot dev home lib media models proc root sbin sys train.py utils.py
LICENCE bin convai_evaluation.py etc interact.py lib64 mnt opt requirements.txt run srv tmp usr var
จากนั้นคุณสามารถเรียกใช้สคริปต์ interact.py
บนโมเดลที่ได้รับการฝึกล่วงหน้าได้:
python3 interact.py --model models/
เราสร้างโมเดลที่ได้รับการฝึกมาล่วงหน้าและปรับแต่งมาเป็นอย่างดีบน S3 ของเราที่นี่ วิธีที่ง่ายที่สุดในการดาวน์โหลดและใช้โมเดลนี้คือเพียงเรียกใช้สคริปต์ interact.py
เพื่อพูดคุยกับโมเดล สคริปต์นี้จะดาวน์โหลดและแคชโมเดลของเราโดยอัตโนมัติโดยไม่มีข้อโต้แย้งใดๆ
สคริปต์การฝึกสามารถใช้ได้ในการตั้งค่า GPU เดี่ยวหรือหลาย GPU:
python ./train.py # Single GPU training
python -m torch.distributed.launch --nproc_per_node=8 ./train.py # Training on 8 GPUs
สคริปต์การฝึกอบรมยอมรับข้อโต้แย้งหลายประการเพื่อปรับแต่งการฝึกอบรม:
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
ชุดข้อมูล_path | str | "" | เส้นทางหรือ URL ของชุดข้อมูล หากว่างเปล่าให้ดาวน์โหลดจาก S3 |
ชุดข้อมูล_cache | str | './dataset_cache.bin' | เส้นทางหรือ URL ของแคชชุดข้อมูล |
แบบอย่าง | str | "openai-gpt" | เส้นทาง URL หรือชื่อย่อของโมเดล |
num_candidates | int | 2 | จำนวนผู้เข้ารับการฝึกอบรม |
max_history | int | 2 | จำนวนการแลกเปลี่ยนก่อนหน้าที่จะเก็บไว้ในประวัติศาสตร์ |
train_batch_size | int | 4 | ขนาดชุดสำหรับการฝึก |
valid_batch_size | int | 4 | ขนาดแบทช์สำหรับการตรวจสอบ |
การไล่ระดับสี_การสะสม_ขั้นตอน | int | 8 | สะสมการไล่ระดับสีในหลายขั้นตอน |
ล | float | 6.25e-5 | อัตราการเรียนรู้ |
lm_coef | float | 1.0 | ค่าสัมประสิทธิ์การสูญเสีย LM |
mc_coef | float | 1.0 | ค่าสัมประสิทธิ์การสูญเสียแบบปรนัย |
max_norm | float | 1.0 | การตัดบรรทัดฐานการไล่ระดับสี |
n_ยุค | int | 3 | จำนวนยุคการฝึกอบรม |
บุคลิกภาพ_การเรียงสับเปลี่ยน | int | 1 | จำนวนการเรียงสับเปลี่ยนของประโยคบุคลิกภาพ |
อุปกรณ์ | str | "cuda" if torch.cuda.is_available() else "cpu" | อุปกรณ์ (cuda หรือ cpu) |
fp16 | str | "" | ตั้งค่าเป็น O0, O1, O2 หรือ O3 สำหรับการฝึก fp16 (ดูเอกสารประกอบของ apex) |
local_rank | int | -1 | อันดับท้องถิ่นสำหรับการฝึกอบรมแบบกระจาย (-1: ไม่กระจาย) |
ต่อไปนี้เป็นวิธีสร้างผลลัพธ์ของเราบนเซิร์ฟเวอร์ที่มี V100 GPU 8 ตัว (ปรับจำนวนโหนดและขนาดแบทช์ให้เข้ากับการกำหนดค่าของคุณ):
python -m torch.distributed.launch --nproc_per_node=8 ./train.py --gradient_accumulation_steps=4 --lm_coef=2.0 --max_history=2 --n_epochs=1 --num_candidates=4 --personality_permutations=2 --train_batch_size=2 --valid_batch_size=2
โมเดลนี้ควรให้ Hits@1 มากกว่า 79, ความฉงนสนเท่ห์ที่ 20.5 และ F1 ที่ 16.5 โดยใช้สคริปต์การประเมินผล convai2 (ดูด้านล่าง)
ตัวเลขเหล่านี้ต่ำกว่าตัวเลขที่เราได้รับในการแข่งขัน ConvAI2 เล็กน้อย นี่คือสิ่งที่คุณสามารถปรับแต่งเพื่อให้ได้ผลลัพธ์เดียวกัน:
สคริปต์การฝึกอบรมจะบันทึกการทดลองและจุดตรวจสอบทั้งหมดในโฟลเดอร์ย่อยที่ตั้งชื่อพร้อมกับการประทับเวลาของการทดสอบในโฟลเดอร์ ./runs
runs ของโฟลเดอร์ฐานที่เก็บข้อมูล
จากนั้นคุณสามารถใช้สคริปต์โต้ตอบเพื่อโต้ตอบกับโมเดลได้ง่ายๆ เพียงชี้ไปที่โฟลเดอร์นี้
นี่คือตัวอย่างบรรทัดคำสั่งในการรันสคริปต์แบบโต้ตอบ:
python ./interact.py --model_checkpoint ./data/Apr17_13-31-38_thunder/ # run the interactive script with a training checkpoint
python ./interact.py # run the interactive script with the finetuned model on our S3
โมเดลที่ได้รับการปรับแต่งอย่างละเอียดจะให้ FINAL Hits@1: 0.715
สคริปต์เชิงโต้ตอบยอมรับข้อโต้แย้งสองสามข้อเพื่อปรับแต่งอัลกอริทึมการถอดรหัส:
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
ชุดข้อมูล_path | str | "" | เส้นทางหรือ URL ของชุดข้อมูล หากว่างเปล่าให้ดาวน์โหลดจาก S3 |
ชุดข้อมูล_cache | str | './dataset_cache.bin' | เส้นทางหรือ URL ของแคชชุดข้อมูล |
แบบอย่าง | str | "openai-gpt" | เส้นทาง URL หรือชื่อย่อของโมเดล |
max_history | int | 2 | จำนวนคำพูดก่อนหน้าที่จะเก็บไว้ในประวัติศาสตร์ |
อุปกรณ์ | str | cuda ถ้า torch.cuda.is_available() อย่างอื่น cpu | อุปกรณ์ (cuda หรือ cpu) |
no_sample | การกระทำ store_true | ตั้งค่าให้ใช้การถอดรหัสโลภแทนการสุ่มตัวอย่าง | |
สูงสุด_ความยาว | int | 20 | ความยาวสูงสุดของคำพูดเอาท์พุต |
นาที_ความยาว | int | 1 | ความยาวขั้นต่ำของคำพูดเอาท์พุต |
เมล็ดพันธุ์ | int | 42 | เมล็ดพันธุ์ |
อุณหภูมิ | int | 0.7 | การสุ่มตัวอย่างอุณหภูมิซอฟต์แม็กซ์ |
ท็อป_เค | int | 0 | กรองโทเค็น top-k ก่อนสุ่มตัวอย่าง ( <=0 : ไม่มีการกรอง) |
ท็อป_พี | float | 0.9 | การกรองนิวเคลียส (top-p) ก่อนการสุ่มตัวอย่าง ( <=0.0 : ไม่มีการกรอง) |
หากต้องการรันสคริปต์การประเมินผลของความท้าทาย ConvAI2 คุณต้องติดตั้ง ParlAI
ในโฟลเดอร์ฐาน repo ก่อนดังนี้:
git clone https://github.com/facebookresearch/ParlAI.git
cd ParlAI
python setup.py develop
จากนั้นคุณสามารถรันสคริปต์การประเมินผลได้จากโฟลเดอร์ฐาน ParlAI
:
cd ParlAI
python ../convai_evaluation.py --eval_type hits@1 # to download and evaluate our fine-tuned model on hits@1 metric
python ../convai_evaluation.py --eval_type hits@1 --model_checkpoint ./data/Apr17_13-31-38_thunder/ # to evaluate a training checkpoint on hits@1 metric
สคริปต์การประเมินผลยอมรับข้อโต้แย้งสองสามข้อเพื่อเลือกการวัดการประเมินผลและปรับแต่งอัลกอริทึมการถอดรหัส:
การโต้แย้ง | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
eval_type | str | "hits@1" | ประเมินโมเดลบนเมตริก hits@1 , ppl หรือ f1 บนชุดข้อมูลการตรวจสอบ ConvAI2 |
แบบอย่าง | str | "openai-gpt" | เส้นทาง URL หรือชื่อย่อของโมเดล |
max_history | int | 2 | จำนวนคำพูดก่อนหน้าที่จะเก็บไว้ในประวัติศาสตร์ |
อุปกรณ์ | str | cuda ถ้า torch.cuda.is_available() อย่างอื่น cpu | อุปกรณ์ (cuda หรือ cpu) |
no_sample | การกระทำ store_true | ตั้งค่าให้ใช้การถอดรหัสโลภแทนการสุ่มตัวอย่าง | |
สูงสุด_ความยาว | int | 20 | ความยาวสูงสุดของคำพูดเอาท์พุต |
นาที_ความยาว | int | 1 | ความยาวขั้นต่ำของคำพูดเอาท์พุต |
เมล็ดพันธุ์ | int | 42 | เมล็ดพันธุ์ |
อุณหภูมิ | int | 0.7 | การสุ่มตัวอย่างอุณหภูมิซอฟต์แม็กซ์ |
ท็อป_เค | int | 0 | กรองโทเค็น top-k ก่อนสุ่มตัวอย่าง ( <=0 : ไม่มีการกรอง) |
ท็อป_พี | float | 0.9 | การกรองนิวเคลียส (top-p) ก่อนการสุ่มตัวอย่าง ( <=0.0 : ไม่มีการกรอง) |
ดู example_entry.py
และความคิดเห็นที่ด้านบน
หากคุณใช้รหัสนี้ในการวิจัย คุณสามารถอ้างอิงเอกสารเวิร์กช็อป NeurIPS CAI ของเราได้:
@article{DBLP:journals/corr/abs-1901-08149,
author = {Thomas Wolf and
Victor Sanh and
Julien Chaumond and
Clement Delangue},
title = {TransferTransfo: {A} Transfer Learning Approach for Neural Network
Based Conversational Agents},
journal = {CoRR},
volume = {abs/1901.08149},
year = {2019},
url = {http://arxiv.org/abs/1901.08149},
archivePrefix = {arXiv},
eprint = {1901.08149},
timestamp = {Sat, 02 Feb 2019 16:56:00 +0100},
biburl = {https://dblp.org/rec/bib/journals/corr/abs-1901-08149},
bibsource = {dblp computer science bibliography, https://dblp.org}
}