Attention Is All You Need簡(jiǎn)記(多頭注意力、自注意力、層歸一化、位置嵌入)

首先注意力模型可以宏觀上理解為一個(gè)查詢(xún)(query)到一系列(鍵key-值value)對(duì)的映射。

將Source(源)中的構(gòu)成元素想象成是由一系列的<Key,Value>數(shù)據(jù)對(duì)構(gòu)成,此時(shí)給定Target(目標(biāo))中的某個(gè)元素Query(查詢(xún)),通過(guò)計(jì)算Query和各個(gè)Key的相似性或者相關(guān)性,得到每個(gè)Key對(duì)應(yīng)Value的權(quán)重系數(shù),通過(guò)softmax歸一化后,對(duì)權(quán)重和相應(yīng)Value進(jìn)行加權(quán)求和,即得到了最終的Attention數(shù)值。所以本質(zhì)上Attention機(jī)制是對(duì)Source中元素的Value值進(jìn)行加權(quán)求和,而Query和Key用來(lái)計(jì)算對(duì)應(yīng)Value的權(quán)重系數(shù)。目前在NLP研究中,key和value常常都是同一個(gè),即key=value。

注意力模型可以宏觀上理解為一個(gè)查詢(xún)(Query)到一系列(鍵key-值value)對(duì)的映射


Attention Is All You Need(2017.6)

放縮點(diǎn)積attention層圖示定義式
逐向量來(lái)看上圖結(jié)構(gòu)

其中 Z 是歸一化因子。K、V 是一一對(duì)應(yīng)的,它們就像是 key-value 的關(guān)系,那么上式的意思就是通過(guò) q_t這個(gè) query,通過(guò)與各個(gè)k_s內(nèi)積的并?softmax 的方式,來(lái)得到?q_t 與各個(gè)v_s 的相似度,然后加權(quán)求和,得到一個(gè) d_v維的向量。此處在進(jìn)行q_tv_s相似度計(jì)算時(shí),使用點(diǎn)積,除此之外還有拼接,感知機(jī)等方式。

其中因子\sqrt{d_k} 起到調(diào)節(jié)作用,使得上方內(nèi)積不至于太大(太大的話(huà) softmax 后就非 0 即 1 了,不夠“soft”了),其中\sqrt{d_k} 指的是鍵向量維度的平方根。


1、多頭attention(Multi-head attention)

多頭attention允許模型同時(shí)注意來(lái)自不同位置的不同表示子空間的信息

多頭attention(Multi-head attention)結(jié)構(gòu)如上圖,Query,Key,Value首先進(jìn)過(guò)一個(gè)線性變換,然后輸入到放縮點(diǎn)積attention,注意這里要做h次,也就是所謂的多頭,每一次算一個(gè)頭,頭之間參數(shù)不共享,每次Q,K,V進(jìn)行線性變換的參數(shù)W是不一樣的。然后將h次的放縮點(diǎn)積attention結(jié)果進(jìn)行拼接,再進(jìn)行一次線性變換得到的值作為多頭attention的結(jié)果。

可以看到,google提出來(lái)的多頭attention的不同之處在于進(jìn)行了h次計(jì)算而不僅僅算一次,論文中說(shuō)到這樣的好處是可以允許模型在不同的表示子空間里學(xué)習(xí)到相關(guān)的信息。


2、自注意力(Self Attention)

所謂 Self Attention,其實(shí)就是 Attention(X,X,X),X 就是前面說(shuō)的輸入序列。Self-attention即K=V=Q,例如輸入一個(gè)句子,那么里面的每個(gè)詞都要和該句子中的所有詞進(jìn)行attention計(jì)算。目的是學(xué)習(xí)句子內(nèi)部的詞依賴(lài)關(guān)系,捕獲句子的內(nèi)部結(jié)構(gòu)。更準(zhǔn)確來(lái)說(shuō),Google 所用的是 Self Multi-Head Attention。

自注意力可以提取句子自身詞間依賴(lài),比如常用短語(yǔ)、代詞指代的事物等?;蛘哒f(shuō), 這層幫助編碼器在對(duì)每個(gè)單詞編碼時(shí)關(guān)注輸入句子的其他單詞。

對(duì)于使用自注意力機(jī)制的原因,論文中提到主要從三個(gè)方面考慮(每一層的復(fù)雜度,是否可以并行,長(zhǎng)距離依賴(lài)學(xué)習(xí)),并給出了和RNN,CNN計(jì)算復(fù)雜度的比較。

1、可以看到,如果輸入序列n小于表示維度d的話(huà),每一層的時(shí)間復(fù)雜度self-attention是比較有優(yōu)勢(shì)的。當(dāng)n比較大時(shí),作者也給出了一種解決方案self-attention(restricted)即每個(gè)詞不是和所有詞計(jì)算attention,而是只與限制的r個(gè)詞去計(jì)算attention。

2、在并行方面,多頭attention和CNN一樣不依賴(lài)于前一時(shí)刻的計(jì)算,可以很好的并行,優(yōu)于RNN。

3、在長(zhǎng)距離依賴(lài)上,由于self-attention是每個(gè)詞和所有詞都要計(jì)算attention,所以不管他們中間有多長(zhǎng)距離,最大的路徑長(zhǎng)度也都只是1。能夠無(wú)視詞之間的距離直接計(jì)算依賴(lài)關(guān)系,能夠?qū)W習(xí)一個(gè)句子的內(nèi)部結(jié)構(gòu)。

????????先來(lái)看一個(gè)翻譯的例子“I arrived at the bank after crossing the river” 這里面的bank指的是銀行還是河岸呢,這就需要我們聯(lián)系上下文,當(dāng)我們看到river之后就應(yīng)該知道這里bank很大概率指的是河岸。在RNN中我們就需要一步步的順序處理從bank到river的所有詞語(yǔ),而當(dāng)它們相距較遠(yuǎn)時(shí)RNN的效果常常較差,且由于其順序性處理效率也較低。

????????Self-Attention則利用了Attention機(jī)制,計(jì)算每個(gè)單詞與其他所有單詞之間的關(guān)聯(lián),在這句話(huà)里,當(dāng)翻譯bank一詞時(shí),river一詞就有較高的Attention score。利用這些Attention score就可以得到一個(gè)加權(quán)的表示,然后再放到一個(gè)前饋神經(jīng)網(wǎng)絡(luò)中得到新的表示,這一表示很好的考慮到上下文的信息。總之Self-Attention機(jī)制對(duì)每一個(gè)詞得到新的考慮了上下文信息的表征。


3、位置嵌入(Position Embedding)

上述模型并不能學(xué)習(xí)序列的順序。換句話(huà)說(shuō),如果將 K,V 按行打亂順序(相當(dāng)于句子中的詞序打亂),那么 Attention 的結(jié)果還是一樣的。學(xué)習(xí)不到順序信息,那么效果將會(huì)大打折扣(比如機(jī)器翻譯中,有可能只把每個(gè)詞都翻譯出來(lái)了,但是不能組織成合理的句子)。這就引出了位置向量(Position Embedding)。

將每個(gè)位置編號(hào),然后每個(gè)編號(hào)對(duì)應(yīng)一個(gè)向量,通過(guò)結(jié)合位置向量和詞向量,就給每個(gè)詞都引入了一定的位置信息,這樣 Attention 就可以分辨出不同位置的詞了,進(jìn)而學(xué)習(xí)位置信息了。

在Attention Is All You Need一文中,Google直接給出了位置向量構(gòu)造公式:

這里的意思是將 id 為 p的位置映射為一個(gè)?d_{pos}維的位置向量,這個(gè)向量的第i個(gè)元素的數(shù)值就是 PE_i(p)

位置向量是絕對(duì)位置信息,相對(duì)位置信息也很重要。Google 選擇前述的位置向量公式的一個(gè)重要原因如下:由于我們有 sin(α+β)=sinα·cosβ+cosα·sinβ 以及 cos(α+β)=cosα·cosβ?sinα·sinβ,這表明位置 p+k 的向量可以表示成位置 p、k 的向量的線性變換,這提供了表達(dá)相對(duì)位置信息的可能性。

結(jié)合位置向量和詞向量有幾個(gè)可選方案,可以把它們拼接起來(lái)作為一個(gè)新向量,也可以把位置向量定義為跟詞向量一樣大小,然后兩者加起來(lái),Attention Is All You Need使用的是后者。


4、Layer Normalization

LN(左)和BN(右)對(duì)比示意圖??

我們指出BN并不適用于RNN等動(dòng)態(tài)網(wǎng)絡(luò)和batchsize較小的時(shí)候效果不好。Layer Normalization(LN)的提出有效的解決BN的這兩個(gè)問(wèn)題。LN和BN不同點(diǎn)是歸一化的維度是互相垂直的,如圖1所示。在圖1中N表示樣本軸,C表示通道軸,F是每個(gè)通道的特征數(shù)量。BN如右側(cè)所示,它是取不同樣本的同一個(gè)通道的特征做歸一化;LN則是如左側(cè)所示,它取的是同一個(gè)樣本的不同通道做歸一化。

LN是和BN非常近似的一種歸一化方法,不同的是BN取的是不同樣本的同一個(gè)特征,而LN取的是同一個(gè)樣本的不同特征。在BN和LN都能使用的場(chǎng)景中,BN的效果一般優(yōu)于LN,原因是基于不同數(shù)據(jù),同一特征得到的歸一化特征更不容易損失信息。但是有些場(chǎng)景是不能使用BN的,例如batchsize較小或者在RNN中,這時(shí)候可以選擇使用LN,LN得到的模型更穩(wěn)定且起到正則化的作用。RNN能應(yīng)用到小批量和RNN中是因?yàn)長(zhǎng)N的歸一化統(tǒng)計(jì)量的計(jì)算是和batchsize沒(méi)有關(guān)系的。


5、transformer

綜合上述部分組成整體結(jié)構(gòu)transformer

transformer模型分為編碼器解碼器兩個(gè)部分。

編碼器由6個(gè)相同的層堆疊在一起,每一層又有兩個(gè)支層。第一個(gè)支層是一個(gè)多頭的自注意機(jī)制,第二個(gè)支層是一個(gè)簡(jiǎn)單的全連接前饋網(wǎng)絡(luò)。在兩個(gè)支層外面都添加了一個(gè)殘差連接(residual),然后進(jìn)行了layer nomalization的操作。模型所有的支層以及embedding層的輸出維度都是d_{model}。

解碼器也是堆疊了6個(gè)相同的層。不過(guò)每層除了編碼器中那兩個(gè)支層,解碼器還加入了第三個(gè)支層,如圖中所示同樣也用了殘差連接以及l(fā)ayer normalization。


另一篇關(guān)于transformer:transformer再記(編碼器)

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

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?transformer代碼注解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容