谷歌最近的一篇BERT取得了卓越的效果,為了研究BERT的論文拇囊,我先找出了《Attention is All You Need》盗誊,看看里面的Transformer模型作為基礎。
Transformer是為了機器翻譯任務中的問題所提出的郎任。
傳統(tǒng)的RNN神經(jīng)網(wǎng)絡結構是可以處理任意長度的輸入史翘,它非常適合于自然語言的建模颖医,所以它在一段時間內(nèi)占據(jù)了整個神經(jīng)網(wǎng)絡中的主流位衩。隨著學術的發(fā)展,我們也會看到RNN有些不足熔萧。
RNN的缺點主要有兩點:
- RNN序列的特性導致其非常難以并行化
- 在RNN訓練中糖驴,RNN的網(wǎng)絡結構對于長距離和層級化的依賴關系難以建立
關于第二點舉個例子:“The dog didn’t cross street because it wastoo tired”僚祷,當我們看到“tired”的時候知道這個it指dog 。如果把最后一個詞換了贮缕,“The dog didn’t cross street because it was too wide”辙谜,這時候如果是人看了這句話就很容易發(fā)現(xiàn)it 指的是street,因為street because it was wide感昼,不可能是dog too wide装哆。對于人來說很簡單,但是機器要分清楚指代關系是非常難的定嗓。
所以人們開始探索新的網(wǎng)絡結構蜕琴,例如FaceBook提出的《Convolutional Sequence to Sequence Learning》。
Google在這一問題上的探索結果便是Transformer宵溅。Transformer這個網(wǎng)絡命名凌简,Transformer在英文翻譯過來有變形金剛的意思。
1. 整體結構
從整體上來看层玲,Transformer依舊是一個“Sequence to Sequence”框架号醉,擁有Encoder和Decoder兩部分:
Transformer的Encoder其實有6層反症,Decoder也有6層辛块,從Encoder的角度,低層的Encoder是表層的詞法信息铅碍,逐步向上進行抽象之后润绵,在上層將表示抽象語義信息。Encoder部分還在最上層連了幾條線到每個Decoder的部分胞谈,這是為了在Decoder中進行Attention操作尘盼,Decoder的網(wǎng)絡中和Encoder也有信息傳遞和交互的。最后一個特點是Decoder和Encoder畫的大小是一樣的烦绳,因為它們層的維度大小是一樣的卿捎。
多層的神經(jīng)網(wǎng)絡結構能夠對句子層級化信息進行建模,如果我們更精細的去看每一層的結構径密,就會發(fā)現(xiàn)這樣的情況:Encode分兩個子網(wǎng)絡部分午阵,第一個是Self-Attention,第二個部分是Feed Forward享扔。
Self-Attention是自注意力機制層底桂,表征句子當中不同位置詞之間的關系,是我們前面提到的it和street 或dog之間的依賴關系惧眠。
2. Self-Attention
首先在做DeepNLP任務時籽懦,我們都會使用word2vec等技術生成詞向量:
注:這里對詞向量的維數(shù)都做了簡化,以方便后面說明
那么首先要明白什么是Attention氛魁。從語言學的角度暮顺,它是表示詞與詞之間的關聯(lián)關系厅篓,像下圖所示,這是一個Self-Attention的示意拖云,它這個it會和其他位置的詞發(fā)生關系贷笛,顏色越深的是說關系越緊密,從中圖中看到它很正確的關聯(lián)到了animal它實際指代的一個詞宙项。
從機器學習的角度乏苦,這個Attention是神經(jīng)網(wǎng)絡隱層之間一個相似度的表示,什么是Self-Attention尤筐?就是表示句子內(nèi)部詞與詞之間的關聯(lián)關系汇荐,就像這里的it到animal,可以用于指代消解等問題盆繁。
在Transformer中提出一種擴展性更高掀淘、并行度更高的Attention計算方式,它把Attention看作一個基于內(nèi)容的查詢的過程油昂,content based query革娄,它會設置3個vector:QueryVector、Key Vector冕碟、Value Vector拦惋。并且每一個Vector都是通過它的input embedding和權重的矩陣相乘得到的。利用這個Q安寺、K厕妖、V進行各種數(shù)值的計算,最終得到Attentionscore挑庶。
用一個例子來給大家演示具體的Attention是怎么計算的言秸。如果我們計算“Thinking”這個詞,用Self-Attention的話迎捺,首先會用它的Query Vector乘以K的向量举畸,如果計算和第二個位置的attention是乘以T2的矩陣得到一個score,這個score再去和它維度的平根根進行相除凳枝,這個相除有數(shù)學上的含義抄沮,能夠使它回傳的梯度更加穩(wěn)定,除完后得到一個數(shù)值進行softmax范舀,所有Attention都是正數(shù)并且相加之和等于1合是,這是從數(shù)學正確上考慮,并且最終得到概率這個值是去定義每一個詞在當前位置的表現(xiàn)力锭环。Softmax之后聪全,我們會用softmax得到的乘以它Value的矩陣,這樣實際得到Attention的值辅辩,最后會把不同位置得到Attention的score加到一起难礼,形成當前位置Attention的Vector娃圆,就是Z1,加上逐詞計算的話就得到所有位置的Attention蛾茉。
使用矩陣形式來表示:
3. Multi-head Attention
這個是Google提出的新概念讼呢,是Attention機制的完善。不過從形式上看谦炬,它其實就再簡單不過了悦屏,就是把Q,K,V通過參數(shù)矩陣映射一下,然后再做Attention键思,把這個過程重復做h次础爬,結果拼接起來就行了
4. Positional Encoding
這樣的模型并不能捕捉序列的順序!換句話說吼鳞,如果將K,V按行打亂順序(相當于句子中的詞序打亂)看蚜,那么Attention的結果還是一樣的。這就表明了赔桌,到目前為止供炎,Attention模型頂多是一個非常精妙的“詞袋模型”而已。
Position Embedding疾党,也就是“位置向量”音诫,將每個位置編號,然后每個編號對應一個向量仿贬,通過結合位置向量和詞向量纽竣,就給每個詞都引入了一定的位置信息墓贿,這樣Attention就可以分辨出不同位置的詞了茧泪。
在以往的Position Embedding中,基本都是根據(jù)任務訓練出來的向量聋袋。而Google直接給出了一個構造Position Embedding的公式:
這里的意思是將id為p的位置映射為一個dpos維的位置向量队伟,這個向量的第i個元素的數(shù)值就是PEi(p)。
Position Embedding本身是一個絕對位置的信息幽勒,但在語言中嗜侮,相對位置也很重要,Google選擇前述的位置向量公式的一個重要原因是:由于我們有sin(α+β) = sinαcosβ+cosαsinβ
以及 cos(α+β)=cosαcosβ?sinαsinβ
啥容,這表明位置p+k的向量可以表示成位置p的向量的線性變換锈颗,這提供了表達相對位置信息的可能性。
這上面的編碼結果好像有點問題咪惠,我運行了哈佛的代碼后的結果如下击吱,也可能我哪里沒有理解清楚,希望有明白的大佬給我指點下遥昧。
需要注意的一點覆醇,結合位置向量和詞向量其實有好幾個可選方案朵纷,可以把它們拼接起來作為一個新向量,也可以把位置向量定義為跟詞向量一樣大小永脓,然后兩者加起來袍辞。Google論文中用的都是后者。
5. Position-wise Feed-Forward Networks
雖然線性變換在不同位置上是相同的常摧,但它們在層與層之間使用不同的參數(shù)搅吁。 另一種描述這種情況的方法是兩個內(nèi)核大小為1的卷積。
6. Residual connection和layer-normalization
對于學習CV的人估計對這個結構一點也不陌生落午,Residual connection
是對于較為深層的神經(jīng)網(wǎng)絡有比較好的作用似芝,比如網(wǎng)絡層很深時,數(shù)值的傳播隨著weight不斷的減弱板甘,Residual connection
是從輸入的部分党瓮,就是圖中虛線的部分,實際連到它輸出層的部分盐类,把輸入的信息原封不動copy到輸出的部分寞奸,減少信息的損失。
layer-normalization
這種歸一化層是為了防止在某些層中由于某些位置過大或者過小導致數(shù)值過大或過小在跳,對神經(jīng)網(wǎng)絡梯度回傳時有訓練的問題枪萄,保證訓練的穩(wěn)定性,這是神經(jīng)網(wǎng)絡設計比較常用的case猫妙。
基本在每個子網(wǎng)絡后面都要加上layer-normalization
瓷翻、加上Residual connection
,加上這兩個部分能夠使深層神經(jīng)網(wǎng)絡訓練更加順利割坠。
到此為止齐帚,Encoder部分其實基本上就已經(jīng)結束了,Decoder部分其實大多數(shù)結構都與Encoder部分相同彼哼,但是它的Attention部分還是有一些小小的不同对妄。
7. Encoder-Decoder Attention
由上圖可以看到,Decoder 部分除了Self-Attention的機制之外敢朱,還有Encoder-Decoder Attention剪菱。
其實,Encoder-Decoder Attention就是平常使用的Attention:
8. 小節(jié)
總體流程(上圖是只畫兩層的Encoder和Decoder):
- 將底層的詞的輸入轉化為embedding的輸入拴签,X1孝常、X2
- 加上“Positional Encoding”的輸入
- 輸入到第一個Encoder當中,經(jīng)過self-Attention層蚓哩,直連的“Residual connection”和歸一化層构灸,得到的輸出
- 將其輸入到前饋神經(jīng)網(wǎng)絡中,前饋神經(jīng)網(wǎng)絡出來之后再經(jīng)過直連層和歸一化層杖剪,這樣就完成了一個Encoder部分
- 再以這個輸入到第二個Encoder之后冻押,它會把第二個Encoder的輸出(這里由于只有兩層驰贷,所以第二個Encoder就是最后Encoder)作為第一個Decoder的輸入,也是依次進行上面的過程
- 最后就是通過一個liner層之后由softmax層轉化概率輸出
注意:目標端的Attention注意力機制是一個masked注意力機制洛巢,為什么括袒?比如在機器翻譯當中,在源端能夠看到所有的詞稿茉,但如果你目標端生成翻譯時是自左上右锹锰,生成翻譯時能夠看到前面已經(jīng)生成詞的信息,看不到后面層的漓库,這是目標端Attention和源端Attention比較大的區(qū)別恃慧,所以在目標端所有的Attention都是加Masked的,這個Masked相當于把后面不該看到的信息屏蔽掉