细讲 | Attention Is All You Need
細(xì)講 | Attention Is All You Need
Attention Is All You Need
自從Attention機(jī)制在提出之后,加入Attention的Seq2Seq模型在各個(gè)任務(wù)上都有了提升,所以現(xiàn)在的seq2seq模型指的都是結(jié)合rnn和attention的模型。傳統(tǒng)的基于RNN的Seq2Seq模型難以處理長(zhǎng)序列的句子,無法實(shí)現(xiàn)并行,并且面臨對(duì)齊的問題。
所以之后這類模型的發(fā)展大多數(shù)從三個(gè)方面入手:
-
input的方向性:單向 -> 雙向
-
深度:單層 -> 多層
-
類型:RNN -> LSTM GRU
但是依舊收到一些潛在問題的制約,神經(jīng)網(wǎng)絡(luò)需要能夠?qū)⒃凑Z句的所有必要信息壓縮成固定長(zhǎng)度的向量。這可能使得神經(jīng)網(wǎng)絡(luò)難以應(yīng)付長(zhǎng)時(shí)間的句子,特別是那些比訓(xùn)練語料庫中的句子更長(zhǎng)的句子;每個(gè)時(shí)間步的輸出需要依賴于前面時(shí)間步的輸出,這使得模型沒有辦法并行,效率低;仍然面臨對(duì)齊問題。
再然后CNN由計(jì)算機(jī)視覺也被引入到deep NLP中,CNN不能直接用于處理變長(zhǎng)的序列樣本但可以實(shí)現(xiàn)并行計(jì)算。完全基于CNN的Seq2Seq模型雖然可以并行實(shí)現(xiàn),但非常占內(nèi)存,很多的trick,大數(shù)據(jù)量上參數(shù)調(diào)整并不容易。
本篇文章創(chuàng)新點(diǎn)在于拋棄了之前傳統(tǒng)的encoder-decoder模型必須結(jié)合cnn或者rnn的固有模式,只用Attention。文章的主要目的在于減少計(jì)算量和提高并行效率的同時(shí)不損害最終的實(shí)驗(yàn)結(jié)果。
Model
1 整體框架
整體框架很容易理解,但看上圖又很復(fù)雜,簡(jiǎn)化一下:
其實(shí)這就是一個(gè)Seq2Seq模型,左邊一個(gè)encoder把輸入讀進(jìn)去,右邊一個(gè)decoder得到輸出:
第一眼看到論文中的框圖,隨之產(chǎn)生問題就是左邊encoder的輸出是怎么和右邊decoder結(jié)合的。因?yàn)閐ecoder里面是有N層的。再畫張圖直觀的看就是這樣:
也就是說,Encoder的輸出,會(huì)和每一層的Decoder進(jìn)行結(jié)合。我們?nèi)∑渲幸粚舆M(jìn)行詳細(xì)的展示:
2 Attention Mechanism
2.1 Attention定義
Attention用于計(jì)算"相關(guān)程度",例如在翻譯過程中,不同的英文對(duì)中文的依賴程度不同,Attention通常可以進(jìn)行如下描述,表示為將query(Q)和key-value pairs映射到輸出上,其中query、每個(gè)key、每個(gè)value都是向量,輸出是V中所有values的加權(quán),其中權(quán)重是由Query和每個(gè)key計(jì)算出來的,計(jì)算方法分為三步:
-
第一步:計(jì)算比較Q和K的相似度,用f來表示:
-
第二步:將得到的相似度進(jìn)行Softmax操作,進(jìn)行歸一化:
-
第三步:針對(duì)計(jì)算出來的權(quán)重,對(duì)V中所有的values進(jìn)行加權(quán)求和計(jì)算,得到Attention向量:
注:第一步中計(jì)算方法包括以下四種:
-
點(diǎn)乘 dot product:
-
權(quán)重 General:
-
拼接權(quán)重 Concat:
-
感知器 Perceptron:
在論文中,將Attention落實(shí)到具體,分別叫做 Scaled Dot-Product Attention 和 Multi-Head Attention。
2.2 Scaled Dot-Product Attention
它的結(jié)構(gòu)圖如下:
-
First Step
首先從輸入開始理解,Scaled Dot-Product Attention里的Q, K, V從哪里來:按照我的理解就是給我一個(gè)輸入X, 通過3個(gè)線性轉(zhuǎn)換把X轉(zhuǎn)換為Q,K,V。
兩個(gè)單詞,Thinking, Machines. 通過嵌入變換會(huì)X1,X2兩個(gè)向量[1 x 4]。分別與Wq,Wk,Wv三個(gè)矩陣[4x3]想做點(diǎn)乘得到,{q1,q2},{k1,k2},{v1,v2} 6個(gè)向量[1x3]。
-
Second Step
向量{q1,k1}做點(diǎn)乘得到得分(Score) 112, {q1,k2}做點(diǎn)乘得到得分96。
-
Third and Forth Steps
對(duì)該得分進(jìn)行規(guī)范,除以8。這個(gè)在論文中的解釋是為了使得梯度更穩(wěn)定。之后對(duì)得分[14,12]做softmax得到比例 [0.88,0.12]。
-
Fifth Step
用得分比例[0.88,0.12] 乘以[v1,v2]值(Values)得到一個(gè)加權(quán)后的值。將這些值加起來得到z1。這就是這一層的輸出。仔細(xì)感受一下,用Q,K去計(jì)算一個(gè)thinking對(duì)與thinking, machine的權(quán)重,用權(quán)重乘以thinking,machine的V得到加權(quán)后的thinking,machine的V,最后求和得到針對(duì)各單詞的輸出Z。
-
矩陣表示
之前的例子是單個(gè)向量的運(yùn)算例子。這張圖展示的是矩陣運(yùn)算的例子。輸入是一個(gè)[2x4]的矩陣(單詞嵌入),每個(gè)運(yùn)算是[4x3]的矩陣,求得Q,K,V。
Q對(duì)K轉(zhuǎn)制做點(diǎn)乘,除以dk的平方根。做一個(gè)softmax得到合為1的比例,對(duì)V做點(diǎn)乘得到輸出Z。那么這個(gè)Z就是一個(gè)考慮過thinking周圍單詞(machine)的輸出。
注意看這個(gè)公式,?其實(shí)就會(huì)組成一個(gè)word2word的attention map!(加了softmax之后就是一個(gè)合為1的權(quán)重了)。比如說你的輸入是一句話 "i have a dream" 總共4個(gè)單詞,這里就會(huì)形成一張4x4的注意力機(jī)制的圖:
這樣一來,每一個(gè)單詞就對(duì)應(yīng)每一個(gè)單詞有一個(gè)權(quán)重
注意encoder里面是叫self-attention,decoder里面是叫masked self-attention。
這里的masked就是要在做language modelling(或者像翻譯)的時(shí)候,不給模型看到未來的信息。
mask就是沿著對(duì)角線把灰色的區(qū)域用0覆蓋掉,不給模型看到未來的信息。
詳細(xì)來說,i作為第一個(gè)單詞,只能有和i自己的attention。have作為第二個(gè)單詞,有和i, have 兩個(gè)attention。 a 作為第三個(gè)單詞,有和i,have,a 前面三個(gè)單詞的attention。到了最后一個(gè)單詞dream的時(shí)候,才有對(duì)整個(gè)句子4個(gè)單詞的attention。
做完softmax后就像這樣,橫軸合為1
2.3 Multi-Head Attention
Multi-Head Attention就是把Scaled Dot-Product Attention的過程做H次,然后把輸出Z合起來。論文中,它的結(jié)構(gòu)圖如下:
我們還是以上面的形式來解釋:
我們重復(fù)記性8次相似的操作,得到8個(gè)Zi矩陣
為了使得輸出與輸入結(jié)構(gòu)對(duì)標(biāo) 乘以一個(gè)線性W0 得到最終的Z。
3 Transformer Architecture
絕大部分的序列處理模型都采用encoder-decoder結(jié)構(gòu),其中encoder將輸入序列映射到連續(xù)表示?,然后decoder生成一個(gè)輸出序列,每個(gè)時(shí)刻輸出一個(gè)結(jié)果。從框架圖中,我們可以知道Transformer模型延續(xù)了這個(gè)模型。
3.1 Position Embedding
因?yàn)槟P筒话≧ecurrence/Convolution,因此是無法捕捉到序列順序信息的,例如將K、V按行進(jìn)行打亂,那么Attention之后的結(jié)果是一樣的。但是序列信息非常重要,代表著全局的結(jié)構(gòu),因此必須將序列的分詞相對(duì)或者絕對(duì)position信息利用起來。
這里每個(gè)分詞的position embedding向量維度也是, 然后將原本的input embedding和position embedding加起來組成最終的embedding作為encoder/decoder的輸入。其中position embedding計(jì)算公式如下:
其中 pos 表示位置index, i 表示dimension index。
Position Embedding本身是一個(gè)絕對(duì)位置的信息,但在語言中,相對(duì)位置也很重要,Google選擇前述的位置向量公式的一個(gè)重要原因是,由于我們有:
這表明位置p+k的向量可以表示成位置p的向量的線性變換,這提供了表達(dá)相對(duì)位置信息的可能性。
在其他NLP論文中,大家也都看過position embedding,通常是一個(gè)訓(xùn)練的向量,但是position embedding只是extra features,有該信息會(huì)更好,但是沒有性能也不會(huì)產(chǎn)生極大下降,因?yàn)镽NN、CNN本身就能夠捕捉到位置信息,但是在Transformer模型中,Position Embedding是位置信息的唯一來源,因此是該模型的核心成分,并非是輔助性質(zhì)的特征。
3.2 Position-wise Feed-forward Networks
在進(jìn)行了Attention操作之后,encoder和decoder中的每一層都包含了一個(gè)全連接前向網(wǎng)絡(luò),對(duì)每個(gè)position的向量分別進(jìn)行相同的操作,包括兩個(gè)線性變換和一個(gè)ReLU激活輸出:
其中每一層的參數(shù)都不同。
3.3 Encoder
Encoder有N=6層,每層包括兩個(gè)sub-layers:
-
第一個(gè)sub-layer是multi-head self-attention mechanism,用來計(jì)算輸入的self-attention
-
第二個(gè)sub-layer是簡(jiǎn)單的全連接網(wǎng)絡(luò)。
-
在每個(gè)sub-layer我們都模擬了殘差網(wǎng)絡(luò),每個(gè)sub-layer的輸出都是:
其中Sublayer(x) 表示Sub-layer對(duì)輸入 x 做的映射,為了確保連接,所有的sub-layers和embedding layer輸出的維數(shù)都相同。
3.4 Decoder
Decoder也是N=6層,每層包括3個(gè)sub-layers:
-
第一個(gè)是Masked multi-head self-attention,也是計(jì)算輸入的self-attention,但是因?yàn)槭巧蛇^程,因此在時(shí)刻 i 的時(shí)候,大于 i 的時(shí)刻都沒有結(jié)果,只有小于 i 的時(shí)刻有結(jié)果,因此需要做Mask
-
第二個(gè)sub-layer是全連接網(wǎng)絡(luò),與Encoder相同
-
第三個(gè)sub-layer是對(duì)encoder的輸入進(jìn)行attention計(jì)算。
同時(shí)Decoder中的self-attention層需要進(jìn)行修改,因?yàn)橹荒塬@取到當(dāng)前時(shí)刻之前的輸入,因此只對(duì)時(shí)刻 t 之前的時(shí)刻輸入進(jìn)行attention計(jì)算,這也稱為Mask操作。
3.5 The Final Linear and Softmax Layer
將Decoder的堆棧輸出作為輸入,從底部開始,最終進(jìn)行word預(yù)測(cè)。
3.6 The Decoder Side
繼續(xù)進(jìn)行:
4 Experiment
可以看出,transformer 用了最少的資源得到了state-of-art的輸出回報(bào)。
對(duì)模型自身的一些參數(shù)做了改變自變量的測(cè)試,看一下哪些參數(shù)對(duì)模型的影響比較大。
總結(jié)
以上是生活随笔為你收集整理的细讲 | Attention Is All You Need的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器翻译】transformer
- 下一篇: BERT却不懂Transformer?2