這篇文章主要介紹發表在 NIPS 2017上的論文

這篇論文提出完全用attention來做序列轉換,拋棄了以往的CNN和RNN結構,是之後大名鼎鼎的BERT的基礎。

1、Introduction

RNN結構在語言模型和Seq2Seq模型中被廣泛使用,但是RNN的一個缺陷是無法像CNN那樣可以並行,這極大的限制了RNN的訓練。已有一些工作來解決這個問題,比如Facebook的ConvS2S。在這篇論文中,Google提出了一種新的模型——Transformer,完全利用self attention來進行建模,能夠更好的捕捉序列的整體依賴關係,並且並行度很高。

2、Model Architecture

Transforme

Transformer還是在已有的Encoder-Decoder框架下構建的,整體如下

Attention Is All You Need: Transformer

Encoder部分由

N=6

個相同的模組堆疊而成。每個模組包含兩部分,一個是multi-head self attention,另一個是前向全連線網路。在輸入和輸出之間採用殘差連線的結構,並且輸出都經過一個layer normalization。模型輸出的維度是

d_{model}=512

Decoder部分也有

N=6

個模組組成,除去與Encoder中相同的兩層之外,還加入了和Encoder輸出做multi-head self attention。在Decoder中,為了防止未來資訊的加入,還加入了mask,用來保證預測第

i

個詞時只使用前

i-1

個詞。

Scaled Dot-Product Attention

先介紹Scaled Dot-Product Attention。attention的計算包含三個部分,分別是query

Q

、key

K

和 value

V

。計算公式為

Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V\\

本質上就是利用內積計算相似度,然後轉化為attention係數,最終將這個係數作用在value上。在計算attention係數的時候加入了

\sqrt{d_k}

,也就是query和key的維度,這是為了防止維度過大造成較大的內積,然後使得attention相當“尖銳”從而只有較小的梯度。

Multi-Head Attention

接下來再看Multi-Head Attention。其實就是將query,key和value分別做多次對映,然後計算attention最後做concat,也就是

MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O\\ head_i=Attention(QW_i^Q,KW_i^K,VW_i^V)\\

在論文中作者使用

h=8

。用圖來表示attention結構如下

Attention Is All You Need: Transformer

具體的模型中,在“encoder-decoder attention”層,query來自decoder,key和value均來自encoder。而在encoder和decoder中,query,key和value都是相同的輸入,當然decoder需要有mask。

FFN

每個模組中的全連線前向網路比較簡單,就是兩個線性變換中間有ReLU的啟用

FFN(x)=max(0,xW_1+b_1)W_2+b_2\\

Positional embedding

由於Transformer結構並不像RNN和CNN一樣有天然的位置資訊,作者加入了Positional Encoder。也就是在word embedding上計入相同維度的位置embedding。雖然這個embedding也可以作為引數進行學習,但是作者提出使用下式

PE(pos,2i)=sin(pos/1000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/1000^{2i/d_{model}})\\

這種embedding不僅有相關位置資訊(pos+k的embedding可以是pos的線性組合),而且不再需要參與訓練。作者對比了將positional embedding作為引數的方法,兩者相差很小。

3、Why Self-Attention

作者從計算複雜度、並行度和長依賴之間需要的path length進行分析,如下表

Attention Is All You Need: Transformer

可以看出 self-attention與RNN和CNN相比還是很有優勢的。第三列個人感覺就是兩個token之間依賴需要的長度。RNN只能從一個token進行到另一個token,而CNN因為有卷積可以更快,self-attention則一步到位,因為每次計算都是所有token參與。

文章中的實驗部分此處就不給出了,在機器翻譯任務上取得了很好的結果。當然現在我們有了BERT,也可以看出Transformer的巨大影響。不過,

並不是所有的任務都可以用Transform這種self attention來解決的,也並不是可以完全替代RNN和CNN。論文Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures對比RNN,CNN和Transformer,只能說是各有千秋,並沒有一個統一的結論證明某個模型就是最好的。而作者也給出了也給restricted的self attention,可能也覺得不是所有任務都需要完整的長依賴。對於演算法工程師,應該選擇最適合的解決業務問題的方法,而對於科研工作者,引用 @劉知遠 老師的回答“這時候不應該反過來想想RNN流怎麼反殺以Transformer為先鋒的CNN流嗎。”