深度學習演算法(第25期)—-機器翻譯中的編碼解碼器網路
- 2019 年 10 月 7 日
- 筆記
上期我們一起學習了自然語言處理中的word embedding相關知識,
深度學習演算法(第24期)—-自然語言處理(NLP)中的Word Embedding 前幾期我們一起學習了RNN的很多相關知識,今天我們一起用這些知識,學習下機器翻譯中的編碼解碼網路.
這裡我們要做一個英文翻譯成法語的翻譯器,直接先上圖,看一下編碼解碼網路長什麼樣子,如下:

從上圖可以看出,整個網路包括左邊的編碼器和右邊的解碼器,其中英文語句『I drink milk』輸入到編碼器中,而解碼器輸出相應的法語翻譯。我們注意到,這裡我們把法語的翻譯結果(標籤)作為輸入也輸入到了解碼器中,也就是說,解碼器的輸入有兩個,一個是標籤,一個是編碼器的輸出結果。對於解碼器第一個單詞,這裡用一個標識符<go>表示語句的開始,而以標識符<eos>結束。
需要注意的是這裡的英文句子是被反置輸入進編碼器的。比如語句「I drink milk」是被反置成「milk drink I」輸入到編碼器中的。這確保了英語句子的開頭將會最後送到編碼器,這很有用,因為這通常是解碼器需要翻譯的第一個東西。
每個單詞最初都用一個簡單的整數標識符來表示(例如:288表示「milk」)。接下來,embedding lookup返回該詞的embedding(如前所述,這是一個密集的,相當低維的向量)。 這些詞的embedding是實際送到編碼器和解碼器的內容。
在每個步驟中,解碼器輸出輸出辭彙表(即法語)中每個詞的score,然後 Softmax 層將這些得分轉換為概率。 例如,在第一步中,單詞"Je"有 20% 的概率,"Tu"有 1% 的概率,以此類推。 概率最高的詞會輸出。 這非常類似於常規分類任務,因此你可以使用softmax_cross_entropy_with_logits()函數來訓練模型。
需要注意的是,在推斷期間(訓練之後),你不再將目標句子送入解碼器。 相反,只需向解碼器提供它在上一步輸出的單詞,如下 所示(這裡還需要embedding lookup,它未在圖中顯示)。

well,現在我們知道了大概思路。 但是,如果我們去閱讀 TensorFlow 的序列教程,並查看rnn/translate/seq2seq_model.py中的程式碼(在 TensorFlow 模型中),我們會注意到一些重要的區別:
首先,到目前為止,我們已經假定所有輸入序列(編碼器和解碼器的)具有恆定的長度。但顯然句子長度可能會有所不同。 有以下幾種方法可以處理,例如,使用static_rnn()或dynamic_rnn()函數的sequence_length參數,來指定每個句子的長度(前幾期學過)。然而,教程中使用了另一種方法(大概是出於性能原因):根據長度對句子分組,比如長度為1到6個單詞的分到一組,長度為7到12的分到另一組,等等),並且使用特殊的填充標記(例如"<pad>")來填充較短的句子。例如,"I drink milk"變成"<pad> <pad> <pad> milk drink I",翻譯成"Je bois du lait <eos> <pad>"。當然,我們希望忽略任何<eos>標記之後的輸出。為此,本教程的實現使用target_weights向量。例如,對於目標句子"Je bois du lait <eos> <pad>",權重將設置為[1.0,1.0,1.0,1.0,1.0,0.0](注意權重 0.0 對應目標句子中的填充標記)。簡單地將損失乘以目標權重,將消除對應<eos> 標記之後的單詞的損失。
其次,當輸出辭彙表很大時(就是這裡的情況),輸出每個可能的單詞的概率的過程將會非常慢。如果目標辭彙表包含50,000個法語單詞,則解碼器將輸出 50,000維向量,然後在這樣高維度的向量上計算softmax函數,計算量將非常大。為了避免這種情況,一種解決方案是讓解碼器輸出更小的向量,例如,1,000 維向量,然後使用取樣技術來估計損失,這樣就不必對目標辭彙表中的每個單詞都計算。 這種取樣的Softmax 技術是由Sébastien Jean等人在2015年提出的。在TensorFlow中,你可以使用sampled_softmax_loss()函數。
第三,教程的實現使用了一種注意力機制,讓解碼器能夠監視輸入序列。注意力增強的RNN,這裡不做詳細討論,但如果你有興趣,可以關注機器翻譯,機器閱讀和影像說明的相關論文。
最後,本教程的實現使用了tf.nn.legacy_seq2seq模組,該模組提供了輕鬆構建各種編解碼器模型的工具。例如,embedding_rnn_seq2seq()函數會創建一個簡單的編解碼器模型,它會自動為你處理word embedding,就像上面中所示的一樣。
現在我們了解了seq2seq教程的實現所需的全部知識,嘗試去應用並訓練自己的翻譯器吧!
好了,至此,今天我們簡單學習了機器翻譯中編碼解碼器的相關知識,希望有些收穫,下期我們將一起學習下自編碼器的相關知識,歡迎留言或進社區共同交流。