- 最近
transformer
的結(jié)構(gòu)改進(jìn)論文挺多的略板,總結(jié)一下亭螟。 -
transformer
是一個(gè)seq2seq
模型小渊。
從RNN談起
-
缺點(diǎn):不能處理過(guò)長(zhǎng)的句子起暮。
-
LSTM
可以一定程度上緩解這個(gè)問(wèn)題,因?yàn)樗杏洃泦卧σ桑约翱梢赃x擇什么時(shí)候進(jìn)行遺忘的門控機(jī)制危融,但是還是不能處理過(guò)長(zhǎng)句子中的依賴問(wèn)題(大約能記住30-40
個(gè)詞之間的依賴關(guān)系,普通的RNN
只能記住5-6
個(gè)詞的依賴關(guān)系)雷袋。 -
RNN-based model
還有一個(gè)問(wèn)題就是encoder
的時(shí)候不能并行吉殃,可以從上面的圖中看到,只有當(dāng)單詞x0
處理完成了以后楷怒,才能處理單詞x1
蛋勺。
attention 機(jī)制
- 為了解決長(zhǎng)時(shí)間長(zhǎng)序列之間的單詞依賴問(wèn)題,引入了
attention
機(jī)制鸠删,就是在處理句子的時(shí)候抱完,不再是一個(gè)句子處理完成以后只取最后一個(gè)hidden state
當(dāng)做句子的表示丟給decoder
,而是每個(gè)時(shí)刻的hidden state
刃泡,decoder
都可以按其所需對(duì)hidden state
進(jìn)行加權(quán)訪問(wèn)巧娱。
- 可以看到之前的
seq2seq
模型decoder
的時(shí)候只獲取了encoder
的最后一個(gè)狀態(tài),加入了attention
機(jī)制以后就可以獲取每一個(gè)時(shí)間步的信息了烘贴。
CNN-based model
- 可以想到
CNN
還是可以解決RNN
的不足的禁添,因?yàn)槭紫?code>CNN本來(lái)就是并行做卷積的因此速度encode
速度比RNN
快的多,其次CNN可以通過(guò)卷積核捕獲短期依賴桨踪,然后通過(guò)疊加層數(shù)捕獲長(zhǎng)期依賴老翘。比如下面的wavenet
的處理方式。
- 既然
CNN
和Attention
機(jī)制這么好锻离,那么把兩者結(jié)合起來(lái)豈不是天下無(wú)敵铺峭?是的這就是Transfomer
Transformers
Transformers
中用的是self-attention
-
首先我們看一下
transfomer
的整體架構(gòu),也是seq2seq
模型汽纠,普通的transfomer
疊了6
層卫键,而big transfomer
疊了12
層。
-
每一個(gè)
encoder
都是由兩部分組成的虱朵,self-attention
幫助句子中的每個(gè)單詞建立依賴關(guān)系莉炉,而且僅僅是使用self-attention
來(lái)建立聯(lián)系的啤呼,而feed-forward
層是每一個(gè)token
都是單獨(dú)向前的(就是一個(gè)非線性層),因此不捕獲token
之間的依賴關(guān)系呢袱,同時(shí)不同token
的feed forward
可以并行。
-
decoder
還有一個(gè)多于的attention
層翅敌,幫助decoder
集中于輸入句子中的特定的部分羞福。
self-attention
- 根據(jù)三個(gè)不同的矩陣得到,
q,k,v
蚯涮。(當(dāng)然有一種self-attention
是不乘矩陣的直接對(duì)embedding
的矩陣進(jìn)行操作治专,self-attention
得到的是embedding * embedding轉(zhuǎn)置* embedding
,這樣的好處是效果不錯(cuò)也沒(méi)有額外的參數(shù) ) -
self-attention
的實(shí)現(xiàn)方式遭顶。
multi-head attention
-
linear
層其實(shí)就是一個(gè)大矩陣张峰,embedding matrix
的維度是seqLen*embedding dim
,而K棒旗,Q喘批,V
對(duì)應(yīng)的W
矩陣(Wk,Wq铣揉,Wv)
的size
都是embedding dim * hidden size
那么KQV
矩陣的size
是seqLen * hidden size
饶深。multi-head attention
和原始的attention
的區(qū)別是,原始的attention
只有一組W
矩陣逛拱,現(xiàn)在的multi-head attention
是有多組敌厘,常用的設(shè)置是將hidden size
設(shè)置為原來(lái)的1/n
,比如原來(lái)的hidden size
是512
維朽合,有8
個(gè)head
那么現(xiàn)在就有8
組W
矩陣各自的hiddensize
是64
俱两,這樣QKV
矩陣的維度是64* 512
(原來(lái)是512*512
)但是得到的Z
尺寸還是一樣的依然是seqLen*512
,然后將8
個(gè)Z concat
起來(lái)過(guò)一個(gè)linear
(就是乘以一個(gè)4096*512
的矩陣)得到seqlen*512
的最終的state
曹步。(那個(gè)hidden state
變成1/n
也不一定是效果最好的宪彩,你可以設(shè)置成其他值) - 這個(gè)操作和
CNN
里面使用多個(gè)卷積核是一樣一樣的。
- 可以看到不同的
head
注意到不同的位置箭窜,相當(dāng)于不同卷積核捕獲不同的特征毯焕。
表示序列的位置信息使用Positional Encoding
- 因?yàn)閮H僅使用
self-attention
的話就相當(dāng)于是一個(gè)詞袋模型,所以我們需要引入表示位置信息的編碼磺樱。
- 看到源代碼里面
positional encoding
實(shí)現(xiàn)方式纳猫,是一個(gè)比較復(fù)雜的三角函數(shù),naacl18
上有一篇文章論文使用了相對(duì)位置的positional encoding
效果提升了0.6
個(gè)bleu
竹捉,總之這個(gè)positional encoding
是一個(gè)比較ugly
的東西芜辕,大家都想改進(jìn)他,但是卻苦于沒(méi)有好的方法块差。
Transformer中的殘差連接
- 在
encoder
的每個(gè)sub layer
之間(一個(gè)self-attention
或者一個(gè)feed forward
算一個(gè)sublayer
)是有殘差連接的侵续,他們大概長(zhǎng)這樣
- 所謂的殘差連接實(shí)現(xiàn)的時(shí)候只不過(guò)是把原來(lái)的
x1
保存下來(lái)倔丈,然后做layernorm
的時(shí)候和下面模塊中傳遞進(jìn)來(lái)的z
加起來(lái)即可。
- 在
decoder
中同樣也有殘差連接
decoder部分
-
encoder
的輸入是單詞的embedding
状蜗,輸出是一組attention
的K
矩陣和V
矩陣需五,這樣decoder
可以用到這個(gè)attention
矩陣就可以更好的獲取輸入句子信息。(embedding matrix
各自乘以一個(gè)矩陣得到K
和V
)
- 可以看到
decoder
的時(shí)候轧坎,也是一個(gè)時(shí)間步一個(gè)時(shí)間步運(yùn)行的宏邮,因此decoder
的時(shí)候沒(méi)有加速的(還是自回歸模型,現(xiàn)在比較活的非自回歸模型就是解決這個(gè)問(wèn)題的缸血,但是效果還是不能比)蜜氨,而encoder
的時(shí)候是并行的,K
和V
矩陣是最終6
層以后得到的embedding
各自乘以一個(gè)矩陣K
和V
- 值得注意的是
decoder
中的self-attention
機(jī)制和是不同的捎泻,因?yàn)樯尚碌膯卧~的時(shí)候只能看到前面已經(jīng)生成過(guò)單詞的信息飒炎,因此需要用mask
擋住后面的位置(設(shè)置為-inf
) -
encoder-decoder attention
層的work
方式和multihead self-attention
方式是很像的,只不過(guò)使用的Queries
矩陣來(lái)自下面層的輸入笆豁,而Keys
和Values Matrix
用的是的encoder
產(chǎn)生的郎汪。 - 最后的
softmax
層: