搞懂Transformer
文章目錄
- 1 內(nèi)容簡(jiǎn)述
- 2 seq2seq的常用模塊
- 3 Self-attention
- 4 Multi-head Self-attention
- 5 Positional Encoding
- 6 Transformer
- 參考資料
文為李弘毅老師【Transformer】的課程筆記,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來(lái)自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
1 內(nèi)容簡(jiǎn)述
拋開Transformer的內(nèi)部結(jié)構(gòu),Transformer其實(shí)就是一個(gè)seq2seq的模型,其中用到了大量的self-attention layer。本文會(huì)試圖講明白什么是self-attention layer。
2 seq2seq的常用模塊
之前使用最廣泛的seq2seq的模塊就是RNN。RNN可以分為單向的和雙向的。如果是單向的RNN,輸出中的每個(gè)time step會(huì)有一些信息丟失,比如單向的RNN在下圖中產(chǎn)生b3b^3b3的時(shí)候就只考慮了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3]。而雙向的RNN輸出的每個(gè)time step都考慮了輸入的所有信息,比如雙向的RNN在下圖中產(chǎn)生b3b^3b3的時(shí)候就考慮了[a1,a2,a3][a^1, a^2, a^3][a1,a2,a3]和[a3,a4][a^3, a^4][a3,a4]。
但是RNN有一個(gè)不好的地方就是它的計(jì)算很難并行化,比如我要算b4b^4b4的時(shí)候,就要等前幾個(gè)結(jié)果都出來(lái)了,才能算。為了解決這個(gè)問(wèn)題,就有人提出了CNN來(lái)替換RNN。
1-D CNN的模塊介紹可以參見(jiàn)這里。雖然CNN的計(jì)算可以并行處理,但是,CNN的kernel_size一般會(huì)比較小,輸出的某個(gè)time step想要考慮到全局的信息,就要把CNN疊很多層。
然后本文的重點(diǎn)就由此引出了,self-attention可以同時(shí)解決這兩個(gè)問(wèn)題,也就是既可以讓每個(gè)time step的輸出考慮了全局的輸入,又可以并行計(jì)算。
3 Self-attention
self-attention最早出自google的這篇Attention Is All You Need,這篇文章比較難讀懂,但它本身并不是那么神秘,一個(gè)非常直觀的理解就是,self-attention是一個(gè)可以替代RNN的東西。下面就來(lái)剖析一下這個(gè)self-attention。我們的目的是輸入一個(gè)序列aaa,得到一個(gè)序列bbb。
假設(shè)我們的輸入是xxx,首先要對(duì)xxx進(jìn)行一次embedding,讓它變到我們需要的維度,我們記這個(gè)embedding的結(jié)果為aaa。
a=Wxa=Wxa=Wx
然后,我們要讓這個(gè)aaa再分別乘以三個(gè)矩陣,self-attention中最為重要的三個(gè)東西query, key和value。
q:query(tomatchothers)q=Wqak:key(tobematched)k=Wkav:value(informationtobeextracted)v=Wvaq: query (to\ match\ others)\\ q = W^qa\\ k: key (to\ be\ matched)\\ k = W^ka\\ v: value(information\ to\ be\ extracted)\\ v = W^va\\ q:query(to?match?others)q=Wqak:key(to?be?matched)k=Wkav:value(information?to?be?extracted)v=Wva
然后,我們會(huì)把每一個(gè)q去對(duì)k做attention,所謂的attention就是塞兩個(gè)向量進(jìn)去,然后吐出來(lái)一個(gè)表示兩個(gè)向量相關(guān)性的數(shù)值α\alphaα。attention的方法有很多種,在Attention Is All You Need中,所使用的叫做scaled dot-product attention。
α1,i=q1?ki/d\alpha_{1, i} = q^1 \cdot k^i / \sqrtze8trgl8bvbq α1,i?=q1?ki/d?
為什么要除以這個(gè)d\sqrtze8trgl8bvbqd?呢?因?yàn)楫?dāng)qqq和kkk的維度很大時(shí),它們內(nèi)積的variance就會(huì)很大,所以要除以一個(gè)d\sqrtze8trgl8bvbqd?來(lái)scale一下。
最后還要對(duì)α\alphaα做一個(gè)softmax,得到α^\hat{\alpha}α^。大致的流程如下圖所示。
這個(gè)α^\hat{\alpha}α^其實(shí)就是每一個(gè)time step的value的重要性。用這個(gè)α^\hat{\alpha}α^對(duì)每個(gè)time step的value進(jìn)行一個(gè)加權(quán),就得到了self-attention的結(jié)果bbb。比如b1b^1b1就可以通過(guò)下式計(jì)算得到
b1=∑iα^1,ivib^1=\sum_i{\hat{\alpha}_{1, i}v^i} b1=i∑?α^1,i?vi
這樣得到的bbb是考慮了所有的輸入的,而且無(wú)視輸入之間的遠(yuǎn)近,完全通過(guò)學(xué)習(xí)attention來(lái)獲取需要的value,其示意圖如下所示。
更重要的是,以上的過(guò)程都是可以并行計(jì)算的。因?yàn)槊總€(gè)time step的計(jì)算都是獨(dú)立的,我們可以把它們concat到一個(gè)大的矩陣?yán)?#xff0c;然后一起計(jì)算,示意圖如下所示。
4 Multi-head Self-attention
self-attention是可以做成multi-head的,所謂multi-head,其實(shí)就是把qqq,kkk,vvv分裂成多個(gè),然后每個(gè)分別在自己的head內(nèi)做self-attention,然后把結(jié)果再concat起來(lái),如果得到的結(jié)果維度不是我們想要的,那么再乘以一個(gè)矩陣就可以了。
做成Multi-head的目的是讓不同的head去學(xué)到不同的東西,比如有的head學(xué)局部的信息,有的head學(xué)全局的信息。
5 Positional Encoding
然而,從之前的整個(gè)流程可以看出來(lái),self-attention是不會(huì)去關(guān)心輸入的time step順序的,任何一個(gè)輸出,time step是111還是TTT,對(duì)self-attention來(lái)說(shuō)都是一樣的,李老師很形象地稱之為“天涯若比鄰”。
為了增加位置的信息,就會(huì)給aaa加上一個(gè)神奇的人為預(yù)先設(shè)定好的向量eee,有了這個(gè)eee之后,模型就可以知道輸入的位置信息了。
那為什么是e+ae+ae+a,這樣不是把aaa的信息給攪亂了嗎?會(huì)什么不是直接concat上去變成[e,a][e, a][e,a]呢?我們不妨來(lái)試試concat的話會(huì)如何,不過(guò)既然是位置信息,我們需要concat到xxx上。假設(shè)我們有一個(gè)和位置有關(guān)的向量ppp,ppp是一個(gè)one-hot的向量,表示當(dāng)前的xix^ixi是在第iii個(gè)time step上。那么在做embedding的時(shí)候,我們也需要把embedding的矩陣WWW變大,而WWW又可以拆成WiW^iWi和WpW^pWp。根據(jù)矩陣的計(jì)算方法,其結(jié)果就相當(dāng)于給aaa加了一個(gè)值,這個(gè)值也就是之前提到的eee的。可見(jiàn),e+ae+ae+a和對(duì)xxx進(jìn)行concat是等效的。
這里有一個(gè)比較神奇的地方,就是這個(gè)eee是個(gè)什么東西,為啥這么靈?換成其他的靈不靈?這就不得而知了。
論文中的position encoding用的是
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos, 2i)} = sin(pos / 10000^{2i/d_{model}}) \\ PE_{(pos, 2i+1)} = cos(pos / 10000^{2i/d_{model}}) PE(pos,2i)?=sin(pos/100002i/dmodel?)PE(pos,2i+1)?=cos(pos/100002i/dmodel?)
這是一個(gè)不用學(xué)習(xí)的參數(shù),作者也試過(guò)讓模型自己去學(xué),但結(jié)果差不多。作者選擇這個(gè)不用學(xué)習(xí)的版本是為了讓模型可以處理比訓(xùn)練時(shí)遇到過(guò)的序列更長(zhǎng)的序列。
也有人把這個(gè)可視化了,可以參見(jiàn)illustrated-transformer。
6 Transformer
從上文中可以看出,self-attention是可以替代RNN的,實(shí)際操作中,也就是把RNN替換成self-attention就結(jié)束了。
接下來(lái)讓我們來(lái)看看下面這幅經(jīng)典的Transformer的圖,現(xiàn)在看起來(lái)應(yīng)該是親切了不少。這個(gè)圖的左半個(gè)結(jié)構(gòu)是Encoder,右半個(gè)結(jié)構(gòu)是Decoder。把圖中的Multi-Head Attention想象成RNN就可以了。Emmm…感覺(jué)也不需要額外的說(shuō)明了。值得注意的是,這里的Masked Multi-Head Attention就是指是對(duì)已經(jīng)產(chǎn)生的序列做attention,比如我們翻譯的時(shí)候,是塞一個(gè)起始符進(jìn)去,然后一個(gè)字一個(gè)字生成,直到遇到終止符。
參考資料
[1] 李宏毅-transformer
[2] illustrated-transformer
[3] Attention Is All You Need
總結(jié)
以上是生活随笔為你收集整理的搞懂Transformer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 2185. 统计包含给
- 下一篇: LeetCode 2141. 同时运行