如何理解谷歌團隊的機器翻譯新作《Attention is all you need》?
本題已收錄至知乎圓桌:機器之能 X 語言之美,更多「人工智慧」相關話題歡迎關注討論。
谷歌團隊 6月13號發表在 Arxiv 上的文章:https://arxiv.org/pdf/1706.03762.pdf
提出了新的 Encoder-Decoder Framework。
號稱不使用 RNN 或 CNN 等複雜的模型,還能達到 WMT newstest 2014 state-of-the-art。
其重大改進主要在於 Sinusoid Positional Encoding 與 並行的 self-attention?
Position-wise Feed Forward Network 與一般的 fully-connected network 有什麼區別呢?
為什麼用這麼簡單的模型能達到這麼好的效果呢?
論文中出現的注意機制QKV對應於機器翻譯的例子有沒有呢?
剛看到論文確實很震驚,FAIR在上個月剛祭出state of the art的convseq2seq,Google就用一堆attention予以回應,WMT en-de和en-fr都刷到了新的state of the art,而且這次不用RNN,不用CNN,只有attention,可謂大道至簡。
演算法細節可以參見paper,這裡簡單說下attention取得好的效果的直觀感覺。傳統的用RNN建模語言的時序特徵,前面的單詞信息都依次feed到後面一個單詞,這種信息的堆疊感覺有點浪費,而且反而把信息糅雜在一起不好區分,雖然decoder階段對每個單詞對應的encoder輸出位置做attention,但每個encoder輸出已經夾雜了前面單詞的信息。同時前面單詞信息往後傳,走的路徑比較長,也就是long dependency的問題,雖然LSTM/GRU這種結構能一定程度上解決,但是畢竟不能完全去掉long dependency。而conv在處理dependency問題時,利用卷積的感受野receptive field,通過堆疊卷積層來擴大每個encoder輸出位置所覆蓋單詞的範圍,每個單詞走的路徑大致是logk(n)步,縮短了dependency的長度。而這篇論文的做法是直接用encoder或者decoder的層與層之間直接用attention,句子中的單詞dependency長度最多只有1,減少了信息傳輸路徑。而且這種attention的方式直接可以挖掘句子內部單詞與單詞的語義組合關係,將它作為一個語義整體,使得翻譯時更好地利用單片語合甚至是短語的信息,更好地decode出語義匹配的目標語言單詞,可參見論文Figure 3-5。
另外,計算複雜度方面,attention的方式不僅能夠完全並行(訓練階段的encoder和decoder,inference階段的encoder),和facebook的convseq2seq並行方式同理,而且計算量比convseq2seq還低,因為考慮到conv還有一個kernel的寬度k。比RNN既能減少計算量,又能增大並行方式,論文中table 1總結得很好。
Google大膽創新的地方就是完全能捨棄RNN/CNN的結構,從自然語言本身的特性出發,設計這種full attention的方式,而且還能煉丹調出state of the art的結果,估計接下來會有大量的attention變體甚至和RNN/CNN一起結合,應用在其它任務上。
確認了一下作者確實以 based entirely on attention作為亮點來「書寫」這篇論文後,有點頭疼了。
模型本身還是不錯的,可是如果靠消除CNN和RNN作為論文的出發點感覺本文的立意就是炫技,而且從實驗上並不能證明在這篇文章的現有模型上加上CNN或者RNN效果不會更好。 因為無論CNN和RNN都只是一個特徵融合過程,出發點是得到一個符合當前需要的context,而這篇文章只不過用attention完全替代了這個過程。而且本篇文章利用attention生成context過程的參數並不見得更少。
本文的第二個亮點是在摘要里提到的Parallel,這個特點也是本文對比模型ConvS2S的一個亮點,同樣能在encode的時候並行化,那多餘的亮點就是我只用了attention,而facebook用了convolution。先不說這兩個結構誰更高級,我們來這樣發散發散。大家先回憶一下卷積層其實只是局部權重共享的local connect, 複雜在這個local connect有多個核。 隨著學習收斂,feature map的信息熵達到最大,這個時候可以假設每個核關注的特徵相互正交,進一步推出來相關值最高的local partial也互不重複。 然後再看本文的muilti-head attention. 將輸入向量切成8份,這每一份可以看成一個local partial,然後再分別attnetion最終再concat成一個context向量。如果將本文multi-head attention的V輸入切成八份後的向量類比關注不同local paritial的卷積核的話,我們可以看到CNN和這裡multi-head attention異曲同工。
綜上我把attention定義的亂七八糟超級複雜,然後發篇文章《No CNN,No RNN》有什麼意義。
------------------------------------------更新線-----------------------------------------------------
最後一句話說的有點過,本文的attention機制其實還是經過思考的,我只是想諷刺下本文強調attention is all you need是不可取的,因為這會對部分研究者產生誤導。attention機制只是一個泛稱,發展到今天裡面的具體實現千奇百怪,甚至還有attention over attention。歸根的定義就是對輸入的每個token進行加權,而加權的weight就是attention weight。那麼我在這裡面的具體實現用cnn,rnn也是可行的,所以論文名字attention is all you need 想表達的那種奧卡姆剃刀最簡即最優也就不成立
然後我們再討論下在本文的模型基礎上往encode的multi-head attention前加一層convolution是否如本文想表達的一樣沒有意義。補充:之前有關cnn的論述理論支撐參看玻爾茲曼機和feature map可視化以及reconvolution相關論文。
attention encode的context 和 cnn後再attention的差別是沒有引入時序關係,補充一下,之前對比說的cnn的local partial要比multi-head 大一點,因為它多一個window,而cnn時序的引入也在這裡,這種時序關係強調了local dependency.本文也意識到這個問題,所以引入了position embedding.有用嗎?有。但效果等價嗎?不知道,但可以這樣類推,如果效果等價,那麼我們之前cnn text classify不用cnn了,輸入每個token加上position embedding後self attention加權組合成context分類,CNN for mnist也不用CNN了,每個像素點加上自己的二維坐標embedding.從我個人的思維來講是不等價的,當然並不是因為以上細思極恐的革命,而是position embedding能幫助attention向量的sum過程保留時序語義,但在計算attention weight的時候沒辦法根據local dependency決定attention partial,因為每個token都是獨立計算weight。所以回到我拋出的問題,當前模型加一層cnn會不會更好,這具體取決於decode的每個詞對於encode的local dependency依賴有多大,如果大的話CNN更好,如果小或沒有CNN的過度泛化反而會影響模型。對於翻譯任務,單個詞的對應性本身就很強,因而local dependency的大小完全取決於語法結構的影響,可以從experiment table看出這個問題,本文在英語-德語效果更好,在英語-法語效果差於ConvS2S,這並不是碰巧,英語和德語同屬日耳曼語系,法語屬於拉丁語系,相同語系語法相近,所以local dependency 更小,所以效果更好,反之效果稍差。所以我們進一步想要擴展該模型的任務範圍是否可能,比如說常常和機器翻譯共享模型的摘要任務,輸入多輸出少,而且更看重輸入的local partial的combine,因而本文模型並不適用。
說了這麼多,並不是google這篇文章不好,結構清晰簡單必然頂會作品,我只是不喜歡它的標題《attention is all you need》,當然我也是因為標題才看的,它的目的達到了,但看完後我覺得應該叫《attention is all we use》更合理。
我讀完這篇論文之後感覺很受啟發,主要是對 attention 有了兩點新的理解:
- attention 可以不只是用於 decoder 里每步輸入一個符號,而是可以用在網路中的任意一層,把一個序列轉換成另一個序列。這個作用與 convolutional layer、recurrent layer 等是類似的,但有一個好處就是不再局限於局域性。
- attention 可以一般地描述為在一個 key-value mapping 中進行檢索,只不過 query 跟 key 可以進行模糊匹配,檢索結果是各個 key 對應的 value 的加權平均。
當然這兩點並不見得是這篇文章的原創,不過確實讓我感覺醍醐灌頂。
非常非常喜歡這篇paper,昨天看到的時候就很激動。
文章可說的地方非常多,說說我最喜歡的兩個點:
1. (masked) self-attention,之前在看structured attention network的時候就考慮過完全拿掉RNN的部分,因為對語言來說,可能這種word-pair之間的關係比word-chain更為重要,也更符合語言學的一些性質。這篇文章完全拿掉了RNN的部分,只算word-pair的attention,並且結果很好。另一點就是在decoder端也加入了self-attention,利用mask去掉還未知的output,這個方法算不上優雅,但是很可行。Multi-Head Attention之前有人做過,就是將輸入映射到不同的空間,再分別做attention,不過這個名字起得好奇怪啊。。。很有歧義性。
2. Positional Encoding,這個不多說了,第一眼看到覺得很醜,細想之後覺得很神,pos(i+k)可以表達成pos(i)的線性組合,對相對距離的表示非常有利,可能正是這種表達保證了在decode的時候不會出現冗餘。當然感覺在絕對位置上還是有欠缺,或許可以有另一個absolute pos embedding?
這個model真的不複雜,但是google神奇的地方就是居然把他做成了,不但做成了,還調出了state-of-the-art。
最後,文章里有一堆tricks,比如那個learning rate的調整公式= =但也有各種細節的缺失,而且沒有ablation test,比較遺憾。
Seq2Seq模型是處理序列到序列問題的利器,尤其是在神經網路翻譯(NMT)方面,取得了很大的成功。Seq2Seq由一個encoder和一個decoder構成,encoder把觀測樣本X編碼成一個固定長度的隱變數Z,decoder再把隱變數Z解碼成輸出標籤Y[1]。傳統的Seq2Seq模型把觀測樣本編碼成一個固定長度的隱變數Z,這個操作被認為限制了Seq2Seq模型的能力。因此,後來提出了基於attention mechanism的RNNSearch模型(Seq2Seq+attention mechanism),在decoder端,採用含一個隱含層的前向網路,採用自適應(adaptive)的方法來計算觀測序列X中,每個word與輸出標籤Y的權重[2]。FaceBook提出了由CNN構成的Seq2Seq模型,完全採用堆疊的CNN來構建encoder和decoder,通過CNN的堆疊方式來回去sequence中long-range dependencies關係,在decoder端採用了多層的attention機制。堆疊CNN之間採用加入殘差的GLU單元來連接,加快計算的同時最大限度保留輸入sequence的信息[3]。
覺得不錯,記得關注頭條號。
2、已有Seq2Seq模型優缺點分析
傳統的基於CNN或RNN的Seq2Seq模型都存在一定的不足:CNN不能直接用於處理變長的序列樣本,RNN不能並行計算,效率低。雖然完全基於CNN的Seq2Seq模型可以並行實現,但非常占內存,很多的trick,大數據量上參數調整並不容易。傳統的Seq2Seq模型不適用於長的句子,Seq2Seq+attention雖然提升了處理長句子的能力,但encoder解碼得到隱變數Z時,任然對觀測序列X的計算添加了約束。
基於Attention Mechanism + LSTM的Seq2Seq模型的優點:自適應地計算一個權值矩陣W,權重矩陣W長度與X的的詞數目一致,每個權重衡量輸入序列X中每個詞對輸入序列Y的重要程度,不需要考慮輸入序列X與輸出序列Y中,詞與詞之間的距離關係。缺點:attention mechanism通常是和RNN結合使用,但RNN依賴t-1的歷史信息來計算t時刻的信息,因此不能並行實現,計算效率比較低,特別是訓練樣本量非常大的時候。
基於CNN的Seq2Seq+attention的優點: 基於CNN的Seq2Seq模型具有基於RNN的Seq2Seq模型捕捉long distance dependency的能力,此外,最大的優點是可以並行化實現,效率比基於RNN的Seq2Seq模型高。缺點:計算量與觀測序列X和輸出序列Y的長度成正比。
針對基於CNN和RNN的Seq2Seq模型存在的不足,本文提出了一種完全基於Attention Mechanism(Self Attention)的Transformer機制:拋棄CNN和RNN,基於Attention來構造encoder和decoder,搭建完全基於Attention的Seq2Seq模型。
覺得不錯,記得關注頭條號。
3、All Attention Seq2Seq模型基本單元分析
1)、Add Norm(AN)單元
Add Norm = LayerNorm(x + Sublayer(x)),Sublayer是前面部分(Multi-Head attention或FeedFoward Layer)的輸出,這種連接方式有兩個明顯好處:
(1)、訓練速度快。LayerNorm是Batch Normalization的一個變體,在之前文章《<優化策略-2>深度學習加速器Layer Normalization-LN》進行了詳細的講解。簡要對比下BN與LN:LN是本次輸入模型的一組樣本做進行Normalization,BN是對一個batch數據進行Normalization。因此,LN可以用於RNN規範化操作,但BN不行。我個人經驗是:基於LN的加速比BN快8-10倍。
(2)、引入了殘差,儘可能保留原始輸入x的信息。
2)、Scaled Dot-Product Attention and Multi-Head Attention單元
Attention有三個輸入:query,keys,values,一個輸出,選擇三個輸入是考慮到模型的通用性(Generative)。輸出是value的加權求和,value的權重來自於query和keys的乘積,經過一個softmax之後得到。可以得到scaled dot-product attention的公式(1)所示:
為什麼除一個dk的根號:常用的attention機制有additive attention,簡寫成AA(由一個前向神經網路實現)和dot-product(multiplicative) attention,簡寫成DA。雖然兩種方法理論上的複雜度類似,但DA實際運行速度更快且更節省內存。當dk值比較小時,兩種演算法效果相當,但當dk值比較大時,AA比DA要好,原因可能是DA中Q與K的點乘得到的值過大。
Multi-Head Attention:對輸入K,V,Q,,採用不同的權重,連續進行H詞Scaled Dot-Product Attention,類似於卷積網路裡面採用不同的卷積核多次進行卷積操作。Multi-Head Attention可以使模型從不同的角度來獲取輸入X的不同subspaces representation。同時,對每個維度多了reduce,使multi=head attention總的計算量與single-head attention一致。
覺得不錯,記得關注頭條號。
3)、結構中逐項的feed-forward網路作用
Attention的sublayer之間嵌入一個FFN層,兩個線性變換組成:FFN(x)=max(0,x*W1 + b1)W2 + b2。同層擁有相同的參數,不同層之間擁有不同的參數。目的應該是提高模型特徵抽取的能力,考慮到效率,選擇兩個線性變換。
4)、Position Encoding
網模型的輸入embedding中添加position embedding,使網路可以獲得輸入序列的位置(positions)之間的一個相對或者絕對位置信息。Position embedding有很多種方式獲得,比如採用像word2vec方式訓練。本文採用較簡單的方式,基於正弦和餘弦函數,根據位置pos和維度i來計算:
這樣做的目的是因為正弦和餘弦函數具有周期性,對於固定長度偏差k(類似於周期),post +k位置的PE可以表示成關於pos位置PE的一個線性變化(存在線性關係),這樣可以方便模型學習詞與詞之間的一個相對位置關係。
4、網路整體結構分析
Transformer的每一層(layer):一個self-attention層 + 逐項的全連接層構成,通過堆疊多個層來構造encoder和decoder,網路結構如圖1所示。
Encoder端:輸入的Embedding,與Positional Embedding(後面會給出positional embedding的計算方法)相加,做為堆疊N(N=6)個完全相同的Layer層的輸入。每一個Layer層由Multi-Head attention部分和一個FeedFoward部分組成,兩個部分直接通過一個Add Norm的方式連接。為了加速,模型中所有子層的輸出dimension = 512。
Decoder端:decoder也是由N(N=6)個完全相同的Layer組成,decoder中的Layer由encoder的Layer中插入一個Multi-Head Attention + AddNorm組成。輸出的embedding與輸出的position embedding求和做為decoder的輸入,經過一個Multi-Head Attention + AddNorm((MA-1)層,MA-1層的輸出做為下一Multi-Head Attention + AddNorm(MA-2)的query(Q)輸入,MA-2層的Key和Value輸入(從圖中看,應該是encoder中第i(i = 1,2,3,4,5,6)層的輸出對於decoder中第i(i = 1,2,3,4,5,6)層的輸入)。MA-2層的輸出輸入到一個前饋層(FF),經過AN操作後,經過一個線性+softmax變換得到最後目標輸出的概率。
覺得不錯,記得關注頭條號。
5、Attention機製作用分析
1)、插入decoder的中間層的MAAN結構輸入:query來源於output的decoder層輸出,memory的keys和values來源於對於的encoder的輸出,充當權重。這一操作使得decoder可以獲取輸入X整個序列的信息,類似於傳統Seq2Seq中的decoder端的attention 機制。
2)、encoder端包含self-attention layers。當前self-attention的輸入k、v,q來源於前一層的輸出,encoder中每一個position可以關聯前一層所有positions,可以全面獲取輸入序列X中positions之間依賴關係。對包含self-attention的decoder端也一樣。
3)、相比基於CNN和RNN的Seq2Seq模型,基於Self-Attention的Seq2Seq模型計算效率更高,單層計算複雜度更低,學習long-range dependencies的能力更強,三種類型的Seq2Seq模型對比如下表所示:
最重要的是,基於Self-Attention的Seq2Seq網路學習long-range dependencies能力很強。Seq2Seq中的一個關鍵問題是如何學習sequence中的詞與詞之間的long-range dependencies關係。在雙向LSTM(BLSTM),我們通常分正向和反向分別計算一次Sequence的信息,其中,學習long-range dependencies關鍵的一點是信號在網路正向和反向計算中傳遞的Path長度(計算次數),計算次數越多,較遠的依賴關係消失情況越嚴重。在Self-Attention結構中,每一層都直接與前一層的所有position直接連接,因此Path的長度為O(1),最大程度保留了sequence中詞與詞之間的依賴關係。針對長句子,為了提高計算效率,只考慮某一個詞前後r個詞時,Path的路徑最長長度任然只有O(n/r),其中,n為sequence長度。
6、參考文獻:
[1] Sequence to Sequence Learning. Ilya Sutskever.
[2] NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE. Dzmitry Bahdanau.
[3] Convolutional Sequence to Sequence Learning. Jonas Gehring.
[4] Attention Is All You Need. Ashish Vaswani.
往期內容推薦
<模型匯總_5>生成對抗網路GAN及其變體SGAN_WGAN_CGAN_DCGAN_InfoGAN_StackGAN模型匯總15 領域適應性Domain Adaptation、One-shot/zero-shot Learning概述模型匯總-12 深度學習中的表示學習_Representation Learning<深度學習優化策略-3> 深度學習網路加速器Weight Normalization_WN深度學習的發展歷史及應用現狀我想寫個ALL YOU NEED IS系列。先佔個坑。
Attention is all you need.
Convolution is all you need.
A good init is all you need.
Recurrence is all you need.
Neuron is all you need.
我來唱反調。本文用了兩種attention,替代cnn rnn,效果上還有提升,換句話說也就是設計了一個新的網路結構,新的變換。至於為什麼work並沒有深入解釋,反倒是一直強調 不用cnn 不用rnn哦,我覺得對寫文章的價值更大。其實scaled dot product attention 和 multi head attention 跟卷積+ 非線性 差別多大?本文突出強調了attention,其他避談;另外名字起得好
Google總是讓人由衷的來一句「wk」。不過在ML領域,「把事情純粹的做到極致」似乎是一種靠譜的套路。前一陣子facebook那個也是,我就往死里懟卷積,把卷積往死里用。現在是G的attention。
話不多說,直接上另外一篇論文,亮點在author
[1706.05137] One Model To Learn Them All文章最大的重點在於self-attention。
基於attention的翻譯模型,都需要在編碼器和解碼器兩個部分分別刻畫源句子和目標句子每個位置的信息,而刻畫的信息需要同時包含單點信息和局部乃至全局信息。
rnn通過直接的序列模型(編碼器雙向,解碼器單向)可以拿到以當前位置為核心的全局信息,cnn可以拿到局部信息。self-attention直接對詞對信息加權拿到全局信息,理論上是一次計算。實際上,只做一次就只有樸素的詞對組合信息了,所以會多做幾次拿到更高級的組合。但無論如何,這個組合的程度是獨立於序列長度的。而rnn想拿到頭尾的組合,信息傳遞路徑跟長度相關。至於解碼器和編碼器之間的attention,這篇文章並沒有多特別。
雖然慣例是對rnn的輸出序列做attention,但attention就是加權而已,本身不要求有序,更不會要求是rnn。但順序信息依然有用,所以加入了位置編碼(positional encoding),在rnn中,位置通過模型刻畫,這裡,位置通過特徵刻畫。Citing Schmidhuber is all you need.
從實際角度,BLEU值沒有想像中那麼大的提升其實,比之fairseq和8層lstm
這裡self attention和Facebook之前的memory network很像,不過文中並沒有提及。
不知道這裡的self attention推廣到其他task上效果怎麼樣http://blog.csdn.net/mijiaoxiaosan/article/details/73251443 這個鏈接是我剛寫的關於自己對這篇論文的理解。下面是我最後的感想,貼在這兒:自我感覺谷歌這次放大招了,完全拋棄了CNN以及RNN這幾年做神經機器翻譯的固有思維,僅用了attention來對句子進行編碼和解碼。從論文後面的附圖可以看出該模型已經在很大程度上「理解」了句子的意思。也許過一段時間,各種層疊attention及其變種的模型就會滿天飛了,但谷歌無疑開了這樣一個好頭,就是我們不必對固有的模型抱有很深的執念,嘗試各種可能也許會有意想不到的效果。
推薦閱讀:
※電腦通過什麼的編程方式翻譯英語的?
※誰能推薦一個好用的多國語機器翻譯軟體?
TAG:機器學習 | 自然語言處理 | 機器翻譯 | 深度學習DeepLearning |