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

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


transformer有一個非常出色的應用叫做BERT,下一篇將會說明BERT,我會在學習后做好筆記并把它上傳。

1.引入

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


那么現在就有人提出用CNN來代替RNN。


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

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

2.Self-Attention

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


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

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

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

2.1.1q,v,k分別是什么,怎么產生的?

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

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

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


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

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

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

可以用來表征或計算兩個向量之間的夾角,以及在$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,現在我們已經得到了要輸出的sequence的第一個vector b^1,這時候的b^1,根據它的計算過程使得它考慮到了全部的sequence。

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

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

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


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

2.1.5整體架構


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

2.2self-attention進階版

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

2.2.1q,v,k分別是什么,怎么產生的?

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

首先看第一行:

  • 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^qIq代表每個位置的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做轉置與q點積,可以將\sqrt9n6nevm省去,讓式子更加簡化。
那么α_{1,1} = k^1q^1α_{1,2} = k^2q^1α_{1,3} = k^3q^1α_{1,4} = k^4q^1 ,在這個過程中我們發現所有式子都用到了q^1,那么這時候我們將q^1提取出來,將k^1k^4疊放在一起成為一個matrix矩陣,那么這時候q^1乘以這個matrix矩陣,得到的結果是α_{1,1}α_{1,4}的matrix矩陣。


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

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

2.1.3得到輸出b

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

2.1.4回顧

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

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

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


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

多頭的關鍵之處就在于,分別將q,k,v向量繼續細分為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,然后經過soft-max的\widehat {\alpha},再和v^{i,1}v^{j,1}相乘相加,最終得到b^{i,1}

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


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

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

在模型中head的個數也是超參數,可以進行調優。

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


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

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

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

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

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

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


右邊的圖形就是的樣子。

4.1什么是Transformer?

Transformer就是seq2seq model with Attention。

4.2從Input到output發生了什么?

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

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

4.3Transformer內部原理

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

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

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


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

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

4.4Transformer的應用場景


transformer的應用場景:
只要是可以用seq2seq,就可以用transformer

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容