從模型產生翻譯

使用 Keras 進行機器翻譯

Thushan Ganegedara

Data Scientist and Author

舊模型 vs 新模型

編碼器解碼器 Repeat Vector

編碼器解碼器:哪個輸入

使用 Keras 進行機器翻譯

訓練後的模型

Teacher Forcing 訓練的模型

使用 Keras 進行機器翻譯

推論模型的解碼器

  • 輸入

    • one-hot 編碼的單字
    • 狀態輸入(來自前一時間步的狀態)
  • 輸出

    • 新的狀態
    • 預測(即一個單字)
  • 將預測出的單字與狀態遞迴餵回模型作為輸入

使用 Keras 進行機器翻譯

完整推論模型

  • 帶遞迴解碼器的推論模型

編碼器搭配遞迴解碼器

  • 前一章的推論模型 編碼器解碼器(前一版)
使用 Keras 進行機器翻譯

sos 與 eos 標記的作用

  • sos 表示翻譯的開始(例如法文句子)。

    • 將 sos 作為解碼器的第一個單字並持續預測
  • eos 表示翻譯的結束。

    • 當模型預測到的單字是 eos 時停止
  • 為安全起見,設定模型可預測的最大長度

使用 Keras 進行機器翻譯

定義產生器的編碼器

  • 匯入層與 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 進行機器翻譯

定義產生器的解碼器

  • 定義解碼器的 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 進行機器翻譯

複製權重

  • 取得層 l1 的權重
    • w = l1.get_weights()
  • 用 w 設定層 l2 的權重
    • l2.set_weights(w)
  • 本模型中有三個帶權重的層
    • Encoder GRU、Decoder GRU 與 Decoder 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 進行機器翻譯

產生翻譯

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)
  • 取得語境向量(context vector)
de_s_t = encoder.predict(en_seq)
  • 將「sos」(解碼器的起始單字)轉成序列
de_seq = word2onehot(fr_tok, 'sos', fr_vocab)
使用 Keras 進行機器翻譯

產生翻譯

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 進行機器翻譯

該來翻譯了!

使用 Keras 進行機器翻譯

Preparing Video For Download...