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 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.