想研究BERT模型?先看看這篇文章吧!


最近,筆者想研究BERT模型,然而發現想弄懂BERT模型,還得先了解Transformer。
本文盡量貼合Transformer的原論文,但考慮到要易於理解,所以並非逐句翻譯,而是根據筆者的個人理解進行翻譯,其中有一些論文沒有解釋清楚或者筆者未能深入理解的地方,都有放出原文,如有不當之處,請各位多多包含,並希望得到指導和糾正。

論文標題

  • Attention Is ALL You Need

論文地址

摘要

序列轉換方式由基於復雜遞歸神經網絡(RNN)和卷積神經網絡(CNN)的編碼器和解碼器模型主導。表現最佳的模型也只是通過一個注意力機制來連接了編碼器和解碼器。我們提出一個新的簡單網絡架構——Transformer。相比表現最佳的模型,該架構僅僅基於注意力機制,完全摒棄了遞歸和卷積。從兩個機器翻譯任務的實驗結果顯示,Transformer的效果更優秀,同時有更好的並行性,顯著的減少了訓練的時間。我們的模型在WMT2014年發布的“英-德”翻譯任務上達到了28.4 BLEU【注解1】,超越了該任務上現有的最好的記錄2個BLEU,包括總體效果。在英-法翻譯任務上,我們的模型在8塊GPU上訓練了3.5天,並創造了單模型最好BLEU分數——41.8。相比文獻中的最佳模型,這個訓練成本不高。Transformer在其它任務上也有好的泛化能力,我們將其應用於English constituency parsing(英語成分句法分析),無論在大量的訓練數據上還是有限的訓練數據上都獲得了成功。

1 引言

RNN,LSTM和GRNN已經是序列建模、語言建模、機器翻譯領域公認的最好方法。之后,仍然有很多人努力推進循環語言模型(recurrent language models)和encoder-decoder架構的邊界。

循環模型(RNN)通常將輸入和輸出序列的符號的位置作為因素進行計算。將位置與計算時間步對齊的過程中,會根據前一個隱藏狀態ht-1和位置t的輸入來生成一系列的隱藏狀態ht【注解2】。這種固有的相繼的性質使得訓練樣本無法並行訓練,這個問題在面對更長序列,並且內存不足以提供更大的批訓練的時候尤其關鍵。近期,人們通過因式分解(factorization)技巧和條件計算(conditional computation),改善了計算效率(后者同時提高了模型的表現)。然而,固有的相繼的性質還沒有得到解決。

注意力機制在各種序列建模和轉換模型的任務中,已經成為不可分割的部分。它使得可以在對符合間的依存關系進行建模的時候,不考慮符號間的距離。然而,大多數情況下,這樣的注意力機制是和RNN一起使用的。

此處,我們提出Transformer,該模型架構摒棄了循環,而采用完全依賴注意力機制來繪制輸入和輸出之間的全局依存關系的方式。Transformer模型有着更好的並行性,在翻譯質量上達到了新的高度,而這樣的Transformer模型在8塊P100GPU上訓練僅需要12小時。

2 背景

減少循序計算(sequential computation)的目標也構成了Extended Neural GPU,ByteNet和ConvS2S的基礎,這些都使用CNN作為基礎構建塊,為所有輸入和輸出的位置並行的計算隱藏表征。對於這些模型,從2個任意的輸入或輸出位置關聯信號所需要的操作次數會隨着位置之間的距離的增加而增加,在ConvS2S中是線性增加,在ByteNet中是對數增加。這使得在兩個遠距離的位置間的依存關系的學習變得更加困難。在Transformer中,這個問題減輕為一個常量次數的操作,這固然會因為經過平均注意力加權的位置而降低有效的信息分辨率,我們應對的策略是采用Multi-Head Attention來抵消這個問題。(大致的理解:注意力機制雖然將序列操作次數固定為一個常量,但本身會丟失一些位置信息,通過Multi-Head 的方式可以彌補這個問題)

Self-attention,有時候又稱為intra-attention,是一種關聯單一序列的不同位置的注意力機制,為了計算該序列的表征。Self-attention 已經被用在各種任務上,包括閱讀理解,抽象式摘要,文本蘊含(textual entailment),學習獨立於任務的句子表征。

端到端的記憶網絡是基於一個循環的注意力機制,而不是按序列對齊(sequence-aligned)的序列循環,並且在簡單語言問答和語言建模任務上表現的不錯。

然而,據我們所知,Transformer是第一個完全依賴self-attention來計算輸入和輸出表征的轉換模型,它沒有使用序列對齊(sequence-aligned)的RNN或者卷積。下面的章節我們將對Transformer進行闡述,進一步討論self-attention的優勢。

3 模型架構

大多數有競爭力的神經序列轉換模型都有一個encoder-decoder結構。這里,編碼器將一個用符號(一般是向量)表示的輸入序列(x1,...,xn)映射到一個連續的表征序列z=(z1,...,zn)。解碼器拿到z后,生成一個符號表示的輸出序列(y1,...,yn),這里是每個時間步生成一個yi,i表示從1到n任意一個數字。每一步,模型都自動消費前一步生成的符號,比如生成y2的時候會以y1作為額外的輸入。

Transformer使用堆疊的self-attention層和明確的指向性來遵循上面這個架構,圖1的左半部分和右半部分分別展出了編碼器和解碼器的完整連接。

3.1 堆疊的編碼器和解碼器

編碼器: 編碼器由6個相同的層堆疊而成。每一層包含2個子層。第一個子層是multi-head self-attention 機制,第二個子層是一個簡單的,位置分明的全連接前饋網絡。我們在每個子層都使用了一個殘差連接(residual connection)【注解3】,並跟上一個歸一化層(normalization layer)。也就是說,每個子層的輸出是LayerNorm(x + Sublayer(x)),其中的Sublayer(x)表示各子層自己實現的函數,比如self-attention層有自己的一套實現,而feed-forward層也有自己的實現。為了方便使用這些殘差鏈接,所有子層包括詞嵌入層的輸出維數都為512。這里因為殘差連接會用到矩陣加法,所以要保持維數統一,至於為什么是512,估計是應為選擇了維數是512的詞嵌入向量。具體參考下圖:

解碼器: 解碼器也是由6個相同的層堆疊而成。每一層除了和編碼器那樣有兩個子層外,解碼器插入了第三個子層,用於在編碼器最后的輸出上執行multi-head attention。和編碼器一樣,我們也在解碼器的各子層中引入了殘差連接,並跟上一個歸一化層。我們還修改了解碼器的self-attention子層,來防止其將注意力擴散到當前處理位置的后續的位置上。筆者理解這里的意思是,編碼器的self-attention子層的注意力機制是關聯到當前處理詞和其他詞的,因為輸入的序列的所有詞都是明確的,而解碼器的self-attention子層只關聯到當前處理詞之前的詞,因為當前處理詞還沒預測出來,之后的詞當然更還沒預測出來。所以解碼器的self-attention子層的當前處理位置的后續位置都是用-inf來標識的,又稱之為mask。這里放上論文中本段落最后的原文:This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.這樣應該比較好理解了。

3.2 注意力(Attention)

注意力函數可以描述為將一個查詢(query)和一組鍵值對(key-value)映射到一個輸出(output),這里的query,keys,values和output都是向量。output是通過values的加權求和來計算的,這里的權重是通過一個query和對應的key的兼容函數來計算的。

3.2.1 Scaled Dot-Product Attention

我們稱我們特殊的attention為“Scaled Dot-Product Attention”(下圖左)。

其輸入由dk維數的queries和keys以及dv維數的values構成。
我們計算query和所有keys的點積,然后除以dk的平方根,然后通過一個softmax函數,其輸出就是values的權重。

實際上,我們是在一組queries上同時計算注意力(attention),具體是將queries打包到一個矩陣Q中。keys和values也是分別打包到K和V矩陣中。我們進行矩陣計算的輸出公式如下:

兩個最常用的attention 函數是additive attention和dot-product(multiplicative)attention。Dot-product attention和我們的算法一樣,除了我們的算法多了一個縮放因子1/(dk的平方根)。Additive attention計算使用一個feed-forward 網絡,該網絡僅有一個隱藏層。兩個算法在理論上具有相同的復雜度,然而,實踐中,dot-product attention更快並且更省空間,因為它可以利用到高度優化的矩陣乘法代碼。

雖然在dk不大的時候,這兩個算法的執行是效率是相似的,但是對於較大的dk值,additive attention 優於不帶縮放的dot-product attention算法。我們猜想dk越大,點積的量級也會增長【注解4】,這會將softmax函數值推向非常小的梯度所在的區域,為了彌補這點,我們才引入縮放因子1/(dk的平方根),將其與點積相乘【注解5】。

3.2.2 Multi-Head Attention

我們發現,相比使用keys,values和queries執行一個單一的注意力函數,線性投影h次不同的keys,values和queries,分別學習到dk,dk,dv維數上的線性投影會更有優勢。(原句:Instead of performing a single attention function with dmodel-dimensional keys, values and queries, we found it beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively。) 每一個queries,keys,values的投影版本上,我們並行的執行注意力函數,然后各自得到一個dv維數的輸出值。然后將這些輸出值(其實就是h個矩陣)拼接(concatenated)起來,在做一次投影【注釋6】,得到最后的結果,就像圖2的右半部分展示的那樣。

Multi-head attention讓模型可以連帶注意到不同位置上的來自不同表征子空間的信息。用一個attention head,會抑制這種能力。
(原句:Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.With a single attention head, averaging inhibits this.)


這里介紹了公式中矩陣W的含義和形狀。筆者的理解是所有出現的W都是一種投影矩陣。

此處,我們采用h=8個並行attention層,或稱為頭。對於每一層我們使用dk=dv=dmodel/h = 64。這里dmodel是指詞嵌入向量的維數,可以推出其值為64* 8=512。由於每個頭減少了維數,總計算成本和用一個采用完整維數的attention頭是差不多的。

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

Transformer 以三種不同的方式使用multi-head attention :

  • 在“encoder-decoder attention”層,queries來自前一個decoder層,keys和values來自encoder的輸出。這使得decoder的每個位置能夠考慮到輸入序列的所有位置。這模擬了sequence-to-sequence模型中采用的經典的encoder-decoder注意力機制。
  • encoder包含self-attention層。在一個self-attention層,所有的keys,values和queries來自相同的地方,這里是來自encoder的前一層的輸出。當前encoder層的每個位置都可以關注到前一層encoder的所有位置。
  • 類似的,decoder中的self-attention層允許decoder層每個位置關注到decoder層的所有位置,包括當前位置。為了保證自回歸性(auto-regressive property)【注解 8】,我們需要阻止解碼器中向左的信息流動。我們在點積注意力算法內部實現了這一點,具體是通過屏蔽(set to -∞)softmax層的輸入中的所有符合非法連接的值來實現的,見圖2左。(筆者的理解就是將當前decoder中self-attention層當前處理詞的后面的位置設置為負無窮大)。

3.3 Position-wise Feed-Forward Networks 位置前饋網絡

除了attention子層外,每個編碼器和解碼器層還包含一個全連接前饋網絡,該網絡以相同的狀態分別應用於每個位置。該網絡由兩個線性變換構成,在這兩個變換中間有一個ReLU激活。公式表達如下:

雖然不同的位置做的是一樣的線性變換,但是不同的層使用了不同的參數。另一個描述這個的方法是就像使用了size為1的卷積核做了2次卷積。該網絡的輸入和輸出的維數都是512,內部層的維數dff = 2048。(這里作者沒有詳細解釋,所以筆者也不太確定,貌似是說這里利用1* 1的卷積核做了一次升維和一次降維。)
附上原句:

3.4 Embeddings and Softmax

和其他的序列轉換模型相似,我們使用經過學習的詞嵌入模型來將輸入詞和輸出詞轉換成dmodel維數的向量。我們也使用經過學習的線性變換和softmax函數來轉換decoder輸出為預測的下一個詞的概率。在我們的模型中,我們在2個embedding層和softmax前的線性變換層共享相同的權重矩陣 。在embedding層,我們會將權重乘以dmodel的平方根。

3.5 Positional Encoding 位置編碼

既然我們的模型沒有包含循環(recurrence)和卷積(convolution),為了讓模型確定序列的順序,我們必須給模型注入序列中各個詞的相對或絕對的位置信息。為此,我們將encoder和decoder棧的底層的embeddings分別與一個“positional encodings”做加法 。positional encodings和embeddings具有相同的維數,以便執行相加操作。有許多做positional encodings的方法,包括經過學習的方式和固定的方式。

此處,我們使用不同頻率的sine和cosine函數:

這里pos是詞在句子中的位置,比如句子長度是L,則pos=0,1,2,3,...,L-1。
i是positional encoding向量的某一維度,positional encoding向量的維數=dmodel,所以當dmodel維數=512時,i=0,1,...,255。
也就是說,每個positional encoding的維度對應一個正弦曲線(具體說是每個偶數維對應一個正弦曲線,每個奇數維對應一個余弦曲線)。
每個維度對應的曲線的波長的取值范圍可以是一個從2Π到10000* 2Π的等比數列。
我們選擇這個函數,是因為我們猜測,既然對任意固定的偏移量k,PEpos+k都能用PEpos的線性函數來表示,那么這可以讓模型更容易通過相對位置來學習注意力。

注:要理解上面這句話需先回顧一下三角函數的"和角"公式:

這里,可以把α看作pos位置,把β看作k位置,則α+β可以看成是位置pos+k,由於PE(pos,2i)和PE(pos,2i+1)公式分別是用的sin和cos,所以PE公式也滿足這個和角公式。則可以得到如下推導:

由此公式可以看出,對任意固定的偏移量k,PEpos+k確實都能用PEpos的線性函數來表示。
至於為什么這樣可以表示相對位置信息,如果把上面的公式看成當計算pos和pos+k的位置編碼維度(2i)時,公式表示(2i)和(2i+1)的線性加權求和;當計算pos和pos+k的位置編碼(2i+1)時,公式表示(2i+1)和(2i)的線性加權求和,也就是說位置編碼就是(2i)與(2i+1)的線性變換。所以可以表示相對位置信息就比較好理解了。

另外,作者也實驗了使用經過學習的位置嵌入來代替上面的方案,然后發現這兩個方案產生了幾乎相同的結果。作者選擇正弦曲線方案是因為即使序列的長度比訓練期間的任何序列的長度長,模型也能夠支持對該序列的推測(extrapolate)。

可以在下面的函數中查看生成positional encoding的代碼:
get_timing_signal_1d

更貼合論文公式的代碼實現如下:

4 為什么使用Self-Attention

本節我們從各個方面比較self-attention和recurrent、convolutional層,recurrent和convolutional層通常用來做不定長度的符號表征序列
(x1, ..., xn)到另一個相同長度的序列( (z1, ..., zn))的映射,諸如一個典型的序列轉換編碼器或解碼器中的隱藏層。讓我們更想選擇self-attention的原因有三個。

第一個是每層總的計算復雜度。第二個是可以並行計算的數量,通過需要的序列操作的最小次數來度量。
第三個是網絡中遠距離依存的路徑長度。在許多序列轉換任務中,遠距離依存的學習都是一個關鍵挑戰。影響這種能力的關鍵因素是前向和反向信號在網絡中需要經過的的路徑長度。輸入和輸出序列中,任意位置的組合間的路徑越短,越容易學習到遠距離依存關系。因此我們也比較了不同類型的層的任意兩個輸入和輸出中的位置的最大路徑長度。如下圖:

圖中所示,self-attention層用一個恆定的循序執行操作的次數來連接所有的位置,而recurrent層需要O(n)復雜度的循序操作。從計算復雜度來看,當序列的長度n比表征維數d小的時候,self-attention層比recurrent層更快,這種情況在最好的機器翻譯模型使用的表征例子中是常見的,比如word-piece和byte-pair表征。為了改善涉及很長序列任務的計算性能,可以限制self-attention只考慮輸入序列中以各自的輸出位置為中心的一個大小為r的鄰域。(筆者注:應該是相對默認的self-attention機制會考慮所有的輸入的位置來說的)這會增加最大路徑長度為O(n/r)。我們計划在將來的工作中進一步研究這種方法。

一個單一的卷積層,使用k<n大小的卷積核,不能連接所有的輸入和輸出位置對。...
這段主要是講采用卷積層的代價比recurrent和self-attention層都大,具體細節可以自行參考原文,由於筆者未能全部理解,就不翻譯了。

self-attention有附加的優勢,就是模型的可解釋性更強。我們從模型中觀察注意力分布,並在附錄中呈現和討論了一個示例。單個注意力頭不僅清晰的學會了執行不同的任務,還呈現出許多和句子的語義結構、句法有關的行為。

5 Training 訓練

本節描述模型的訓練機制。

5.1 Training Data and Batching

我們在標准的WMT 2014 English-German數據集上訓練,其包含450w句子對。句子用包含37000個詞的原目標詞匯表的byte-pair encoding來編碼。對於English-French,我們使用大的多的WMT 2014 English-French數據集,其由3600萬個句子組成,並將單詞分割成32000個不同單詞組成的詞匯表。句子對按照相近序列長度進行批次划分。每個訓練批次包含一組含有接近25000原始單詞(source tokens)和25000目標單詞(target tokens)的句子對。

5.2 Hardware and Schedule

我們在8塊NVIDIA P100 GPU上訓練我們的模型。我們的基礎模型使用了本論文描述的超參數,每個訓練步耗時0.4秒。我們訓練基礎模型用了總共100000步,花費12小時。對於我們的大型模型,(table3的最后一行有描述),每步耗時1秒。大型模型訓練了300000步,耗時3.5天。

5.3 Optimizer 優化器

我們使用Adam優化器,采用β1 = 0.9, β2 = 0.98 and epsilon= 10−9 。我們根據如下公式隨着訓練過程而改變學習率:

這里,我們在首個warmup_step訓練步線性增加學習率,然后按照step_num平方根的倒數成比例降低學習率。我們設置warmup_steps=4000。

5.4 Regularization 正則化

我們在訓練期間采用了三種正則化方法。

Residual Dropout 我們在每個子層的輸出加入下一個子層的輸入和歸一化之前上應用了dropout。
(原句:We apply dropout [33] to the output of each sub-layer, before it is added to the sub-layer input and normalized.)
另外,我們在encoder和decoder棧的embeddings和positional encodings相加后,應用了dropout。對於基礎模型,我們使用的比率Pdrop = 0.1。

Label Smoothing 在訓練期間,我們采用label smoothing,值如下:

這使得模型學到了更多的不確定因素,但是改善了准確度和BLEU得分。

6 Results

6.1 Machine Translation 機器翻譯

在 WMT 2014 English-German 翻譯任務上,大型transformer模型(Transformer(big) in Table 2) 勝過之前最好的模型(包括 ensembles)2.0個BLEU,創造了新的BLEU分數記錄——28.4。這個模型的配置在Table3的末行有展示。訓練在8塊P100GPU上耗時3.5天。甚至我們的基礎模型也優於所有先前發布的模型和集成(ensembles),並且訓練成本比其他任何模型的成本都低。

在 WMT 2014 English-to-French 翻譯任務上,我們的大型模型達到了41.0的BLEU分數,勝過所有發布的單個模型,並且只使用了最好模型的1/4的訓練成本。Transformer(big) 在訓練English-to-French的時候使用了Pdrop = 0.1的dropout rate(失活率),而不是0.3。

下面這段,筆者也有不明白的地方,筆者會嘗試解釋,但是未必准確,所以放出原句:
For the base models, we used a single model obtained by averaging the last 5 checkpoints, which were written at 10-minute intervals. For the big models, we averaged the last 20 checkpoints. We used beam search with a beam size of 4 and length penalty α = 0.6 [38]. These hyperparameters were chosen after experimentation on the development set. We set the maximum output length during inference to input length + 50, but terminate early when possible [38].

對於基礎模型,我們使用一個單一的從最新的5個訓練檢查點平均求出的模型,這些檢查點的寫入間隔是10分鍾。對於大型models,我們用的是最新的20個檢查點。我們使用beam search算法,beam的大小=4,長度的懲罰系數α = 0.6 。這些超參數是在開發集上實驗之后得出的。我們設置推理過程中的最大的輸出長度為輸入長度+50,但是會在可以終止的時候盡早終止。(筆者注:不明白為什么這么做。)

Table 2 中比較了我們的模型和其他模型架構的表現,包括翻譯質量和訓練成本。我們通過乘以訓練時間,GPU的使用數量,以及對各GPU持續單精度浮點容量的估計(我們對K80, K40, M40 and P100型號的GPU分別使用 2.8, 3.7, 6.0 和 9.5 TFLOPS , respectively),來評估用於訓練模型的浮點運算的數量。

6.2 Model Variations

為了評估Transformer不同部分的重要性,我們將基礎模型進行不同方式的變化,以此度量在開發集和測試集上模型表現的改變。我們使用beam search算法(和上節提到的一樣,但是沒有對檢查點取平均)。我們在Table 3中呈現了這些。

在Table 3的A行,我們改變attention heads的數量,以及attention key和value的維數,以此保持總計算量的不變,就像3.2.2小節中描述的那樣。雖然單頭注意力比最佳設置(8個頭)差0.9個BLEU,但過多的頭也會降低質量。

在Table 3的B行,我們觀察到,較小k的維數,會降低模型的表現。這暗示着確定兼容性並不容易,而且一個比點積更復雜的兼容性函數可能是有益的。我們進一步觀察C行和D行,如預料的那樣,大型模型更好,dropout對避免過擬合非常有用。在E行,我們用經過學習的位置嵌入方式來代替正弦曲線位置編碼的方式,對於基礎模型來說效果幾乎是一樣的。

6.3 English Constituency Parsing 英語成分解析

為了評估Transformer是否可以泛化到其他任務上,我們在English constituency parsing上做了實驗。此任務有着特別的挑戰:輸出受強結構約束,並且比輸入長的多。此外,基於RNN的sequence-to-sequence的模型還沒有在小數據集上達到過最先進的結果。

我們在Wall Street Journal (WSJ) portion of the Penn Treebank數據集上訓練了一個4層的transformer,維數dmodel =1024,大概有40K個訓練句子。我們還在半監督的環境中對其進行了訓練,使用了更大的高置信度和BerkleyParser語料庫,語料庫中有大約1700萬句話。我們在WSJ only 設置中使用了包含16K個唯一單詞的詞匯表,在半監督設置中使用了32K個唯一單詞的詞匯表。

我們只用了少量的實驗來選擇droput,不論是attention、residual、學習率、beam size 都是如此,所有其他剩余的參數和English-to-German的基礎翻譯模型的一樣。在推理階段,我們增加了最大輸出長度為輸入的長度+300。對於WSj only 和半監督設置,我們使用beam size=21,α = 0.3。

Table 4 顯示,盡管我們的模型缺少特定任務的調優,其仍然執行的非常好,除了Recurrent Neural Network Grammar(
Dyer等人提出)以外,比其他模型都好。

與RNN序列到序列模型相比,即使只在 WSJ 的40K句訓練集上進行訓練,Transformer的性能也優於BerkeleyParser[29]。

7 總結

在本次工作中,我們展示了Transformer,首個完全依賴注意力機制的序列轉化模型,用multi-headed self-attention替換了encoder-decoder架構中常用的recurrent層。

在翻譯任務中,Transformer 的訓練比基於recurrent或convolutional層的架構的模型都要快的多。在WMT 2014 English-to-German 和 WMT 2014 English-to-French 翻譯任務上,我們創造了新的記錄。在前一個任務中,我們的最佳模型甚至優於所有先前報告的模型的集成。

我們對基於注意力的模型的未來感到興奮,並計划將其應用於其他任務。我們計划將Transformer擴展到涉及文本以外的輸入和輸出模式的問題上,並研究局部的、受限的注意機制,以便有效地處理大量輸入和輸出,如圖像、音頻和視頻。Making generation less sequential is another research goals of ours。(注:這句沒翻譯,是因為不知道“Making generation less sequential ”具體是指什么。)

我們用於訓練和評估我們模型的代碼可通過這個地址獲取: https://github.com/ tensorflow/tensor2tensor

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

參考文獻

請從原論文末尾查找。

Attention Visualizations 注意力可視化


圖3:可以看到,在編碼making的時候,注意力的關注情況。上面的圖只將making的注意力展示出來了。顏色越深的頭注意力越集中。


圖4:Top: head 5的完整注意力。Bottom: 僅是從head 5 和head 6中剝離出來的對單詞‘its’的注意力。


圖5:許多注意力頭表現出的行為看起來都和句子的結構有些關系。我們給出了2個例子,來自編碼器中不同的注意力頭。注意力頭顯然學會了執行不同的任務。

注解

  1. BLEU:全稱 bilingual evaluation understudy。是一種使用機器代替人工評估翻譯結果好壞的方法。評估思路是將模型翻譯的結果和一組人工翻譯的結果進行比較得出一個綜合分數,分數越高的模型越好。

  2. ht: 第t個時間步的激活值,如果不理解,請先了解神經網絡結構中的激活函數。

  3. residual connection: 殘差連接.引入殘差連接,一般是為了避免梯度爆炸和彌散問題,這里估計也是為了解決這個問題。

  4. 為什么維數越大,點積越大?看下面的公式,其中dk是維數,q·k是點積 :

    根據圖中的公式,直覺上覺得dk越大q·k就越大是顯然的,然而,論文中作者對此的解釋提到了均值和方差,這里筆者還沒能弄明白為什么要通過均值和方差來說明點積會隨着維數的增加而增加。
    原句如下:

  5. 要理解“我們猜想dk越大,點積的量級也會增長,這會將softmax函數值推向非常小的梯度所在的區域,為了彌補這點,我們才引入縮放因子1/(dk的平方根),將其與點積相乘”這句話,需要看下面三個圖:



    x軸顯示的是輸入的向量中的各個分量,y軸表示輸入的向量中的各個分量對應的softmax的輸出。
    筆者將第一幅圖的輸入向量的各個分量設置為從0到19,步長為1,則輸入維數為20,;第二幅圖的輸入向量的各個分量增大到從0到59,步長為3,則輸入維數同樣是20。對比兩幅圖,明顯第二幅圖中有更多的梯度非常小的區域。而在深度學習神經網絡中,我們知道非常小的梯度將導致非常慢的學習速度。所以作者引入了一個縮放因子,那么第三幅圖就是筆者將第二幅圖的輸入除以其維數的平方根后的圖,可以看到落在非常小的梯度的區域的值變少了。
    繪制曲線的代碼如下,大家可以自行調整參數以做測試:

import matplotlib.pyplot as plt
import numpy as np

def softmax(inputs):
    return np.exp(inputs) / float(sum(np.exp(inputs)))

def line_graph(x, y, x_title, y_title):
    plt.plot(x, y, markerfacecolor='blue',marker='o')
    plt.xlabel(x_title)
    plt.ylabel(y_title)
    plt.show()

# graph_x = range(0, 20) #數值小的時候
graph_x = range(0, 60,3) # 維數相同,數值大的時候
print(len(graph_x))
graph_x = np.array(graph_x)/(float(len(graph_x)) ** 0.5) # 加入縮放因子
graph_y = softmax(graph_x)
print("GraphXreadings: {}".format(graph_x))
print("GraphYreadings: {}".format(graph_y))
line_graph(graph_x, graph_y, "Inputs", "SoftmaxScores")

  1. projected: 投影。具體的操作是用當前矩陣乘以另一個矩陣,另一個矩陣通常就是一個權重矩陣,其中的值一開始是隨機初始化的,然后通過不斷的學習得到合適的值。

  2. Auto-regressive : 簡稱AR,核心思想是: 下一個觀測值約等於前n個觀測值的某種線性加權和。所以作者需要將decoder中上一個預測詞的左向信息流給 mask 掉(即右側所有位置的值設置為負無窮)。

筆者總結

ok,終於翻譯完成了。讓我們來回顧一下論文作者的思路以做個總結。
本論文中,作者提出了Transformer模型架構,該架構用在序列到序列的轉換領域,比如機器翻譯,可以是語言到語言的翻譯,也可以是任何序列到另一個序列的轉換。

Transformer中用到了一種注意力機制,直觀上理解就是在編碼句子中的某個詞的時候,會同時注意句子中的"其他詞","其他詞"中各個詞越和當前詞相關,得到的注意力越多。

Transformer利用這種注意力機制來給相關詞打分,來得到最終的輸出,然后通過訓練樣本集和相應的損失函數不斷更新網絡的權重系數來得到一個有效的序列到序列轉換的模型。
也就是說,訓練好的模型會知道如何將一個句子序列映射到另一個句子序列,比如英文到中文的翻譯。

在這個過程中,作者提出了query,key,value的概念,注意力分數就是用這三個概念參與計算出來的,其中還用到了query和key的點積。而這三個概念作者只用了一段話描述:”注意力函數可以描述為將一個查詢(query)和一組鍵值對(key-value)映射到一個輸出(output),這里的query,keys,values和output都是向量。output是通過values的加權求和來計算的,這里的權重是通過一個query和對應的key的兼容函數來計算的。“。
筆者的嘗試直觀的解釋一下(不一定准確,僅作參考,請大佬指正。),就是作者把
query當作當前詞的詞嵌入向量在某個注意力空間的投影;
key 當作句子中所有詞在注意力空間上的鍵投影;
value當作句子中所有詞在注意力空間上的值投影。
而編碼器中query和key做點積,就是為了找到注意力空間中其他詞和當前編碼詞的注意力相關性,這些相關性將作為value的權重,也就是其他詞對當前編碼詞的注意力集中度。
解碼器中的query和編碼器的key做點積,是為了在計算注意力的時候再加入對已經解碼的詞的考量。
為了讓模型在注意力上考慮的更全面,作者使用了8個注意力頭,也就是計算了8次上面涉及q,k,v的過程,然后將結果拼接在一起。
但是這個過程並沒有考慮到句子中詞和詞之間的位置關系,所以為了彌補,作者引入了positional encoding,就是要讓Transormer能夠考慮到位置信息。不至於打亂一個句子的詞匯后,得到的轉換結果和沒打亂一樣。

相比基於注意力機制的循環或卷積的架構模型,Transformer的顯著特點是其完全依賴注意力機制,而摒棄了循環和卷積。由此得到的好處包括:計算復雜度降低了,並行計算的數量增加了,句子中任意兩個詞離得越遠,越不容易學習其依存關系的問題被減輕了。

如果你還是隱隱覺得不能完全搞懂論文的所有思想也不要緊,因為論文本身確實比較難讀懂,畢竟是論文,不是教學為目的。但是至少通過本文,你應該大致明白了論文在討論什么,其提出的attention機制是為了解決什么問題。

ok,本篇就這么多內容啦,感謝閱讀O(∩_∩)O,88


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM