Karya ini mencoba mereproduksi hasil A Neural Conversational Model (alias Google chatbot). Ini menggunakan RNN (model seq2seq) untuk prediksi kalimat. Itu dilakukan dengan menggunakan python dan TensorFlow.
Bagian korpus pemuatan dari program ini terinspirasi oleh neuralconvo Torch dari macournoyer.
Untuk saat ini, DeepQA mendukung korpus dialog berikut:
--corpus opensubs
.--corpus scotus
. Lihat petunjuk pemasangannya.--corpus ubuntu
. Lihat petunjuk pemasangannya.Untuk mempercepat pelatihan, Anda juga dapat menggunakan penyematan kata yang telah dilatih sebelumnya (terima kasih kepada Eschnou). Info lebih lanjut di sini.
Program ini memerlukan dependensi berikut (mudah dipasang menggunakan pip: pip3 install -r requirements.txt
):
Anda mungkin juga perlu mengunduh data tambahan agar nltk berfungsi.
python3 -m nltk.downloader punkt
Dataset Cornell sudah disertakan. Untuk dataset lainnya, lihat file readme ke dalam foldernya masing-masing (di dalam data/
).
Antarmuka web memerlukan beberapa paket tambahan:
Instalasi Docker juga tersedia. Petunjuk lebih rinci di sini.
Untuk melatih model, jalankan main.py
. Setelah dilatih, Anda dapat menguji hasilnya dengan main.py --test
(hasil dihasilkan di 'save/model/samples_predictions.txt') atau main.py --test interactive
(lebih menyenangkan).
Berikut beberapa tanda yang mungkin berguna. Untuk bantuan dan opsi lebih lanjut, gunakan python main.py -h
:
--modelTag
: memungkinkan untuk memberi nama pada model saat ini untuk membedakannya saat pengujian/pelatihan.--keepAll
: gunakan tanda ini saat berlatih jika saat menguji, Anda ingin melihat prediksi pada langkah yang berbeda (akan menarik melihat program mengubah nama dan usianya seiring kemajuan pelatihan). Peringatan: Ini dapat memakan banyak ruang penyimpanan dengan cepat jika Anda tidak menambah opsi --saveEvery
.--filterVocab 20
atau --vocabularySize 30000
: Batasi ukuran kosakata dan optimalkan performa dan penggunaan memori. Gantikan kata-kata yang digunakan kurang dari 20 kali dengan token
dan tetapkan ukuran kosakata maksimum.--verbose
: saat pengujian, akan mencetak kalimat saat dihitung.--playDataset
: menampilkan beberapa contoh dialog dari kumpulan data (dapat digunakan bersama dengan --createDataset
jika ini adalah satu-satunya tindakan yang ingin Anda lakukan). Untuk memvisualisasikan grafik komputasi dan biaya dengan TensorBoard, jalankan tensorboard --logdir save/
.
Secara default, arsitektur jaringan adalah encoder/decoder standar dengan dua lapisan LSTM (ukuran tersembunyi 256) dan ukuran penyematan untuk kosakata 32. Jaringan dilatih menggunakan ADAM. Panjang kalimat maksimal diatur 10 kata, namun dapat ditambah.
Setelah dilatih, Anda dapat mengobrol dengannya menggunakan antarmuka yang lebih ramah pengguna. Server akan melihat model yang disalin ke save/model-server/model.ckpt
. Pertama kali Anda ingin menggunakannya, Anda harus mengkonfigurasinya dengan:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
Kemudian, untuk meluncurkan server secara lokal, gunakan perintah berikut:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
Setelah peluncuran, antarmuka akan tersedia di http://localhost:8000/. Jika Anda ingin menerapkan program di server, gunakan python manage.py runserver 0.0.0.0
sebagai gantinya. Info lebih lanjut di sini.
Yang mengejutkan, beberapa hasil dapat diperoleh hanya setelah 1 atau 2 jam pelatihan (pada GeForce GT 740M), dengan secara drastis mengurangi urutan masukan menjadi 5 kata dan keluaran menjadi 3 (ditambah token go
dan eos
) dan dengan menggunakan sedikit ukuran penyematan (kira-kira 25). Sejak itu saya memodifikasi kodenya dan sekarang panjang keluaran harus sesuai dengan panjang masukan tetapi Anda masih dapat mereproduksi hasil aslinya, menggunakan versi ini. Tentu saja, jaringannya tidak akan terlalu cerewet:
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.
Berikut adalah beberapa kasus yang gagal:
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...
Dengan kalimat yang lebih panjang, jaringan akan jauh lebih lambat untuk dilatih. Setelah 250.000 iterasi dengan maxLength=10, jaringan masih memberikan jawaban mengelak (dengan menjawab sebagian besar pertanyaan terbuka dengan 'Saya tidak tahu') tetapi tampaknya telah mengintegrasikan beberapa semantik dasar:
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.
Seperti yang ditunjukkan pada pertanyaan terakhir, jaringan ini masih mengalami kebingungan antara gender dan masa kini/masa depan. Saya juga mencoba beberapa pertanyaan filosofis yang lebih dalam dan kurang lebih berhasil.
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.
Model yang saya latih sangat dibatasi oleh ukuran penyematan yang saya masukkan dan ukurannya, serta ukuran korpus pelatihan. 'Vektor pemikiran'-nya mungkin juga terlalu kecil untuk menjawab pertanyaan berikut:
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.
Tampaknya juga terlalu cocok karena terkadang hanya mengeluarkan kalimat dari set pelatihannya yang tidak ada hubungannya dengan pertanyaan. Menambahkan beberapa orang yang putus sekolah akan mengurangi masalah ini.
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.
Catatan: Tautan tidak berfungsi lagi.
Anda dapat menemukan model terlatih di sini , dilatih dari korpus default. Untuk menggunakannya:
DeepQA/save/
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
ke data/samples/
../main.py --modelTag pretrainedv2 --test interactive
. Terima kasih kepada Nicholas C., berikut (asli) beberapa model terlatih tambahan (kompatibel dengan TF 1.2) untuk beragam kumpulan data. Folder tersebut juga berisi kumpulan data yang telah diproses sebelumnya untuk Cornell, OpenSubtitles, Ubuntu dan Scotus (untuk dipindahkan ke dalam data/samples/
). Yang diperlukan adalah Anda tidak ingin memproses kumpulan data sendiri.
Jika Anda memiliki GPU kelas atas, jangan ragu untuk bermain dengan hyper-parameter/corpus untuk melatih model yang lebih baik. Dari percobaan saya, tampaknya learning rate dan dropout rate mempunyai pengaruh paling besar terhadap hasil. Juga jika Anda ingin membagikan model Anda, jangan ragu untuk menghubungi saya dan saya akan menambahkannya di sini.
Selain mencoba model yang lebih besar/lebih dalam, ada banyak perbaikan kecil yang bisa diuji. Jangan ragu untuk mengirimkan pull request jika Anda menerapkan salah satunya. Berikut beberapa idenya:
loop_function
dari tf.nn.seq2seq.rnn_decoder
, seharusnya tidak terlalu sulit untuk menambahkannya. Setelah itu, suhu SoftMax dapat dimainkan untuk mendapatkan prediksi yang lebih konservatif atau eksotis.embedding_rnn_seq2seq
dengan embedding_attention_seq2seq
pada model.py
.Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
kita dapat menghasilkan 3 sampel baru: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
dan Q:Sentence 2. => A:Sentence X.
. Peringatan: kombinasi lain seperti Q:Sentence 1. => A:Sentence X.
tidak akan berfungsi karena akan merusak transisi 2 => X
yang menghubungkan pertanyaan ke pertanyaan menjawab)
dan
dapat ditambahkan sehingga pembuat enkode mengetahui kapan lawan bicaranya berubah. Saya tidak yakin model seq2seq sederhana akan cukup untuk menangkap ketergantungan jangka panjang antar kalimat. Menambahkan sistem bucket untuk mengelompokkan panjang masukan yang serupa dapat meningkatkan kecepatan pelatihan secara signifikan.