นี่คือแชทบอทที่ได้รับการฝึกอบรมโดย seq2seq และ การเรียนรู้แบบเสริมกำลัง
seq2seq
Seq2seq เป็นโมเดลคลาสสิกสำหรับการเรียนรู้แบบมีโครงสร้าง โดยอินพุตและเอาท์พุตมีทั้งแบบเรียงลำดับ
โมเดล vanilla seq2seq ได้รับการอธิบายไว้ในเอกสาร NIPS '14 Sequence to Sequence Learning ด้วย Neural Networks ตัวเข้ารหัสและตัวถอดรหัสจะถูกแยกออกจากกัน
โมเดล seq2seq ในที่เก็บนี้สร้างขึ้นด้วย 2 LSTM ซึ่งคล้ายกับที่อธิบายไว้ในเอกสาร ICCV '15 Sequence to Sequence - วิดีโอเป็นข้อความ ตัวเข้ารหัสและตัวถอดรหัสมีน้ำหนักเท่ากัน
อาร์แอล
หลังจากฝึกฝนแชทบอตในยุคที่เพียงพอแล้ว ฉันใช้เทคนิค RL ที่เรียกว่าการไล่ระดับนโยบายเพื่อปรับปรุงแชทบอตให้ดียิ่งขึ้น
เมื่อทำเช่นนี้ แชทบอทจะสามารถสร้างการตอบสนองที่น่าสนใจมากขึ้นเกี่ยวกับฟังก์ชันการให้รางวัลได้
ฟังก์ชั่นการให้รางวัลของฉันคล้ายกับที่อธิบายไว้ในรายงาน EMNLP '16 การเรียนรู้การเสริมกำลังเชิงลึกสำหรับการสร้างบทสนทนา
ฉันขอแสดงผลลัพธ์ของ chatbot ให้คุณดู:
ผลลัพธ์ 1 (A & B เป็นทั้งแชทบอทที่ผ่านการฝึกอบรม)
ตอบ: คุณช่วยฉันหน่อยได้ไหม?
บี:อะไรก็ได้.
A: ฉันอยากให้คุณงอพ่อ
บี: แน่นอน.
A: ฉันขอโทษจริงๆ ที่ฉันไม่ได้ตั้งใจจะหยาบคาย
B: อย่าเข้าใจเลย อย่างน้อยที่สุดฉันก็ทำได้
ผลลัพธ์ 2 (A & B เป็นทั้งแชทบอทที่ผ่านการฝึกอบรม)
ตอบ: ฉันไม่ได้ทำ! ฉันไม่มีปืน!
B: คุณโกหก คุณยังต้องการได้รับเงินคืน
ตอบ: มีบางอย่างผิดปกติกับความจริง
B: ฉันไม่ต้องการเงินเพียงเล็กน้อย ฉันไม่สามารถเอาออกไปได้
ตอบ: มีอะไรผิดปกติ
บี: ฟังฉันนะ. ตอนนี้ฉันกลัวแล้ว
ตอบ: อ่า คุณจะต้องการเงินทั้งหมด ฉันต้องการความช่วยเหลือจากคุณ
ผลลัพธ์ 3 (A & B เป็นทั้งแชทบอทที่ผ่านการฝึกอบรม)
ตอบ: ฉันลืมเอาโคคา-โคลา
B: ฉันมีบางอย่างติดอยู่ในหัว.
ตอบ: ไม่เป็นไร ฉันเดาว่ามันค่อนข้างจะธรรมดาในเรื่องไร้สาระมากมาย
B: ฉันหมายถึงเราอยู่ด้วยกันมาตั้งแต่เด็กๆ
ตอบ: ยิ่งมีเหตุผลมากเท่าไร
B: ไม่ใช่เขา มันเป็นความผิดของเขา และเขาตาบอดเพราะพระเจ้า
ตอบ: และเป็นเรื่องราวที่แปลกประหลาด
คุณสามารถค้นหาผลลัพธ์เพิ่มเติมจาก chatbot ได้ในไดเร็กทอรีนี้
การกำหนดค่าเครือข่ายประสาทเทียมของผลลัพธ์เหล่านั้นอธิบายไว้ในชื่อไฟล์
คุณประหลาดใจกับผลลัพธ์ของแชทบอทหรือไม่? :D
คุณสามารถสร้างบทสนทนาที่น่าทึ่งเหล่านั้นได้ด้วยตัวเอง!
เพียงทำตามคำแนะนำด้านล่าง:
pip ติดตั้ง -r ข้อกำหนด.txt
./script/download.sh
./script/simulate.sh <เส้นทางไปยังโมเดล> <ประเภทจำลอง> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
<เส้นทางสู่โมเดล>
เพื่อสร้างกล่องโต้ตอบ seq2seq ให้พิมพ์ " model/Seq2Seq/model-77 "
เพื่อสร้างกล่องโต้ตอบ RL ให้พิมพ์ " model/RL/model-56-3000 "
<ประเภทจำลอง>
สามารถเป็น 1 หรือ 2
ตัวเลขนี้แสดงถึง # ประโยคเดิมที่แชทบอทพิจารณา
หากคุณเลือก 1 แชทบอทจะพิจารณาเฉพาะประโยคสุดท้ายเท่านั้น
หากคุณเลือก 2 แชทบอทจะพิจารณาสองประโยคสุดท้าย (หนึ่งประโยคจากผู้ใช้ และอีกหนึ่งประโยคจากแชทบอทเอง)
<ใส่ไฟล์>
ดูที่ result/sample_input_new.txt
นี่คือรูปแบบอินพุตของแชทบอต แต่ละบรรทัดคือประโยคเริ่มต้นของกล่องโต้ตอบ
คุณสามารถใช้ไฟล์ตัวอย่างเพื่อความสะดวก
<ไฟล์เอาท์พุต>
ไฟล์เอาต์พุต ให้พิมพ์ชื่อไฟล์ที่คุณต้องการ
หากคุณต้องการให้แชทบอทสร้างคำตอบเดียวสำหรับแต่ละคำถาม
ทำตามคำแนะนำด้านล่าง:
pip ติดตั้ง -r ข้อกำหนด.txt
./script/download.sh
./script/run.sh <ประเภท> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
<ประเภท>
เพื่อสร้างการตอบสนอง seq2seq ให้พิมพ์ " S2S "
เพื่อสร้างการตอบสนองการเรียนรู้แบบเสริมแรง พิมพ์ " RL "
<ใส่ไฟล์>
ดูที่ result/sample_input_new.txt
นี่คือรูปแบบอินพุตของแชทบอต แต่ละบรรทัดคือประโยคเริ่มต้นของกล่องโต้ตอบ
คุณสามารถใช้ไฟล์ตัวอย่างเพื่อความสะดวก
<ไฟล์เอาท์พุต>
ไฟล์เอาต์พุต ให้พิมพ์ชื่อไฟล์ที่คุณต้องการ
ฉันฝึกแชทบอทด้วย python2.7
หากคุณต้องการฝึกแชทบอทตั้งแต่เริ่มต้น
คุณสามารถปฏิบัติตามคำแนะนำด้านล่าง:
ดูที่ python/config.py อธิบายการกำหนดค่าทั้งหมดสำหรับการฝึกไว้ที่นี่
คุณสามารถเปลี่ยนไฮเปอร์พารามิเตอร์การฝึกอบรมบางส่วน หรือเพียงแค่เก็บค่าเดิมไว้ก็ได้
ฉันใช้ Cornell Movie-Dialogs Corpus
คุณต้องดาวน์โหลด แตกไฟล์ และ ย้ายไฟล์ *.txt ทั้งหมดไปยังไดเร็กทอรี data/
จากนั้นดาวน์โหลดไลบรารี่ด้วย pip:
pip ติดตั้ง -r ข้อกำหนด.txt
./script/parse.sh
./script/train.sh
มาแสดงผลของโมเดล seq2seq กันหน่อย :)
./script/test.sh <เส้นทางไปยัง MODEL> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
และแสดงผลลัพธ์กล่องโต้ตอบจากโมเดล seq2seq!
./script/simulate.sh <เส้นทางไปยังโมเดล> <ประเภทจำลอง> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
<ประเภทจำลอง>
สามารถเป็น 1 หรือ 2
ตัวเลขนี้แสดงถึง # ประโยคเดิมที่แชทบอทพิจารณา
หากคุณเลือก 1 แชทบอทจะพิจารณาเฉพาะคำพูดของผู้ใช้เท่านั้น
หากคุณเลือก 2 แชทบอทจะพิจารณาคำพูดของผู้ใช้และคำพูดสุดท้ายของแชทบอท
คุณต้องเปลี่ยนพารามิเตอร์ training_type ใน python/config.py
'ปกติ' สำหรับการฝึกอบรม seq2seq, 'pg' สำหรับการไล่ระดับนโยบาย
คุณต้องฝึกด้วย 'ปกติ' ก่อนสำหรับบางยุคจนถึงมีเสถียรภาพ (ขอแนะนำอย่างน้อย 30 ยุค)
จากนั้นเปลี่ยนวิธีการเป็น 'pg' เพื่อเพิ่มประสิทธิภาพฟังก์ชันการให้รางวัล
./script/train_RL.sh
เมื่อฝึกแบบไล่ระดับนโยบาย (pg)
คุณอาจต้องใช้รุ่นที่กลับด้าน
โมเดลที่กลับรายการยังได้รับการฝึกฝนโดยชุดข้อมูลไดอะล็อกภาพยนตร์ของ Cornell แต่จะกลับรายการแหล่งที่มาและเป้าหมาย
คุณสามารถดาวน์โหลดโมเดลย้อนกลับที่ผ่านการฝึกอบรมล่วงหน้าได้โดย
./script/download_reversed.sh
หรือคุณสามารถฝึกได้ด้วยตัวเอง
คุณไม่จำเป็นต้องเปลี่ยนการตั้งค่าใดๆ เกี่ยวกับโมเดลกลับด้าน หากคุณใช้โมเดลกลับด้านที่ได้รับการฝึกล่วงหน้า
มาสร้างผลลัพธ์ของโมเดล RL กันดีกว่า และค้นหาความแตกต่างจากโมเดล seq2seq :)
./script/test_RL.sh <เส้นทางไปยัง MODEL> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
และแสดงผลลัพธ์กล่องโต้ตอบจากโมเดล RL!
./script/simulate.sh <เส้นทางไปยังโมเดล> <ประเภทจำลอง> <ไฟล์อินพุต> <ไฟล์เอาต์พุต>
<ประเภทจำลอง>
สามารถเป็น 1 หรือ 2
ตัวเลขนี้แสดงถึง # ประโยคเดิมที่แชทบอทพิจารณา
หากคุณเลือก 1 แชทบอทจะพิจารณาเฉพาะประโยคสุดท้ายเท่านั้น
หากคุณเลือก 2 แชทบอทจะพิจารณาสองประโยคสุดท้าย (หนึ่งประโยคจากผู้ใช้ และอีกหนึ่งประโยคจากแชทบอทเอง)
ระบบปฏิบัติการ: CentOS Linux รีลีส 7.3.1611 (คอร์)
ซีพียู: Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
จีพียู: GeForce GTX 1070 8GB
หน่วยความจำ: 16GB DDR3
Python3 (สำหรับ data_parser.py) และ Python2.7 (สำหรับอื่นๆ)
ปอจือหวาง / @pochih