はじめに
このレポートでは、日本語を英語に翻訳する機械翻訳の学習データについて報告する。注目すべき点は、自己回帰型プログラムより非自己回帰型プログラムの方が、WER が小さく、BLEU が大きい結果がでたことである。
2024年7月28日 4. を追記。
1.Transformer を用いた自己回帰型での学習
プログラムファイル名 Autoregressive.ipynb
WER 29.1 と BLEU 47.9
2.Mask-Predict の非自己回帰型での学習
プログラムファイル名 Mask_Predict.ipynb
3.CTCLoss と Mask-Predict での非自己回帰型学習
プログラムファイル名 CTC_Mask_Predict.ipynb
4.Encoder の出力を Upsampling して Decoder のtaraget 入力に。loss は CTC。
プログラムファイル名 EncoderOuts_Upsampling.ipynb
WER 24.1、BLEU 55.1
の四種類の学習データである。
学習データ
データは、日本語英語コーパス
のデータです。train 100万件、val 5000件、test 50件としました。token の単位は単語です。私の環境では、英語文に multi-byte 文字が入っていると、idx_to_word.json ファイルの分かち書きの英語が文字化けするので、multi-byte 文字の入った英文は学習に使いませんでした。idx_to_word.json(index と英語分かち書きの対応ファイル)、 idx_to_wakati.json(index と日本語分かち書きの対応ファイル)も作成しました。
自己回帰型での学習
学習は、train データ100万件、validation データ 5,000件で 20エポック行った。損失と WER の変化のグラフを掲載する。
この学習では、途中で、WER と一部 BLEU の値を測定した。上記グラフの WER の値は、Transformer Decoder の target 入力に、target[:,1:] を入力したものであるが、下の表の WER と BLEU は、model への入力は source 言語のみで、Transformer Decoder を自己回帰的に使って得た数値である。
epoch | WER | BLEU |
---|---|---|
1 | 74.0 | 未記録 |
2 | 72.0 | 未記録 |
3 | 58.3 | 未記録 |
4 | 54.3 | 未記録 |
5 | 47.9 | 未記録 |
6 | 43.7 | 未記録 |
7 | 45.8 | 未記録 |
8 | 47.3 | 未記録 |
9 | 43.0 | 未記録 |
10 | 40.5 | 未記録 |
11 | 未測定 | |
12 | 36.7 | 未記録 |
13 | 35.7 | 41.4 |
14 | 34.5 | 42.1 |
15 | 33.8 | 41.7 |
16 | 32.2 | 45.1 |
17 | 30.7 | 47.4 |
18 | 未測定 | |
19 | 29.5 | 48.7 |
20 | 29.1 | 47.9 |
20エポックの時に WER 29.1 と BLEU 47.9 が得られている。
Mask-Predict による学習。
Mask-Predict による学習を行った。学習は、train データ100万件、validation データ 5,000件で 20エポック行った。loss0、loss、WER と BLEU の変化のグラフを掲載する。loss0 は、マスクされた target 言語の損失であり、loss は、loss0 に target 文章の長さの予測の損失を加えた値である。
次に、各エポックにおけるWERとBLEU の値を計測したので、掲載する。この計測では、モデルへの入力は、source 言語のみであり、教師データの情報は使っていない。Transformer Decoder の target 入力は、<pad> 以外すべての sequence で <mask> の埋め込み文章から始めて10回イタレーションした。推論に用いた関数などは、Fairseq の Mask-Predict
を参考にさせて頂いた。length_beam_size は 3 とした。これは、ターゲット言語の長さ予測の 3 種類について、イタレーションするということである。また、batch_size = 1, number_of_test_data = 50 である。
epoch | WER | BLEU |
---|---|---|
1 | 66.9 | 0.78 |
2 | 54.1 | 10.3 |
3 | 45.4 | 24.4 |
4 | 42.0 | 27.5 |
5 | 38.9 | 33.7 |
6 | 39.9 | 33.3 |
7 | 34.0 | 42.8 |
8 | 未測定 | |
9 | 34.3 | 39.8 |
10 | 未測定 | |
11 | 34.7 | 40.4 |
12 | 32.6 | 44.9 |
13 | 34.8 | 43.0 |
14 | 34.6 | 40.1 |
15 | 35.1 | 37.8 |
16 | 35.8 | 37.4 |
17 | 34.4 | 42.5 |
18 | 33.5 | 39.8 |
19 | 35.1 | 42.1 |
20 | 34.4 | 40.2 |
エポック12で WER 32.6, BLEU 44.9 を得た。
CTC loss を用いた Mask-Predict
Mask-Predict の精度のネックは、target 言語の sequence 長の予測にあるのではないかと考えた。CTC Loss は、長さへの依存が少ないという印象があったため、CTCLoss を使うことにした。CTCLoss を使うためには、確実に source 言語の sequence 長より target 言語の sequence 長が長くなければならないため、target 言語を 2倍に upsampling した。
学習途中の train データ、validation データについての loss0, loss, WER, BLEU の変化のグラフを掲載する。loss0 が、mask を考えずに計算したtarget 文章の CTCLoss である。これに target 言語の長さの予測の損失を加えた値が loss である。
Mask-Predict と同様に、各エポックで、推論結果の評価をおこなった。CTCLoss を用いた Mask-Predict の推論は、二つの関数で比較した。一つは、推論の mask の数を減らすイタレーションにおいて、Transformer Decoder の出力を CTC を考慮した decode をしたのちに、mask のかけなおしを行う関数が inference である。もう一つは、推論の mask の数を減らすイタレーションにおいて、mask の位置をupsampling に合わせておいて、ターゲット言語は、decode せずに mask のかけなおしを行い、Transformer Decoder の target 言語の upasmpling を行わない関数が inference1 である。
length_beam_size は 3 とした。これは、ターゲット言語の予測の 3 種類について、イタレーションするということである。また、batch_size = 1, number_of_test_data = 50 である。
当初、予測された target 言語の長さ依存を弱くするために CTCLoss を導入したが、length_beam_size = 2,4,5 より 3 の値が良かった。
epoch | WER | BLEU |
---|---|---|
1 | 76.0 | 0.00 |
2 | 59.8 | 16.5 |
3 | 52.8 | 24.3 |
4 | 57.3 | 22.2 |
5 | 48.2 | 25.2 |
6 | 51.0 | 25.0 |
7 | 45.2 | 29.4 |
8 | 44.2 | 28.4 |
9 | 46.1 | 28.3 |
10 | 43.8 | 30.7 |
11 | 42.0 | 37.5 |
12 | 41.8 | 35.3 |
13 | 40.9 | 37.4 |
14 | 41.8 | 36.1 |
15 | 39.7 | 36.5 |
16 | 40.1 | 36.8 |
17 | 40.5 | 34.1 |
18 | 38.0 | 38.4 |
19 | 39.8 | 35.5 |
20 | 34.1 | 42.6 |
epoch | WER | BLEU |
---|---|---|
1 | 73.2 | 0.00 |
2 | 56.0 | 13.3 |
3 | 49.4 | 20.8 |
4 | 41.5 | 27.1 |
5 | 45.1 | 24.7 |
6 | 38.4 | 33.3 |
7 | 34.0 | 34.9 |
8 | 38.8 | 35.2 |
9 | 39.4 | 30.9 |
10 | 39.4 | 34.9 |
11 | 37.0 | 37.5 |
12 | 38.0 | 37.0 |
13 | 40.2 | 29.2 |
14 | 37.9 | 34.9 |
15 | 38.9 | 36.6 |
16 | 38.9 | 34.4 |
17 | 40.5 | 28.5 |
18 | 37.9 | 33.1 |
19 | 33.2 | 45.3 |
20 | 37.2 | 34.7 |
inferece1 のエポック19 で WER 33.2 BLEU 45.3 を得た。
TransformerEncoder の出力を Upsampling して、TransformerDecoder の target 入力にする非自己回帰型プログラム Loss は CTC。
CTC loss を用いた Mask-Predict では、ターゲット文章(教師データ)をマスクしたものを sequence 方向に 2倍に upsampling して TransformerDecoder の target 入力にした。一方、ここで評価数値を掲載する方法では、TransformerEncoder の出力を sequence 方向に 2倍に upsampling して、TransformerDecoder の target 入力とする。損失は CTC Loss である。
学習は20エポックまで行った。
train データと validation データについての、loss, WER, BLEU のグラフを掲載する。このプログラムでは、学習と推論のニューラルネットワークは predictions = model( source_embed_sentences ) とでき、target_embed_sentences に依存しない。すなわち、学習と推論は同じアルゴリズムの model 関数を使うことができる。推論は非自己回帰型となる。
次にテストデータについての推論評価の表を掲載する。テストデータ数は 50 で batch_size = 1 である。
epoch | WER | BLEU |
---|---|---|
1 | 41.0 | 25.2 |
2 | 34.4 | 33.3 |
3 | 32.7 | 34.6 |
4 | 34.0 | 37.2 |
5 | 34.0 | 34.1 |
6 | 31.4 | 40.1 |
7 | 32.5 | 37.5 |
8 | 29.8 | 42.4 |
9 | 29.6 | 44.8 |
10 | 26.9 | 47.8 |
11 | 30.0 | 45.6 |
12 | 26.7 | 50.3 |
13 | 未測定 | |
14 | 25.6 | 50.8 |
15 | 25.3 | 50.8 |
16 | 25.4 | 51.5 |
17 | 24.1 | 55.1 |
18 | 23.2 | 54.1 |
19 | 26.0 | 50.2 |
20 | 24.0 | 52.5 |
エポック17 で、WER 24.1、BLEU 55.1 を得た。一般に、非自己回帰型の精度は自己回帰型の精度より劣るが、今回の実験では、自己回帰型の精度が WER 29.1、 BLEU 47.9 であることを考えると注目に値する。
参考のために学習に使ったプログラムを github にアップしておきます。