1. 程式人生 > >釋出一年了,做NLP的還有沒看過這篇論文的嗎?--“Attention is all you need”

釋出一年了,做NLP的還有沒看過這篇論文的嗎?--“Attention is all you need”

筆記作者:王小草
日期:2018年10月30日
歡迎關注我的微信公眾號“AI躁動街”

image_1cqvre80t1u5h17e319l3lrg19j69.png-75.6kB

1 Background

說起深度學習和神經網路,影象處理一呼百應的“卷積神經網路CNN“也好,還是自然語言處理得心應手的”迴圈神經網路RNN”,都簡直是膾炙人口、婦孺皆知。前者助力處理高維特徵,後者聚焦掌控序列記憶,時而分道而行,時而也互相取暖,但也終是各司其職,自有短長。

然而,在深度學習中,還有一個不可或缺的靈魂角色,那就是注意力機制(attention machanisms),在本文要介紹的論文之前,attention machanisms還只是個在CNN和RNN襁褓中的配角,協助主角表現更優,雖也算不上是跑龍套,但也絕不會在劇情裡獨當一面。而本文要介紹的這篇發表於2017 NIPS 會議上的論文,不僅高捧attention,而且讓它上位到了“is all you need”的至高點,吸睛的論文標題中不僅體現了學者們對於學術敢於創新與拍前浪的精神,也深刻體現了,恩,我們不只會搞硬學術,還會標題黨和PR呢~(你就說像不像你媽媽轉發的朋友圈“這個冬天,就吃這樣東西就夠了!”,“震驚!原來它有這樣的作用!”)

2 Why is attention all we need?

拋開標題黨的成分,為什麼作者竟敢如此“鼓吹”attention的作用呢?自然也是有理有據,不打誑語。

1.文中,推翻原來使用CNN或RNN構建的encoder-decoder 網路,直接構建了一個只有attention machanisims的encoder-decoder 網路,取名為“transformer"

2.這個transformer,結合了CNN和RNN的優點,即善於平行計算,提高訓練效率,又能有序列上的記憶,不遜於RNN的表現。

3.文中做了兩個機器翻譯的實驗來證明:英文-德文翻譯,英文-法文翻譯,都取得了state of art 的成績。

3 Why shoud we read this paper?

那麼為什麼2017年的這篇老論文,現在都2018年末了還要拿出來老生常談呢?是不是已經過時了呢?然而並沒有呢。許多傳統的模型和傳統的問題都巧妙借用了這篇論文的思想,甚至許多最新的文獻中省去了介紹模型結構的篇幅,只說“細節你們自己去看’attention is all you need’那篇論文,我用的就是它的”,對,就是這麼屌。

4 How Transformer works?

寫了這麼多廢話,終於進入了期待已久的高潮,按照論文的結構,(1)先介紹整個模型的結構,有一個全域性觀;(2)再對模型中的每一個小結構詳細介紹。就像男生看到美女,先上下全身打量一下,恩,一個字,美,然後再細看臉,胸,腰,臀,大長腿。不過有些男生看到這裡可能要不高興我妄加比喻:我們明明是隻看胸好嗎?行行行,你開心就好。

4.1 the architecture of full model

理解這個模型要分兩個部分:encoder部分和decoder部分,只是這裡的encoder和decoder中使用的已經不是CNN或者RNN的結構了,而是attention機制。先看一眼整個模型的結構圖:

image_1cqvtd7al1rn4pd2vu3ku017t61j.png-103.6kB

左邊是encoder部分,右邊是decoder部分,兩部分以某種曖昧的方式藕斷絲連地牽扯著。

4.1.1 Encoder

先來說說Encoder部分。

Encoder部分由特定的6個layer連線而成,這6個layer是6胞胎,性格長相一模一樣,手拉手組成了encoder。於是我們只需要介紹其中一個layer的結構,也就明白了encoder的全貌了。下圖是一個完整的layer所示:
image_1cqvthkn1sr91c6t1kp31ggvoul2d.png-18.8kB

一個layer中包含兩個sub layer.從下往上,第一個sub layer取名為multi-head self-attetion mechanisim(紅框),第二個sub layer是positional wise fully connected feed-forward network(綠框)。

multi-head self-attetion mechanisim層的過程是:
(1)輸入:x
(2)multi-head attetion計算:SubLayer(x)
(3)residul connection計算:x+ SubLayer(x)
(4)layer normalization計算:Layer Norm(x+ SubLayer(x))

positional wise fully connected feed-forward network層的過程是:
(1)輸入:x(也就是multi-head self-attetion mechanisim層的輸出)
(2)feed forward: x+ SubLayer(x)
(3)residul connection計算:x+ SubLayer(x)
(4)layer normalization計算:Layer Norm(x+ SubLayer(x))

該層的layer normalization的輸出將會是下一個layer中第一個sub layer的輸入,以此迴圈往復,直到第6個layer的positional wise fully connected feed-forward network層的輸出,即為transformer中encoder的最終輸出,這個最終輸出要稍安勿躁得等待deocder的拋來愛的橄欖枝,即它將作為decoder的其中一個輸入。

4.1.2 Decoder

在來說說Decoder部分。
image_1cqvtmfg6sn48hr1tnlqouvmk3a.png-28.9kB
Decoder也有6個layer 組成,且巧了,這6個decoder也是一模一樣的6胞胎。與encoder中不同的是,每個layer中有3個sub layer,新增的這個sub layer是插在3層的中間位置,它不僅接受decoder中上一個sublayer層的輸入,而且還會將encoder的輸出作為輸入。 在每一個sub layer中,同樣也使用了residul connection和layer normalization。

6層layer後面又接了一個linear層,因為輸出其實是一個根據概率的分類問題,因此後面又接了一層softmax層。
image_1cqvtvp4c1jss9i61jpi1fg21c293n.png-55.7kB

至此,我們大概瞭解了transformer model的大致結構,分成encoder和decoder兩步,每步中各自有6個相同的layer。

4.2 詳解Attention

瞭解了模型的整體架構,接下來就對模型的核心成員attention來做個認知吧~首先會介紹Scaled Dot-Product Attention,接著會介紹Multi-Head Attention。

4.2.1 Scaled Dot-Product Attention

先來說一說這個叫Scaled Dot-Product Attention的東東。輸入attention的一般是3個元素:queries(Q表示), keys(K表示,維度d_k), values(V表示,維度d_v),

計算的過程用文字描述是這樣的:
(1)首先將Q和K進行點乘
(2)然後將乘積規模化,統一除以d_k開根號
(3)接著(2)的結果部分mask掉(可選)
(4)進過softmax層
(5)將(4)的結果與value進行點乘,得到最終的attention輸出

用流程圖描述是這樣:
image_1cr002h6hlgedis16plfdq134v44.png-20.7kB

用公式描述是這樣:
image_1cr004puagahkrk19egdil1h134u.png-6.7kB

4.2.2 Multi-Head Attention

再來說說Multi-Head Attention,也就是上文architecture中屢次提到的,作為核心成員的注意力機制。同樣是3個元素:queries, keys(K表示,維度d_k), values(Q表示,維度d_v)。

計算的過程用文字描述是這樣的:
(1)先對輸入的V,K,Q做一個線性變化
(2)然後將線性變化後的三者輸入Scaled Dot-Product Attention,並且並行產生h個Scaled Dot-Product Attention
(3)將h個Scaled Dot-Product Attention的結果進行拼接
(4)將(3)的結果再進行線性變化,得到最終的Multi-Head Attention輸出。

用流程圖描述是這樣:
image_1cr010gihmutmvs11seb2i17465b.png-32.3kB

用公式描述是這樣:
image_1cr011avq7v4cmv1nkngqev605o.png-13.7kB
其中:
image_1cr011pm41lft1auc6nk1gk9mlm65.png-6.6kB
image_1cr01283612706tgaq8k4dv7c6i.png-2.4kB
論文中作者採用h=8,並且:image_1cr013kaecntenr1v11u77pep6v.png-3.2kB
由於每一個head的維度都降低了,因此總的計算量並沒有上升。

4.2.3 Attention在本文transformer模型中的應用

從整個transformer的模型結構中可以看到,有3個地方用了attention,第一是encoder中的self attention;第二是decoder中第一個sub layer,也是self attention;第三是decoder中的第二個sub layer, 接受encoder的輸出為輸入。

(1)encoder中的self attention中, key, value, quries都是相同的,都是上一層的輸出。

(2)同樣的,decoder中的self attention中, key, value, quries都是相同的,都是上一層的輸出。

(3)特殊的是在"encoder-decoder attention" layer中,queries是來自decoder中上一層的輸出,key和value都是encoder的輸出。這麼一來,允許encoder中的每一個位置都參與輸入序列中的所有位置,模仿了在sequence-to sequence模型中的encoder-decoder機制。

3.3 詳解Position-wise Feed-Forward Networks

在transformer Model中,除了attention,還有另一個即在encoder layer中又在decoder layer中用到的成員,即Position-wise Feed-Forward Networks(結果圖中藍色部分)。

這是一個全連線的前饋網路,過程如下:
(1)輸入:x
(2)首先經過一個線性變換
(3)接著經過RELU啟用函式
(4)然後再進行一個線性變換

寫成公式如下:
image_1cr19n68c146j5nmicc1q3o3hp8c.png-5.1kB

這個過程其實可以看做是做了兩個卷積層,其中kenel size = 1,輸入與輸出的維度是512。

3.4 其他細節

以上分成3節講述了整個模型的結構與構成,主要的兩個組成部分:atttention和position-wise feed-forward network.本節要把剩下的細節和構件都講述清楚,從而對模型建立全面的認知。

3.4.1 embedding

與其他傳統的序列模型相似,這裡也使用已經預訓練好的詞向量,將input和output中的詞先轉換成向量,維度是d_model。

image_1cr1at272d9d1bc11oger1d1s7a8.png-28.2kB

3.4.2 softmax

同樣,對於decoder的輸出,會先經過一個linear計算,再進行softmax計算,這樣就將結果轉換成了預測下一個詞的概率值。

image_1cr1bgplqt6av7h1v0sp6l1ln2e2.png-7.8kB

3.4.3 positional encoding

由於該模型中沒有迴圈機制也沒有卷積機制,為了使模型也能夠利用詞在句子中位置的資訊,作者也通過某種方式引入了詞在序列中的位置資訊,那就是“positional encoding".

image_1cr1bg0gb1jod1u9l4ha13kr1t06dl.png-28.2kB

positional encoding的維度和詞向量的維度是一致的:d_model,作者用不同頻率的sine和cosine函式來對position形象編碼:
image_1cr1bqb09jc3m4r1k2r10bqdtuef.png-9.7kB
其中,pos是position, i是維度。也就是說,位置編碼的每個維度都對應於一個正弦訊號,波長組成幾何級數從2π10000·2π。選擇這個函式是因為我們假設它可以讓模型很容易地通過相對位置學習,由於對於任何固定偏移量k, PEpos +k可以表示為PEpos的線性函式。

如何將詞向量和位置向量這兩個向量結合起來呢,因為維度一致可以直接相加,當然也有其他很多種方啦。

5 Training

現在來說說整個訓練模型的過程。

5.1 訓練資料

|資訊|資料1|資料2
|-|-|
|資料來源|standard WMT 2014 English-German dataset|larger WMT 2014 English-French dataset |
|資料數量|4.5 million個句子對|36 million個句子對|
|總的詞數|37000個詞|32000個詞|

句子對以近似的順序長度分組在一起。每個培訓批次包含一組句子,其中包含大約25000個源詞和25000個目標詞。

5.2 硬體

機器:one machine with 8 NVIDIA P100 GPUs
|資訊|基本模型|大模型(引數更多|
|-|
|每一步訓練時間|0.4秒|1秒|
|訓練總步數|100000|300000|
|訓練總時間|12小時|3.5天|

5.3 優化

優化器:Adam optimizer
|超引數|值|
|-|
|β1|0.9|
|β2|0.98|
|ε|10^-9|
|warm_step|4000|
learning rate:
image_1cr1d483iujt27s1pfqtih10k0fv.png-8.5kB

5.4 正則化

5.4.1 residual dropout

有兩個地方使用的了dropout.

(1)對模型的每一個sub layer的輸出進度dropout,也就是在模型結構圖中Add&norm層前面的時候。
(2)在將token embedding和positional embedding相加之後,使用dropout, 而且在encoder和decoder部分都使用了。

因為文中分別構建了一個基本模型和一個大模型,基本模型中的dropout rate=0.1。

5.4.2 label smoothing

訓練中,使用標籤的平滑值ε = 0.1。

6 Results

作者在兩組語言的翻譯模型上分別做了實驗。最後兩行是transformer模型,一個事基本模型,一個較大模型,引數會更多,訓練複雜度更高。

從結果看,tranformer比其他的翻譯模型都要表現更優,且在訓練的成本要小非常多。
image_1cr1e0bm7a3c1rtui9g1l4kah8hf.png-92.7kB