1. 程式人生 > >想研究BERT模型?先看看這篇文章吧!

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

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

論文標題

  • Attention Is ALL You Need

論文地址

  • https://arxiv.org/pdf/1706.03762.pdf

摘要

序列轉換方式由基於複雜遞迴神經網路(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),我們需要阻止解碼器中向左的資訊流動。我們在點積注意力演算法內部實現了這一點,具體是通過遮蔽(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是位置,i是維。也就是說,每個positional encoding的維對應一個正弦曲線。其波長形成一個從2Π到10000* 2Π的幾何數列。我們選擇這個函式,是因為我們猜測,既然對任意固定的偏移量k,PEpos+k都能用PEpos的線性函式來表示,那麼這可以讓模型更容易通過相對位置來學習注意力。

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

筆者注:上面關於Positional Encoding 的段落確實很難理解,筆者自己也沒能完全理解,但是我們可以先記住一點,就是採用這種基於正弦和餘弦曲線的方式來計算位置編碼,可以讓模型學習到的注意力更容易將相對位置(也包括絕對位置)納入考慮,這能夠彌補模型摒棄迴圈(recurrence)和卷積(convolution)後導致的位置順序資訊丟失的問題。如果沒有位置資訊做考量,那麼模型對一句話中所有詞的打亂排序後組成的各個句子的理解將會使一樣的。這種模型是不能拿來做機器翻譯或者語言建模的。

如果想深入瞭解具體原因,可以在下面的函式中檢視生成positional encoding的程式碼:
get_timing_signal_1d

另外,這裡貼出論文中3.5節的原文:

3.5 Positional Encoding
Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the bottoms of the encoder and decoder stacks. The positional encodings have the same dimension dmodel as the embeddings, so that the two can be summed. There are many choices of positional encodings, learned and fixed [9].
In this work, we use sine and cosine functions of different frequencies:

where pos is the position and i is the dimension. That is, each dimension of the positional encoding corresponds to a sinusoid. The wavelengths form a geometric progression from 2π to 10000 · 2π. We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, P Epos+k can be represented as a linear function of P Epos.
We also experimented with using learned positional embeddings [9] instead, and found that the two versions produced nearly identical results (see Table 3 row (E)). We chose the sinusoidal version because it may allow the model to extrapolate to sequence lengths longer than the ones encountered during training.

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. 要理解這句話,需要看下面三個圖:



    x軸顯示的是輸入的向量中的各個分量,y軸表示輸入的向量中的各個分量對應的softmax的輸出。筆者將第一幅圖的輸入維數設定為20,輸入向量的各個分量是從1到20,步長為1;第二幅圖的輸入維數設為了60,輸入向量的各個分量是從1到60,步長為1;明顯第二幅圖中有更多的梯度非常小的區域。而在深度學習神經網路中,我們知道非常小的梯度將導致非常慢的學習速度。所以作者引入了一個縮放因子,那麼第三幅圖就是筆者將第二幅圖的輸入除以其維數的平方根後的圖,可以看到落在非常小的梯度的區域的值變少了。
    繪製曲線的程式碼如下,大家可以自行調整引數以做測試:
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)
    plt.xlabel(x_title)
    plt.ylabel(y_title)
    plt.show()

# graph_x = range(0, 21) 維數小的時候
graph_x = range(0, 61) # 維數大的時候
# 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: 投影。具體的操作是用當前矩陣乘以另一個矩陣,另一個矩陣通常就是一個權重矩陣,其中的值一開始是隨機初始化的,然後通過不斷的學習得到合適的值。

筆者總結

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~

相關推薦

研究BERT模型看看文章

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

讀留學讀計算機博士嗎?看看文章

        首先,在我們討論博士是幹嘛的之前,我們最好弄清楚“科研”究竟是怎麼回事。科研是不是坐在一個小屋子裡,滿桌子驗算紙,然後十多年如一日不見人,最終弄出了歌德巴赫猜想似的結論?這恐怕是多數人心中的科研模式,不過這樣的模式不僅僅是完全過時的,甚至是不正確的。科研

如果你未曾深入瞭解python,請看看python簡史

  python與人工智慧緊緊的聯絡在一起,現在很多年輕的開發者都開始學習Python,文章清晰且幽默的講述了python的發展史,希望對還在自學python的你有些幫助,或重拾自學python的激情。 學習Python中有不明白推薦加入交流群   &n

還在為記不住Markdown語法犯愁?收藏文章

-c 程序員 urn bee 技術文章 轉換 和我 tro rip 本文已同步發表到我的技術微信公眾號,掃一掃文章底部的二維碼或在微信搜索 “程序員驛站”即可關註,每天都會更新優質技術文章。 最近在用Markdown記錄生活,發現有些語法總記不住,特此寫下這篇文字,方便

從事IT行業的你,一定看看文章

很多想從事IT行業的小夥伴都會問: 我該如何學習技術? 我應該選擇什麼樣的方向來深入學習並以此來就業? 如何證明自己的技術很牛? 什麼是程式設計師的核心競爭力? 如何成為一名優秀的工程師? 對於這些疑問,小編總結了一些趨勢來供大家參考,希望對各位小夥伴有幫助。 1

(轉)清華博士王垠的退學申請——研究生,無論你研究,都該讀讀文章

我覺得再沒有從實際出發的目標,我的研究就會完全變成紙張了,就像我高中感覺到的一樣。所以後來我就自己設立了一個研究方向,我把自己稱為“研 究博士生”,我要去了解博士生都是怎麼樣生活的。我就想知道有多少學生有跟我類似的困境。我跟很多朋友談過,去了解他們的苦衷,研究生也有,本科的也有。我覺得我還應該瞭解更多的人,就

就算你不是電商,你應該為你的電商朋友好好看看文章

size gin 屬性 set 朋友 sdn 商務 通過 每天 典型案例場景:電商客服&倉庫協作管理用戶:天貓電商賣家-米詩緹娜客服-倉庫協作管理作為當今時代通過互聯網進行商品交易的電商服務,絕佳的購物體驗與完好的售後服務直接決定了其品牌價值。比起傳統的實體店來

學習C語言的大家可以可以看看文章可能會對你有幫助哦

部分 lag follow etc 被調用 ron 指定 ans ofo 為什麽要用”真正”這個詞?因為我們從學C語言開始,都會先明白這個道理,即C語言有且僅有一個main函數,main函數是C語言的入口點和出口點!(可以參考<<一個C語言程序的基本機構>

Java程式設計師要高薪,看完文章就夠了

Java作為一門程式語言,在各類程式語言中作為弄潮兒始終排在前三的位置,這充分肯定了java語言的魅力,在實際專案應用中,我們已經無法脫離java,它的高效能,穩定性,擴充套件性已經深入到每一個java程式設計工程師的骨髓裡。 然而要想成為一名合格的java工程師並不容易。因為作為一名Ja

Linux優化不知如何下手?那你的看看文章

這些問題或者場景,你是否曾經遇到過? 流量高峰期,伺服器CPU使用率過高報警,你登入Linux上去top完之後,卻不知道怎麼進一步定位,到底是系統CPU資源太少,還是程式併發部分寫的有問題? 系統並沒有跑什麼吃記憶體的程式,但是敲完free命令之後,卻發現系統已經沒有什麼記憶體了,那到底是哪

成為資料科學家?做到6點

世界變化很快,各行各業在大環境的變化也發生著非常大的改動。傳統的行業比如會計師、審計師、同聲翻譯、點餐員等許多職業逐漸被機器所替代。根據相關報道,未來top10的行業都與資料有關,比如資料分析科學家、AI專家等。最近一則新聞——校招薪資超80萬讓一些工作數年的員工羨慕不已,該類職業大多都與資料相關。因此,很多

如果你的shiro沒學明白,那麽應該看看文章,將shiro整合進springboot

最小 3.2 開始 depend art tostring 登陸 string int 最近在做項目的時候需要用到shiro做認證和授權來管理資源 在網上看了很多文章,發現大多數都是把官方文檔的簡介摘抄一段,然後就開始貼代碼,告訴你怎麽怎麽做,怎麽怎麽做 相信很多小夥伴即使

心情不好的時候看看文章

一:學會緘默        有時候,你被人曲解,你不想擡槓,因而抉擇沈默。原先就不是所有的人都得打聽你,因而你沒無須對全世界喊話。卻也有時候,你被最愛的人誤會,你難受到不想辯論,也只有挑選靜默。全世界都能夠不懂你,但他應當懂,若他居然不能懂,還有什麼話可說?性命中時常有連舒伯

面試BAT,我建議1-3年的Java程式設計師仔細看看文章

此文的目的是為了督促自己去不斷學習,讓自己有更明確的方向去提升自己。以技能樹為基礎,以面試要點為大綱,我覺得比抓住什麼看什麼要更有

面試又被 Java 基礎難住了?推薦你看看文章

本文已經收錄自 JavaGuide (59k+ Star):【Java學習+面試指南】 一份涵蓋大部分Java程式設計師所需要掌握的核心知識。 1. 面向物件和麵向過程的區別 面向過程 :面向過程效能比面向物件高。 因為類呼叫時需要例項化,開銷比較大,比較消耗資源,所以當效能是最重要的考量因素的時候,比

如何學習Python?自學還是培訓?通過文章指點迷津超級詳細

ram 適用於 主機 只有一個 們的 行程 允許 技術 沒有 本篇文章重點講解什麽? 1、了解 Python 應用在哪些方面 2、為 0 基礎入行 IT 的同學們做入門語言對比介紹,找到自己想要的方向 3、為有工作經驗,想轉型 Python 工程師的開發者

比特幣麽火熱,看看比特幣初學者指南

htm 愛好者 新增 wechat 如何 通過 中新 人的 說明 原文:ruanyifeng.com/blog/2018/01/bitcoin-tutorial.html 作者: 阮一峰 如有侵權,請及時聯系,謝謝! 2017 年對比特幣來說,是極為瘋狂的一年。

再有人問你Java內存模型是什麽,就把文章發給他。

jpg 職業生涯 ron 英文 順序執行 物理地址 直接 順序 新的 前幾天,發了一篇文章,介紹了一下JVM內存結構、Java內存模型以及Java對象模型之間的區別。有很多小夥伴反饋希望可以深入的講解下每個知識點。Java內存模型,是這三個知識點當中最晦澀難懂的一個,而且涉

讓安卓app不再卡頓?看文章就夠了

實踐 分析 net 差異 項目 void 應該 倒數 文件存儲 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由likunhuang發表於雲+社區專欄 實現背景 應用的使用流暢度,是衡量用戶體驗的重要標準之一。Android 由於機型配置和系統的不同,

如何高效學python?文章就是為學的你寫的

如過你一直想學Python,但是不知道如何入手,那就別猶豫了。這篇文章就是為你寫的。   疑問 隨著資料科學概念的普及,Python這門並不算新的語言火得一塌糊塗。 因為寫了幾篇用Python做資料分析的文章,經常有讀者和學生在留言區問我,想學習Python,該