Attention Is All You Need(2017.6)
本文從微觀角度(張量角度)討論transformer的前向傳播
自注意力層
一取具、計算自注意力的第一步就是用每個編碼器的輸入向量(每個單詞的詞向量)生成三個向量脖隶。也就是說對于每個單詞,我們創(chuàng)造一個查詢向量(Query)暇检、一個鍵向量(Key)和一個值向量(Value)产阱。(在本文的討論范圍內(nèi),及目前實際中絕大多數(shù)討論中一個詞的鍵向量等于值向量)块仆。這三個向量是通過每個詞嵌入向量與各自的權(quán)重矩陣相乘后創(chuàng)建的构蹬。可以發(fā)現(xiàn)這些新向量在維度上比詞嵌入向量更低 ,論文中詞嵌入和編碼器的輸入/輸出向量的維度是512悔据,新向量維度是64庄敛。但實際上不強(qiáng)求維度更小,這只是一種基于架構(gòu)上的選擇科汗,它可以使多頭注意力(multiheaded attention)的大部分計算保持不變藻烤。
二、計算自注意力的第二步是計算得分坤检。假設(shè)我們在為一個例子中的第一個詞“Thinking”計算自注意力向量兴猩,我們需要拿輸入句子中的每個單詞對“Thinking”打分。這些分?jǐn)?shù)決定了在編碼單詞“Thinking”的過程中有多關(guān)注句子的其它部分早歇。這些分?jǐn)?shù)是通過打分單詞(輸入句子的所有單詞)的鍵向量(Key)與“Thinking”的查詢向量(Query)相點積來計算的倾芝。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個分?jǐn)?shù)是q1和k1的點積箭跳,第二個分?jǐn)?shù)是q1和k2的點積晨另。
三、將分?jǐn)?shù)除以8(8是論文中使用的鍵向量的維數(shù)64的平方根衅码,即拯刁,這會讓梯度更穩(wěn)定。這里也可以使用其它值逝段,8只是默認(rèn)值)
四、然后通過softmax傳遞結(jié)果割捅。softmax的作用是使所有單詞的分?jǐn)?shù)歸一化奶躯,得到的分?jǐn)?shù)都是正值且和為1。這個softmax分?jǐn)?shù)決定了每個單詞對編碼當(dāng)下位置(“Thinking”)的貢獻(xiàn)亿驾。
五嘹黔、將每個值向量(Value)乘以softmax分?jǐn)?shù)(這是為了準(zhǔn)備之后將它們求和)。這里的直覺是希望關(guān)注語義上相關(guān)的單詞,并弱化不相關(guān)的單詞儡蔓。
六郭蕉、對加權(quán)值向量求和(譯注:自注意力的另一種解釋就是在編碼某個單詞時,就是將所有單詞的表示(值向量)進(jìn)行加權(quán)求和喂江,而權(quán)重是通過該詞的表示(鍵向量)與被編碼詞表示(查詢向量)的點積并通過softmax得到召锈。),然后即得到自注意力層在該位置的輸出(在我們的例子中是對于第一個單詞)获询。?
這樣自自注意力的計算就完成了涨岁。得到的向量就可以傳給前饋神經(jīng)網(wǎng)絡(luò)。然而實際中吉嚣,這些計算是以矩陣形式完成的梢薪,以便算得更快。
實際中矩陣實現(xiàn)上述計算:
一尝哆、計算查詢矩陣(Query)秉撇、鍵矩陣(Key)和值矩陣(Value)。為此秋泄,我們將輸入句子的詞嵌入裝進(jìn)矩陣X中畜疾,將其乘以我們訓(xùn)練的權(quán)重矩陣()啡捶。
步驟二到六可以合并為一個公式來計算自注意力層的輸出与帆。
多頭注意力(“multi-headed” attention):
較普通自注意力優(yōu)勢:
1了赌、它擴(kuò)展了模型專注于不同位置的能力。
2玄糟、它給出了注意力層的多個“表示子空間”(representation subspace)勿她。對于“多頭”注意機(jī)制,我們有多個查詢/鍵/值權(quán)重矩陣集(Transformer使用八個注意力頭阵翎,因此我們對于每個編碼器/解碼器有八個矩陣集合)逢并。這些集合中的每一個都是隨機(jī)初始化的,在訓(xùn)練之后郭卫,每個集合都被用來將輸入詞嵌入(或來自上一級編碼器/解碼器的向量)投影到不同的表示子空間中砍聊。
如果我們做與上述相同的自注意力計算,只需八次不同的權(quán)重矩陣運算贰军,我們就會得到八個不同的Z矩陣玻蝌。
這給我們帶來了一點挑戰(zhàn)。前饋層不需要8個矩陣,它只需要一個矩陣(由每一個單詞的表示向量組成)俯树。所以我們需要一種方法把這八個矩陣壓縮成一個矩陣帘腹。可以直接把這些矩陣拼接在一起许饿,然后用一個附加的權(quán)重矩陣與它們相乘阳欲,得到最終的Z矩陣。
多頭注意力(multi-headed” attention)帶來的“多重注意力”
位置編碼(Positional Encoding):
為了解決上述還缺少的理解輸入單詞順序的方法,Transformer為每個輸入的詞嵌入添加了一個向量狸页。
如果我們假設(shè)詞嵌入的維數(shù)為4锨能,則實際的位置編碼如下:
更進(jìn)一步,在下圖中芍耘,每一行對應(yīng)一個詞向量的位置編碼址遇,所以第一行對應(yīng)著輸入序列的第一個詞。每行包含512個值斋竞,每個值介于1和-1之間倔约。我們已經(jīng)對它們進(jìn)行了顏色編碼,所以圖案是可見的坝初。
20字(行)的位置編碼實例浸剩,詞嵌入大小為512(列)。你可以看到它從中間分裂成兩半鳄袍。這是因為左半部分的值由一個函數(shù)(使用正弦)生成绢要,而右半部分由另一個函數(shù)(使用余弦)生成。然后將它們拼在一起而得到每一個位置編碼向量拗小。
綜上一個編碼器的結(jié)構(gòu)如下圖所示重罪。我們需要提到一個編碼器架構(gòu)中的細(xì)節(jié):在每個編碼器中的每個子層(自注意力、前饋網(wǎng)絡(luò))的周圍都有一個殘差連接(虛線)哀九,并且都跟隨著一個“層歸一化”步驟剿配。
下一篇:? ? ? ? ? ??transformer再記(解碼器)
參考文章:? ? ? ??BERT大火卻不懂Transformer?讀這一篇就夠了
有用的文章:? ? ? ?關(guān)于transformer各組件的說明
? ? ? ? ? ? ? ? ? ? ? ? ? transfromer代碼解釋