Section1~4は講義内に実装演習がないため割愛
割愛
Section5 Transformer
Seq2Seq
- 実行ファイルは「lecture_chap1_exercise_public.ipynb」
- Sequence-to-Sequence (Seq2Seq) モデルを使って日本語から英語に翻訳を行う。
- データセットは英語-日本語の対訳コーパスTanaka Corpus を使用
http://www.edrdg.org/wiki/index.php/Tanaka_Corpus
今回はそのうちの一部分を取り出したsmall_parallel_enja: 50k En/Ja Parallel Corpus for Testing SMT Methodsを使用する。
GitHub - odashi/small_parallel_enja: 50k English-Japanese Parallel Corpus for Machine Translation Benchmark.50k English-Japanese Parallel Corpus for Machine Translation Benchmark. - GitHub - odashi/small_parallel_enja: 50k English-Japanese Parallel Corpus for Machine ... - モデルの性能評価にBLEUを使用する。
BLEUは機械翻訳の分野において最も一般的な自動評価基準の一つで、予め用意した複数の参照訳と、機械翻訳モデルが出力した訳のn-gramのマッチ率に基づく指標
エラーの対策としてwheelライブラリのバージョン0.34.2を指定してインストールコマンドを実行する
1 |
!pip install "wheel==0.34.2" |
Seq2Seqモデルの訓練結果:
エポックが進むにつれ、訓練、検証データともにloss(誤差)が下がり、BLEUの評価は上がっていることがわかる。
生成のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 生成 batch_X, batch_Y, lengths_X = next(test_dataloader) sentence_X = ' '.join(ids_to_sentence(vocab_X, batch_X.data.cpu().numpy()[:-1, 0])) sentence_Y = ' '.join(ids_to_sentence(vocab_Y, batch_Y.data.cpu().numpy()[:-1, 0])) print('src: {}'.format(sentence_X)) print('tgt: {}'.format(sentence_Y)) output = model(batch_X, lengths_X, max_length=20) output = output.max(dim=-1)[1].view(-1).data.cpu().tolist() output_sentence = ' '.join(ids_to_sentence(vocab_Y, trim_eos(output))) output_sentence_without_trim = ' '.join(ids_to_sentence(vocab_Y, output)) print('out: {}'.format(output_sentence)) print('without trim: {}'.format(output_sentence_without_trim)) |
生成の結果
src: show your own business .
tgt: 自分 の 事 を しろ 。
out: 自分 の よけい を <UNK> な 。
BLEUの評価
17.97129686894934
実行するために英文がランダムに選択され、それに対する教師データとモデルの翻訳が出力される。
何回か実行してほかにも出力してみる。
src: he lived a hard life .
tgt: 彼 は つら い 人生 を 送 っ た 。
out: 彼 は 人生 に 命 を た た 。
BLEUの評価:17.97129686894934
src: no . i ‘m sorry , i ‘ve got to go back early .
tgt: ごめん なさ い 。 早 く 帰 ら な く ちゃ 。
out: 早 く 帰 っ た い 、 、 に に ま い 。
BLEUの評価:17.97129686894934
src: she wrote to me to come at once .
tgt: 彼女 は 私 に すぐ 来 い と の 便り を よこ し た 。
out: 彼女 は すぐ に 来る 手紙 を と た 。
BLEUの評価:17.97129686894934
src: i can ‘t swim at all .
tgt: 私 は 少し も 泳げ な い 。
out: 私 は まったく 泳げ な い 。
BLEUの評価:17.97129686894934
最後の「 i can ‘t swim at all .」の訳はかなりうまくおこなっているが、ほかの翻訳はうまくいっていない。
BLEUの評価は個々の訳で変わるのかと思って実行したが、変化がなかった。このニューラルネットモデルの全体的な評価なんだろうか。
Transformer
- 実行ファイルは「lecture_chap2_exercise_public.ipynb」
- 英語から日本語の翻訳を行う
- データセットのコーパスはchap1と同じ田中コーパス
- 評価はBLEU
Position Encodingの可視化
Transformerは系列の処理にRNNを使用しないので、そのままでは単語列の語順を考慮することができない。そのため、入力系列の埋め込み行列に単語の位置情報を埋め込むPosition Encodingを加算する
出力結果
ハイパーパラメータの設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
MAX_LENGTH = 20 batch_size = 64 num_epochs = 15 lr = 0.001 ckpt_path = 'transformer.pth' max_length = MAX_LENGTH + 2 model_args = { 'n_src_vocab': vocab_size_X, 'n_tgt_vocab': vocab_size_Y, 'max_length': max_length, 'proj_share_weight': True, 'd_k': 32, 'd_v': 32, 'd_model': 128, 'd_word_vec': 128, 'd_inner_hid': 256, 'n_layers': 3, 'n_head': 6, 'dropout': 0.1, } |
訓練データの出力結果
エポック2ですでにSeq2Seq並みのBLEUの値が出ている。
最終的にSeq2Seqの2倍以上のBLEUの評価値になっている。
訓練データと検証データの誤差もSeq2Seqの時に比べて半分ほどになっている。
生成
生成された文は次の通り。BLEUの評価値が上がっても翻訳できていない文章がおおい。
src: show your own business .
tgt: 自分 の 事 を しろ 。
out: <UNK> を 見せ て くれ 。
src: show your own business .
tgt: 自分 の 事 を しろ 。
out: 自分 の 商売 を 自分 の <UNK> に し て くださ い 。
src: the water was cut off yesterday .
tgt: 昨日 水道 を 止め られ た 。
out: その <UNK> は 昨日 水 を 切 っ て い た 。
src: i should like to see you this afternoon .
tgt: 今日 の 午後 お 会 い し た い の で す が 。
out: 午後 に は 君 に 会 い に 入 っ て い る 。
src: i gave him a call .
tgt: 私 は 彼 に 電話 を し た 。
out: 私 は 彼 に 電話 を かけ た 。
コメント