接下來的步驟重複這個過程,直到一個特殊的符號到達表明transformer解碼器完成了輸出。每一步的輸出在下一個時間點被喂到底部的解碼器,解碼器就像編碼器一樣往上流動冒出解碼結果。就像我們對編碼器輸入所做的那樣,我們在這些解碼器輸入端嵌入並增加位置編碼,來指示每個單詞的位置。
在解碼器中自注意力層操作與在編碼器中的操作方式略有不同:
在解碼器中,自注意力層只被允許注意到輸出序列中早一些的位置。這是通過在自注意計算中的softmax步驟之前屏蔽未來位置(將它們設置為-inf)來完成的。
「編碼器--解碼器注意力」層像多頭自注意力一樣工作,除了它從下面的層創建它的Queries矩陣,和從編碼器輸出中獲取Keys和Value矩陣。
線性層和softmax層
解碼器輸出浮點型向量。我們怎麼把它轉化成一個單詞?這是最終線性層的工作,其後是softmax層。
線性層是一個簡單的全連接神經網路,把解碼器的輸出向量投影到一個更大、更大的logits向量。
我們假設我們的模型知道10000個獨特的單詞(模型的輸出辭彙表),這些單詞從訓練集中學習得到。這將使logits向量10000個cell寬--每個cell對應於一個唯一單詞的得分。這就是我們如何解釋模型的輸出,然後是線性層。
softmax層把這些得分轉換成概率(都是正數,和為1)。概率最高的cell被選中,並且與其關聯的單詞將作為此時間步的輸出。
該圖從底部開始,產生的矢量作為解碼器的輸出。然後它變成了一個輸出單詞。
訓練過程的扼要重述
既然我們通過訓練過的Transformer涵蓋了整個前向過程,看一下訓練模型的直覺是有用的。
在訓練過程中,一個未訓練過的模型會經歷同樣的前向過程。但是因為我們在一個標註的訓練集訓練它,我們可以比較模型的輸出和實際正確的輸出。
為了可視化這個過程,假設我們輸出辭彙只包含6個單詞(a,am,I,thanks,student,和end of sentence的縮寫)
模型的輸出辭彙在預處理階段被創建,這在我們開始訓練之前。
一旦我們定義好輸出辭彙,我們可以用一個同樣寬度的向量指示我們辭彙表中的每一個單詞。這也被稱為one-hot編碼。因此,舉個例子,我們可以用下面的向量指示單詞am:
下面接著討論一下模型的損失函數--在訓練過程中我們優化的準則,來訓練出訓練有素、令人驚奇的精確模型。
損失函數
假設我們正在訓練我們的模型。假設我們現在處在訓練階段的第一步,我們在一個簡單的例子上訓練它--把「merci」翻譯成「thanks」。
這意味著,我們想輸出一個概率分佈來指示單詞「thanks」。但是因為這個模型還沒有被訓練,這還不太可能發生。
因為模型的參數(權重)隨機初始化,(未訓練的)模型為每一個cell/word產生一個任意值的概率分佈。我們可以與真實的輸出比較,然後利用反向傳播法調整模型的權重,來保證輸出更接近期望的輸出。
我們怎麼比較兩個概率分佈呢?我們簡單的用一個分佈減去另一個。更多細節請看cross-entorpy和Kullback-Leibler divergence
需要注意的是,這是一個過度簡化的例子。更真實地,我們可以用一個長於一個單詞的句子。例如-輸入「je suis étudiant」期望輸出是「i am a student」。這實際意味著,我們希望我們的模型能夠連續輸出概率分佈,其中:
每一個概率分佈用一個寬度為vocab_size(在下面的例子中為6,真實的例子中為3000或10000)的向量來表示。
第一個概率分佈在與單詞「i」相關聯的單元處具有最高概率
第二個概率分佈在與單詞「am」相關聯的單元處具有最高概率
直到第5個輸出概率指示符號,即使在10000個元素的單詞表也有一個單元與它對應。
我們將在一個樣本句子的訓練示例中訓練我們模型的目標概率分佈。
在一個足夠大的數據集上訓練足夠的時間之後,我們希望產生的概率分佈會是這樣:
希望經過訓練,模型會輸出我們期望的正確的翻譯。當然,這個短語是否是訓練數據集的一部分沒有真正的指示(見cross validation)。請注意,即使不太可能是該時間步的輸出,每個位置都會獲得一點概率--這是softmax函數非常有用的特性,這有利於訓練過程。
現在,因為模型一次產生一個輸出,我們假設模型從那些概率分佈中選擇具有最大概率分佈的單詞,並扔掉其餘的部分。這是處理的一種方式(被稱為greedy decoding)。另一種處理的方式是假設保留兩個具有最高概率的單詞(假設單詞「I」和「a」),下一步,運行模型兩次:一次假設第一個輸出位置是單詞「I」,另一次假設第一個輸出單詞是「me」,考慮位置#1和位置#2,保留產生最少誤差的版本。我們在位置#2和位置#3重複同樣的操作,以此類推。這種方法稱為「beam search」,在我們的例子中,beam_size是2(因為我們在計算位置#1和位置#2的beams後比較了結果),並且top_beams也是2(因為我們保留了兩個單詞)。這些都是你可以試驗的超參數。
參考
翻譯自The Illustrated Transformer
推薦閱讀: