Attention Is All You Need(2017.6)
本文從微觀角度(張量角度)討論transformer的前向傳播
自注意力層
一、計算自注意力的第一步就是用每個編碼器的輸入向量(每個單詞的詞向量)生成三個向量。也就是說對于每個單詞,我們創造一個查詢向量(Query)、一個鍵向量(Key)和一個值向量(Value)。(在本文的討論范圍內,及目前實際中絕大多數討論中一個詞的鍵向量等于值向量)。這三個向量是通過每個詞嵌入向量與各自的權重矩陣相乘后創建的。可以發現這些新向量在維度上比詞嵌入向量更低 ,論文中詞嵌入和編碼器的輸入/輸出向量的維度是512,新向量維度是64。但實際上不強求維度更小,這只是一種基于架構上的選擇,它可以使多頭注意力(multiheaded attention)的大部分計算保持不變。
二、計算自注意力的第二步是計算得分。假設我們在為一個例子中的第一個詞“Thinking”計算自注意力向量,我們需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在編碼單詞“Thinking”的過程中有多關注句子的其它部分。這些分數是通過打分單詞(輸入句子的所有單詞)的鍵向量(Key)與“Thinking”的查詢向量(Query)相點積來計算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個分數是q1和k1的點積,第二個分數是q1和k2的點積。
三、將分數除以8(8是論文中使用的鍵向量的維數64的平方根,即
,這會讓梯度更穩定。這里也可以使用其它值,8只是默認值)
四、然后通過softmax傳遞結果。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。
五、將每個值向量(Value)乘以softmax分數(這是為了準備之后將它們求和)。這里的直覺是希望關注語義上相關的單詞,并弱化不相關的單詞。
六、對加權值向量求和(譯注:自注意力的另一種解釋就是在編碼某個單詞時,就是將所有單詞的表示(值向量)進行加權求和,而權重是通過該詞的表示(鍵向量)與被編碼詞表示(查詢向量)的點積并通過softmax得到。),然后即得到自注意力層在該位置的輸出(在我們的例子中是對于第一個單詞)。?
這樣自自注意力的計算就完成了。得到的向量就可以傳給前饋神經網絡。然而實際中,這些計算是以矩陣形式完成的,以便算得更快。
實際中矩陣實現上述計算:
一、計算查詢矩陣(Query)、鍵矩陣(Key)和值矩陣(Value)。為此,我們將輸入句子的詞嵌入裝進矩陣X中,將其乘以我們訓練的權重矩陣(
)。
步驟二到六可以合并為一個公式來計算自注意力層的輸出。
多頭注意力(“multi-headed” attention):
較普通自注意力優勢:
1、它擴展了模型專注于不同位置的能力。
2、它給出了注意力層的多個“表示子空間”(representation subspace)。對于“多頭”注意機制,我們有多個查詢/鍵/值權重矩陣集(Transformer使用八個注意力頭,因此我們對于每個編碼器/解碼器有八個矩陣集合)。這些集合中的每一個都是隨機初始化的,在訓練之后,每個集合都被用來將輸入詞嵌入(或來自上一級編碼器/解碼器的向量)投影到不同的表示子空間中。
如果我們做與上述相同的自注意力計算,只需八次不同的權重矩陣運算,我們就會得到八個不同的Z矩陣。
這給我們帶來了一點挑戰。前饋層不需要8個矩陣,它只需要一個矩陣(由每一個單詞的表示向量組成)。所以我們需要一種方法把這八個矩陣壓縮成一個矩陣。可以直接把這些矩陣拼接在一起,然后用一個附加的權重矩陣
與它們相乘,得到最終的Z矩陣。
多頭注意力(multi-headed” attention)帶來的“多重注意力”
位置編碼(Positional Encoding):
為了解決上述還缺少的理解輸入單詞順序的方法,Transformer為每個輸入的詞嵌入添加了一個向量。
如果我們假設詞嵌入的維數為4,則實際的位置編碼如下:
更進一步,在下圖中,每一行對應一個詞向量的位置編碼,所以第一行對應著輸入序列的第一個詞。每行包含512個值,每個值介于1和-1之間。我們已經對它們進行了顏色編碼,所以圖案是可見的。
20字(行)的位置編碼實例,詞嵌入大小為512(列)。你可以看到它從中間分裂成兩半。這是因為左半部分的值由一個函數(使用正弦)生成,而右半部分由另一個函數(使用余弦)生成。然后將它們拼在一起而得到每一個位置編碼向量。
綜上一個編碼器的結構如下圖所示。我們需要提到一個編碼器架構中的細節:在每個編碼器中的每個子層(自注意力、前饋網絡)的周圍都有一個殘差連接(虛線),并且都跟隨著一個“層歸一化”步驟。
下一篇:? ? ? ? ? ??transformer再記(解碼器)
參考文章:? ? ? ??BERT大火卻不懂Transformer?讀這一篇就夠了
有用的文章:? ? ? ?關于transformer各組件的說明
? ? ? ? ? ? ? ? ? ? ? ? ? transfromer代碼解釋