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:
| File | Apa isinya? | 
|---|
| tensorflow / tensorflow / python / ops / seq2seq.py | Perpustakaan untuk membuat model urutan-ke-urutan | 
| model / tutorial / rnn / terjemahkan / seq2seq_model.py | Model terjemahan neural urutan-ke-urutan | 
| models / tutorials / rnn / translate / data_utils.py | Fungsi pembantu untuk menyiapkan data terjemahan | 
| model / tutorial / rnn / terjemahkan / translate.py | Biner yang melatih dan menjalankan model terjemahan | 
Dasar-dasar urutan-ke-urutanModel 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
Pustaka TensorFlow seq2seqSeperti 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.