今天做完深度學(xué)習的論文分享,將這篇論文記錄下來,以便日后回顧查看。
PS:簡書不支持 MathJax 編輯公式,簡直悲傷的想哭泣,之后再上傳到farbox上好啦??
論文原文:Attention is all you need

這篇論文是Google于2017年6月發(fā)布在arxiv上的一篇文章,現(xiàn)在用attention處理序列問題的論文層出不窮,本文的創(chuàng)新點在于拋棄了之前傳統(tǒng)的encoder-decoder模型必須結(jié)合cnn或者rnn的固有模式,只用attention,可謂大道至簡。文章的主要目的是在減少計算量和提高并行效率的同時不損害最終的實驗結(jié)果,創(chuàng)新之處在于提出了兩個新的Attention機制,分別叫做 Scaled Dot-Product Attention 和 Multi-Head Attention.
六個作者都是一作,不愧是google大佬!??!

接下來從以下幾方面進行講解。
?Background
?Attention
?Transformer
?Experiments
?Conclusions
1.BACKGROUND

目前主流的處理序列問題像機器翻譯,文檔摘要,對話系統(tǒng),QA等都是encoder和decoder框架,
編碼器:從單詞序列到句子表示
解碼器:從句子表示轉(zhuǎn)化為單詞序列分布

傳統(tǒng)的編碼器解碼器一般使用RNN,這也是在機器翻譯中最經(jīng)典的模型,但正如我們都知道的,RNN難以處理長序列的句子,無法實現(xiàn)并行,并且面臨對齊問題。

之后這類模型的發(fā)展大多從三個方面著手:
input的方向性 - 單向或雙向
深度 - 單層或多層
類型– RNN,LSTM或GRU

但是依舊收到一些潛在問題的制約,神經(jīng)網(wǎng)絡(luò)需要能夠?qū)⒃凑Z句的所有必要信息壓縮成固定長度的向量。這可能使得神經(jīng)網(wǎng)絡(luò)難以應(yīng)付長時間的句子,特別是那些比訓(xùn)練語料庫中的句子更長的句子;每個時間步的輸出需要依賴于前面時間步的輸出,這使得模型沒有辦法并行,效率低;仍然面臨對齊問題。

再然后CNN由計算機視覺也被引入到deep NLP中,CNN不能直接用于處理變長的序列樣本但可以實現(xiàn)并行計算。完全基于CNN的Seq2Seq模型雖然可以并行實現(xiàn),但非常占內(nèi)存,很多的trick,大數(shù)據(jù)量上參數(shù)調(diào)整并不容易。

以上這些缺點的話就是由于無論輸入如何變化,encoder給出的都是一個固定維數(shù)的向量,存在信息損失;在生成文本時,生成每個詞所用到的語義向量都是一樣的,這顯然有些過于簡單。為了解決上面提到的問題,一種可行的方案是引入attentionmechanism。
深度學(xué)習里的Attentionmodel其實模擬的是人腦的注意力模型,舉個例子來說,當我們觀賞一幅畫時,雖然我們可以看到整幅畫的全貌,但是在我們深入仔細地觀察時,其實眼睛聚焦的就只有很小的一塊,這個時候人的大腦主要關(guān)注在這一小塊圖案上,也就是說這個時候人腦對整幅圖的關(guān)注并不是均衡的,是有一定的權(quán)重區(qū)分的。這就是深度學(xué)習里的AttentionModel的核心思想。所謂注意力機制,就是說在生成每個詞的時候,對不同的輸入詞給予不同的關(guān)注權(quán)重。我們可以看一下上面??這幅圖——通過注意力機制,我們將輸入句子編碼為一個向量序列,并自適應(yīng)地選擇這些向量的一個子集,同時對譯文進行譯碼,例如where are you——>你在哪?現(xiàn)在我們在翻譯“你”的時候給"you"更多的權(quán)重,那么就可以有效的解決對齊問題。

2. ATTENTION

Neural machine translation by jointly learning to align and translate
這篇論文首先將注意力機制運用在NLP上,提出了soft Attention Model,并將其應(yīng)用到了機器翻譯上面。其實,所謂Soft,意思是在求注意力分配概率分布的時候,對于輸入句子X中任意一個單詞都給出個概率,是個概率分布。加入注意力機制的模型表現(xiàn)確實更好,但也存在一定問題,例如:attention mechanism通常和RNN結(jié)合使用,我們都知道RNN依賴t-1的歷史信息來計算t時刻的信息,因此不能并行實現(xiàn),計算效率比較低,特別是訓(xùn)練樣本量非常大的時候。

基于CNN的Seq2Seq+attention的優(yōu)點:基于CNN的Seq2Seq模型具有基于RNN的Seq2Seq模型捕捉long distance dependency的能力,此外,最大的優(yōu)點是可以并行化實現(xiàn),效率比基于RNN的Seq2Seq模型高。缺點:計算量與觀測序列X和輸出序列Y的長度成正比。

3. Transformer

谷歌的這篇論文里提出的transformer模型拋棄了cnn,rnn,初次看有點一頭霧水,總結(jié)了一下迷惑的地方有三個:
- Positional embedding;(位置嵌入向量——其實類似word2vec,只不過處理的是位置信息罷了)。
- multi-head attention; (多頭注意力機制——點乘注意力的升級版本)
- Position-wise Feed-Forward Networks(位置全鏈接前饋網(wǎng)絡(luò)——MLP變形)
現(xiàn)在一一分析:
multi-head attention

有兩種常用的注意力函數(shù),一種是加法注意力(additive attention),另外一種是點乘注意力(dot-productattention),論文所采用的就是點乘注意力,這種注意力機制對于加法注意力而言,更快,同時更節(jié)省空間。
輸入q、k、v,分別代表query、key-valuepair。這里的 key,value, 和 query需要解釋一下,這里把attention抽象為對 value() 的每個 token進行加權(quán),而加權(quán)的weight就是 attentionweight,而 attention weight 就是根據(jù) query和 key 計算得到,其意義為:為了用 value求出 query的結(jié)果, 根據(jù) query和 key 來決定注意力應(yīng)該放在value的哪部分。以前的 attention是用 LSTM 做 encoder,也就是用它來生成key 和 value,然后由 decoder來生成 query。
具體到 Bahdanau 的論文 Neural machine translation by jointly learning to align and translate,key 和 value是一樣的,都是文中的h ,而 query是文中的 s。
為什么要乘以√1dk?是因為如果d_k太大,點乘的值太大,如果不做scaling,結(jié)果就沒有加法注意力好。另外,點乘的結(jié)果過大,這使得經(jīng)過softmax之后的梯度很小,不利于反向傳播的進行,所以我們通過對點乘的結(jié)果進行尺度化。

這里有沒有很像cnn的思想!?。?br> 之前看的另一篇論文sentence embedding也有類似的用法。可以參見A Structured Self-attentive Sentence Embedding

Transformer會在三個不同的方面使用multi-headattention:
1.encoder-decoder attention:使用multi-head attention,輸入為encoder的輸出和decoder的self-attention輸出,其中encoder的self-attention作為 key and value,decoder的self-attention作為query
-
encoder self-attention:使用 multi-head attention,輸入的Q、K、V都是一樣的(input embedding and positional embedding)
3.decoder self-attention:在decoder的self-attention層中,deocder 都能夠訪問當前位置前面的位置
Position-wise feed forward network
image.png
用了兩層Dense層,activation用的都是Relu??梢钥闯墒莾蓪拥?*1的1d-convolution。hidden_size變化為:512->2048->512
Position-wise feed forward network,其實就是一個MLP 網(wǎng)絡(luò),1 的輸出中,每個 d_model 維向量 x 在此先由 xW_1+b_1 變?yōu)?d_f $維的 x',再經(jīng)過max(0,x')W_2+b_2 回歸 d_model 維。之后再是一個residual connection。輸出 size 仍是 $[sequence_length, d_model]$
image.png
Positional embedding
image.png
這樣做的目的是因為正弦和余弦函數(shù)具有周期性,對于固定長度偏差k(類似于周期),post +k位置的PE可以表示成關(guān)于pos位置PE的一個線性變化(存在線性關(guān)系),這樣可以方便模型學(xué)習詞與詞之間的一個相對位置關(guān)系。
模型整體

Transformer也會遵循這種結(jié)構(gòu),encoder和decoder都使用堆疊的self-attention和point-wise,fully connected layers。
Encoder: encoder由6個相同的層堆疊而成,每個層有兩個子層。第一個子層是多頭自我注意力機制(multi-head self-attention mechanism),第二層是簡單的位置的全連接前饋網(wǎng)絡(luò)(position-wise fully connected feed-forward network)。在兩個子層中會使用一個殘差連接,接著進行層標準化(layer normalization)。也就是說每一個子層的輸出都是LayerNorm(x + sublayer(x))。網(wǎng)絡(luò)輸入是三個相同的向量q, k和v,是word embedding和position embedding相加得到的結(jié)果。為了方便進行殘差連接,我們需要子層的輸出和輸入都是相同的維度。
Decoder: decoder也是由N(N=6)個完全相同的Layer組成,decoder中的Layer由encoder的Layer中插入一個Multi-Head Attention + Add&Norm組成。輸出的embedding與輸出的position embedding求和做為decoder的輸入,經(jīng)過一個Multi-HeadAttention + Add&Norm((MA-1)層,MA-1層的輸出做為下一Multi-Head Attention + Add&Norm(MA-2)的query(Q)輸入,MA-2層的Key和Value輸入(從圖中看,應(yīng)該是encoder中第i(i = 1,2,3,4,5,6)層的輸出對于decoder中第i(i = 1,2,3,4,5,6)層的輸入)。MA-2層的輸出輸入到一個前饋層(FF),經(jīng)過AN操作后,經(jīng)過一個線性+softmax變換得到最后目標輸出的概率。
對于decoder中的第一個多頭注意力子層,需要添加masking,確保預(yù)測位置i的時候僅僅依賴于位置小于i的輸出。
層與層之間使用的Position-wise feed forward network。

實驗


總結(jié)我們的結(jié)果,并將我們的翻譯質(zhì)量和培訓(xùn)成本與文獻中的其他模型架構(gòu)進行比較。
我們通過將訓(xùn)練時間,所使用的GPU數(shù)量以及每個GPU的持續(xù)單精度浮點容量相乘來估計用于訓(xùn)練模型的浮點運算的數(shù)量。
可以看出,transformer 用了最少的資源得到了state-of-art的輸出回報。
值得注意的是

這是今年5月份facebook發(fā)布的用cnn做機器翻譯,當時說他們?nèi)〉昧俗詈玫慕Y(jié)果,然而不到一個月就被google用一堆attention來了回擊。

對模型自身的一些參數(shù)做了改變自變量的測試,看一下哪些參數(shù)對模型的影響比較大。

將task推廣到其他任務(wù)上發(fā)現(xiàn)效果也很好,這里是英國選民分析任務(wù)。

Conclusion

思考
1.將soft attention換成local attention效果如何?
2.將task 換成文本摘要效果如何?
- 處理中文翻譯效果如何?


