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

最近,筆者想研究BERT模型,然而發現想弄懂BERT模型,還得先了解Transformer。
本文儘可能貼合Transformer的原論文,但考慮到要易於理解,因此並不是逐句翻譯,而是根據筆者的我的理解進行翻譯,其中有一些論文沒有解釋清楚或者筆者未能深刻理解的地方,都有放出原文,若有不當之處,請各位多多包含,並但願獲得指導和糾正。git

論文標題

  • 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(英語成分句法分析),不管在大量的訓練數據上仍是有限的訓練數據上都得到了成功。github

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小時。app

2 背景

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

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~

相關文章
相關標籤/搜索