งานนี้พยายามสร้างผลลัพธ์ของโมเดลการสนทนาทางประสาท (หรือที่รู้จักในชื่อแชทบอทของ Google) ใช้ RNN (โมเดล seq2seq) สำหรับการคาดเดาประโยค ทำได้โดยใช้ python และ TensorFlow
ส่วนการโหลดคลังข้อมูลของโปรแกรมได้รับแรงบันดาลใจจาก Torch neuralconvo จาก macournoyer
ในตอนนี้ DeepQA รองรับคลังข้อความโต้ตอบต่อไปนี้:
--corpus opensubs
--corpus scotus
ดูคำแนะนำในการติดตั้ง--corpus ubuntu
ดูคำแนะนำในการติดตั้งเพื่อเร่งการฝึกอบรม คุณสามารถใช้การฝังคำที่ผ่านการฝึกอบรมมาแล้วได้ (ขอบคุณ Eschnou) ข้อมูลเพิ่มเติมที่นี่
โปรแกรมต้องการการพึ่งพาดังต่อไปนี้ (ติดตั้งง่ายโดยใช้ pip: pip3 install -r requirements.txt
):
คุณอาจต้องดาวน์โหลดข้อมูลเพิ่มเติมเพื่อให้ nltk ทำงานได้
python3 -m nltk.downloader punkt
รวมชุดข้อมูล Cornell แล้ว สำหรับชุดข้อมูลอื่นๆ ให้ดูที่ไฟล์ readme ลงในโฟลเดอร์ที่เกี่ยวข้อง (ภายใน data/
)
เว็บอินเตอร์เฟสต้องการแพ็คเกจเพิ่มเติม:
มีการติดตั้ง Docker ด้วย คำแนะนำโดยละเอียดเพิ่มเติมที่นี่
หากต้องการฝึกโมเดล เพียงเรียกใช้ main.py
เมื่อฝึกฝนแล้ว คุณสามารถทดสอบผลลัพธ์ด้วย main.py --test
(ผลลัพธ์ที่สร้างใน 'save/model/samples_predictions.txt') หรือ main.py --test interactive
(สนุกยิ่งขึ้น)
นี่คือแฟล็กบางส่วนที่อาจมีประโยชน์ หากต้องการความช่วยเหลือและตัวเลือกเพิ่มเติม ให้ใช้ python main.py -h
:
--modelTag
: อนุญาตให้ตั้งชื่อให้กับโมเดลปัจจุบันเพื่อแยกความแตกต่างระหว่างโมเดลเหล่านั้นเมื่อทำการทดสอบ/ฝึกอบรม--keepAll
: ใช้แฟล็กนี้เมื่อฝึกซ้อม หากเมื่อทำการทดสอบ คุณต้องการดูการคาดการณ์ในขั้นตอนต่างๆ (น่าสนใจที่จะเห็นโปรแกรมเปลี่ยนชื่อและอายุตามความคืบหน้าของการฝึกอบรม) คำเตือน: อาจใช้พื้นที่เก็บข้อมูลจำนวนมากอย่างรวดเร็วหากคุณไม่เพิ่มตัวเลือก --saveEvery
--filterVocab 20
หรือ --vocabularySize 30000
: จำกัดขนาดคำศัพท์และเพิ่มประสิทธิภาพการทำงานและการใช้หน่วยความจำ แทนที่คำที่ใช้น้อยกว่า 20 ครั้งด้วยโทเค็น
และตั้งค่าขนาดคำศัพท์สูงสุด--verbose
: เมื่อทำการทดสอบจะพิมพ์ประโยคในขณะที่คำนวณ--playDataset
: แสดงตัวอย่างบทสนทนาบางส่วนจากชุดข้อมูล (สามารถใช้ร่วมกับ --createDataset
หากนี่เป็นการกระทำเดียวที่คุณต้องการดำเนินการ) หากต้องการแสดงกราฟการคำนวณและค่าใช้จ่ายด้วย TensorBoard เพียงเรียกใช้ tensorboard --logdir save/
ตามค่าเริ่มต้น สถาปัตยกรรมเครือข่ายคือตัวเข้ารหัส/ตัวถอดรหัสมาตรฐานที่มีเลเยอร์ LSTM สองชั้น (ขนาดที่ซ่อนอยู่คือ 256) และขนาดการฝังสำหรับคำศัพท์คือ 32 เครือข่ายได้รับการฝึกฝนโดยใช้ ADAM ความยาวประโยคสูงสุดตั้งไว้ที่ 10 คำ แต่สามารถเพิ่มได้
เมื่อได้รับการฝึกอบรมแล้ว คุณสามารถสนทนากับมันได้โดยใช้อินเทอร์เฟซที่เป็นมิตรต่อผู้ใช้มากขึ้น เซิร์ฟเวอร์จะดูโมเดลที่คัดลอกไปยัง save/model-server/model.ckpt
ครั้งแรกที่คุณต้องการใช้งาน คุณจะต้องกำหนดค่าด้วย:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
จากนั้น หากต้องการเปิดเซิร์ฟเวอร์ภายในเครื่อง ให้ใช้คำสั่งต่อไปนี้:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
หลังจากเปิดตัว อินเทอร์เฟซควรจะพร้อมใช้งานบน http://localhost:8000/ หากคุณต้องการปรับใช้โปรแกรมบนเซิร์ฟเวอร์ ให้ใช้ python manage.py runserver 0.0.0.0
แทน ข้อมูลเพิ่มเติมที่นี่
น่าประหลาดใจที่เป็นไปได้ที่จะได้รับผลลัพธ์หลังจากการฝึกอบรมเพียง 1 หรือ 2 ชั่วโมง (บน GeForce GT 740M) โดยการลดลำดับอินพุตลงอย่างมากเหลือ 5 คำและเอาต์พุตเหลือ 3 (บวกโทเค็น go
และ eos
) และโดยการใช้ขนาดเล็ก ขนาดการฝัง (ประมาณ 25) ตั้งแต่นั้นมา ฉันแก้ไขโค้ดและตอนนี้ความยาวของเอาต์พุตจะต้องตรงกับอินพุต แต่คุณยังสามารถสร้างผลลัพธ์ดั้งเดิมขึ้นมาใหม่ได้โดยใช้เวอร์ชันนี้ แน่นอนว่าเครือข่ายจะไม่ช่างพูดจริงๆ:
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
ต่อไปนี้เป็นบางกรณีที่ล้มเหลว:
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
ด้วยประโยคที่ยาวขึ้น เครือข่ายจะฝึกได้ช้ากว่ามาก หลังจากการวนซ้ำ 250,000 ครั้งด้วย maxLength=10 เครือข่ายยังคงให้คำตอบแบบหลีกเลี่ยงเป็นหลัก (โดยการตอบคำถามปลายเปิดส่วนใหญ่โดย 'ฉันไม่รู้') แต่ดูเหมือนว่าจะรวมความหมายพื้นฐานบางอย่างเข้าด้วยกัน:
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
ดังที่แสดงไว้ในคำถามสุดท้าย เครือข่ายยังคงมีความสับสนระหว่างเพศกับปัจจุบัน/อนาคต ฉันยังลองถามคำถามเชิงปรัชญาที่ลึกซึ้งยิ่งขึ้นโดยประสบความสำเร็จไม่มากก็น้อย
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
แบบจำลองที่ฉันฝึกค่อนข้างถูกจำกัดด้วยขนาดการฝังที่ฉันใส่ ขนาดของมัน และตามขนาดคลังข้อมูลการฝึก 'เวกเตอร์ความคิด' ของมันอาจเล็กเกินไปที่จะตอบสิ่งต่อไปนี้:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
ดูเหมือนว่ามันจะพอดีเกินไปเพราะบางครั้งมันก็หลุดประโยคออกมาจากชุดการฝึกที่ไม่เกี่ยวข้องกับคำถาม การเพิ่มการออกกลางคันควรช่วยลดปัญหาได้
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
หมายเหตุ: ลิงก์ใช้งานไม่ได้อีกต่อไป
คุณสามารถค้นหาโมเดลที่ได้รับการฝึกอบรมล่วงหน้าได้ที่นี่ ซึ่งได้รับการฝึกฝนจากคลังข้อมูลเริ่มต้น หากต้องการใช้:
DeepQA/save/
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
ไปยัง data/samples/
./main.py --modelTag pretrainedv2 --test interactive
ขอบคุณ Nicholas C. ที่นี่ (ต้นฉบับ) คือโมเดลที่ได้รับการฝึกอบรมล่วงหน้าเพิ่มเติมบางส่วน (เข้ากันได้กับ TF 1.2) สำหรับชุดข้อมูลที่หลากหลาย โฟลเดอร์นี้ยังมีชุดข้อมูลที่ประมวลผลล่วงหน้าสำหรับ Cornell, OpenSubtitles, Ubuntu และ Scotus (เพื่อย้ายเข้าไปภายใน data/samples/
) สิ่งที่จำเป็นคือคุณไม่ต้องการประมวลผลชุดข้อมูลด้วยตัวเอง
หากคุณมี GPU ระดับไฮเอนด์ อย่าลังเลที่จะเล่นกับไฮเปอร์พารามิเตอร์/คลังข้อมูลเพื่อฝึกโมเดลที่ดีกว่า จากการทดลองของฉัน ดูเหมือนว่าอัตราการเรียนรู้และอัตราการออกกลางคันมีผลกระทบต่อผลลัพธ์มากที่สุด นอกจากนี้ หากคุณต้องการแบ่งปันแบบจำลองของคุณ อย่าลังเลที่จะติดต่อฉัน แล้วฉันจะเพิ่มไว้ที่นี่
นอกเหนือจากการลองใช้โมเดลที่ใหญ่ขึ้น/ลึกขึ้นแล้ว ยังมีการปรับปรุงเล็กๆ น้อยๆ อีกมากมายที่สามารถทดสอบได้ อย่าลังเลที่จะส่งคำขอดึงหากคุณใช้หนึ่งในนั้น นี่คือแนวคิดบางส่วน:
loop_function
ของ tf.nn.seq2seq.rnn_decoder
ก็ไม่ควรเพิ่มยากเกินไป หลังจากนั้นก็ควรเล่นกับอุณหภูมิ SoftMax เพื่อให้ได้คำทำนายที่อนุรักษ์นิยมหรือแปลกใหม่มากขึ้นembedding_rnn_seq2seq
ด้วย embedding_attention_seq2seq
บน model.py
Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
เราสามารถสร้าง 3 ตัวอย่างใหม่: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
และ Q:Sentence 2. => A:Sentence X.
. คำเตือน: ชุดค่าผสมอื่นๆ เช่น Q:Sentence 1. => A:Sentence X.
จะไม่ทำงานเพราะจะทำให้การเปลี่ยนแปลง 2 => X
ซึ่งเชื่อมโยงคำถามกับคำตอบ)
และ
สามารถเพิ่มได้ เพื่อให้ตัวเข้ารหัสรู้ว่าเมื่อคู่สนทนามีการเปลี่ยนแปลง ฉันไม่แน่ใจว่าโมเดล seq2seq แบบธรรมดาจะเพียงพอที่จะจับการพึ่งพาระยะยาวระหว่างประโยค การเพิ่มระบบบัคเก็ตเพื่อจัดกลุ่มความยาวอินพุตที่คล้ายกันเข้าด้วยกันอาจช่วยเพิ่มความเร็วในการฝึกได้อย่างมาก