モデルから翻訳を生成する

Kerasで学ぶMachine Translation

Thushan Ganegedara

Data Scientist and Author

従来モデル vs 新モデル

エンコーダー・デコーダー(リピートベクター)

エンコーダー・デコーダー どの入力?

Kerasで学ぶMachine Translation

学習済みモデル

Teacher Forcing で学習済みモデル

Kerasで学ぶMachine Translation

推論用デコーダー

  • 入力

    • 1語のワンホット表現
    • 状態入力(前時刻の状態)
  • 出力

    • 新しい状態
    • 予測(語)
  • 予測語と状態を再帰的にモデルへ戻して入力します

Kerasで学ぶMachine Translation

推論モデル全体

  • 再帰デコーダーを用いた推論モデル

エンコーダー+再帰デコーダー

  • 前章の推論モデル エンコーダー・デコーダー(前章)
Kerasで学ぶMachine Translation

sos/eos トークンの役割

  • sos は翻訳の開始を示します(例:フランス語文)。

    • デコーダーの最初の語として sos を与え、予測を継続します
  • eos は翻訳の終了を示します。

    • 予測語が eos のときに停止します
  • 安全のため、モデルが予測できる最大長を設定します

Kerasで学ぶMachine Translation

生成用エンコーダーの定義

  • layers と Model をインポート

    # Import Keras layers
    import tensorflow.keras.layers as layers
    from tensorflow.keras.models import Model
    
  • モデル層の定義

    en_inputs = layers.Input(shape=(en_len,en_vocab))
    en_gru = layers.GRU(hsize, return_state=True)
    en_out, en_state = en_gru(en_inputs)
    
  • Model オブジェクトの定義

    encoder = Model(inputs=en_inputs, outputs=en_state)
    
Kerasで学ぶMachine Translation

生成用デコーダーの定義

  • デコーダーの Input 層を定義
de_inputs = layers.Input(shape=(1, fr_vocab))
de_state_in = layers.Input(shape=(hsize,))
  • デコーダーの中間 layers を定義
de_gru = layers.GRU(hsize, return_state=True)
de_out, de_state_out = de_gru(de_inputs, initial_state=de_state_in)

de_dense = layers.Dense(fr_vocab, activation='softmax') de_pred = de_dense(de_out)
  • デコーダー Model の定義
decoder = Model(inputs=[de_inputs, de_state_in], outputs=[de_pred, de_state_out])
Kerasで学ぶMachine Translation

重みのコピー

  • レイヤー l1 の重みを取得
    • w = l1.get_weights()
  • レイヤー l2w を設定
    • l2.set_weights(w)
  • 本モデルでは重みを持つレイヤーは3つ
    • エンコーダー GRU、デコーダー GRU、デコーダー Dense
en_gru_w = tr_en_gru.get_weights()
en_gru.set_weights(en_gru_w)

別の書き方:

en_gru.set_weights(tr_en_gru.get_weights())
Kerasで学ぶMachine Translation

翻訳の生成

en_sent = ['the united states is sometimes chilly during 
           december , but it is sometimes freezing in june .']
  • 英文を系列に変換
en_seq = sents2seqs('source', en_st, onehot=True, reverse=True)
  • コンテキストベクターを取得
de_s_t = encoder.predict(en_seq)
  • 「sos」(デコーダーの初期語)を系列に変換
de_seq = word2onehot(fr_tok, 'sos', fr_vocab)
Kerasで学ぶMachine Translation

翻訳の生成

fr_sent = ''

for _ in range(fr_len): de_prob, de_s_t = decoder.predict([de_seq,de_s_t])
de_w = probs2word(de_prob, fr_tok)
de_seq = word2onehot(fr_tok, de_w, fr_vocab)
if de_w == 'eos': break fr_sent += de_w + ' '
Kerasで学ぶMachine Translation

いざ翻訳!

Kerasで学ぶMachine Translation

Preparing Video For Download...