論文記錄筆記NLP(四):transformer

這篇筆記主要是結合,各種學習資源,整理而成的查找筆記,整理的不好,還望指出錯誤,主要是用於查找與記錄。

NIPS 2017年的一篇論文,完全基於注意力機制的Transformer架構

摘要:

主流序列轉導模型基於複雜的循環神經網絡或卷積神經網絡,這些神經網絡包含一個編碼器和一個解碼器。 性能最好的模型還通過attention機制將編碼器和解碼器連接起來。 我們提出一種新的簡單的網絡架構Transformer,僅基於attention機制並完全避免循環和卷積。 對兩個機器翻譯任務的實驗表明,這些模型在質量上更加優越、並行性更好並且需要的訓練時間顯著減少。 我們的模型在WMT 2014英語-德語翻譯任務上達到28.4 BLEU,超過現有最佳結果(包括整合模型)2個BLEU。 在WMT 2014英語-法語翻譯任務中,我們的模型建立了單模型新的最先進的BLEU分數41.8,它在8個GPU上訓練了3.5天,這個時間只是目前文獻中記載的最好的模型訓練成本的一小部分。 通過在解析大量訓練數據和有限訓練數據的兩種情況下將其應用到English constituency,我們表明Transformer可以很好地推廣到其他任務。

1 簡介

在序列建模和轉換問題中,如語言建模和機器翻譯[3525],循環神經網絡特別是長短期記憶[13]和門控循環[7]神經網絡,已經被確立爲最先進的方法。 自那以後,許多努力一直在推動循環語言模型和編碼器-解碼器架構的界限[382415]。

循環模型通常是對輸入和輸出序列的符號位置進行因子計算。 通過在計算期間將位置與步驟對齊,它們根據前一步的隱藏狀態ht-1和輸入產生位置t的隱藏狀態序列ht。這種固有的順序特性阻礙樣本訓練的並行化,這在更長的序列長度上變得至關重要,因爲有限的內存限制樣本的批次大小。 最近的工作通過巧妙的因子分解[21]和條件計算[32]在計算效率方面取得重大進展,後者還同時提高了模型性能。 然而,順序計算的基本約束依然存在。

在各種任務中,attention機制已經成爲序列建模和轉導模型不可或缺的一部分,它可以建模依賴關係而不考慮其在輸入或輸出序列中的距離[219]。 除少數情況外[27],這種attention機制都與循環網絡一起使用。

在這項工作中我們提出Transformer,這種模型架構避免循環並完全依賴於attention機制來繪製輸入和輸出之間的全局依賴關係。Transformer允許進行更多的並行化,並且可以在八個P100 GPU上接受少至十二小時的訓練後達到翻譯質量的新的最佳結果。

2 背景

減少順序計算的目標也構成擴展的神經網絡GPU [16]、ByteNet [18]和ConvS2S [9]的基礎,它們都使用卷積神經網絡作爲基本構建模塊、並行計算所有輸入和輸出位置的隱藏表示。 在這些模型中,關聯任意兩個輸入和輸出位置的信號所需的操作次數會隨着位置之間的距離而增加,ConvS2S是線性增加,而ByteNet是對數增加。 這使得學習遠距離位置之間的依賴關係變得更加困難[12]。 在Transformer中,這中操作減少到固定的次數,儘管由於對用attention權重化的位置取平均降低了效果,但是我使用Multi-Head Attention進行抵消,具體描述見 3.2

Self-attention,有時稱爲intra-attention,是一種attention機制,它關聯單個序列的不同位置以計算序列的表示。 Self-attention已成功用於各種任務,包括閱讀理解、摘要概括、文本蘊涵和學習與任務無關的句子表徵[4272822]。

端到端的內存網絡基於循環attention機制,而不是序列對齊的循環,並且已被證明在簡單語言的問題回答和語言建模任務中表現良好[34]。

然而,就我們所知,Transformer是第一個完全依靠self-attention來計算輸入和輸出表示而不使用序列對齊RNN或卷積的轉導模型。 在下面的章節中,我們將描述Transformer、引出self-attention並討論它相對[1718]和[9]幾個模型的優勢。

大部分神經序列轉導模型都有一個編碼器-解碼器結構[5235]。 這裏,編碼器映射一個用符號表示的輸入序列(x1,...,xn) 到一個連續的表示z= (z1,...,zn)。 根據z,解碼器生成符號的一個輸出序列(y1,...,ym) ,一次一個元素。 在每一步中,模型都是自迴歸的[10],當生成下一個時,消耗先前生成的符號作爲附加輸入。

Transformer遵循這種整體架構,編碼器和解碼器都使用self-attention堆疊和point-wise、完全連接的層,分別顯示在圖1的左邊和右邊。

3.1 編碼器和解碼器堆棧

編碼器: 編碼器由N = 6 個完全相同的層堆疊而成。 每一層都有兩個子層。 第一層是一個multi-head self-attention機制,第二層是一個簡單的、位置完全連接的前饋網絡。 我們對每個子層再採用一個殘差連接[11] ,接着進行層標準化[1]。 也就是說,每個子層的輸出是LayerNorm(x + Sublayer(x)),其中Sublayer(x) 是由子層本身實現的函數。 爲了方便這些殘差連接,模型中的所有子層以及嵌入層產生的輸出維度都爲dmodel = 512。

解碼器: 解碼器同樣由N = 6 個完全相同的層堆疊而成。 除了每個編碼器層中的兩個子層之外,解碼器還插入第三個子層,該層對編碼器堆棧的輸出執行multi-head attention。 與編碼器類似,我們在每個子層再採用殘差連接,然後進行層標準化。 我們還修改解碼器堆棧中的self-attention子層,以防止位置關注到後面的位置。 這種掩碼結合將輸出嵌入偏移一個位置,確保對位置的預測 i 只能依賴小於i 的已知輸出。

3.2 Attention

Attention函數可以描述爲將query和一組key-value對映射到輸出,其中query、key、value和輸出都是向量。 輸出爲value的加權和,其中分配給每個value的權重通過query與相應key的兼容函數來計算。

3.2.1 縮放版的點積attention

我們稱我們特殊的attention爲“縮放版的點積attention”(圖 2)。 輸入由query、dk 維的key和dv 維的value組成。 我們計算query和所有key的點積、用  相除,然後應用一個softmax函數以獲得值的權重。

在實踐中,我們同時計算一組query的attention函數,並將它們組合成一個矩陣Q。 key和value也一起打包成矩陣 K 和 V 。 我們計算輸出矩陣爲:

兩個最常用的attention函數是加法attention[2]和點積(乘法)attention。 除了縮放因子之外,點積attention與我們的算法相同。 加法attention使用具有單個隱藏層的前饋網絡計算兼容性函數。 雖然兩者在理論上的複雜性相似,但在實踐中點積attention的速度更快、更節省空間,因爲它可以使用高度優化的矩陣乘法代碼來實現。

dk的值比較小的時候,這兩個機制的性能相差相近,當dk比較大時,加法attention比不帶縮放的點積attention性能好[3]。 我們懷疑,對於很大的dk值,點積大幅度增長,將softmax函數推向具有極小梯度的區域4。 爲了抵消這種影響,我們縮小點積  倍。

3.2.2 Multi-Head Attention

我們發現將query、key和value分別用不同的、學到的線性映射h倍到dkdkdv維效果更好,而不是用d model維的query、key和value執行單個attention函數。 基於每個映射版本的query、key和value,我們並行執行attention函數,產生dv 維輸出值。 將它們連接並再次映射,產生最終值,如圖所示 2

 

Multi-head attention允許模型的不同表示子空間聯合關注不同位置的信息。 如果只有一個attention head,它的平均值會削弱這個信息。

其中,映射爲參數矩陣WiQ ∈ ℝdmodel×dk , WiK ∈ ℝdmodel×dk , WiV ∈ ℝdmodel×dvW O ∈ ℝhdv×dmodel。

在這項工作中,我們採用h = 8 個並行attention層或head。 對每個head,我們使用dk =dv=dmodel ∕ h = 64。 由於每個head的大小減小,總的計算成本與具有全部維度的單個head attention相似。

3.2.3 Attention在我們的模型中的應用

Transformer使用以3種方式使用multi-head attention:

  • 在“編碼器—解碼器attention”層,query來自前一個解碼器層,key和value來自編碼器的輸出。 這允許解碼器中的每個位置能關注到輸入序列中的所有位置。 這模仿序列到序列模型中典型的編碼器—解碼器的attention機制,例如[3829]。
  • 編碼器包含self-attention層。 在self-attention層中,所有的key、value和query來自同一個地方,在這裏是編碼器中前一層的輸出。編碼器中的每個位置都可以關注編碼器上一層的所有位置。
  • 類似地,解碼器中的self-attention層允許解碼器中的每個位置都關注解碼器中直到幷包括該位置的所有位置。 我們需要防止解碼器中的向左信息流來保持自迴歸屬性。 通過屏蔽softmax的輸入中所有不合法連接的值(設置爲-∞),我們在縮放版的點積attention中實現。 見圖 2.

3.3 基於位置的前饋網絡

除了attention子層之外,我們的編碼器和解碼器中的每個層都包含一個完全連接的前饋網絡,該前饋網絡單獨且相同地應用於每個位置。 它由兩個線性變換組成,之間有一個ReLU激活。

儘管線性變換在不同位置上是相同的,但它們使用層與層之間的不同參數。 它的另一種描述方式是兩個內核大小爲1的卷積。 輸入和輸出的維度爲,內部層的維度爲

3.4 嵌入和Softmax

與其他序列轉導模型類似,我們使用學習到的嵌入將輸入詞符和輸出詞符轉換爲維度爲dmodel的向量。 我們還使用普通的線性變換和softmax函數將解碼器輸出轉換爲預測的下一個詞符的概率。 在我們的模型中,兩個嵌入層之間和pre-softmax線性變換共享相同的權重矩陣,類似於[30]。 在嵌入層中,我們將這些權重乘以

3.5 位置編碼

由於我們的模型不包含循環和卷積,爲了讓模型利用序列的順序,我們必須注入序列中關於詞符相對或者絕對位置的一些信息。 爲此,我們將“位置編碼”添加到編碼器和解碼器堆棧底部的輸入嵌入中。 位置編碼和嵌入的維度dmodel相同,所以它們倆可以相加。 有多種位置編碼可以選擇,例如通過學習得到的位置編碼和固定的位置編碼[9]。

在這項工作中,我們使用不同頻率的正弦和餘弦函數:

其中pos 是位置,i 是維度。 也就是說,位置編碼的每個維度對應於一個正弦曲線。 這些波長形成一個幾何級數,從2π 到10000 ⋅ 2π。 我們選擇這個函數是因爲我們假設它允許模型很容易學習對相對位置的關注,因爲對任意確定的偏移k可以表示爲的線性函數。

我們還使用學習到的位置嵌入9進行了試驗,發現這兩個版本產生幾乎相同的結果(參見表 3 行(E))。 我們選擇了正弦曲線,因爲它可以允許模型推斷比訓練期間遇到的更長的序列。

4 爲什麼選擇Self-Attention

本節,我們比較self-attention與循環層和卷積層的各個方面,它們通常用於映射變長的符號序列表示(x1,...,xn) 到另一個等長的序列(z1,...,zn),其中xi , ,例如一個典型的序列轉導編碼器或解碼器中的隱藏層。 我們使用self-attention是考慮到解決三個問題。

一個是每層計算的總複雜度。 另一個是可以並行的計算量,以所需的最小順序操作的數量來衡量。

第三個是網絡中長距離依賴之間的路徑長度。 學習長距離依賴性是許多序列轉導任務中的關鍵挑戰。 影響學習這種依賴性能力的一個關鍵因素是前向和後向信號必須在網絡中傳播的路徑長度。 輸入和輸出序列中任意位置組合之間的這些路徑越短,學習遠距離依賴性就越容易[12]。因此,我們還比較了由不同圖層類型組成的網絡中任意兩個輸入和輸出位置之間的最大路徑長度。

如表1所示,self-attention層將所有位置連接到恆定數量的順序執行的操作,而循環層需要O(n) 順序操作。 在計算複雜性方面,當序列長度n 小於表示維度d 時,self-attention層比循環層快,這是機器翻譯中最先進的模型最常見情況,例如單詞[38]表示法和字節對[31]表示法。爲了提高涉及很長序列的任務的計算性能,可以將self-attention限制在僅考慮大小爲r 的鄰域。 這會將最大路徑長度增加到O(n ∕ r)。 我們計劃在未來的工作中進一步調查這種方法。

表1: 不同圖層類型的最大路徑長度、每層複雜度和最少順序操作數。 n 爲序列的長度,d 爲表示的維度,k 爲卷積的核的大小,r 爲受限self-attention中鄰域的大小。

核寬度爲k < n的單層卷積不會連接每一對輸入和輸出的位置。 要這麼做,在鄰近核的情況下需要O(n∕k) 個卷積層, 在擴展卷積的情況下需要O(logk(n)) 個層[18],它們增加了網絡中任意兩個位置之間的最長路徑的長度。 卷積層通常比循環層更昂貴,與因子k有關。然而,可分卷積[6]大幅減少複雜度到O(k ⋅nd + nd2)。 然而,即使k = n,一個可分卷積的複雜度等同於self-attention層和point-wise前向層的組合,即我們的模型採用的方法。

間接的好處是self-attention可以產生更可解釋的模型。 我們從我們的模型中研究attention的分佈,並在附錄中展示和討論示例。 每個attention head不僅清楚地學習到執行不同的任務,許多似乎展現與句子的句法和語義結構的行爲。

5 訓練

本節介紹我們的模型訓練方法。

5.1 訓練數據和批次

我們在標準的WMT 2014英語-德語數據集上進行了訓練,其中包含約450萬個句子對。 這些句子使用字節對編碼[3]進行編碼,源語句和目標語句共享大約37000個詞符的詞彙表。 對於英語-法語翻譯,我們使用大得多的WMT 2014英法數據集,它包含3600萬個句子,並將詞符分成32000個word-piece詞彙表[38]。 序列長度相近的句子一起進行批處理。 每個訓練批次的句子對包含大約25000個源詞符和25000個目標詞符。

5.2 硬件和時間

我們在一臺具有8個NVIDIA P100 GPU的機器上訓練我們的模型。 使用本文描述的超參數的基礎模型,每個訓練步驟耗時約0.4秒。 我們的基礎模型共訓練了10萬步或12小時。 For our big models,(described on the bottom line of table 3), step time was 1.0 seconds. 大模型訓練了30萬步(3.5天)。

5.3 優化

我們使用Adam優化[20],其中β1 = 0.9, β2 = 0.98 及ϵ = 10-9。 我們根據以下公式在訓練過程中改變學習率:

這對應於在第一次warmup_steps 步驟中線性地增加學習速率,並且隨後將其與步驟數的平方根成比例地減小。 我們使用warmup_steps = 4000。

5.4 正則化

訓練期間我們採用三種正則化:

殘差丟棄 我們將丟棄[33]應用到每個子層的輸出,在將它與子層的輸入相加和規範化之前。 此外,在編碼器和解碼器堆棧中,我們將丟棄應用到嵌入和位置編碼的和。 對於基本模型,我們使用Pdrop = 0.1丟棄率。

Label Smoothing 在訓練過程中,我們使用的label smoothing的值爲ϵls = 0.1[36]。 這讓模型不易理解,因爲模型學得更加不確定,但提高了準確性和BLEU得分。

6 結果

6.1 機器翻譯

在WMT 2014英語-德語翻譯任務中,大型transformer模型(表2中的Transformer (big))比以前報道的最佳模型(包括整合模型)高出2.0個BLEU以上,確立了一個全新的最高BLEU分數爲28.4。 該模型的配置列在表3的底部。 訓練在8 個P100 GPU上花費3.5 天。 即使我們的基礎模型也超過了以前發佈的所有模型和整合模型,且訓練成本只是這些模型的一小部分。

在WMT 2014英語-法語翻譯任務中,我們的大型模型的BLEU得分爲41.0,超過了之前發佈的所有單一模型,訓練成本低於先前最先進模型的1  4 。 英語-法語的Transformer (big) 模型使用丟棄率爲Pdrop = 0.1,而不是0.3。

對於基礎模型,我們使用的單個模型來自最後5個檢查點的平均值,這些檢查點每10分鐘寫一次。 對於大型模型,我們對最後20個檢查點進行了平均。 我們使用beam search,beam大小爲4 ,長度懲罰α = 0.6 [38]。 這些超參數是在開發集上進行實驗後選定的。 在推斷時,我們設置最大輸出長度爲輸入長度+50,但在可能時儘早終止[38]。

2總結了我們的結果,並將我們的翻譯質量和訓練成本與文獻中的其他模型體系結構進行了比較。 我們通過將訓練時間、所使用的GPU的數量以及每個GPU的持續單精度浮點能力的估計相乘來估計用於訓練模型的浮點運算的數量5

 

6.2 模型的變體

爲了評估Transformer不同組件的重要性,我們以不同的方式改變我們的基礎模型,測量開發集newstest2013上英文-德文翻譯的性能變化。我們使用前一節所述的beam搜索,但沒有平均檢查點。 我們在表中列出這些結果 3.

在表3的行(A)中,我們改變attention head的數量和attention key和value的維度,保持計算量不變,如3.2.2節所述。 雖然只有一個head attention比最佳設置差0.9 BLEU,但質量也隨着head太多而下降。

表3: Transformer架構的變體。 未列出的值與基本模型的值相同。 所有指標都基於英文到德文翻譯開發集newstest2013。 Listed perplexities are per-wordpiece, according to our byte-pair encoding, and should not be compared to per-word perplexities.

在表3行(B)中,我們觀察到減小key的大小dk會有損模型質量。 這表明確定兼容性並不容易,並且比點積更復雜的兼容性函數可能更有用。我們在行(C)和(D)中進一步觀察到,如預期的那樣,更大的模型更好,並且丟棄對避免過度擬合非常有幫助。 在行(E)中,我們用學習到的位置嵌入[9]來替換我們的正弦位置編碼,並觀察到與基本模型幾乎相同的結果。

----------------------- 下面這段 待 翻譯   ---- 開

 

----------------------- 下面這段 待 翻譯   ---- 關

7 結論

在這項工作中,我們提出了Transformer,第一個完全基於關注的序列轉導模型,用multi-headed self-attention取代了編碼器-解碼器架構中最常用的循環層。

對於翻譯任務,Transformer可以比基於循環或卷積層的體系結構訓練更快。 在WMT 2014英語-德語和WMT 2014英語-法語翻譯任務中,我們取得了最好的結果。 在前面的任務中,我們最好的模型甚至勝過以前報道過的所有整合模型。

我們對基於attention的模型的未來感到興奮,並計劃將它們應用於其他任務。 我們計劃將Transformer擴展到除文本之外的涉及輸入和輸出模式的問題,並調查局部的、受限attention機制以有效處理大型輸入和輸出,如圖像、音頻和視頻。 讓生成具有更少的順序性是我們的另一個研究目標。

我們用於訓練和評估模型的代碼可以在https://github.com/tensorflow/tensor2tensor上找到

致謝 我們感謝Nal Kalchbrenner和Stephan Gouws富有成效的評論、更正和靈感。

 

 

-------------未完,待完善

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章