【論文筆記】Attention Is All You Need(Transformer 模型結構理解)
本文主要用於記錄谷歌發表於2017年的一篇論文(引用量接近上千)。該論文提出的Transformer模型也是近年來被廣泛應用的。本筆記主要為方便初學者快速入門,以及自我回顧。
論文連結: ofollow,noindex">https://arxiv.org/pdf/1706.03762.pdf
Github: https://github.com/tensorflow/tensor2tensor
基本目錄如下:
- 摘要
- 核心思想
- 總結
------------------第一菇 - 摘要------------------
1.1 論文摘要
現今幾乎所有主流的翻譯模型都是建立在複雜迴圈或卷積seq2seq框架基礎上的,而其中表現最好的模型是基於注意力機制實現的。本論文提出了一種新的神經網路結構,Transformer,僅僅依賴於注意力機制,擯棄了傳統迴圈或卷積網路。這個新的網路結構,刷爆了各大翻譯任務,同時創造了多項新的記錄(英-德的翻譯任務,相比之前的最好記錄提高了2個BLEU值)。而且,該模型的訓練耗時短,並且對大資料或者有限資料集均有良好表現。
------------------第二菇 - 核心思想------------------
2.1 論文模型結構
作者在開頭還是吐槽了很多傳統模型的弊端,尤其是計算速度慢(主要是序列模型無法進行平行計算的緣故)。然後說自己的Transformer模型有多牛x,完美避開了那些複雜的神經網路模型,只用了注意力機制,不僅大大加快了模型的訓練速度,還保證了質量。然後在背景介紹裡丟擲了一個新的概念self-attention(我還專門去搜了一下相關文獻,但反正我是沒搜到其他地方有用到哈哈,應該谷歌家是第一個提出這麼玩注意力機制的)。話不多說,我就帶著大家一起來看看這個Transformer到底是個什麼東西。(多圖預警!)
首先直接看原論文的模型架構圖肯定是一臉懵逼,這都啥玩意?反正我第一眼看過去都是個新概念。。。想必很多初學者也是跟我一樣,所以我們還是先從更高的視角來解析Transformer模型。我從網上盜了幾張模型架構圖【1】,方便大家理解。
2.1.1 Transformer架構在哪裡?( 圖片來源 )

Figure 1.png
這張圖的結構就非常清晰,就說明了一件事情!谷歌團隊真的就只用了Transformer來做翻譯orz!大家沒有看錯,這不是簡化圖,這就是整個模型的全部,只有一個Transformer:grin:!
2.1.2 Transformer裡面是什麼?( 圖片來源 )

Figure 2.png
又是一張結構非常清晰的圖,說明了2個事情。第一件事,Transformer結構的基本組成仍舊是seq2seq那一套(參考我另一篇筆記)。第二件事,每一個ENCODERS和DECODERS部分都由6(原論文的N=6)個小的並且相同的ENCODER和DECODER組成。
2.1.3 ENCODER和DECODER內部結構是什麼?( 圖片來源 )

Figure 3.png
每一個ENCODER內部又分為兩層,第一層為self-attention,第二層為全連線層()。DECODER層與ENCODER層相似,但是中間多了一層Attention,其功能原理與普通的注意力機制相似(參考我另一篇筆記)
2.1.4 self-attention是如何執行的?( 圖片來源 )
在原論文裡,作者很霸氣的丟出了一個公式,
要直接去理解這個公式,對矩陣運算不是非常熟練的同學可能有點困難,因此,我們還是先拆分去考量一個單詞向量的計算過程,再回過頭來理解這個矩陣的運算。如下圖,是進行運算的第一步,

Figure 4.png
對於每一個單詞向量(Embedding後的),我們都會計算出3個不同的向量,名為query, keys, values。這些向量都是我們通過模型引數計算得出來的。相比於詞向量的緯度(論文中為512),這些向量的緯度會小一點(為64),當然這些向量的緯度肯定都是超引數,是可以調整的。至於這三個向量的具體含義,只能讓大家從後續的計算過程中自行體會來,我也會穿插講一下自己的理解。
self-attention的第二步是對每一個詞進行打分(dot products of the query with all keys)其實就是把當前位置q的向量與所有位置的k向量進行點積相乘,然後再除以 (原論文是8,據說是可以讓訓練收斂的更平穩),最後再做一層softmax操作,每一個詞就會得到一個對當前位置的打分,顯然,當前詞應該會對當前位置有最高的權重。(總感覺看到了一絲rnn的意思,考慮所有的輸入序列,對當前預測結果的影響)
self-attention的最後一步,也是很簡單了,就是把權重與每一個位置的v向量加權求和,最後得到的z向量就是我們要送入到下一層前饋神經網路的。上述過程的計算示意圖如下,

Figure 5.png
至此,每一個詞向量的計算過程已經描述清楚了,矩陣的運算想必也是很好理解了。首先,我們計算Q,K,V三個矩陣,再根據上述的運算過程,簡化為矩陣的運算就如下圖,

Figure 6.png
至此,對原論文中的公式就剖析完畢了(當然也是整個self-attention)的核心。
2.1.5 Multi-Head attention是如何執行的?( 圖片來源 )
這裡Multi-Head其實沒有那麼神祕,簡單說就是把上述的過程,重複進行幾次(原論文中取值為8)最後再把結果連線起來。而重複進行的運算中,唯一不同的就是初始Q,K,V矩陣的生成,他們分別由不同的引數矩陣計算得出,示意圖如下,

Figure 7.png
這樣做的好處主要有以下2點。1)擴大了模型的視野,讓模型在計算當前位置資訊時,能關注到更多其他不同位置的資訊。(若是單一模型,很可能永遠被當前詞所決定)。2)增加了模型的語意表達能力,因為所有的Q,K,V三個矩陣的生成都是互不干擾的,可能會有更多語意層面的表達。
當生成完多個輸出矩陣以後,我們會拼接所有的結果,然後與一個權重矩陣相乘(隨模型訓練的),得到一個最終的self-attention層的輸出,因此,總結一下,self-attention的整個計算過程如下示意圖,

Figure 8.png
2.1.6 什麼是Positional Encoding? ( 圖片來源 )
Positional Encoding的引入是為了考量輸入序列中的順序問題,他的作用就是為模型注入一些當前詞的絕對位置或相對位置資訊。該向量是由特定的模式生成的,論文中也有公式(大概是用正弦或餘弦計算得出的),然後將該向量與詞向量想加,構造出整個模型的輸入向量。(貌似程式碼的實現與論文中的公式有出入,有興趣的同學可以深入調研一下,我其實也沒太想明白這塊的輸入具體在什麼地方起到作用)。依舊再放一張圖,方便大家的理解,

Figure 9.png
2.1.7 Residuals和Layer-Normalization的引入( 圖片來源 )
每一個Encoder內部,每一層都會有一個殘參連線,並且帶有一個層-歸一化操作。這倒沒什麼好展開講的,直接上圖(一個Encoder的內部結構圖),一目瞭然,

Figure 10.png
2.1.8 encoder-decoder attention( 圖片來源 )
Decoder的結構跟Encoder其實差不多,只不過,Decoder多了一層注意力機制(是真正的注意力機制orz,跟seq2seq那一套的注意力機制類似,不熟的參考我上一篇論文筆記)。我們來做一個對應關係,其實大家應該就懂了,seq2seq中的輸出隱狀態,其實就是這邊上一層的Q矩陣輸出,而源輸入的隱狀態,就對應這邊Encoder出來的K,V矩陣。原理幾乎是一模一樣的,下面上一張圖,大家就能理解了,

Figure 11.png
不過還是要再多說一句,Decoder與Encoder的結構還是略微的不同,主要體現在Decoder層的self-attention層會有一個mask,會把當前位置之後的所有值都置為(-inf)意為他們對當前預測詞不應該起作用。
說到這裡,除了最後一層,最常規的softmax層,來預測當前輸出詞的最大概率,其他的模型結構應該是梳理清晰了,這個時候再回頭看,原論文中的圖,應該就清晰多了。

Figure 12.png
2.2 Transformer架構的好處
原論文中,獨闢蹊徑的開了一章,就叫"Why Self-Attention"。重點討論了一下自己的這一套self-attention在提取特徵上與RNN, CNN的對照。主要分三個層面的討論,1)每一層的空間複雜度。2)平行計算的可能性。3)解決長時依賴問題的最長路徑。具體的對照大家可以看論文原文。這裡我就聊一下自己的理解。其實本質上來看,整一套Transformer的架構並沒有標題取的那麼神乎其神(Attention is All You Need)哈哈,讓我一度以為,注意力框架真的能自成一套,但其實本質還是繞不過特徵提取的階段。真正涉及注意力機制的,做法其實也還是一樣的。
2.3 論文實驗結果分析
論文作者把自己提出的整套框架實現了一遍,這裡就不具體展現了。有興趣的讀者可以自行研讀。值得一提的是,谷歌有開源的tensor2tensor,有空還是可以讀一遍原始碼,或者工業界的小夥伴,可以學一波應用。
------------------第三菇 - 總結------------------
到這裡,整篇論文的核心思想及其創新點已經說清楚了。本論文主要集中在於闡述Transformer架構,並且解釋了自己為什麼要使用這一套架構的原因(坊間謠言,對了對標FB的convseq2seq)。
簡單總結一下本文就是先羅列了一下該論文的摘要,再具體介紹了一下Transformer架構,主要是盜用了很多一個外國小哥部落格的圖(他的視覺化Transformer,真的能讓人快速入門,感恩),最後也談了一點自己對Transformer架構的理解,總的來說,谷歌這篇還是劃時代的產物。希望大家讀完本文後能進一步加深對該論文的理解。有說的不對的地方也請大家指出,多多交流,大家一起進步~:grin:
參考文獻: