Sequence-to-Sequence Bagian 1 Model

Hari baik untuk semua!

Dan kami kembali membuka aliran baru ke kursus Data Scientist yang direvisi: guru luar biasa lainnya, program yang sedikit disempurnakan berdasarkan pembaruan. Nah, seperti biasa, pelajaran terbuka menarik dan koleksi bahan-bahan menarik. Hari ini kita akan memulai analisis model seq2seq dari Tensor Flow.

Ayo pergi.

Seperti yang sudah dibahas dalam tutorial RNN (kami sarankan Anda membiasakan diri dengannya sebelum membaca artikel ini), jaringan saraf berulang dapat diajarkan untuk memodelkan bahasa. Dan muncul pertanyaan yang menarik: apakah mungkin untuk melatih jaringan pada data tertentu untuk menghasilkan jawaban yang bermakna? Misalnya, dapatkah kita mengajarkan jaringan saraf untuk menerjemahkan dari Bahasa Inggris ke Bahasa Prancis? Ternyata kita bisa.

Panduan ini akan menunjukkan cara membuat dan melatih sistem end-to-end. Salin repositori inti aliran Tensor dan repositori model TensorFlow dari GitHub . Kemudian, Anda dapat memulai dengan memulai program terjemahan:

cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory] 



Dia akan mengunduh data untuk diterjemahkan dari bahasa Inggris ke bahasa Prancis dari situs web WMT'15 , mempersiapkannya untuk pelatihan dan pelatihan. Ini akan membutuhkan sekitar 20GB pada hard drive dan cukup banyak waktu untuk mengunduh dan menyiapkan, sehingga Anda dapat memulai proses sekarang dan melanjutkan membaca tutorial ini.

Manual akan mengakses file-file berikut:

FileApa isinya?
tensorflow / tensorflow / python / ops / seq2seq.pyPerpustakaan untuk membuat model urutan-ke-urutan
model / tutorial / rnn / terjemahkan / seq2seq_model.pyModel terjemahan neural urutan-ke-urutan
models / tutorials / rnn / translate / data_utils.pyFungsi pembantu untuk menyiapkan data terjemahan
model / tutorial / rnn / terjemahkan / translate.pyBiner yang melatih dan menjalankan model terjemahan

Dasar-dasar urutan-ke-urutan

Model urutan-ke-urutan dasar, seperti yang disajikan oleh Cho et al., 2014 ( pdf ), terdiri dari dua jaringan saraf berulang (RNNs): enkoder (enkoder) yang memproses input data dan decoder (decoder) yang menghasilkan data keluaran. Arsitektur dasar ditunjukkan di bawah ini:



Setiap persegi panjang pada gambar di atas mewakili sel dalam RNN, biasanya sel GRU - blok pengulangan terkontrol, atau sel LSTM - memori jangka pendek jangka panjang (baca tutorial RNN untuk mempelajari lebih lanjut tentang mereka). Encoder dan decoder dapat memiliki bobot yang sama atau, lebih sering, menggunakan set parameter yang berbeda. Sel multilayer telah berhasil digunakan dalam model urutan-ke-urutan, misalnya, untuk menerjemahkan Sutskever et al., 2014 ( pdf ).

Dalam model dasar yang dijelaskan di atas, setiap input harus dikodekan ke dalam vektor keadaan ukuran tetap, karena ini adalah satu-satunya hal yang ditransmisikan ke dekoder. Untuk memberikan decoder lebih banyak akses langsung ke input data, mekanisme perhatian diperkenalkan di Bahdanau et al., 2014 ( pdf ). Kami tidak akan merinci mekanisme perhatian (untuk ini Anda dapat membiasakan diri dengan pekerjaan di sini); Cukuplah untuk mengatakan bahwa itu memungkinkan decoder untuk melihat data input pada setiap langkah decoding. Jaringan urutan-ke-urutan multilayer dengan sel LSTM dan mekanisme perhatian dalam dekoder adalah sebagai berikut:



Pustaka TensorFlow seq2seq

Seperti yang Anda lihat di atas, ada berbagai model urutan-ke-urutan. Semuanya dapat menggunakan sel RNN yang berbeda, tetapi semuanya menerima data input encoder dan data input decoder. Ini adalah dasar dari antarmuka perpustakaan TensorFlow seq2seq (tensorflow / tensorflow / python / ops / seq2seq.py). Model dasar, RNN, codec, urutan-ke-urutan ini berfungsi sebagai berikut.

 outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell) 

Dalam panggilan di atas, encoder_inputs adalah daftar tensor yang mewakili data input encoder, sesuai dengan huruf A, B, C dari gambar di atas. Demikian pula, decoder_inputs adalah tensor yang mewakili data input decoder. GO, W, X, Y, Z dari gambar pertama.

Argumen cell adalah turunan dari kelas tf.contrib.rnn.RNNCell , yang menentukan sel mana yang akan digunakan dalam model. Anda dapat menggunakan sel yang ada, misalnya, GRUCell atau LSTMCell , atau Anda dapat menulis sendiri. Selain itu, tf.contrib.rnn menyediakan shell untuk membuat sel multilayer, menambahkan pengecualian pada input dan output sel, atau transformasi lainnya. Lihatlah Tutorial RNN sebagai contoh.

Panggilan basic_rnn_seq2seq mengembalikan dua argumen: outputs dan states . Keduanya mewakili daftar tensor dengan panjang yang sama dengan decoder_inputs . outputs sesuai dengan data output decoder pada setiap langkah waktu, pada gambar pertama adalah W, X, Y, Z, EOS. Status yang dikembalikan mewakili keadaan internal decoder pada setiap langkah waktu.

Dalam banyak aplikasi menggunakan model urutan-ke-urutan, output decoder pada waktu t ditransmisikan kembali ke input ke decoder pada waktu t +1. Selama pengujian, selama decoding urutan, ini adalah bagaimana yang baru dibangun. Di sisi lain, selama pelatihan biasanya mengirimkan ke decoder data input yang benar pada setiap langkah waktu, bahkan jika decoder sebelumnya salah. Fungsi di seq2seq.py mendukung kedua mode dengan argumen feed_previous . Misalnya, pertimbangkan penggunaan model RNN bersarang berikut ini.

 outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False) 

Dalam model embedding_rnn_seq2seq , semua data input (baik encoder_inputs dan decoder_inputs ) adalah tensor bilangan bulat yang mencerminkan nilai diskrit. Mereka akan bersarang dalam representasi ketat (untuk detail pada lampiran, lihat Panduan Tampilan Vektor ), tetapi untuk membuat lampiran ini, Anda perlu menentukan jumlah maksimum karakter diskrit: num_encoder_symbols di sisi encoder dan num_decoder_symbols di sisi decoder.

Dalam panggilan di atas, kami menetapkan feed_previous ke False. Ini berarti bahwa decoder akan menggunakan tensor decoder_inputs dalam bentuk yang disediakan. Jika kita menetapkan feed_previous ke True, decoder hanya akan menggunakan elemen decoder_inputs pertama. Semua tensor lain dari daftar akan diabaikan, dan nilai keluaran dekoder sebelumnya akan digunakan sebagai gantinya. Ini digunakan untuk memecahkan kode terjemahan dalam model terjemahan kami, tetapi juga dapat digunakan selama pelatihan, untuk meningkatkan stabilitas model terhadap kesalahannya. Kira-kira seperti dalam Bengio et al., 2015 ( pdf ).

Argumen penting lain yang digunakan di atas adalah output_projection . Tanpa klarifikasi, kesimpulan dari model tertanam akan menjadi tensor dari jumlah sampel pelatihan per num_decoder_symbols , karena mereka mewakili logiths dari setiap simbol yang dihasilkan. Saat melatih model dengan kamus keluaran besar, misalnya dengan num_decoder_symbols besar, menyimpan tensor besar ini menjadi tidak praktis. Sebagai gantinya, lebih baik mengembalikan tensor yang lebih kecil, yang selanjutnya akan diproyeksikan ke tensor besar menggunakan output_projection . Hal ini memungkinkan kami untuk menggunakan model seq2seq kami dengan kerugian softmax sampel, seperti yang dijelaskan oleh Jean et. al., 2014 ( pdf ).

Selain basic_rnn_seq2seq dan embedding_rnn_seq2seq , ada beberapa model urutan-ke-urutan lainnya di seq2seq.py . Perhatikan mereka. Semuanya memiliki antarmuka yang sama, jadi kami tidak akan menyelidiki detailnya. Untuk model terjemahan kami di bawah ini, gunakan embedding_attention_seq2seq .

Untuk dilanjutkan.

Source: https://habr.com/ru/post/id430780/


All Articles