天天看點

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

作者 | 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和完全連接配接的層,如在下圖的左半部分和右半部分所示。

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

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

位置編碼

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

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

此處,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。這種遮罩形式如下:

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

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

Attention

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

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

縮放點積Attention

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

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

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

其中Q、K、V 分别是查詢、鍵和值;

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

是鍵的次元;相容性函數(SoftMax部分)計算一行中配置設定給每個值的權重。按1/

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

比例縮放點積

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

,以避免對較大的值使用非常小的漸變,在該值中,點積的大小增大,進而将SoftMax函數推送到邊緣區域。

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

多頭 Attention

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

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

其中映射是如下的參數矩陣:

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

對于每個頭部,我們首先應用一個完全連接配接的層來減小次元,然後将結果傳遞給一個 Attention函數。最後,将所有頭連接配接起來,再次映射,得到最終值。由于所有的頭部都是并行運作的,并且每個頭部的次元都是預先減小的,是以總的計算成本與單頭Attention的全次元計算成本相似。

在實踐中,如果我們有h

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

=hdᵥ=d_{model}, 可以簡單地使用注意和還有四個完全連接配接的層來實作多個頭部Attention。每個次元d_{model}×d_{model} 如下:

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

Tensorflow代碼

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

谷歌NIPS論文Transformer模型解讀:隻要Attention就夠了(*本文為AI科技大學營編譯文章,轉載請聯系微信 1092722531)

代碼源于:

https://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)

原文連結:

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

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