2.2 Multi-head Attention(多頭注意)
2.3 ADD&Normalization(殘差連接與添加規范化)
1.Transformer整體架構
Transformer拋棄了傳統的RNN和CNN,首先它使用了Attention機制,將序列中的任意兩個位置之間的距離是縮小為一個常量;其次它不是類似RNN的順序結構,因此具有更好的並行性,符合現有的GPU框架,有效的解決了NLP中棘手的長期依賴問題 。
Transformer是一個encoder-decoder的結構,由若干個編碼器和解碼器堆疊形成。如上圖的左側部分為編碼器,由Multi-Head Attention和一個全連接組成,用於將輸入語料轉化成特征向量。右側部分是解碼器,其輸入為編碼器的輸出以及已經預測的結果,由Masked Multi-Head Attention, Multi-Head Attention以及一個全連接組成,用於輸出最后結果的條件概率 。
由框圖可以看出,有三個輸入Q、K、V,假設我們輸入了n個word,首先對每個word做embedding,然后對這n個embedding進行self-attention,所以Q這個矩陣裝的是所有的word的embedding,而K和V裝的是用來描述這些word的embedding的矩陣,其中K與Q的維度要保持一致,且V的維度要與K、Q經過attention后輸出的維度保持一致,K、V的長度必須一致。
在Q、K、V中,Q代表着query,是個M個維度為d的向量(可以理解為M長度的sequence的向量),代表需要被表達的序列,K代表着key,是個N個維度為d的向量(可以理解為N長度的sequence向量),與V一起用來表達Q的序列,公式如下:
這里與傳統RNN的區別在encoder中就可以明顯體現出來了,RNN需要對每一個時刻都產生輸入與輸出,而transformer只需要將所有序列全部輸入,就可以進行attention計算了。
其中一些詞匯的解釋:
-
長期依賴: 長期依賴是指當前系統的狀態,可能受很長時間之前系統狀態的影響,是RNN中無法解決的一個問題。
-
Embedding這是一種從文本語料庫構建低維向量表示的方法,該方法可以保留單詞的上下文相似性。
-
token令牌,即標記的意思。
-
context背景
-
target目標
-
multi-head attention多頭注意
-
mask保證訓練與推理的一致性
2.對Transformer框架中模塊的理解
2.1 Input(輸入)
-
在該模型中,每時每刻的輸入都是input embedding + positional encoding,即所帶有的信息加上其位置編碼,其中embedding就是用來取代傳統RNN(如seq2seq)中的hidden states。
-
由於transformer模型屬於自回歸模型,因此它的下一個輸出需要基於上一個輸出進行推斷,即主框架中的outputs(shifted right)
-
position encoding是位置編碼,是不可以缺失的一部分,它可以將attention計算方式無法捕捉的位置信息變成embedding形式,直接疊加到變換為embedding形式后的input中。
-
encoder(編碼器)會接收到一個list(每個元素都是512維的詞向量)
-
這里介紹Transformer的一個關鍵特性,每個位置的詞僅僅流過它自己的編碼器路徑。在self-attention層中,這些路徑兩兩之間是相互依賴的。前向網絡層(FFN)則沒有這些依賴性,但這些路徑在流經前向網絡時可以並行執行。
-
因為在解碼的時候,僅知道當前詞左邊的部分。由此,利用masking(當前詞右側的內容被設置為−∞,這樣softmax的值為0)屏蔽了當前詞右邊部分的影響,保持了自回歸的特性。
2.2 Multi-head Attention(多頭注意)
multi-head attention由多個scaled dot-product attention這樣的基礎單元經過堆疊而成,multi-head attention把query和key映射到高維空間的不同子空間中去計算相似度,且多頭注意的輸入都是query Q、key K 、value V 三個元素,只是 Q、K、V 的取值不同。
為了更好的理解multi-head attention,我們分成兩步走:
-
scaled dot-product attention(縮放的點乘注意力)介紹:
首先,attention也叫self-attention,顧名思義,就是自己和自己做attention操作,即得到所有時刻的數據后,可以用其中每一時刻數據與所有數據中任意一時刻數據進行計算attention(相似程度)。
其次,如框圖所示,可以分成6步來看:
1)將編碼器與文本輸入生成輸入向量,然后將其生成三個向量,生成方法是將輸入向量分別乘以三個權重矩陣,這些矩陣是可以在訓練過程學習的,而且所有的輸入向量都共享這三個權重矩陣。
2)計算attention,即計算一個分值,將對應的Q、K依次進行點積獲得每個位置的分值。
3)保持訓練與推理的數據一致性。
4)對計算出來的分值進行softmax操作,歸一化分值使得全為正數且它們的和為1。
5)將softmax分值與V的向量按位相乘,保留關注詞的value值,削弱非相關詞的value值。
6)將所有加權向量加起來,產生該位置的self-attention的輸出結果。
-
multi-head attention(多頭注意)介紹:
如上圖所示,這就是scaled dot-product attention的堆疊(stacking),先把我們上面講過的Q、K、V進行線性變換變成Q'、K'、V',然后進行attention計算,重復這樣的操作h次,然后將這h次的結果進行concat(合並),最后總的做一次線性變換,輸出的就是多頭注意這個模塊的輸出了。
而在主框架中右半部分的多頭注意中,與其他兩個多頭注意有些差異,它是一個cross_attention,它的Q是由目標端序列而來,K、V是由源端序列來的。
2.3 ADD&Normalization(殘差連接與添加規范化)
在主框架中每一個模塊后面,都有一個殘差連接和規范化層,它是一個通用的技術,它的本質是可以有效的改善深層模型中梯度消失的問題,且能打破網絡對稱性,改善網絡退化問題,加速收斂,規范化優化空間。
2.4 Feed Forward Network(FFN,前饋神經網絡)
每一層經過attention之后,還會有一個FFN,這個FFN的作用就是空間變換。FFN包含了2層linear transformation(線性變換)層,中間的激活函數是ReLu 。
3.Transformer的缺點
-
缺少recurrent inductive bias: 學習算法中Inductive Bias可以用來預測從未遇到的輸入的輸出 , 對於很多序列建模任務(如需要對輸入的層次結構進行建模時,或者在訓練和推理期間輸入長度的分布不同時),Recurrent Inductive Bias至關重要。
-
不能很好的處理超長輸入: 理論上來說,attention可以關聯兩個任意遠距離的詞,但實際中,由於計算資源有限,仍然會限制輸入序列的長度,超過這個長度的序列會被截斷。
-
transformer是非圖靈完備的:就是說不能解決所有問題, 它的輸入是一個需要對每個輸入元素進行順序處理的函數,在這種情況下,對於任意給定的深度T的transformer,都可以構造一個長度為N>T的embedding。
-