04-Transformer(Attention Is All You Need)詳解

本文是觀看B站視頻(傳送門:https://www.bilibili.com/video/av48285039/?p=92
)后做的筆記,一方面加深理解,另一方面方便日后復(fù)習(xí)的時候不用重頭再來。


transformer有一個非常出色的應(yīng)用叫做BERT,下一篇將會說明BERT,我會在學(xué)習(xí)后做好筆記并把它上傳。

1.引入

在講transformer之前,我想提一下RNN,我們都知道RNN非常擅長處理這些input是sequence,但是它有個問題,不容易被平行化(單向信息流),也就是說每個word Embedding都不能同時計算,而需要按照順序執(zhí)行。


那么現(xiàn)在就有人提出用CNN來代替RNN。


但是單層的CNN相比RNN考慮的序列有限,如上圖中它只考慮了4個vector。為了考慮更長的序列,這就需要增加CNN的層數(shù),那么第二層的filter卷積核會將第一層的輸出Output當(dāng)成它的Input。

CNN的優(yōu)勢在于可以不需要等待第一個filter卷積核計算完成,自己才能進行計算,它達到了平行的狀態(tài),也就是說所有的filter卷積核能夠同時進行計算。
而伴隨二樓的CNN的缺點就是必須要疊加很多層,以便為了得到上下文的更多信息,反之只能得到很少的范圍。

2.Self-Attention

那么為了解決這個問題,self-attention應(yīng)運而生,它取代了RNN可以做的事情(Input是sequence,output也是sequence),它特別的地方是相比于RNN(需要按順序執(zhí)行),如下圖b1到b4它是可以同時進行計算的。


下面將對self-attention以及multi-head attention的原理進行介紹,進而引出transformer模型

2.1Self-Attention從輸入到輸出到底發(fā)生了什么?(含詳細計算過程)

Self-attention出現(xiàn)在google發(fā)表的一篇論文名為Attention is all you need中(原文地址:https://arxiv.org/abs/1706.03762).

2.1.1q,v,k分別是什么,怎么產(chǎn)生的?

首先,這里的input是x^1x^4,然后通過Word Embedding再乘上matrix W變成a^1a^4,然后把它們丟進self-attention 層中,這時候每一個input都分別乘上3個不同的matrix產(chǎn)生3個不同的vector,分別把它們命名為q,k,v。

q代表的是查詢向量,query (to match others用來去匹配其它的向量)
k代表的是地址向量,key (to be matched用來去被query匹配的向量)
v代表的是內(nèi)容向量,value(information to be extracted用來被抽取的信息的向量)

2.1.2用q和k做attention,得到α向量


現(xiàn)在要做的工作就是用每個query 去對每個 key 做attention(吃2個向量,輸出就是告訴你這2個向量有多么匹配或者可以說輸入兩個向量輸出一個分數(shù)(而怎么去吃2個向量output一個分數(shù),有很多不同的做法))。

這里的公式被稱為 Scaled Dot-Product Attention 被縮放的點積 注意力,它是由向量q與向量k做點積然后除以\sqrtu0z1t8os,這里的\sqrtu0z1t8os指的是qk向量的維度。
至于為什么要除以\sqrtu0z1t8os,一種直觀的解釋是qk的點積會隨著它們維度的增加,點積中相加的子項就越多,所以除以\sqrtu0z1t8os(論文有注解。)(思考:如果這里的點積換成其他的方式,效果會不會更好?)

這里普及下點乘的幾何意義:

可以用來表征或計算兩個向量之間的夾角,以及在$b$向量在$a$向量方向上的投影
     a·b>0    方向基本相同,夾角在0°到90°之間

     a·b=0    正交,相互垂直  

     a·b<0    方向基本相反,夾角在90°到180°之間 

2.1.3soft-max


接下來要做的是Soft-max,會將到通過Soft-max層得到biaozheng到 。

2.1.4得到輸出b


我們用和每一個v相乘,和相乘加上和相乘。以此類推并相加,最終得到。

剛才說self-attention就是輸入一個sequence輸出一個sequence,現(xiàn)在我們已經(jīng)得到了要輸出的sequence的第一個vector b^1,這時候的b^1,根據(jù)它的計算過程使得它考慮到了全部的sequence。

這里考慮一下得到b的其他情況:

  • 如果我們只想讓它考慮局部的信息,只要讓\widehat {a}_{1,3}v^3得到值為0就可以實現(xiàn)。
  • 如果我們只想讓它考慮最遠的信息,只讓\widehat {a}_{1,4}v^4計算出值,其他沒有即可。

這就做到了想截取input哪部分的sequence,self-attention都可以實現(xiàn)它。


因為self-attention是可以同時進行計算的,那么self-attention可以在計算b1的時候同時計算b^2、b^3、b^4,計算過程與b^1相同,他們這些表征向量是可以平行的計算出來。

2.1.5整體架構(gòu)


如果以黑盒的角度看,self-attention的機制就是這樣的。

2.2self-attention進階版

下面根據(jù)2.1的內(nèi)容,更詳細的說明self-attention每一步是怎么進行計算的。

2.2.1q,v,k分別是什么,怎么產(chǎn)生的?

整體思路:輸入信息,通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列。

首先看第一行:

  • a^1乘以matrixW^q得到q^1;
  • a^2乘以matrixW^q得到q^2;
  • a^3乘以matrixW^q得到q^3;
  • a^4乘以matrixW^q得到q^4;

這時候我們可以把q^1q^4拼接起來作為一個matrix。概括一下將a^1a^4整合為I,將q^1q^4整合為Q,整體為Q=W^qI,q代表每個位置的query。

同理,對于k向量的計算同q向量。將k^1k^4整體概括為K。整體為K=W^kI
對于v向量的計算也同q向量。將v^1v^4整體概括為V。整體為V=W^vI。

2.2.2用q和k做attention,得到α向量;soft-max得到\widehat {a}


之前說我們用每一個向量去和做attention,其實是做點積。

這里將k做轉(zhuǎn)置與q點積,可以將\sqrtu0z1t8os省去,讓式子更加簡化。
那么α_{1,1} = k^1q^1,α_{1,2} = k^2q^1,α_{1,3} = k^3q^1α_{1,4} = k^4q^1 ,在這個過程中我們發(fā)現(xiàn)所有式子都用到了q^1,那么這時候我們將q^1提取出來,將k^1k^4疊放在一起成為一個matrix矩陣,那么這時候q^1乘以這個matrix矩陣,得到的結(jié)果是α_{1,1}α_{1,4}的matrix矩陣。


同理,到的計算過程和一樣,和到組成矩陣相乘得到到,依此類推。

我們將q^1q^4組成的向量叫做Q,k^1k^4組成的向量轉(zhuǎn)置叫做K^T,他們之間相乘的結(jié)果為A,經(jīng)過softmax得到\widehat {a}

2.1.3得到輸出b

現(xiàn)在按照之前的步驟,我們要得到b,此時按照線性代數(shù)的公式,用v^1v^4組成的矩陣V乘以\widehat {A}矩陣,即V的行去相乘相加\widehat {A}矩陣的每一列,第一次計算得到b^1,以此類推直到b^4。將b^1b^4的向量組成矩陣O(也是整個self-attention層的輸出)。

2.1.4回顧

現(xiàn)在我們再將剛才的運算回顧一下,我們將a^1a^4組成的輸入叫做I(以下用I來指代),輸出b^1b^4叫做O。下面我們梳理下從IO這個過程之中,self-attention層做了哪些事情。
1.首先,我們將I分別和三個不同的matrix相乘,w^q,w^kw^v。我們得到了q^1q^4向量組成的矩陣Q,k^1k^4向量組成的矩陣K,v^1v^4組成的矩陣V
2.然后,我們用矩陣QK的轉(zhuǎn)置k^{T}相乘(為了省去\sqrtu0z1t8os,讓式子簡化),得到了A矩陣(attention矩陣),每個元素α代表的是input輸入的的sequence每個位置上的兩兩之間的attention(即概率分布)。
3.然后A矩陣經(jīng)過softmax計算,成為了\widehat {A}矩陣
4.最后,\widehat {A}矩陣與V矩陣相乘就得到了輸出O矩陣。

Tips:我們發(fā)現(xiàn)self-attention中做的就是一連串的矩陣乘法,我們可以使用GPU進行加速計算。

3.Multi-head Self-attention 多頭自注意力機制


除了self-attention,現(xiàn)在還有多頭自注意力機制 Multi-head Self-attention。下面以2頭注意力機制作為說明。

多頭的關(guān)鍵之處就在于,分別將q,k,v向量繼續(xù)細分為q^{i,1},q^{i,2};k^{i,1},k^{i,2};v^{i,1},v^{i,2}。

這里的q^{i,1}只和位置在1的k進行相乘,如q^{i,1}乘以k^{i,1}k^{j,1},得到\alpha,然后經(jīng)過soft-max的\widehat {\alpha},再和v^{i,1}v^{j,1}相乘相加,最終得到b^{i,1}。

同理,q^{i,2}同上q^{i,1},最終得到b^{i,2}。


進行到這一步,這時候我們擁有了和,如果不想要和組成的矩陣的維度(這里是2),我們可以進行降維,得到。
這樣多頭的機制有什么好處呢?在論文中,不同的head它們關(guān)注的部分不同,這樣每個head會各司其職注意力集中于各自的區(qū)域,

(換句話說,多頭注意力(multi-head attention)是利用多個查詢Q = [q^1, · · · , q^M],來平行地計算從輸入信息中選取多個信息。每個注意力關(guān)注輸入信息的不同部分,然后再進行拼接)

在模型中head的個數(shù)也是超參數(shù),可以進行調(diào)優(yōu)。

4.Transformer在此前的基礎(chǔ)上改進了什么?


我們這里有個問題,對于self-attention來說,它的Input的sequence是沒有順序的,這顯然不是我們想要的。

在Transformer的論文中,我們手動設(shè)定了位置編碼向量e^i,它代表了位置信息,我們就可以知道某個a^i現(xiàn)在在哪個位置。

那么這里可能會有疑問,直接將位置向量e^i和輸入向量a^i相加會不會導(dǎo)致向量混亂影響結(jié)果,這里對e^i的產(chǎn)生有一種解釋(與原論文不同,但是最后的公式一致):

在輸入x^i的時候,每個輸入的x^i再加入一個用one-hot編碼的向量pi用來代表位置信息。
1.將x^ip^i進行拼接;
2.然后與W(W分為W^IW^P)相乘得到Embedding,
3.根據(jù)線性代數(shù)公式W^Ix^i相乘,W^Pp^i相乘然后相加。

對比上面的式子e^i+a^iW^Ix^i相乘就得到a^i,W^Pp^i相乘然后相加就得到e^i。

而在原論文中比較匪夷所思的是,W^P是人工設(shè)置的。


右邊的圖形就是的樣子。

4.1什么是Transformer?

Transformer就是seq2seq model with Attention。

4.2從Input到output發(fā)生了什么?

Encoding的時候所有輸入的序列的詞,兩兩進行attention,這些attention是平行的,有三層所以做三次。

Decoding的時候,不僅會attend之前已經(jīng)輸入的部分還有已經(jīng)輸出的部分。

4.3Transformer內(nèi)部原理

一個seq2seq的model,左邊是encoder,右邊是decoder,希望輸入中文輸出是英文。

比如輸入的是機器學(xué)習(xí)
首先decoder給一個BOS的token,decoder輸出machine,然后將machine作為輸入,輸出learning,然后知道輸出句點,就結(jié)束了。

下面解釋下transformer內(nèi)部發(fā)生了什么?
左半部分:
1.input通過一個input Embedding層變?yōu)関ector;
2.vector會加上位置編碼進入block,這個block會重復(fù)N次;
3.block的第一層是multi-head attention,通過它會得到另一個sequence;


4.然后是add&norm,其中add是:將multi-head attention的輸出b和輸入a加起來b';norm是:將b'經(jīng)過layer norm做layer normalization(詳情見http://www.itdecent.cn/p/c357c5717a60);
5.經(jīng)過add&norm,vector會進入feed forward進行處理(簡單的全連接網(wǎng)絡(luò),對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出),然后再進行add&norm;

右半部分:
1.decoder的底部的output是由前一個向量計算產(chǎn)生的結(jié)果作為輸入;
2..同理。vector會加上位置編碼進入block,這個block會重復(fù)N次;
3.進入第一層,block的第一層是masked multi-head attention。這里的masked是attend on the generated sequence,意思就是decoder只會參加到已經(jīng)產(chǎn)生出的sequence中(由于是序列生成過程,所以在時刻 i 的時候,大于 i 的時刻都沒有結(jié)果,只有小于 i 的時刻有結(jié)果,所以沒有產(chǎn)生出來的向量是不存在的,無法進行attention),然后進行add&norm;
4.之后進入一層 multi-head attention,它的輸入是之前encoder部分的輸出;
5.然后再與3.的輸出進行add&norm,之后進入feed forward進行處理,進入add&norm,然后是linear層(Linear層就是一個全連接網(wǎng)絡(luò),作用是把decoder輸出的向量映射到一個大很多的logits 向量上。)
6.經(jīng)過softmax計算后輸出分數(shù)最高的那個詞就是這一步的輸出。

4.4Transformer的應(yīng)用場景


transformer的應(yīng)用場景:
只要是可以用seq2seq,就可以用transformer

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

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

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