NMTモデルの学習

Kerasで学ぶMachine Translation

Thushan Ganegedara

Data Scientist and Author

モデルの再確認

  • Encoder GRU
    • 英語の単語を入力
    • コンテキストベクトルを出力
  • Decoder GRU
    • コンテキストベクトルを入力
    • GRU出力の系列を出力
  • Decoder 予測層
    • GRU出力系列を入力
    • フランス語単語の予測確率を出力

Kerasで学ぶMachine Translation

パラメータの最適化

  • GRU層とDense層にはパラメータがあります
  • 一般にW(重み)とb(バイアス)で表現(初期値はランダム)
  • 入力を有用な出力へ変換
  • オプティマイザで損失を最小化するよう更新
    • 損失: 次の差分
      • 予測(モデルが生成したフランス語)
      • 正解(実際のフランス語)
  • これらはモデルのコンパイル時に指定
nmt.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
Kerasで学ぶMachine Translation

モデルの学習

  • 学習の反復
    for ei in range(n_epochs): # データセットを1回走査
      for i in range(0,data_size,bsize): # バッチを処理
    
  • 学習用バッチの取得
      en_x = sents2seqs('source', en_text[i:i+bsize], onehot=True, reverse=True)
      de_y = sents2seqs('target', en_text[i:i+bsize], onehot=True)
    
  • 単一バッチで学習
      nmt.train_on_batch(en_x, de_y)
    
  • モデルの評価
      res = nmt.evaluate(en_x, de_y, batch_size=bsize, verbose=0)
    
Kerasで学ぶMachine Translation

モデルの学習

  • 学習損失と精度の取得
      res = nmt.evaluate(en_x, de_y, batch_size=bsize, verbose=0)
      print("Epoch {} => Train Loss:{}, Train Acc: {}".format(
        ei+1,res[0], res[1]*100.0))
    
Epoch 1 => Train Loss:4.8036723136901855, Train Acc: 5.215999856591225
...
Epoch 1 => Train Loss:4.718592643737793, Train Acc: 47.0880001783371
...
Epoch 5 => Train Loss:2.8161656856536865, Train Acc: 56.40000104904175
Epoch 5 => Train Loss:2.527724266052246, Train Acc: 54.368001222610474
Epoch 5 => Train Loss:2.2689621448516846, Train Acc: 54.57599759101868
Epoch 5 => Train Loss:1.9934935569763184, Train Acc: 56.51199817657471
Epoch 5 => Train Loss:1.7581449747085571, Train Acc: 55.184000730514526
Epoch 5 => Train Loss:1.5613118410110474, Train Acc: 55.11999726295471
Kerasで学ぶMachine Translation

過学習を避ける

  • データセットを2つに分割
    • 学習用データ — モデルの学習に使用
    • 検証用データ — 精度の監視に使用
  • 検証精度の向上が止まったら学習を停止

過学習のポイント

Kerasで学ぶMachine Translation

データセットの分割

  • 学習データ数と検証データ数を定義

    train_size, valid_size = 800, 200
    
  • データのインデックスをランダムにシャッフル

    inds = np.arange(len(en_text))
    np.random.shuffle(inds)
    
  • 学習・検証のインデックスを取得

    train_inds = inds[:train_size]
    valid_inds = inds[train_size:train_size+valid_size]
    
Kerasで学ぶMachine Translation

データセットの分割

  • 次のように分割:
    • 学習インデックスのデータ → 学習セット
    • 検証インデックスのデータ → 検証セット
tr_en = [en_text[ti] for ti in train_inds]
tr_fr = [fr_text[ti] for ti in train_inds]

v_en = [en_text[ti] for ti in valid_inds]
v_fr = [fr_text[ti] for ti in valid_inds]
Kerasで学ぶMachine Translation

検証付きでの学習

n_epochs, bsize = 5, 250
for ei in range(n_epochs):

for i in range(0,train_size,bsize): en_x = sents2seqs('source', tr_en[i:i+bsize], onehot=True, pad_type='pre') de_y = sents2seqs('target', tr_fr[i:i+bsize], onehot=True) nmt.train_on_batch(en_x, de_y)
v_en_x = sents2seqs('source', v_en, onehot=True, pad_type='pre') v_de_y = sents2seqs('target', v_fr, onehot=True)
res = nmt.evaluate(v_en_x, v_de_y, batch_size=valid_size, verbose=0) print("Epoch: {} => Loss:{}, Val Acc: {}".format(ei+1,res[0], res[1]*100.0))
Epoch 1 => Train Loss:4.8036723136901855, Train Acc: 5.215999856591225
Kerasで学ぶMachine Translation

Passons à la pratique !

Kerasで学ぶMachine Translation

Preparing Video For Download...