Transformer由模塊組成:Attention(包括多頭自關註&;Context-Attention)、規範化(使用層規範,這與批處理規範不同)、掩碼(填充掩碼&;序列掩碼)、位置編碼、前饋網絡(FFN)。
Transformer的總體架構如下圖所示:
這是典型的變壓器結構。簡單來說,Transformer =預訓練(輸入)+編碼器* N+預訓練(輸出)+解碼器* N+輸出。
模型的運行步驟如下:
①嵌入輸入,可以使用Word2Vec等工具,尺寸為512。嵌入後,它與位置編碼相結合,位置編碼記錄輸入單詞的位置信息。
(2)預處理後的輸入向量經過多頭註意力層處理,加入殘差和正則化,數據交給FFN(全連接層),再加入殘差和正則化。重復地,在六個這樣的編碼器之後(即Nx=6x),編碼部分結束。
③編碼部分第壹個解碼器的第壹個註意力接受來自輸出的信息,其余註意力都接受來自編碼器和上級解碼器的信息。最終輸出的串行生成,每個生成的輸出都被輸入到解碼器底部的解碼器輸入中。
④還有六個解碼器,最終輸出要經過線性層和Softmax才能得到最終輸出。
需要註意的是,編碼器和解碼器的結構是相同的,但它們不享有重量;在編碼器部分,每個單詞在註意力路徑層中具有相關性,這是串行執行的,但在FFN層中沒有相關性,並且是並行執行的。
在這個結構中,有幾種註意,包括:自我註意&;語境關註與。規模點產品關註和。多頭註意力。需要註意的是,scaled點積註意力和多頭註意力是註意力的兩種計算方法,後面會介紹。
這種關註的計算公式是:
以第壹個編碼器為例說明該過程如下:
①為編碼器的每個單詞創建以下三個向量:查詢向量、鍵向量和值向量。這三個向量是通過將輸入嵌入乘以三個向量矩陣而獲得的。需要註意的是,嵌入向量維數為512,Q K V向量維數為64。
②計算分數:對於每個單詞,計算其自身與所有單詞的乘積。
③計算關註度:根據上述關註度公式,將分數除以壹個固定值(此操作稱為“scaled”)並進行Softmax變換,使所有分數之和為1。最後,將其乘以相應的位置,以獲得該單詞的註意。
這是縮放點積註意力機制的計算方法,在Transformer架構中兩種註意力都使用該方法,但不同之處在於Q K V的來源略有不同。
註意:為什麽Softmax要除以根號?本文給出的原因是原始和既是均值為0的變量,又是方差為1的變量。假設它們相互獨立,它們乘積的分布是平均值為0,方差為0。除以根號使Softmax中的值保持平均值為0和方差為1,這有利於梯度計算。如果不添加根號,計算將緩慢收斂,因為Softmax中的值位於漸變消失區。
進壹步思考:為什麽很多關註中沒有Scaled step?註意力有兩種,壹種是乘法,另壹種是加法。實驗表明,雖然加法看起來很簡單,但它的計算速度並沒有快多少(tanh相當於壹個完整的隱藏層),並且在維度較高時確實更好,但如果添加Scaled則類似。在Transformer中選擇乘法以加快計算速度,如果維度較大,則會添加縮放。
多註意力機制也是壹種處理技能,主要提高註意力層的性能。因為上面提到的自我關註包含了其他位置的代碼,所以占主導地位的仍然是處於自身位置的單詞,有時我們需要更多地關註其他位置,例如代詞在機器翻譯中所指的是哪個主語。
多頭註意力的機制是通過H次線性變換投影Q、K和V三個矩陣,然後計算H次自我註意力,最後拼接H次計算結果。
在編碼器的自我關註中,Q K V是前壹個編碼器的輸出。對於第壹個編碼器,它們是輸入嵌入和位置編碼的總和。
在Decoder的自關註中,Q K V也是前壹個Decoder的輸出。對於第壹個解碼器,它們是輸入嵌入和位置編碼的總和。需要註意的是,在這壹部分中,我們並不想獲得後期的數據,而只想考慮預測的信息,因此我們必須進行序列屏蔽(後期)。
在編碼器-解碼器註意(即上下文註意)中,q是解碼器上層的輸出,K V是編碼器的輸出。
LN用於Transformer,而不是BN(批量規範化)。什麽是常態化?壹般來說,它可以用以下公式表示:
配方1為規範化治療前,配方2為治療後。歸壹化是對數據分布的調整,比如數據本身是正態分布,調整後的數據分布是標準正態分布,相當於調整了均值和方差。這樣做的意義在於激活值落入激活函數的敏感範圍,梯度更新變大並加速訓練,消除極值以提高訓練穩定性。
Transformer使用LN,而不是BN。首先看看兩者之間的區別,如圖所示:
LN將每個樣本本身標準化,而BN將同壹維度的壹批數據標準化,這就是跨樣本。在CNN任務中,BatchSize較大,訓練時全局記錄樣本的均值和方差,適用於BN。在時間序列問題中,統計每個神經元是不現實的。LN的極限相對小得多,即使BatchSize=1。
掩碼有兩種,壹種是填充掩碼,另壹種是序列掩碼,它們出現在Transformer中的不同位置:填充掩碼出現在所有縮放的點積註意力中,序列掩碼僅出現在解碼器的自註意力中。
因為每批輸入序列的長度不同,所以使用填充掩碼來對齊序列長度。簡單來說,短序列與長序列對齊,對齊方法是加0。補充的地方沒有意義,所以不應該註意。實際上,我們不會直接在相應的位置上添加0,而是添加-inf(負無窮大),這樣在Softmax之後,這些位置的概率接近於0。
在處理過程中,填充掩碼是壹個布爾張量,其中false是添加0的位置。
如前所述,序列掩碼的作用是防止解碼器看到當前時刻之後的信息,因此後面部分的信息應該被完全覆蓋。具體來說,生成壹個上三角矩陣,上三角的值都是1,下三角和對角線的值都是0。
在解碼器的自關註部分,序列掩碼和填充掩碼同時起作用,它們作為掩碼相加。
RNN處理順序問題是自然而有序的,而《變形金剛》消除了這種對時間順序的依賴。以機器翻譯為例,如果輸出的是壹個完整合理的句子,則需要在輸入數據中添加位置信息,否則輸出的每個單詞可能都是對的,但不會形成句子。位置編碼是對輸入信息的位置進行編碼,然後將其添加到輸入嵌入中。
位置編碼使用正弦和余弦編碼:
在偶數位置,使用公式1的正弦編碼,在奇數位置,使用公式2的余弦編碼。由於正弦和余弦函數的特性,這種編碼既是絕對位置編碼又是相對位置編碼。
相對位置編碼信息主要取決於三角函數和角度公式:
FFN是壹個全連接網絡,它依次經歷線性變換、ReLU非線性變換和線性變換。公式如下:
參考資料:
【整理】談談變形金剛
推特:變形金剛的細節
說明什麽是Transformer。
文本分類練習(八)—— Transformer模型
深度學習:變壓器模型