#### [Pembaruan 2017-03-14]
- Tingkatkan ke TensorFlow v1.0.0, tidak ada yang kompatibel karena TensorFlow telah banyak berubah.
- Model pra-terlatih dengan corpus Twitter ditambahkan, hanya
./go_exampleuntuk mengobrol! (atau pratinjau contoh obrolan saya)- Anda bisa mulai dari melacak skrip
go_exampleini untuk mengetahui cara kerja!
Ini adalah model SEQ2SEQ yang dimodifikasi dari contoh TensorFlow.
app.py server flask ringan disertakan untuk menjadi backend aplikasi Facebook Messenger. Saya menjelaskan beberapa detail tentang fitur dan beberapa trik implementasi di sini.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
Anda mungkin menemukan corpus seperti obrolan Twitter, Buka Film Subtitle, atau Forum PTT dari Repositori Chat Corpus saya. Anda harus meletakkannya di bawah jalan seperti:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
Dan membuat kerajinan tangan beberapa kalimat pengujian (setiap kalimat per baris) di:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
Setelah Anda melatih model Anda sampai kebingungan di bawah 50 atau lebih, Anda bisa melakukannya:
python3 main.py --mode test --model_name <MODEL_NAME>
[CATATAN !!!] Jika Anda menempatkan parameter apa pun yang ditimpa dalam Main.py Commmand ini, pastikan untuk menerapkan baik untuk melatih dan menguji, atau hanya memodifikasi di lib/config.py untuk failsafe.
python3 app.py --model_name <MODEL_NAME>
Anda dapat melihat contoh fb_messenger minimum ini untuk detail lebih lanjut seperti menyiapkan SSL, Webhook, dan Work-Arounds untuk bug yang diketahui.
Berikut perbandingan yang menarik: percakapan kiri memungkinkan pencarian balok dengan balok = 10, responsnya nyaris tidak lebih baik dari biasanya "Saya tidak tahu". Percakapan yang tepat juga menggunakan pencarian balok dan juga, memungkinkan model anti-bahasa. Ini seharusnya menekan respons generik, dan responsnya tampaknya lebih baik.
[UPDATE 2017-03-09] Pembelajaran penguatan tidak berfungsi sekarang, tunggu untuk diperbaiki.
Jika Anda ingin beberapa kesempatan untuk lebih meningkatkan model Anda, di sini saya menerapkan arsitektur pembelajaran penguatan yang diilhami oleh Li et al., 2016. Cukup aktifkan opsi interforce_learn di config.py , Anda mungkin ingin menambahkan aturan Anda sendiri dalam fungsi step_rf() di lib/seq2seq_mode.py .
Perhatikan bahwa Anda harus berlatih dalam mode normal untuk mendapatkan model yang layak terlebih dahulu! , karena pembelajaran penguatan akan mengeksplorasi dunia baru yang berani dengan model pra-terlatih ini. Ini akan berakhir selamanya untuk meningkatkan dirinya sendiri jika Anda mulai dengan model yang buruk.
SEQ2SEQ adalah model hebat yang dirilis oleh Cho et al., 2014. Pada awalnya ini digunakan untuk melakukan terjemahan mesin, dan segera orang menemukan bahwa apa pun tentang memetakan sesuatu ke hal lain juga dapat dicapai dengan model SEQ2SEQ. Chatbot adalah salah satu mukjizat ini, di mana kami menganggap dialog berturut -turut sebagai semacam hubungan "pemetaan".
Berikut ini adalah gambar intro klasik yang menunjukkan arsitektur model SEQ2SEQ, kutipan dari posting blogpost ini tentang fitur gmail otomatis.
Masalahnya adalah, sejauh ini kami belum menemukan fungsi objektif yang lebih baik untuk chatbot. Kami masih menggunakan MLE (estimasi kemungkinan maksimum), yang baik untuk terjemahan mesin, tetapi selalu menghasilkan respons generik seperti "saya juga", "Saya pikir begitu", "Aku mencintaimu" saat melakukan obrolan.
Tanggapan ini tidak informatif, tetapi mereka memiliki probabilitas besar --- karena mereka cenderung muncul berkali-kali dalam pelatihan corpus. Kami tidak akan selalu membalas chatbot kami yang tidak masuk akal ini, jadi kami perlu menemukan beberapa cara untuk membuat bot kami lebih "menarik", secara teknis, untuk meningkatkan "kebingungan" tanggapan.
Di sini kami mereproduksi karya li. et al., 2016 mencoba menyelesaikan masalah ini. Gagasan utamanya adalah menggunakan model SEQ2SEQ yang sama sebagai model bahasa, untuk mendapatkan kata-kata kandidat dengan probabilitas tinggi di setiap cap waktu decoding sebagai anti-model, maka kami menghukum kata-kata ini selalu menjadi probabilitas tinggi untuk setiap input. Dengan anti-model ini, kita bisa mendapatkan respons yang lebih istimewa, non-generik, informatif.
Karya asli li. et al menggunakan Mert (Och, 2003) dengan Bleu sebagai metrik untuk menemukan bobot probabilitas terbaik ( λ dan γ dalam skor (t) = p (t | s)-λu (t) + γnt ) dari model anti-bahasa yang sesuai. Tetapi saya menemukan bahwa skor Bleu dalam chat corpus cenderung selalu menjadi nol, sehingga tidak bisa mendapatkan hasil yang bermakna di sini. Jika ada yang tahu tentang ini, kirimi saya pesan, terima kasih!
Ada beberapa opsi untuk pelatihan model dan memprediksi di lib/config.py. Pada dasarnya mereka dijelaskan sendiri dan dapat bekerja dengan nilai default untuk sebagian besar kasus. Di sini kami hanya mencantumkan sesuatu yang perlu Anda konfigurasikan:
Tentang lingkungan
| nama | jenis | Keterangan |
|---|---|---|
| mode | rangkaian | Mode kerja: Kereta/tes/obrolan |
| model_name | rangkaian | nama model, mempengaruhi jalur kerja Anda (menyimpan data, nn_model, folder hasil) |
| scope_name | rangkaian | Di TensorFlow jika Anda perlu memuat dua grafik secara bersamaan, Anda perlu menyimpan/memuatnya dalam namespace yang berbeda. (Jika Anda hanya membutuhkan satu model seq2seq, biarkan default) |
| vocab_size | bilangan bulat | Tergantung pada bahasa corpus Anda: untuk bahasa Inggris, 60000 sudah cukup baik. Untuk bahasa Cina Anda membutuhkan setidaknya 100000 atau 200000. |
| gpu_usage | mengambang | Fraksi memori GPU TensorFlow yang digunakan, default adalah 1 dan TensorFlow akan menempati 100% GPU Anda. Jika Anda memiliki multi -pekerjaan yang berbagi sumber daya GPU Anda, buat 0,5 atau 0,3, untuk 2 atau 3 pekerjaan. |
| penguat_learn | int | Atur 1 untuk mengaktifkan mode pembelajaran penguatan |
Tentang decoding
| nama | jenis | bawaan | Keterangan |
|---|---|---|---|
| beam_size | int | 10 | Ukuran pencarian balok, pengaturan 1 sama dengan pencarian serakah |
| Antilm | mengambang | 0 (dinonaktifkan) | menghukum berat model anti-bahasa |
| n_bonus | mengambang | 0 (dinonaktifkan) | Hadiah berat panjang kalimat |
Fungsi anti-LM dinonaktifkan secara default, Anda dapat mulai dari pengaturan antilm = 0,5 ~ 0,7 dan n_bonus = 0,05 untuk melihat apakah Anda menyukai perbedaan hasil.
Untuk pelatihan, GPU direkomendasikan karena SEQ2SEQ adalah model besar, Anda memerlukan kekuatan komputasi tertentu untuk melakukan pelatihan dan memprediksi secara efisien, terutama ketika Anda mengatur ukuran pencarian balok yang besar.
Persyaratan DRAM tidak ketat sebagai CPU/GPU, karena kami melakukan gradien stokastik yang layak.
Jika Anda baru dalam pembelajaran dalam, pengaturan hal-hal seperti GPU, Python Environment menjengkelkan bagi Anda, berikut adalah Dockers dari lingkungan pembelajaran mesin saya:
(Non-GPU Version Docker) / (GPU Version Docker)
Seq2seq adalah model dengan banyak pendahuluan, saya telah menghabiskan cukup banyak waktu survei dan berikut adalah beberapa bahan terbaik yang sangat menguntungkan saya:
BlogPost terbaik yang menjelaskan model RNN, LSTM, GRU dan SEQ2SEQ: Memahami Jaringan LSTM oleh Christopher Olah.
Karya ini Sherjilozair/Char-RNN-TensorFlow membantu saya belajar banyak tentang model bahasa dan grafik implementasi di TensorFlow.
Jika Anda tertarik pada lebih banyak keajaiban tentang RNN, berikut adalah posting blog yang harus dibaca: efektivitas jaringan saraf berulang yang tidak masuk akal oleh Andrej Karpathy.
Vanilla versi seq2seq+perhatian: nicolas-ivanov/tf_seq2seq_chatbot. Ini akan membantu Anda mengetahui aliran utama model Vanilla SEQ2SEQ, dan saya membangun repositori ini berdasarkan pekerjaan ini.
Saat ini saya membangun pencarian balok dari grafik, yang berarti --- ini sangat lambat. Ada diskusi tentang membangunnya di grafik di sana-sini. Namun sayangnya jika Anda ingin menambahkan sesuatu lebih dari sekadar pencarian balok, seperti pekerjaan anti-LM ini, Anda membutuhkan lebih dari sekadar pencarian balok untuk menjadi in-graf.
Saya belum tahu bagaimana Mert dengan Bleu dapat mengoptimalkan berat model anti-LM, karena saat ini Bleu sering menjadi nol.