Sequence-to-Sequence Bagian 2 Model

Halo semuanya!

Bagian kedua dari terjemahan, yang kami posting beberapa minggu yang lalu, dalam persiapan untuk peluncuran aliran kedua dari kursus "Ilmuwan data" . Depan adalah bahan lain yang menarik dan pelajaran terbuka.

Sementara itu, kami melangkah lebih jauh ke dalam hutan model.

Model terjemahan neural

Sementara inti dari model urutan-ke-urutan dibuat oleh fungsi dari tensorflow/tensorflow/python/ops/seq2seq.py , masih ada beberapa trik yang digunakan dalam model terjemahan kami dalam models/tutorials/rnn/translate/seq2seq_model.py , tentang layak disebut.



Sampel softmax dan proyeksi keluaran

Seperti disebutkan di atas, kami ingin menggunakan softmax sampel untuk bekerja dengan kamus keluaran besar. Untuk memecahkan kode dari itu, Anda harus melacak proyeksi output. Kehilangan softmax sampel dan proyeksi keluaran dihasilkan oleh kode berikut di seq2seq_model.py .

 if num_samples > 0 and num_samples < self.target_vocab_size: w_t = tf.get_variable("proj_w", [self.target_vocab_size, size], dtype=dtype) w = tf.transpose(w_t) b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype) output_projection = (w, b) def sampled_loss(labels, inputs): labels = tf.reshape(labels, [-1, 1]) # We need to compute the sampled_softmax_loss using 32bit floats to # avoid numerical instabilities. local_w_t = tf.cast(w_t, tf.float32) local_b = tf.cast(b, tf.float32) local_inputs = tf.cast(inputs, tf.float32) return tf.cast( tf.nn.sampled_softmax_loss( weights=local_w_t, biases=local_b, labels=labels, inputs=local_inputs, num_sampled=num_samples, num_classes=self.target_vocab_size), dtype) 

Pertama, perhatikan bahwa kami hanya membuat softmax sampel jika jumlah sampel (512 secara default) kurang dari ukuran kamus target. Untuk kamus yang lebih kecil dari 512, lebih baik menggunakan kerugian softmax standar.

Kemudian, buat proyeksi output. Ini adalah pasangan yang terdiri dari matriks bobot dan vektor perpindahan. Saat digunakan, sel rnn mengembalikan vektor bentuk dari jumlah sampel pelatihan berdasarkan size , dan bukan jumlah sampel pelatihan dengan target_vocab_size . Untuk mengembalikan log, Anda perlu mengalikannya dengan matriks bobot dan menambahkan offset, yang terjadi di baris 124-126 di seq2seq_model.py .

 if output_projection is not None: for b in xrange(len(buckets)): self.outputs[b] = [tf.matmul(output, output_projection[0]) + output_projection[1] for ...] 

Bucketing dan padding

Selain softmax sampel, model terjemahan kami juga menggunakan bucketing , metode yang memungkinkan Anda mengelola kalimat dengan panjang berbeda secara efisien. Untuk memulai, jelaskan masalahnya. Ketika menerjemahkan dari Bahasa Inggris ke Bahasa Prancis, kami memiliki kalimat bahasa Inggris dengan panjang L1 yang berbeda di pintu masuk dan kalimat bahasa Prancis dengan panjang L1 yang berbeda di pintu keluar. Karena kalimat bahasa Inggris ditransmisikan sebagai encoder_inputs , dan kalimat bahasa Prancis ditampilkan sebagai decoder_inputs (dengan awalan simbol GO), perlu untuk membuat model seq2seq untuk setiap pasangan (L1, L2 + 1) dengan panjang kalimat bahasa Inggris dan Perancis. Sebagai hasilnya, kami mendapatkan grafik besar yang terdiri dari banyak subgraph serupa. Di sisi lain, kita dapat "mengisi" setiap kalimat dengan karakter PAD khusus. Dan kemudian kita hanya perlu satu model seq2seq untuk panjang "penuh". Tetapi model seperti itu tidak akan efektif dalam kalimat pendek - Anda harus menyandikan dan mendekode banyak karakter PAD yang tidak berguna.

Sebagai kompromi antara membuat grafik untuk setiap pasangan panjang dan isian ke panjang tunggal, kami menggunakan sejumlah ember dan barang-barang setiap kalimat dengan panjang grup di atas. Di translate.py kami menggunakan grup berikut secara default.

 buckets = [(5, 10), (10, 15), (20, 25), (40, 50)] 


Dengan demikian, jika kalimat bahasa Inggris dengan 3 token tiba di input, dan kalimat Perancis yang sesuai berisi 6 token di output, maka mereka akan pergi ke grup pertama dan akan diisi hingga panjang 5 pada input encoder dan panjang 10 pada input decoder. Dan jika ada 8 token dalam penawaran bahasa Inggris, dan dalam 18 berbahasa Perancis yang sesuai, mereka tidak akan jatuh ke dalam grup (10, 15) dan akan ditransfer ke grup (20, 25), yaitu, tawaran bahasa Inggris akan meningkat menjadi 20 token, dan yang Prancis ke 25.

Ingat bahwa ketika membuat input dekoder, kami menambahkan karakter GO khusus ke input. Ini terjadi pada fungsi get_batch() di seq2seq_model.py , yang juga membalikkan kalimat bahasa Inggris. Pembalikan input membantu meningkatkan hasil model terjemahan saraf Sutskever et al., 2014 (pdf). Untuk akhirnya mengetahuinya, bayangkan ada kalimat "Aku pergi." Pada input, dipecah menjadi token ["I", "go", "."] , Dan pada output ada kalimat "Je vais.", Patah ke token ["Je", "vais", "."] . Mereka akan ditambahkan ke grup (5, 10), dengan representasi dari enkoder input [PAD PAD "." "go" "I"] [PAD PAD "." "go" "I"] dan dekoder masukan [GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD] [GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD] .

Jalankan itu

Untuk melatih model yang dijelaskan di atas, Anda akan membutuhkan korps Anglo-Prancis yang besar. Untuk pelatihan, kami akan menggunakan 10 ^ 9 korps Prancis-Inggris dari situs web WMT'15 , dan menguji berita dari situs yang sama sebagai sampel yang berfungsi. Kedua dataset akan dimuat ke train_dir ketika perintah selanjutnya dijalankan.

 python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --en_vocab_size=40000 --fr_vocab_size=40000 

Anda akan membutuhkan ruang hard drive 18GB dan beberapa jam untuk mempersiapkan gedung pelatihan. data_dir, file kamus dibuat di data_dir, dan setelah itu data_dir, dan dikonversi ke pengidentifikasi bilangan bulat. Perhatikan parameter yang bertanggung jawab untuk ukuran kamus. Pada contoh di atas, semua kata di luar 40.000 kata yang paling sering digunakan akan dikonversi menjadi token UNK yang mewakili kata yang tidak dikenal. Jadi, ketika mengubah ukuran kamus, biner akan mereformasi perumahan dengan token-id. Setelah pelatihan persiapan data dimulai.

Nilai yang ditentukan dalam translate sangat tinggi secara default. Model-model besar yang belajar untuk waktu yang lama menunjukkan hasil yang baik, tetapi dapat memakan waktu terlalu banyak atau terlalu banyak memori GPU. Anda dapat menentukan latihan model yang lebih kecil, seperti pada contoh di bawah ini.

 python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --size=256 --num_layers=2 --steps_per_checkpoint=50 

Perintah di atas akan melatih model dengan dua lapisan (secara default ada 3), yang masing-masing memiliki 256 unit (default - 1024), dengan pos pemeriksaan di setiap 50 langkah (default - 200). Lakukan percobaan dengan opsi ini untuk melihat model ukuran mana yang tepat untuk GPU Anda.

Selama pelatihan, setiap langkah biner steps_per_checkpoin t akan memberikan statistik tentang langkah-langkah sebelumnya. Dengan parameter default (3 layer ukuran 1024), pesan pertama adalah sebagai berikut:

 global step 200 learning rate 0.5000 step-time 1.39 perplexity 1720.62 eval: bucket 0 perplexity 184.97 eval: bucket 1 perplexity 248.81 eval: bucket 2 perplexity 341.64 eval: bucket 3 perplexity 469.04 global step 400 learning rate 0.5000 step-time 1.38 perplexity 379.89 eval: bucket 0 perplexity 151.32 eval: bucket 1 perplexity 190.36 eval: bucket 2 perplexity 227.46 eval: bucket 3 perplexity 238.66 

Perhatikan bahwa setiap langkah membutuhkan waktu kurang dari 1,4 detik, membingungkan sampel pelatihan dan membingungkan sampel kerja di masing-masing kelompok. Setelah sekitar 30 ribu langkah, kita melihat bagaimana kebingungan kalimat pendek (grup 0 dan 1) menjadi tidak ambigu. Gedung pelatihan berisi sekitar 22 juta kalimat, satu iterasi (satu run data pelatihan) memakan waktu sekitar 340 ribu langkah dengan jumlah sampel pelatihan dalam jumlah 64. Pada tahap ini, model dapat digunakan untuk menerjemahkan kalimat bahasa Inggris ke dalam bahasa Prancis menggunakan opsi --decode .

 python translate.py --decode --data_dir [your_data_directory] --train_dir [checkpoints_directory] Reading model parameters from /tmp/translate.ckpt-340000 > Who is the president of the United States? Qui est le prรฉsident des ร‰tats-Unis ? 

Apa selanjutnya

Contoh di atas menunjukkan cara membuat penerjemah Bahasa Inggris-Prancis Anda sendiri dari ujung ke ujung. Jalankan dan lihat bagaimana model bekerja. Kualitasnya dapat diterima, tetapi model terjemahan yang ideal tidak dapat diperoleh dengan parameter default. Berikut adalah beberapa hal yang dapat Anda tingkatkan.

Pertama, kami menggunakan tokenization primitif, fungsi dasar dari basic_tokenizer di data_utils . Tokenizer yang lebih baik dapat ditemukan di situs web WMT'15 . Jika Anda menggunakannya dan kamus besar, Anda bisa mendapatkan terjemahan yang lebih baik.

Selain itu, parameter default model terjemahan tidak dikonfigurasikan dengan sempurna. Anda dapat mencoba mengubah kecepatan belajar, redaman, inisialisasi bobot model. Anda juga dapat mengganti GradientDescentOptimizer standar di seq2seq_model.py dengan sesuatu yang lebih maju, seperti AdagradOptimizer . Coba dan perhatikan untuk hasil yang lebih baik!

Akhirnya, model yang disajikan di atas dapat digunakan tidak hanya untuk terjemahan, tetapi juga untuk tugas urutan-ke-urutan lainnya. Bahkan jika Anda ingin mengubah urutan menjadi pohon, misalnya, menghasilkan pohon parse, model ini dapat menghasilkan hasil yang canggih, seperti yang ditunjukkan oleh Vinyals & Kaiser et al., 2014 (pdf) . Jadi, Anda tidak hanya dapat membuat penerjemah, tetapi juga parser, chat bot, atau program lain yang Anda inginkan. Eksperimen!

Itu saja!

Kami menunggu komentar dan pertanyaan Anda di sini atau kami mengundang Anda untuk bertanya kepada guru mereka dalam pelajaran terbuka .

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


All Articles