#### [อัปเดต 2017-03-14]
- อัพเกรดเป็น tensorflow v1.0.0 ไม่เข้ากันได้ย้อนหลังเนื่องจาก tensorflow เปลี่ยนไปมาก
- มีการเพิ่มโมเดลที่ผ่านการฝึกอบรมมาล่วงหน้าด้วย Twitter Corpus เพียงแค่
./go_exampleเพื่อแชท! (หรือดูตัวอย่างตัวอย่างการแชทของฉัน)- คุณสามารถเริ่มต้นจากการติดตามสคริปต์
go_exampleนี้เพื่อรู้ว่าสิ่งต่าง ๆ ทำงานอย่างไร!
นี่คือโมเดล SEQ2SEQ ที่แก้ไขจากตัวอย่าง TensorFlow
app.py รวมอยู่ในแบ็กเอนด์แอพ Facebook Messenger ฉันอธิบายรายละเอียดเกี่ยวกับคุณสมบัติและเทคนิคการใช้งานที่นี่
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
คุณอาจพบคลังข้อมูลเช่น Twitter Chat, Open Movie Subtitle หรือ Forums PTT จากที่เก็บคอร์ปัสแชทของฉัน คุณต้องวางไว้ใต้เส้นทางเช่น:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
และสร้างประโยคทดสอบบางประโยค (แต่ละประโยคต่อบรรทัด) ใน:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
หลังจากที่คุณฝึกฝนแบบจำลองของคุณจนงงงวยต่ำกว่า 50 หรือมากกว่านั้นคุณสามารถทำได้:
python3 main.py --mode test --model_name <MODEL_NAME>
[หมายเหตุ !!!] หากคุณใส่พารามิเตอร์ใด ๆ ที่เขียนทับใน main.py commmand ให้แน่ใจว่าได้ใช้ทั้งสองเพื่อฝึกอบรมและทดสอบหรือเพียงแค่แก้ไขใน lib/config.py สำหรับ failsafe
python3 app.py --model_name <MODEL_NAME>
คุณอาจเห็นตัวอย่าง FB_Messenger ขั้นต่ำนี้สำหรับรายละเอียดเพิ่มเติมเช่นการตั้งค่า SSL, WebHook และการทำงานสำหรับข้อผิดพลาดที่รู้จัก
นี่คือการเปรียบเทียบที่น่าสนใจ: การสนทนาด้านซ้ายเปิดใช้งานการค้นหาลำแสงด้วย Beam = 10 การตอบสนองนั้นดีกว่า "ฉันไม่รู้" เสมอ การสนทนาที่ถูกต้องยังใช้การค้นหาลำแสงและนอกจากนี้ยังเปิดใช้งานโมเดลต่อต้านภาษา สิ่งนี้ควรจะยับยั้งการตอบสนองทั่วไปและการตอบสนองจะดีขึ้น
[อัปเดต 2017-03-09] การเรียนรู้การเสริมกำลังไม่ทำงานในขณะนี้รอการแก้ไข
หากคุณต้องการโอกาสในการปรับปรุงแบบจำลองของคุณต่อไปที่นี่ฉันใช้สถาปัตยกรรมการเรียนรู้เสริมแรงที่ได้รับแรงบันดาลใจจาก Li et al., 2016. เพียงเปิดใช้งานตัวเลือก reinforce_learn ใน config.py คุณอาจต้องการเพิ่มกฎของคุณเองในฟังก์ชั่น step_rf() ใน lib/seq2seq_mode.py
โปรดทราบว่าคุณควร ฝึกในโหมดปกติเพื่อรับแบบจำลองที่เหมาะสมก่อน! เนื่องจากการเรียนรู้การเสริมแรงจะสำรวจโลกใหม่ที่กล้าหาญด้วยรูปแบบที่ผ่านการฝึกอบรมมาก่อน มันจะจบลงด้วยการปรับปรุงตัวเองตลอดไปหากคุณเริ่มต้นด้วยโมเดลที่ไม่ดี
SEQ2SEQ เป็นรุ่นที่ยอดเยี่ยมที่เปิดตัวโดย Cho et al., 2014 ในตอนแรกมันเคยใช้ในการแปลเครื่องจักรและในไม่ช้าผู้คนก็พบว่ามีอะไรเกี่ยวกับ การทำแผนที่บางสิ่งบางอย่างกับสิ่งอื่น Chatbot เป็นหนึ่งในปาฏิหาริย์เหล่านี้ซึ่งเราพิจารณาบทสนทนาติดต่อกันเป็นความสัมพันธ์ "การทำแผนที่"
นี่คือภาพอินโทรคลาสสิกแสดงสถาปัตยกรรม SEQ2SEQ Model Architecture โดยอ้างจากบล็อกนี้เกี่ยวกับคุณสมบัติการปรับแต่งอัตโนมัติ Gmail
ปัญหาคือจนถึงตอนนี้เรายังไม่พบฟังก์ชั่นวัตถุประสงค์ที่ดีกว่าสำหรับ chatbot เรายังคงใช้ MLE (การประมาณค่าความเป็นไปได้สูงสุด) ซึ่งทำได้ดีสำหรับการแปลด้วยเครื่อง แต่มักจะสร้างการตอบสนองทั่วไปเช่น "ฉันด้วย", "ฉันคิดอย่างนั้น", "ฉันรักคุณ" ในขณะที่แชท
คำตอบเหล่านี้ไม่ได้ให้ข้อมูล แต่มีความน่าจะเป็นอย่างมาก --- เนื่องจากพวกเขามีแนวโน้มที่จะปรากฏหลายครั้งในคลังการฝึกอบรม เราจะไม่ chatbot ของเราตอบกลับ noncense เหล่านี้เสมอดังนั้นเราจำเป็นต้องหาวิธีที่จะทำให้บอทของเรา "น่าสนใจ" มากขึ้นในทางเทคนิคเพื่อเพิ่ม "ความงุนงง" ของการตอบโต้
ที่นี่เราทำซ้ำงานของ Li et al., 2016 พยายามแก้ปัญหานี้ แนวคิดหลักคือการใช้โมเดล SEQ2SEQ เดียวกันกับแบบจำลองภาษาเพื่อให้ได้คำของผู้สมัครที่มีความน่าจะเป็นสูงในการประทับเวลาการถอดรหัสแต่ละครั้งเป็นแบบต่อต้านโมเดลจากนั้นเราลงโทษคำเหล่านี้เป็นความน่าจะเป็นสูงสำหรับอินพุตใด ๆ โดยการต่อต้านแบบจำลองนี้เราจะได้รับการตอบสนองที่ไม่ได้เป็นพิเศษและไม่ได้เป็นพิเศษมากขึ้น
งานต้นฉบับของ Li et al ใช้ Mert (OCH, 2003) ที่มี Bleu เป็นตัวชี้วัดเพื่อค้นหาการถ่วงน้ำหนักความน่าจะเป็นที่ดีที่สุด (คะแนน λ และ γ (t) = p (t | s)-λu (t) + γnt ) ของแบบจำลองการต่อต้านภาษาที่สอดคล้องกัน แต่ฉันพบว่าคะแนน Bleu ในแชทคอร์ปัสมักจะเป็นศูนย์อยู่เสมอดังนั้นจึงไม่สามารถรับผลลัพธ์ที่มีความหมายได้ที่นี่ หากใครมีความคิดเกี่ยวกับเรื่องนี้ส่งข้อความถึงฉันขอบคุณ!
มีตัวเลือกบางอย่างสำหรับการฝึกอบรมแบบจำลองและการทำนายใน lib/config.py โดยพื้นฐานแล้วพวกเขาจะอธิบายตนเองและสามารถทำงานกับค่าเริ่มต้นสำหรับกรณีส่วนใหญ่ ที่นี่เราแสดงรายการสิ่งที่คุณต้องการในการกำหนดค่าเท่านั้น:
เกี่ยวกับสภาพแวดล้อม
| ชื่อ | พิมพ์ | คำอธิบาย |
|---|---|---|
| โหมด | สาย | โหมดการทำงาน: รถไฟ/ทดสอบ/แชท |
| model_name | สาย | ชื่อรุ่นมีผลต่อเส้นทางการทำงานของคุณ (การจัดเก็บข้อมูล nn_model โฟลเดอร์ผลลัพธ์) |
| scope_name | สาย | ใน TensorFlow หากคุณต้องการโหลดกราฟสองกราฟในเวลาเดียวกันคุณต้องบันทึก/โหลดในเนมสเปซที่แตกต่างกัน (หากคุณต้องการรุ่น SEQ2SEQ เพียงหนึ่งรุ่นให้ปล่อยให้เป็นค่าเริ่มต้น) |
| คำศัพท์ | จำนวนเต็ม | ขึ้นอยู่กับภาษาคลังข้อมูลของคุณ: สำหรับภาษาอังกฤษ 60000 ดีพอ สำหรับภาษาจีนคุณต้องการอย่างน้อย 100,000 หรือ 200000 |
| gpu_usage | ลอย | Tensorflow GPU Memory Fraction ที่ใช้ค่าเริ่มต้นคือ 1 และ TensorFlow จะครอบครอง GPU 100% ของคุณ หากคุณมีงานหลายงานที่ใช้ทรัพยากร GPU ของคุณให้ทำ 0.5 หรือ 0.3 สำหรับ 2 หรือ 3 งาน |
| retonforce_learn | int | ตั้งค่า 1 เพื่อเปิดใช้งานโหมดการเรียนรู้การเสริมแรง |
เกี่ยวกับการถอดรหัส
| ชื่อ | พิมพ์ | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| beam_size | int | 10 | ขนาดการค้นหาลำแสงการตั้งค่า 1 เท่ากับการค้นหาโลภ |
| แอนติเจน | ลอย | 0 (ปิดใช้งาน) | ลงโทษน้ำหนักของแบบจำลองการต่อต้านภาษา |
| n_bonus | ลอย | 0 (ปิดใช้งาน) | รางวัลน้ำหนักของความยาวประโยค |
functin anti-LM ถูกปิดใช้งานโดยค่าเริ่มต้นคุณอาจเริ่มต้นจากการตั้งค่า antilm = 0.5 ~ 0.7 และ n_bonus = 0.05 เพื่อดูว่าคุณชอบความแตกต่างในผลลัพธ์หรือไม่
สำหรับการฝึกอบรมแนะนำให้ใช้ GPU เนื่องจาก SEQ2SEQ เป็นรุ่นขนาดใหญ่คุณต้องใช้พลังการคำนวณบางอย่างในการฝึกอบรมและทำนายได้อย่างมีประสิทธิภาพโดยเฉพาะอย่างยิ่งเมื่อคุณตั้งขนาดลำแสงขนาดใหญ่
ข้อกำหนด DRAM ไม่เข้มงวดเหมือน CPU/GPU เนื่องจากเรากำลังทำการไล่ระดับสีแบบสุ่ม
หากคุณยังใหม่กับการเรียนรู้อย่างลึกซึ้งการตั้งค่าสิ่งต่าง ๆ เช่น GPU สภาพแวดล้อม Python น่ารำคาญสำหรับคุณนี่คือสภาพแวดล้อมการเรียนรู้ของเครื่องจักรของฉัน:
(Docker รุ่นที่ไม่ใช่ GPU) / (Docker เวอร์ชัน GPU)
SEQ2SEQ เป็นนางแบบที่มีรอบคัดเลือกมากมายฉันใช้เวลาสำรวจมาระยะหนึ่งแล้วและนี่คือวัสดุที่ดีที่สุดที่เป็นประโยชน์ต่อฉันมาก:
บล็อกที่ดีที่สุดในการอธิบาย RNN, LSTM, GRU และ SEQ2SEQ Model: การทำความเข้าใจเครือข่าย LSTM โดย Christopher Olah
งานนี้ Sherjilozair/Char-RNN-Tensorflow ช่วยให้ฉันเรียนรู้มากมายเกี่ยวกับรูปแบบภาษาและกราฟการใช้งานใน TensorFlow
หากคุณมีความสนใจในเวทมนตร์เพิ่มเติมเกี่ยวกับ RNN นี่คือบล็อกที่ต้องอ่าน: ประสิทธิภาพที่ไม่สมเหตุสมผลของเครือข่ายประสาทที่เกิดขึ้นซ้ำโดย Andrej Karpathy
รุ่นวานิลลา SEQ2SEQ+ความสนใจ: NICOLAS-IVANOV/TF_SEQ2SEQ_CHATBOT สิ่งนี้จะช่วยให้คุณทราบถึงการไหลหลักของโมเดลวานิลลา SEQ2SEQ และฉันสร้างที่เก็บนี้ตามงานนี้
ขณะนี้ฉันสร้างคานค้นหาจากกราฟซึ่งหมายความว่า-มันช้ามาก มีการอภิปรายเกี่ยวกับการสร้างมันในกราฟที่นี่และที่นั่น แต่น่าเสียดายที่ถ้าคุณต้องการเพิ่มอะไรมากกว่าการค้นหาคานเช่นงานต่อต้าน LM นี้คุณต้องมีมากกว่าการค้นหาคานที่จะเป็นกราฟ
ฉันยังไม่ทราบว่า mert กับ Bleu สามารถเพิ่มน้ำหนักของแบบจำลองต่อต้าน LM ได้อย่างไรเนื่องจากปัจจุบัน Bleu มักเป็นศูนย์