Transfer Pengetahuan dan Terjemahan Mesin Saraf Tiruan dalam Praktek

Neural Machine Translation (NMT) berkembang sangat cepat. Hari ini, untuk mengumpulkan penerjemah Anda, Anda tidak perlu memiliki dua pendidikan tinggi. Tetapi untuk melatih model, Anda memerlukan corpus paralel besar (corpus di mana terjemahan dalam bahasa sumber dikaitkan dengan kalimat). Dalam praktiknya, kita berbicara tentang setidaknya satu juta pasang kalimat. Bahkan ada area besar terpisah dari IMF yang mengeksplorasi metode untuk mengajar pasangan bahasa dengan sejumlah kecil data elektronik (English Low Resource NMT).

Kami mengumpulkan korps Chuvash-Rusia dan pada saat yang sama kami melihat apa yang dapat dilakukan dengan volume data yang tersedia. Dalam contoh ini, kasus 90.000 pasang kalimat digunakan. Hasil terbaik saat ini diberikan oleh metode mentransfer pengetahuan (Eng. Transfer Learning), dan itu akan dibahas dalam artikel. Tujuan artikel ini adalah untuk memberikan contoh praktis implementasi yang dapat dengan mudah direproduksi.

Rencana pelatihan adalah sebagai berikut. Kita perlu mengambil bangunan besar (orang tua), melatih model saraf, dan kemudian melatih model putri kita. Selain itu, bahasa target terjemahan akan sama: Rusia. Secara intuitif, ini dapat dibandingkan dengan belajar bahasa kedua. Lebih mudah untuk belajar, mengetahui satu bahasa asing. Ini juga terlihat seperti mempelajari area sempit bahasa asing, misalnya, istilah medis bahasa Inggris: pertama Anda perlu belajar bahasa Inggris secara umum.

Sebagai korps orang tua, kami mencoba mengambil 1 juta pasang kalimat dari korps paralel Inggris-Rusia dan 1 juta dari korps Kazakh-Rusia . Ada 5 juta kalimat dalam data Kazakh. Dari jumlah tersebut, hanya mereka yang memiliki koefisien kepatuhan (kolom ketiga) lebih dari 2. Yang diambil. Versi Kazakh memberikan hasil yang sedikit lebih baik. Tampaknya secara intuitif bahwa ini dapat dimengerti, karena bahasa Chuvash dan Kazakh lebih mirip satu sama lain. Tetapi pada kenyataannya, ini tidak terbukti, dan juga sangat tergantung pada kualitas kasus. Rincian lebih lanjut tentang pemilihan tubuh orang tua dapat ditemukan di artikel ini . Tentang korps anak perusahaan dari 90.000 pasang penawaran, Anda dapat mengetahui dan meminta data sampel di sini.

Sekarang ke kode. Jika Anda tidak memiliki kartu grafis cepat sendiri, Anda dapat melatih modelnya di situs Colab . Untuk pelatihan, kami menggunakan perpustakaan Sockeye . Diasumsikan bahwa Python3 sudah diinstal.

pip install sockeye 

Anda mungkin juga harus bermain-main secara terpisah dengan MXNet , yang bertanggung jawab untuk bekerja dengan kartu video. Colab membutuhkan instalasi perpustakaan tambahan

 pip install mxnet-cu100mkl 

Tentang jaringan saraf, secara umum diterima bahwa cukup bagi mereka untuk memberi makan data apa adanya, dan mereka akan mengetahuinya. Namun dalam kenyataannya ini tidak selalu terjadi. Jadi dalam kasus kami, tubuh perlu diproses terlebih dahulu. Pertama, kita tokenize sehingga lebih mudah bagi model untuk memahami bahwa "kucing!" Dan "kucing" adalah tentang hal yang sama. Sebagai contoh, hanya tokenizer python akan dilakukan.

 from nltk.tokenize import WordPunctTokenizer def tokenize(src_filename, new_filename): with open(src_filename, encoding="utf-8") as src_file: with open(new_filename, "w", encoding="utf-8") as new_file: for line in src_file: new_file.write("%s" % ' '.join(WordPunctTokenizer().tokenize(line))) new_file.write("\n") 

Sebagai hasilnya, kami memberi makan pasangan kalimat dari formulir

   ӗ  ҫ ӳ ӑӑ. ӑ ӑ ӑ ӑӗ, ӑ ӑӑӗ,   ӑ  ӗӗ -ӑ ӗӗҫ,  ҫӗ ӗ ӗҫ ӑӑ ӑӑ, ҫ ӗ ӗ   ӑ ӑ ӑӑ ӑ . 

dan

      .  , ,       , ,    ,        . 

Outputnya adalah penawaran tokenized berikut:

   ӗ  ҫ ӳ ӑӑ . ӑ ӑ ӑ ӑӗ , ӑ ӑӑӗ ,   ӑ  ӗӗ  - ӑ ӗӗҫ ,  ҫӗ ӗ ӗҫ ӑӑ ӑӑ , ҫ ӗ ӗ   ӑ ӑ ӑӑ ӑ  . 

dan dalam bahasa Rusia

       .   ,  ,        ,  ,     ,         . 

Dalam kasus kami, kami akan membutuhkan kamus gabungan dari kasus induk dan anak, jadi kami akan membuat file umum:

 cp kk.parent.train.tok kkchv.all.train.tok cat chv.child.train.tok >> kk.parent.train.tok cp ru.parent.train.tok ru.all.train.tok cat ru.child.train.tok >> ru.all.train.tok 

karena pelatihan lebih lanjut dari model anak terjadi pada kamus yang sama.

Sekarang penyimpangan kecil tapi penting. Dalam MP, kalimat dibagi menjadi atom dalam bentuk kata-kata dan kemudian beroperasi pada kalimat sebagai urutan kata-kata. Tetapi ini biasanya tidak cukup, karena ekor yang sangat besar terbentuk dari kata-kata yang terjadi pada korpus satu kali. Untuk membangun model probabilistik bagi mereka sulit. Hal ini terutama berlaku untuk bahasa dengan morfologi maju (kasus, jenis kelamin, jumlah). Bahasa Rusia dan Chuvash hanyalah bahasa seperti itu. Tapi ada solusinya. Anda dapat memecah kalimat menjadi level yang lebih rendah, menjadi subword. Kami menggunakan pengkodean pasangan Byte.

 git clone https://github.com/rsennrich/subword-nmt.git 

Kami mendapatkan kira-kira urutan subword seperti itu

 @@   ӗ  ҫ ӳ@@  ӑӑ . @@ ӑ ӑ ӑ @@ ӑӗ , ӑ ӑӑ@@ ӗ ,   ӑ@@  @@  ӗӗ  - ӑ@@  ӗ@@ ӗҫ ,  ҫӗ@@  ӗ ӗҫ@@ @@  ӑӑ ӑӑ , ҫ@@ @@ @@  ӗ ӗ @@ @@  @@  ӑ ӑ ӑӑ ӑ  . 

dan

 @@    @@  @@   . @@  @@ @@ @@ @@  , @@  , @@ @@  @@    @@  @@ @@  @@ @@ @@ @@  ,  ,  @@  @@ @@ @@  @@ @@ @@  ,       @@ @@  @@ @@ @@  . 

Dapat dilihat bahwa afiks dibedakan dengan baik dari kata-kata: Tidak @@ untuk waktu yang lama dan @@ baik.
Untuk melakukan ini, siapkan kamus bpe

 python subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input kkchv.all.train.tok ru.all.train.tok -s 10000 -o bpe.codes --write-vocabulary bpe.vocab.kkchv bpe.vocab.ru 

Dan menerapkannya pada token, misalnya:

 python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.kkchv --vocabulary-threshold 50 < kkchv.all.train.tok > kkchv.all.train.bpe !python subword-nmt/subword_nmt/apply_bpe.py -c bpe.codes --vocabulary bpe.vocab.ru --vocabulary-threshold 50 < ru.all.train.tok > ru.all.train.bpe 

Dengan analogi, Anda perlu melakukannya untuk semua file: pelatihan, validasi, dan uji model induk dan anak.

Sekarang kita beralih langsung ke pelatihan model saraf. Pertama, Anda perlu menyiapkan kamus model umum:

 python -m sockeye.prepare_data -s kk.all.train.bpe -t ru.all.train.bpe -o kkru_all_data 

Selanjutnya, latih model induk. Contoh sederhana dijelaskan secara lebih rinci di halaman Sockeye. Secara teknis, proses terdiri dari dua langkah: menyiapkan data menggunakan kamus model yang dibuat sebelumnya

 python -m sockeye.prepare_data -s kk.parent.train.bpe -t ru.parent.train.bpe -o kkru_parent_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json 

dan pembelajaran itu sendiri

 python -m sockeye.train -d kkru_parent_data -vs kk.parent.dev.bpe -vt ru.parent.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o kkru_parent_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10 

Pelatihan di fasilitas Colab memakan waktu sekitar satu hari. Ketika pelatihan model selesai, Anda dapat menerjemahkannya dengan demikian

 python -m sockeye.translate --input kk.parent.test.bpe -m kkru_parent_model --output ru.parent.test_kkru_parent.bpe 

Untuk melatih model anak
 python -m sockeye.prepare_data -s chv.child.train.bpe -t ru.child.train.bpe -o chvru_child_data --source-vocab kkru_all_data/vocab.src.0.json --target-vocab kkru_all_data/vocab.trg.0.json 

Kode awal pelatihan terlihat seperti ini

 python -m sockeye.train -d chvru_child_data -vs chv.child.dev.bpe -vt ru.child.dev.bpe --encoder transformer --decoder transformer --transformer-model-size 512 --transformer-feed-forward-num-hidden 256 --transformer-dropout-prepost 0.1 --num-embed 512 --max-seq-len 100 --decode-and-evaluate 500 -o ruchv_150K_skv_dev19_model --num-layers 6 --disable-device-locking --batch-size 1024 --optimized-metric bleu --max-num-checkpoint-not-improved 10 --config kkru_parent_model/args.yaml --params kkru_parent_model/params.best 

Parameter ditambahkan yang menunjukkan bahwa konfigurasi dan bobot model induk harus digunakan sebagai titik awal. Detail dalam contoh dengan pelatihan ulang dari Sockeye . Belajar model anak bertemu dalam waktu sekitar 12 jam.

Untuk meringkas, bandingkan hasilnya. Model terjemahan mesin yang biasa menghasilkan kualitas 24,96 BLEU, sedangkan model transfer pengetahuan adalah 32,38 BLEU. Perbedaannya terlihat juga secara visual pada contoh terjemahan. Karena itu, selagi kami terus merakit kasing, kami akan menggunakan model ini.

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


All Articles