這篇文章的主要內容是對谷歌提出的transformer 進行論文解讀,主要是針對Google在2017年《Attention is all you need》 提出的transformer模型進行一個研究,另外我還看了這篇文章《Neural Machine Translation by Jointly Learning to Align and Translate》,這篇文章對seq2seq模型及其attention機制的應用做了詳細的介紹。在此整理了下內容及筆記,歡迎各位讀者交流討論。

《Attention is all you need 》論文地址:arxiv.org/pdf/1706.0376

《Neural Machine Translation by Jointly Learning to Align and Translate》

論文地址:arxiv.org/pdf/1409.0473

目錄

1.引例

2.Encoder-Decoder框架

2.1seq2seq框架內部構造

2.2encoder內部連接解釋

2.3decoder內部連接解釋

2.4 侷限性

2.5 solution

3.《Neural Machine Translation by Jointly Learning to Align and Translate》

3.1 encoder

3.2 decoder

4.《Attention is all you need》

4.1transformer

4.1.1 encoder

4.1.2 decoder

4.1.3 殘差網路

4.2.1 self-attetion

4.2.2 Multi-Head attention

4.3 position-wise feed-forward network

4.4 position embeddings

4.5 怎麼計算attention

4.6 match程度怎麼比較

5 總結

1.引例

從注意力模型的命名方式看,很明顯其借鑒了人類的注意力機制,因此,我們首先簡單介紹人類視覺的選擇性注意力機制。

深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是從眾多信息中選擇出對當前任務目標更關鍵的信息。

從圖像上看,我們的人眼在捕捉一個圖像的時候總是會首先關注到這個圖像中最重要的部位,因為這個圖像某個部位上肯定是有些特徵使得我們不得不注意到它。

在自然語言處理中,隨著句子單詞的增多,如何對特定的單詞進行關注呢?

2.Encoder-Decoder框架

2.1seq2seq框架內部構造

要了解深度學習中的注意力模型,就不得不先談Encoder-Decoder框架,因為目前大多數注意力模型附著在Encoder-Decoder框架下,當然,其實注意力模型可以看作一種通用的思想,本身並不依賴於特定框架,這點需要注意。

Encoder-Decoder框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。圖2是文本處理領域裡常用的Encoder-Decoder框架最抽象的一種表示。

當然了,這個只是大概的思想,具體實現的時候,編碼器和解碼器都不是固定的,可選的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由組合。比如說,你在編碼時使用BiRNN,解碼時使用RNN,或者在編碼時使用RNN,解碼時使用LSTM等等。

如果拿機器翻譯來解釋這個分心模型的Encoder-Decoder框架更好理解,比如輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:「湯姆」,「追逐」,「傑瑞」。在翻譯「傑瑞」這個中文單詞的時候,分心模型裡面的每個英文單詞對於翻譯目標單詞「傑瑞」貢獻是相同的,很明顯這裡不太合理,顯然「Jerry」對於翻譯成「傑瑞」更重要,但是分心模型是無法體現這一點的,這就是為何說它沒有引入注意力的原因。

在RNN Encoder-Decoder的工作當中,我們用一個RNN去模擬大腦的讀入動作,用一個特定長度的特徵向量去模擬我們的記憶,然後再用另外一個RNN去模擬大腦思考得到答案的動作,將三者組織起來利用就成了一個可以實現Sequence2Sequence工作的「模擬大腦」了。 RNN既可以扮演encoder的角色又可以扮演decoder的角色。

RNN中存在了許多變體如LSTM和GRU,都是能夠比較好的捕捉到距離較長的單詞之間的聯繫的。

2.2encoder內部連接解釋

這邊為了方便闡述,選取了編碼和解碼都是RNN的組合。在RNN中,當前時間的隱藏狀態是由上一時間的隱藏狀態和當前時間輸入決定的,也就是

獲得了各個時間段的隱藏層以後,再將隱藏層的信息匯總,生成最後的語義向量 c

一種簡單的方法是將最後的隱藏層作為語義向量C,即 C= hTx

2.3decoder內部連接解釋

解碼階段可以看做編碼的逆過程。這個階段,我們要根據給定的語義向量C和之前已經生成的輸出序列y1,y2,…yt?1來預測下一個輸出的單詞yt,即

也可以寫作 yt=g({y1,…,yt?1},C)

而在RNN中,上式又可以簡化成

其中s是輸出RNN中的隱藏層(隱藏狀態),C代表之前提過的語義向量,yt?1表示上個時間段的輸出,反過來作為這個時間段的輸入。而g則可以是一個非線性的多層的神經網路,產生詞典中各個詞語屬於yt的概率。(這個g的設計其實也是一個關鍵,可以根據自己的需要設計各種類型NN來實現所需要的效果)

2.4 侷限性

encoder-decoder模型雖然非常經典,但是侷限性也非常大。最大的侷限性就在於編碼和解碼之間的唯一聯繫就是一個固定長度的語義向量C。也就是說,編碼器要將整個序列的信息壓縮進一個固定長度的向量中去。但是這樣做有兩個弊端,一是語義向量無法完全表示整個序列的信息,還有就是先輸入的內容攜帶的信息會被後輸入的信息稀釋掉,或者說,被覆蓋了。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有獲得輸入序列足夠的信息, 那麼解碼的準確度自然也就要打個折扣了。

例如:湯姆追逐傑瑞,如果語義向量C的固定長度不是很長的話,他可能在傑瑞輸入的時候將湯姆這個信息給去除掉,所以會造成信息上的丟失。

2.5solution:

A :動態規定語義向量C的長度

B :將C的長度擴大到一定程度把所有的信息都輸入然後再通過attention機制來判斷我們是需要哪一個信息

3.《Neural Machine Translation by Jointly Learning to Align and Translate》

在這篇文章中,作者提出了一個用於翻譯任務的結構。解碼部分使用了attention模型,而在編碼部分,則使用了BiRNN(bidirectional RNN,雙向RNN)

相比於之前的encoder-decoder模型,attention模型最大的區別就在於它不在要求編碼器將所有輸入信息都編碼進一個固定長度的向量之中。相反,此時編碼器需要將輸入編碼成一個向量的序列,而在解碼的時候,每一步都會選擇性的從向量序列中挑選一個子集進行進一步處理。這樣,在產生每一個輸出的時候,都能夠做到充分利用輸入序列攜帶的信息。而且這種方法在翻譯任務中取得了非常不錯的成果。

3.1 encoder編碼模塊

這一塊方面相對來說與之前的RNN比較相似,(X1,X2,...,XT)都是輸入的序列,映射為向量後經過兩層堆疊的雙向LSTM進行連接處理,將各個時間層的隱藏層信息匯總後生成語義向量。

一個BIRNN包含一個前向( forward)和一個後向( backward)RN。前向RNN按照詞序列(x1,x2,→…xr)的順序依次壓縮源語言端詞,並得到系列隱層狀態(h1,h2,...hr),類似地,後向RNN按照(xr,xr-1,...,x1)的順序依次壓箱源語言端詞,得到(hr,hr-1,...,h1).

將兩個隱層狀態進行合併得到hi,可以看到hi可以很好的表示壓縮後的前向和後向信息,並且更加關注xi附近的信息。

3.2 decoder解碼模塊(創新點)

(4)式指的是已經知道到y1,y2,...和X的概率,可以把他間寫成一個非線性模型g, 自變數包括三個部分

yi-1 ——上一時刻的輸出

si ——解碼器 i 時刻的隱藏狀態

ci ——由編碼序列按照權重疊加組成

(詳細解釋可以看第二節的解釋)

隱藏狀態可以由三個部分影響

si-1——上一個時刻的隱藏層狀態

yi-1——上一個時刻的輸出

ci——當前時刻的合成的語義向量

與簡單的RNN不用的是,上下文表示向量有c變成了ci,也就是說針對每個特定的si都有一個特定的ci . 這個ci怎麼的來的呢?這個時候就引入了attention機制別急,待會就解釋了。

既然利用到了attention機制,那就少不了對向量之間相似度衡量(見第五節有更詳細的解釋),在該節中用的就是a()這個函數來衡量si-1和hj之間的相似度(也稱作匹配程度)

衡量完相似度後,進行softmax歸一化輸出概率α,根據各自匹配程度(需要關注的程度)阿爾法的值然後對原來的hj進行帶權重的線性疊加,形成根據si-1而得到的ci(這個ci如果不引入attention機制的情況下是不會改變的)然後yi的計算就根據後面兩步的計算而水到渠成啦

舉個例子:

中國/經濟/發展/迅速是一個輸入,首先把它們各自都映射到一個向量中去,為x=(x1,x2,x3,x4)

然後將x中各自的向量與他們附近的向量做雙層雙向LSTM,形成一個前向的H1和一個後向的H2,進行組合形成一個H,這個就是我們要找到的語義向量,裡麪包含著經過壓縮後的前後信息。

然後再decoder層面我們引入了attention機制,針對於H和RNN中隱含層狀態做一個匹配,會得到各自的α值,如果是我們現在是需要關注到中國這個辭彙,那麼想對應的它的α值也會比較高,如果看到不需要關注的辭彙那麼它的α值就會比較低,然後通過softmax進行歸一化處理,將各自的向量經過線性相加重新組合得到一個新的向量(如果沒有attention機制的話是不會有這一步的,那麼大家的α值都是一樣的)

然後在藍框的處進行一個非線性變化,輸出想要的狀態

4.【《Attention is all you need》】

4.1transformer

這個是《Attention is all you need》裡頭的model圖,首先可以看到一共有左右兩個塊組成,左邊由input做輸入的這一塊稱為encoder,右邊由outputs做輸入的這一塊稱之為decoder。

論文中提到N=6,指的是在這一個將左邊這一塊堆疊6次得到一個完整的encoder,右邊的decoder組成亦同理。

Transformer也會遵循這種結構,encoder和decoder都使用堆疊的self-attention和point-wise,fully connected layers。

? encoder self-attention(黑框):使用 multi-head attention,輸入的Q、K、V都是一樣的(input embedding and positional embedding)

? encoder-decoder attention(黃框):使用multi-head attention,輸入為encoder的輸出和decoder的self-attention輸出,其中encoder的self-attention作為 key and value,decoder的self-attention作為query

? decoder self-attention(紅框):在decoder的self-attention層中,decoder 都能夠訪問當前位置前面的位置

4.1.1Encoder

encoder由 6 層相同的層組成,每一層分別由兩部分組成:

  • 第一部分是 multi-head self-attention
  • 第二部分是 position-wise feed-forward network,是一個全連接層

兩個部分,都有一個殘差連接(residual connection),然後接著一個 Layer Normalization。

網路輸入是三個相同的向量q, k和v,是word embedding和position embedding相加得到的結果。為了方便進行殘差連接,我們需要子層的輸出和輸入都是相同的維度。

4.1.2Decoder

和 encoder 類似,decoder 也是由6個相同的層組成,每一個層包括以下3個部分:

  • 第一個部分是 multi-head self-attention mechanism
  • 第二部分是 multi-head context-attention mechanism
  • 第三部分是一個 position-wise feed-forward network

和 encoder 一樣,上面三個部分的每一個部分,都有一個殘差連接,後接一個 Layer Normalization。

decoder 和 encoder 不同的地方在 multi-head context-attention mechanism

4.1.3 殘差網路與歸一化層

隨著網路深度的不斷加深,我們訓練的準確率在上升的過程中突然下降,原因不是因為過擬合,而是因為深度加深導致提取的特徵丟失無法使得模型更好的進行訓練。

故引入殘差網路這一個概念。殘差網路在圖像中應用的比較多,如VGGnet等層數較深的網路中都有所使用,殘差網路結構簡單,解決了極深度條件下深度卷積神經網路性能退化的問題,分類性能表現出色。從ILSVRC 2015至今半年多的時間裡,殘差網路的廣泛使用已推進計算機視覺各任務的性能升入新的高度。

歸一化層,目前主要有這幾個方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年);

在這一篇文章中使用到的是Layer Normalization.

4.2.1 self-attetion

對於self-attention來講,Q(Query), K(Key), V(Value)三個矩陣均來自同一輸入,首先我們要計算Q與K之間的點乘,然後為了防止其結果過大,會除以一個尺度標度 ,其中 為一個query和key向量的維度。再利用Softmax操作將其結果歸一化為概率分佈,然後再乘以矩陣V就得到權重求和的表示

Y=MultiHead(X,X,X) 旨在尋找到本句子中目標單詞與其他單詞之間的聯繫

將這個句子的每個單詞都各自變成X,Y軸,如果這個self-attention效果較好,那麼它的整個attention機制用灰度圖表示會呈現一個對角線的形式。事實上之前提到的Layer Normalization做的類似歸一化的操作就是把防止特徵漂移

4.2.2 Multi-Head attention

在論文裡面,

= 512,h = 8,所以在 scaled dot-product attention 裡面的

可以看出,所謂 Multi-Head,就是隻多做幾次同樣的事情,同時參數不共享,然後把結果拼接起來,進行線性變換然後做一個輸出。(目的是為了能夠多次捕捉到信息,也就是利用到多次attention機制中將不用類型捕捉到的信息進行結合)那這些信息存放在哪裡呢?放在各自訓練通道里的W矩陣中,最後形成八個小Z經過連接層連接後經過線性轉換形成一個大Z

整個流程下來,我從網上找到了一張整個流程的示意圖

4.3 Position-wise Feed-Forward Networks(位置全鏈接前饋網路——MLP變形)

在位置全鏈接前饋網路等價於先做了一層感知機加上RELU函數在加上一層感知機

4.4 position embeddings

由於attention機制中對位置不存在概念,可以把transformer看作是一個沒有順序的詞袋模型,在這個詞袋模型中不斷的引入attention機制來找到我們所需要的信息。如果在應用到機器翻譯這種前後順序為主的實戰中是必須要引入postion embeddings 的,例如在翻譯「湯姆追逐傑瑞」和「傑瑞湯姆追逐」就會沒有了主次之分。

postion embeddings引入的式子如下,當然這是google訓練出來的結果與這個擬合式接近,Google就說我們如果不去訓練position embeddings的話那就直接使用這個式子進行embeddings把

使用正餘弦函數進行embeddings的好處在於可以捕捉到前後信息的一個相對位置,數學依據當然就是和差化積公式了

4.5 怎麼計算attention

Key-value——指的就是每個單詞所代表的向量

Query ——指的就是decoder state

在進行運算的時候首先是經歷了一個match程度的匹配估計,然後通過softmax算出概率值

算出概率後在和Value-vector中的進行一個帶權重的線性疊加,最後預測出我是需要針對哪幾個向量來進行加attention著重關注

KQV分三個階段的一個計算流程

4.6 match程度怎麼比較

Attenion Score Function中從15年開始就對這個匹配程度有研究,一直到17年發展到點乘形式

總結:

對於使用自注意力機制的原因,論文中提到主要從三個方面考慮(每一層的複雜度,是否可以並行,長距離依賴學習),並給出了和 RNN,CNN 計算複雜度的比較。可以看到,如果輸入序列 n 小於表示維度 d 的話,每一層的時間複雜度 Self-Attention 是比較有優勢的。當 n 比較大時,作者也給出了一種解決方案 Self-Attention(restricted)即每個詞不是和所有詞計算 Attention,而是隻與限制的 r 個詞去計算 Attention。

在並行方面,多頭 Attention 和 CNN 一樣不依賴於前一時刻的計算,可以很好的並行,優於 RNN。

在長距離依賴上,由於 Self-Attention 是每個詞和所有詞都要計算 Attention,所以不管他們中間有多長距離,最大的路徑長度也都只是 1。可以捕獲長距離依賴關係。

Google 提出的多頭 Attention 通過計算多次來捕獲不同子空間上的相關信息。Self-Attention 的特點在於無視詞之間的距離直接計算依賴關係,能夠學習一個句子的內部結構,實現也較為簡單並行可以並行計算。

Google提出的self-attention是attention模型的一種特殊形式,是自己學習自己的過程,Q=K=V;提出的multi-head attention是通過計算多次來捕獲不同維度不同子空間上的相關信息。Self-attention可以不考慮詞與詞之間的距離而直接計算依賴關係,能夠學習到一個句子的內部結構,能夠簡單並行的計算,可以脫離CNN和RNN,但是需要合理的考慮和設置位置函數。當然,從AAAI2018年的論文可以看出,self-attention也可以當作一個層,與RNN、CNN和FNN等配合使用,能夠更好的解決NLP領域的任務。

【referdences】

blog.csdn.net/u01459501

mini.eastday.com/mobile

答主微信:Jerry

不足之處,敬請指出交流和討論。

答主公眾號:Jerry的演算法和NLP


推薦閱讀:
相關文章