谷歌NIPS論文Transformer模型解讀:只要Attention就夠了

2019-09-16 11:27:03


作者 | Sherwin Chen

譯者 | Major,編輯 | 夕顏

出品 | AI科技大本營(ID:rgznai100)


導讀:在 NIPS 2017 上,谷歌的 Vaswani 等人提出了 Transformer 模型。它利用自我注意(self-attention)來計算其輸入和輸出的表示,而不使用序列對齊 RNN。通過這種方式,它減少了將兩個任意位置的訊號關聯到一個常數所需的運算元量,並實現了明顯更好的並行化。在本文中,我們將重點討論 Transformer 模型的主要架構和 Attention 的中心思想。


簡介


迴圈神經網路(RNN),特別是長短記憶(LSTM)和門控迴圈單元(GRU),已經作為最先進的序列建模和轉導方法被牢固地建立起來。這些模型通常依賴於隱藏狀態來儲存歷史資訊。它們的好處在於允許模型根據隱藏狀態下提取的有用歷史資訊進行預測。

 

另一方面,由於記憶體大小限制了跨樣例的批處理,因此這種固有的順序性排除了並行化。而並行化在較長的序列長度下變得至關重要。此外,在這些模型中,將來自兩個任意輸入或輸出位置的訊號關聯起來所需的運算元量隨著位置之間距離的增加而增多,這使得學習較遠位置之間的依賴性變得更加困難。

 

有一點應當記住,我們在這裡介紹的 Transformer 在一個樣本中儲存序列資訊,就像 RNN 一樣。這表明網路的輸入是這種形式:[batch size, sequence length, embedding size]。


模型架構


Transformer 遵循編碼器-解碼器結構,對編碼器和解碼器都使用堆疊的自我Attention和完全連線的層,如在下圖的左半部分和右半部分所示。

       

Transformer 模型架構 (引自論文 Attention is All You Need)


位置編碼


在本文中,我們使用不同頻率的正弦和餘弦函式來編碼位置資訊:

 

             

 

此處,pos 是位置,i 是維度。也就是說,位置編碼的每個維度都對應一個正弦曲線。這些波長形成從 2π 到 10000⋅2π 的幾何級數。作者之所以選擇這個函式,是因為他們假設它可以讓模型很容易地學習到相對位置的 Attention,因為對於任何固定的偏移 k,PE_{pos+k} 都可以表示為PE_{pos} 的線性函式。

編碼器和解碼器堆疊

編碼器


編碼器由N=6個相同的層堆疊組成。每層有兩個子層。第一個是一個多頭的自我Attention機制(我們很快就會討論),第二個是一個簡單的完全連線的前饋網路。兩個子層的每一層都使用了Residual 連線,並且在這兩個子層之間應用了層規範化。

 

也就是說,每個子層的輸出是 x+Sublayer(LayerNorm(x)) (這與由[2]採用的子層輸出,略有不同,但遵循[3]中何愷明推薦的模式,其中Sublayer(x) 是子層本身的函式。


解碼器


解碼器也由N=6個相同的層組成。除了編碼器層中的兩個子層外,解碼器還插入第三個子層,該子層在編碼器堆疊的輸出上執行多頭Attention(即,我們將編碼器的輸出作為鍵和值)。解碼器中的子層遵循與編碼器中相同的方式。


遮罩


編碼器和解碼器的自我注意層在SoftMax之前使用遮罩,以防止對序列錯誤位置的不必要注意。此外,與一般遮罩結合,在解碼器堆疊中的自注意子層中使用額外的遮罩,以排除後續位置的Attention。這種遮罩形式如下:

 

             

 

在實踐中,解碼器中的兩個遮罩可以通過逐位加操作進行混合。


Attention

        

(左)縮放點積Attention。(右)多頭Attention由幾個並行執行的Attention層組成。

 

縮放點積Attention


Attention 函式可以描述為從查詢和一組鍵值對到輸出的對映,其中查詢、鍵、值和輸出都是向量。輸出是以值的加權和計算的,其中分配給每個值的權重是通過查詢的相容函式和相應的鍵計算的。

 

更嚴格地說,輸出按下列方式計算:

     


其中Q、K、V 分別是查詢、鍵和值;是鍵的維度;相容性函式(SoftMax部分)計算一行中分配給每個值的權重。按1/比例縮放點積,以避免對較大的值使用非常小的漸變,在該值中,點積的大小增大,從而將SoftMax函式推送到邊緣區域。


一些啟示:在數學上,Attention僅僅集中在Q和K 餘弦相似的空間上,Q和K餘弦相似的空間中,因為它們具有相同的量級((QK^T)_{i,j}=|Q_i||K_j|cosθ)。一個極端的思想練習是Q 和 K都是熱編碼的情況。


多頭 Attention

 


單注意頭對注意加權位置進行平均,降低了有效解析度。為了解決這一問題,提出了多頭Attention,關注來自不同位置的不同表示子空間的資訊。

 

其中對映是如下的引數矩陣:

 

 

對於每個頭部,我們首先應用一個完全連線的層來減小維度,然後將結果傳遞給一個 Attention函式。最後,將所有頭連線起來,再次對映,得到最終值。由於所有的頭部都是並行執行的,並且每個頭部的維度都是預先減小的,因此總的計算成本與單頭Attention的全維度計算成本相似。


在實踐中,如果我們有h=hdᵥ=d_{model}, 可以簡單地使用注意和還有四個完全連線的層來實現多個頭部Attention。每個維度d_{model}×d_{model} 如下:



Tensorflow程式碼


現在,我們提供了用於多頭Attention的TensorFlow程式碼。為了簡單起見,我們進一步假設Q、K、V均為X。

       


程式碼源於:


http://github.com/deepmind/sonnet/blob/56c917e156d84db2bcc1f027ccbeae3cb1192cf/sonnet/python/modules/relational_memory.py l120。為消除不需要的依賴性進行了刪減。

 

結語


作者希望你已經對 Transformer 有了基本的認識。要檢視包含程式碼的完整示例,你可以進一步參考(http://nlp.seas.harvard.edu/2018/04/03/attention.html?source=post_page---------------------------#attention)

 

原文連結:


http://medium.com/towards-artificial-intelligence/attention-is-all-you-need-transformer-4c34aa78308f


(*本文為AI科技大本營編譯文章,轉載請聯絡微信 1092722531)


推薦閱讀

  • 六大主題報告,四大技術專題,AI開發者大會首日精華內容全回顧

  • AI ProCon圓滿落幕,五大技術專場精彩瞬間不容錯過

  • CSDN“2019 優秀AI、IoT應用案例TOP 30+”正式發

  • 我的一年AI演算法工程師成長記

  •   開源sk-dist,超引數調優僅需3.4秒,sk-learn訓練速度提升100倍

  • 如何打造高質量的機器學習資料集?

  • 從模型到應用,一文讀懂因子分解機

  • 用Python爬取淘寶2000款套套

  • 7段程式碼帶你玩轉Python條件語句


你點的每個“在看”,我都認真當成了喜歡
已同步到看一看



熱點新聞