transformer再記(編碼器)

transformer整體結(jié)構(gòu)

Attention Is All You Need(2017.6)

本文從微觀角度(張量角度)討論transformer的前向傳播


自注意力層

一、計(jì)算自注意力的第一步就是用每個(gè)編碼器的輸入向量(每個(gè)單詞的詞向量)生成三個(gè)向量。也就是說(shuō)對(duì)于每個(gè)單詞,我們創(chuàng)造一個(gè)查詢(xún)向量(Query)、一個(gè)鍵向量(Key)和一個(gè)值向量(Value)。(在本文的討論范圍內(nèi),及目前實(shí)際中絕大多數(shù)討論中一個(gè)詞的鍵向量等于值向量)。這三個(gè)向量是通過(guò)每個(gè)詞嵌入向量與各自的權(quán)重矩陣相乘后創(chuàng)建的。可以發(fā)現(xiàn)這些新向量在維度上比詞嵌入向量更低 ,論文中詞嵌入和編碼器的輸入/輸出向量的維度是512,新向量維度是64。但實(shí)際上不強(qiáng)求維度更小,這只是一種基于架構(gòu)上的選擇,它可以使多頭注意力(multiheaded attention)的大部分計(jì)算保持不變。

X1與WQ權(quán)重矩陣相乘得到q1, 就是與這個(gè)單詞相關(guān)的查詢(xún)向量。最終使得輸入序列的每個(gè)單詞的創(chuàng)建一個(gè)查詢(xún)向量、一個(gè)鍵向量和一個(gè)值向量。

二、計(jì)算自注意力的第二步是計(jì)算得分。假設(shè)我們?cè)跒橐粋€(gè)例子中的第一個(gè)詞“Thinking”計(jì)算自注意力向量,我們需要拿輸入句子中的每個(gè)單詞對(duì)“Thinking”打分。這些分?jǐn)?shù)決定了在編碼單詞“Thinking”的過(guò)程中有多關(guān)注句子的其它部分。這些分?jǐn)?shù)是通過(guò)打分單詞(輸入句子的所有單詞)的鍵向量(Key)與“Thinking”的查詢(xún)向量(Query)相點(diǎn)積來(lái)計(jì)算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個(gè)分?jǐn)?shù)是q1和k1的點(diǎn)積,第二個(gè)分?jǐn)?shù)是q1和k2的點(diǎn)積。

三、分?jǐn)?shù)除以8(8是論文中使用的鍵向量的維數(shù)64的平方根,即\sqrt{d_k} ,這會(huì)讓梯度更穩(wěn)定。這里也可以使用其它值,8只是默認(rèn)值)

四、然后通過(guò)softmax傳遞結(jié)果。softmax的作用是使所有單詞的分?jǐn)?shù)歸一化,得到的分?jǐn)?shù)都是正值且和為1。這個(gè)softmax分?jǐn)?shù)決定了每個(gè)單詞對(duì)編碼當(dāng)下位置(“Thinking”)的貢獻(xiàn)。

五、將每個(gè)值向量(Value)乘以softmax分?jǐn)?shù)(這是為了準(zhǔn)備之后將它們求和)。這里的直覺(jué)是希望關(guān)注語(yǔ)義上相關(guān)的單詞,并弱化不相關(guān)的單詞

六、對(duì)加權(quán)值向量求和(譯注:自注意力的另一種解釋就是在編碼某個(gè)單詞時(shí),就是將所有單詞的表示(值向量)進(jìn)行加權(quán)求和,而權(quán)重是通過(guò)該詞的表示(鍵向量)與被編碼詞表示(查詢(xún)向量)的點(diǎn)積并通過(guò)softmax得到。),然后即得到自注意力層在該位置的輸出(在我們的例子中是對(duì)于第一個(gè)單詞)。?

這樣自自注意力的計(jì)算就完成了。得到的向量就可以傳給前饋神經(jīng)網(wǎng)絡(luò)。然而實(shí)際中,這些計(jì)算是以矩陣形式完成的,以便算得更快


實(shí)際中矩陣實(shí)現(xiàn)上述計(jì)算:

一、計(jì)算查詢(xún)矩陣(Query)、鍵矩陣(Key)和值矩陣(Value)。為此,我們將輸入句子的詞嵌入裝進(jìn)矩陣X中,將其乘以我們訓(xùn)練的權(quán)重矩陣(W^Q、W^K、W^V)。

x矩陣中的每一行對(duì)應(yīng)于輸入句子中的一個(gè)單詞。我們?cè)俅慰吹皆~嵌入向量 (512,或圖中的4個(gè)格子)和q/k/v向量(64,或圖中的3個(gè)格子)的大小差異。

步驟二到六可以合并為一個(gè)公式來(lái)計(jì)算自注意力層的輸出。


多頭注意力(“multi-headed” attention):

較普通自注意力優(yōu)勢(shì):

1、它擴(kuò)展了模型專(zhuān)注于不同位置的能力。

2、它給出了注意力層的多個(gè)“表示子空間”(representation subspace)。對(duì)于“多頭”注意機(jī)制,我們有多個(gè)查詢(xún)/鍵/值權(quán)重矩陣集(Transformer使用八個(gè)注意力頭,因此我們對(duì)于每個(gè)編碼器/解碼器有八個(gè)矩陣集合)。這些集合中的每一個(gè)都是隨機(jī)初始化的,在訓(xùn)練之后,每個(gè)集合都被用來(lái)將輸入詞嵌入(或來(lái)自上一級(jí)編碼器/解碼器的向量)投影到不同的表示子空間中。

如果我們做與上述相同的自注意力計(jì)算,只需八次不同的權(quán)重矩陣運(yùn)算,我們就會(huì)得到八個(gè)不同的Z矩陣。

這給我們帶來(lái)了一點(diǎn)挑戰(zhàn)。前饋層不需要8個(gè)矩陣,它只需要一個(gè)矩陣(由每一個(gè)單詞的表示向量組成)。所以我們需要一種方法把這八個(gè)矩陣壓縮成一個(gè)矩陣。可以直接把這些矩陣拼接在一起,然后用一個(gè)附加的權(quán)重矩陣W^0與它們相乘,得到最終的Z矩陣。

多頭注意力(multi-headed” attention)帶來(lái)的“多重注意力”

當(dāng)我們編碼“it”一詞時(shí),一個(gè)注意力頭集中在“animal”上,而另一個(gè)則集中在“tired”上,從某種意義上說(shuō),模型對(duì)“it”一詞的表達(dá)在某種程度上是“animal”和“tired”的代表。



位置編碼(Positional Encoding):

為了解決上述還缺少的理解輸入單詞順序的方法,Transformer為每個(gè)輸入的詞嵌入添加了一個(gè)向量。

如果我們假設(shè)詞嵌入的維數(shù)為4,則實(shí)際的位置編碼如下:

更進(jìn)一步,在下圖中,每一行對(duì)應(yīng)一個(gè)詞向量的位置編碼,所以第一行對(duì)應(yīng)著輸入序列的第一個(gè)詞。每行包含512個(gè)值,每個(gè)值介于1和-1之間。我們已經(jīng)對(duì)它們進(jìn)行了顏色編碼,所以圖案是可見(jiàn)的。

20字(行)的位置編碼實(shí)例,詞嵌入大小為512(列)。你可以看到它從中間分裂成兩半。這是因?yàn)樽蟀氩糠值闹涤梢粋€(gè)函數(shù)(使用正弦)生成,而右半部分由另一個(gè)函數(shù)(使用余弦)生成。然后將它們拼在一起而得到每一個(gè)位置編碼向量。


綜上一個(gè)編碼器的結(jié)構(gòu)如下圖所示。我們需要提到一個(gè)編碼器架構(gòu)中的細(xì)節(jié):在每個(gè)編碼器中的每個(gè)子層(自注意力、前饋網(wǎng)絡(luò))的周?chē)加幸粋€(gè)殘差連接(虛線),并且都跟隨著一個(gè)“層歸一化”步驟。

虛線是殘差連接


下一篇:? ? ? ? ? ??transformer再記(解碼器)

參考文章:? ? ? ??BERT大火卻不懂Transformer?讀這一篇就夠了

有用的文章:? ? ? ?關(guān)于transformer各組件的說(shuō)明

? ? ? ? ? ? ? ? ? ? ? ? ? transfromer代碼解釋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容