解碼器與編碼器在細(xì)節(jié)上有差異。
解碼器的Attention
decoder第一級自注意力的key, query, value均來自前一層decoder的輸出,但加入了Mask操作,即我們只能attend到前面已經(jīng)翻譯過的輸出的詞語,因為翻譯過程我們當(dāng)前還并不知道下一個輸出詞語,這是我們之后才會推測到的。
而decoder第二級注意力也被稱作encoder-decoder attention layer,即它的query來自于之前一級的decoder層的輸出,但其key和value來自于encoder的輸出,這使得decoder的每一個位置都可以attend到輸入序列的每一個位置。
總結(jié)一下,k和v的來源總是相同的,q在encoder及decoder自注意力層中與k,v來源相同,在encoder-decoder attention layer中與k,v來源不同。
編碼器與解碼器的連接:
編碼器通過處理輸入序列開啟工作。頂端編碼器的輸出之后會變轉(zhuǎn)化為一個包含向量K(鍵向量)和V(值向量)的注意力向量集 。這些向量將被每個解碼器用于自身的“編碼-解碼注意力層”,而這些層可以幫助解碼器關(guān)注輸入序列哪些位置合適。
解碼器解碼:
在完成編碼階段后,則開始解碼階段。解碼階段的每個時間步都會輸出一個輸出序列的元素(在這個例子里,是英語翻譯的句子)
接下來的每個時間步重復(fù)了這個過程,直到到達(dá)一個特殊的終止符號,它表示transformer的解碼器已經(jīng)完成了它的輸出。每個時間步的輸出在下一個時間步被提供給底端解碼器,并且就像編碼器之前做的那樣,這些解碼器會輸出它們的解碼結(jié)果 。另外,就像我們對編碼器的輸入所做的那樣,我們會將上個時間步的輸出嵌入并添加位置編碼,來表示每個單詞的位置。
而那些解碼器中的自注意力層表現(xiàn)的模式與編碼器不同:在解碼器中,自注意力層只被允許處理輸出序列中更靠前的那些位置。在softmax步驟前,它會把后面的位置給隱去(Masked)。
解碼器中的“編碼-解碼注意力層”工作方式基本就像多頭自注意力層一樣,只不過它是通過在它下面的解碼層來創(chuàng)造查詢矩陣(Q),并且從編碼器的輸出中取得鍵(V)/值矩陣(K)。
最終的線性變換和Softmax層
線性變換:
解碼器最終會輸出一個實數(shù)向量。解碼器輸出后的線性變換層是一個簡單的全連接神經(jīng)網(wǎng)絡(luò),它可以把解碼組件產(chǎn)生的向量投射到一個比它大得多的(字典維度),被稱作對數(shù)幾率(logits)的向量里。不妨假設(shè)我們的模型從訓(xùn)練集中學(xué)習(xí)一萬個不同的英語單詞(我們模型的“輸出詞表”)。因此對數(shù)幾率向量為一萬個單元格長度的向量,其中每個單元格對應(yīng)某一個單詞的分?jǐn)?shù)。
softmax層:
Softmax 層便會把那些分?jǐn)?shù)變成概率(都為正數(shù)、和為1)。概率最高的單元格被選中,并且它對應(yīng)的單詞被作為這個時間步的輸出。?