BERT的前世此生

Transformer

Transformer來自論文: All Attention Is You Needhtml

別人的總結資源:算法

  1. 谷歌官方AI博客: Transformer: A Novel Neural Network Architecture for Language Understanding
  2. Attention機制詳解(二)——Self-Attention與Transformer谷歌軟件工程師
  3. 放棄幻想,全面擁抱Transformer:天然語言處理三大特徵抽取器(CNN/RNN/TF)比較中科院軟件所 · 天然語言處理 /搜索 10年工做經驗的博士(阿里,微博);
  4. Calvo的博客:Dissecting BERT Part 1: The Encoder,儘管說是解析Bert,可是由於Bert的Encoder就是Transformer,因此其實它是在解析Transformer,裏面舉的例子很好;
  5. 再而後能夠進階一下,參考哈佛大學NLP研究組寫的「The Annotated Transformer. 」,代碼原理左右開弓,講得也很清楚。
  6. 《Attention is All You Need》淺讀(簡介+代碼)這個總結的角度也很棒。

A High-Level Look

能夠將輸入的語言序列轉換成另一種序列,好比下圖的神經機器翻譯:數組

Ze7v1H.png

Transformer模型由編碼器-解碼器組合組成,解碼器負責對序列進行編碼,提取時間和空間信息,解碼器負責利用時間和空間特徵信息進行上下文預測,下圖是單個結構:網絡

Ze7qAK.png

編碼器和解碼器堆棧的組合結構,在谷歌的實驗結構中採用了6個編碼器和6解碼器相對應,使模型的編碼能力和解碼能力達到一個平衡狀態(堆棧式結構):ide

Ze7LtO.png

編碼器-解碼器的內部結構,相似seq2seq模型:函數

Ze7H76.png

seq2seq模型:性能

ZeqWh8.png

Encoder: 由6個相同的層組成, 每層包含兩個sub-layers.第一個sub-layer就是multi-head attention layer,而後是一個簡單的全鏈接層。其中每一個sub-layer都加了residual connection(殘差鏈接)和normalisation(歸一化)。學習

Decoder: 由6個相同的層組成,這裏的layer包含三個sub-layers, 第一個sub-layer 是masked multi-head attention layer。這裏有個特別點就是masked, 做用就是防止在訓練的時候,使用將來的輸出的單詞。好比訓練時,第一個單詞是不能參考第二個單詞的生成結果的。Masked是在點乘attention操做中加了一個mask的操做,這個操做是保證softmax操做以後不會將非法的values連到attention中,提升泛化性。google

Ze7zjA.png

Self-Attention at a High Level

假設下面的句子就是咱們須要翻譯的輸入句:編碼

」The animal didn't cross the street because it was too tired」

當模型處理單詞的時候,self attention層能夠經過當前單詞去查看其輸入序列中的其餘單詞,以此來尋找編碼這個單詞更好的線索。

Ze7xcd.png

Self-Attention in Detail

第一步是將輸入的嵌入詞向量經過三個不一樣的參數矩陣獲得三個向量,分別是一個Query向量,一個Key向量和一個Value向量,參數矩陣分別爲Wq,Wk,Wv,,以下圖所示:

Ze7OhD.png

第二步是經過當前詞的q向量與其餘詞的k向量計算當前詞相對於其餘詞的得分,分數採用點積進行計算,以下圖所示:

Ze7j9e.png

第三步和第四步是講獲得的分數除以k值維數的平方根(k值維數爲64,可使訓練過程有更加穩定的梯度,這個歸一化的值是經驗所得),再經過softmax獲得每一個得分的標準化得分:

ZeHZcj.png

第五步是對當前詞所獲得的標準化值對全部value向量進行加權求和獲得當前詞的attention向量,這樣就使不一樣單詞的嵌入向量有了attention的參與,從而預測上下文句子的時候體現不一樣的重要的重要程度。

ZeHpnI.png

Matrix Calculation of Self-Attention

  • Attendtion向量計算的矩陣形式,經過全職矩陣進行詞向量的計算大大加快了神經網絡的速度

  • X矩陣中的每一行對應於輸入句子中的一個單詞。(圖中的4個方框論文中爲512個)和q / k / v向量(圖中的3個方框論文中爲64個)

ZeHiAf.png

公式中濃縮前面步驟2到5來計算self attention層的輸出。

ZeH9Bt.png

The Beast With Many Heads

使用「Multi-headed」的機制來進一步完善self-attention層。「Multi-headed」主要經過兩個方面改善了Attention層的性能,參數組成和子空間映射:

ZeHV3Q.png

Many Heads的優缺點:

  • 它拓展了模型關注不一樣位置的能力。Multi head 的每一個參數矩陣都會記錄單詞的位置信息,使原來的單個位置信息變得更加複雜。

  • 它爲attention層提供了多個「representation subspaces」。由下圖能夠看到,在self attention中,咱們有多個個Query / Key / Value權重矩陣(Transformer使用8個attention heads),使特徵的提取變得更加複雜,而不是做爲一個總體的特徵進行,每一個單獨的子空間都會進行上下文的信息融合

在8個不一樣的子空間進行self-attention的操做,每一個單詞生成獨立的8個向量

ZeHCHP.png

將8個子空間生成的向量壓縮成一個大向量,每一個向量的子空間矩陣可以學習到更多細節,壓縮過程採用一個更大的參數矩陣進行,對multi-head向量進行組合,生成最終的特徵向量。

ZeHE9g.png

總體的框圖來表示一下計算的過程:

ZeHFN8.png

Representing The Order of The Sequence Using Positional Encoding

其實上面介紹的網絡裏面並無考慮序列的位置信息,在RNN中不一樣時刻的信息是經過遞歸網絡的時間t來刻畫的,有明顯的時間刻度,因此引入了位置向量來解決時間刻度問題。

ZeHk4S.png

爲了讓模型捕捉到單詞的順序信息,添加位置編碼向量信息(POSITIONAL ENCODING),位置編碼向量不須要訓練,它有一個規則的產生方式,生成與詞嵌入向量有着相同的向量就能夠。

ZeHKH0.png

經過構造函數sin、cos來對位置進行嵌入,pos爲單詞位置信息,而i用來表達dimension 這裏爲了好說明,若是2i= dmodel, PE 的函數就是sin(pos/10000)。這樣的sin, cos的函數是能夠經過線性關係互相表達的,經過兩個函數對奇偶維度進行編碼。位置編碼的公式以下圖所示:

我的認爲選擇正餘弦函數主要是在-1和1之間是一個對稱關係,兩個相鄰的維度編碼相差比較大,在位置上有更好的區分性,1000是序列的長度,通常儘可能將取值範圍控制在四分一個週期裏面,這樣會使每個序列的每個維度都取惟一的值。

ZeHlNT.png

The Residuals

編碼器和解碼器裏面的每一層都採用殘差的思想進行訓練,目的就是爲了解決網絡過深狀況下的難訓練問題,殘差鏈接能夠將目標值問題轉化成零值問題,必定程度也能夠減小網絡的過擬合問題。

ZeHejs.png

使用殘差鏈接的編碼器內部結構:

ZeHuBq.png

使用殘差鏈接的編碼器-解碼器內部結構:

ZeHQEV.png

The Decoder Side

經過自迴歸方式進行預測,解碼器每個時間步輸入一個單詞,而後輸出一個單詞,將預測的單詞做爲下一時刻的輸入進行單詞的預測,直到預測結束。

ZeHB4O.gif

The Final Linear and Softmax Layer

  • 線性層是一個簡單的全鏈接神經網絡,模型一次生成一個輸出,咱們能夠假設模型從該機率分佈中選擇具備最高几率的單詞並丟棄其他的單詞。

  • 對於最終句子的生成有2個方法:一個是貪婪算法(greedy decoding),一個是波束搜索(beam search)。

ZeH14U.png

Bidirectional Encoder Representation from Transformers

Word Embedding

  • 線性模型,主要是對高維空間進行映射,實際上是對one-hot向量的空間轉換。

  • 經過神經網絡對輸入的詞進行映射,獲取詞向量,通常有cbow和skip-gram兩種方法,此方法訓練的詞向量與上下文無關,並無參考位置信息,只是對詞的有無進行參考,採用的是負採樣,預測的時候進行的是一個二分類器,模型認爲只要在下文中找出正確的詞就認爲是完成了任務。

ZeH8CF.png

還沒有解決一詞多義等問題。好比多義詞Bank,有兩個經常使用含義,可是Word Embedding在對bank這個單詞進行編碼的時候,是區分不開這兩個含義的,由於它們儘管上下文環境中出現的單詞不一樣,可是在用語言模型訓練的時候,不論什麼上下文的句子通過word2vec,都是預測相同的單詞bank,而同一個單詞佔的是同一行的參數空間,這致使兩種不一樣的上下文信息都會編碼到相同的word embedding空間裏去。因此word embedding沒法區分多義詞的不一樣語義,這就是它的一個比較嚴重的問題。

ZeHG34.png

Embedding from Language Models(ELMO)

  • ElMO採用雙向的LSTM作上下文相關的任務,從前到後和後到前分別作一遍LSTM的encoding操做,從而得到兩個方向的token聯繫。

  • Word Embedding本質上是個靜態的方式,所謂靜態指的是訓練好以後每一個單詞的表達就固定住了,之後使用的時候,不論新句子上下文單詞是什麼,這個單詞的Word Embedding不會跟着上下文場景的變化而改變,因此對於好比Bank這個詞,它事先學好的Word Embedding中混合了幾種語義 ,在應用中來了個新句子,即便從上下文中(好比句子包含money等詞)明顯能夠看出它表明的是「銀行」的含義,可是對應的Word Embedding內容也不會變,它仍是混合了多種語義。

ZeHYv9.png

ELMO的本質思想是:

事先用語言模型學好一個單詞的Word Embedding,此時多義詞沒法區分,不過這不要緊。在我實際使用Word Embedding的時候,單詞已經具有了特定的上下文了,這個時候我能夠根據上下文單詞的語義去調整單詞的Word Embedding表示,這樣通過調整後的Word Embedding更能表達在這個上下文中的具體含義,天然也就解決了多義詞的問題了。因此ELMO自己是個根據當前上下文對Word Embedding動態調整的思路。

ZeHJgJ.png

同樣的,在具體進行下游任務的時候,採用神經網絡參數微調的方法根據不一樣的詞的上下文環境對詞向量進行調整,從而獲得同一詞的不一樣向量表示。

缺點:

  • LSTM的抽取能力遠遠落後於Transformer,主要是並行計算能力

  • 拼接方式融合雙向特徵能力偏弱

Bidirectional Encoder Representation from Transformers

BRET採用兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下游任務。在預訓練階段採用了相似ELMO的雙向語言模型,雙向指的是對於預測單詞的上文和下文是否參與,若是都參與預測那麼就是雙向,雙向容易致使本身看本身的問題,後面提出mask來解決

ZeHNuR.png

通過預訓練的BRET模型,其已經具有了豐富的詞向量特徵信息,而後將此詞向量信息與下游任務進行組合進行NLP下游任務,例如文本生成,文本分類。

ZeHaHx.png

如何可以更好將BRET模型與下游任務進行改造是一個比較複雜的問題,再好的預訓練語言模型都要與下游的任務模型相結合纔有好的效果, BRET的優點在於能夠自由根據預訓練模型進行單詞級別的任務和句子級的任務。

ZeHrCD.png

BRET模型的創新

就是論文中指出的Masked 語言模型和Next Sentence Prediction。而Masked語言模型上面講了,本質思想實際上是CBOW,可是細節方面有改進。

Masked 語言模型:

  • 而Masked語言模型上面講了,本質思想實際上是CBOW,可是細節方面有改進,掩蓋的同時,要輸出掩蓋的詞的位置,而後用真實詞來預測。
  • Mask LM主要是爲了增長模型的魯棒性和實際性能,可是在訓練時使用mask過多會影響實際任務的表現,因此作了一些處理:隨機選擇語料中15%的單詞,把它摳掉,也就是用[Mask]掩碼代替原始單詞,而後要求模型去正確預測被摳掉的單詞。可是這裏有個問題:訓練過程大量看到[mask]標記,可是真正後面用的時候是不會有這個標記的,這會引導模型認爲輸出是針對[mask]這個標記的,可是實際使用又見不到這個標記,這天然會有問題。爲了不這個問題, BRET改造了一下,15%的被選中要執行[mask]替身這項光榮任務的單詞中,只有80%真正被替換成[mask]標記,10%被狸貓換太子隨機替換成另一個單詞,10%狀況這個單詞還待在原地不作改動。這就是Masked雙向語音模型的具體作法。

ZeHUD1.png

Next Sentence Prediction:

  • 指的是作語言模型預訓練的時候,分兩種狀況選擇兩個句子,一種是選擇語料中真正順序相連的兩個句子;另一種是第二個句子從語料庫中拋色子,隨機選擇一個拼到第一個句子後面。
  • 咱們要求模型除了作上述的Masked語言模型任務外,附帶再作個句子關係預測,判斷第二個句子是否是真的是第一個句子的後續句子。之因此這麼作,是考慮到不少NLP任務是句子關係判斷任務,單詞預測粒度的訓練到不了句子關係這個層級,增長這個任務有助於下游句子關係判斷任務。因此能夠看到,它的預訓練是個多任務過程。這也是BRET的一個創新,通常用於句級任務。

ZeH0UK.png

ZeHwE6.png

Transformer&BERT總結

  • 首先是兩階段模型,第一階段雙向語言模型預訓練,這裏注意要用雙向而不是單向,第二階段採用具體任務Fine-tuning或者作特徵集成;

  • 第二是特徵抽取要用Transformer做爲特徵提取器而不是RNN或者CNN;

  • 第三,雙向語言模型能夠採起CBOW的方法去作(固然我以爲這個是個細節問題,不算太關鍵,前兩個因素比較關鍵)。 BRET最大的亮點在於效果好及普適性強,幾乎全部NLP任務均可以套用BRET這種兩階段解決思路,並且效果應該會有明顯提高。能夠預見的是,將來一段時間在NLP應用領域,Transformer將佔據主導地位,並且這種兩階段預訓練方法也會主導各類應用。

相關文章
相關標籤/搜索