NLP系列——(10)BERT


Bert之所以取得這麼驚才絕豔的效果,很大一部分原因源自於Transformer。爲了後面更好、更快地理解BERT模型,這一節從Transformer的開山鼻祖說起,先來跟着」 Attention Is All You Need「 這篇文章,走近transformer的世界,在這裏你再也看不到熟悉的CNN、RNN的影子,取而代之的是,你將看到Attention機制是如何被髮揮的淋漓盡致、妙至毫顛,以及它何以從一個爲CNN、RNN跑龍套的配角實現華麗逆襲。對於Bert來說,transformer真可謂天縱神兵,出匣自鳴!

一、Transformer

論文:Attention Is All You Need

1.1 Encoder-Decoder框架

Encoder-Decoder是爲seq2seq(序列到序列)量身打造的一個深度學習框架,在機器翻譯、機器問答等領域有着廣泛的應用。這是一個抽象的框架,由兩個組件:Encoder(編碼器)和Decoder(解碼器)組成。對於給定的輸入source(x1, x2, x3, …,xn), 首先編碼器將其編碼成一箇中間表示向量z=(z1, z2, …, zn)。接着,解碼器根據z和解碼器自身前面的輸出,來生成下一個單詞。

在實際應用中,編碼器和解碼器可以有多種組合,比如{RNN, RNN}、{CNN,RNN}等等,這就是傳統的seq2seq框架。後來引入了attention機制,上述框架也被稱爲」分心模型「。爲什麼說他」分心「呢?因爲對於解碼器來說,他在生成每一個單詞的時候,中間向量的每一個元素對當前生成詞的貢獻都是一樣的。Attention的思想則是對於當前生成的單詞,中間向量z的每個元素對其貢獻的重要程度不同,跟其強相關的賦予更大的權重,無關的則給一個很小的權重。

舉個例子:假如我們要將 「knowledge is power」 翻譯成 中文,在翻譯」knowledge「這個單詞時, 顯然」knowledge「這個單詞對翻譯出來的」知識「貢獻最大,其他兩個單詞貢獻就很小了。這實際上讓模型有個區分度,不會被無關的東西干擾到,翻譯出來的準確度當然也就更高了。

1.2 Transformer模型架構

在這裏插入圖片描述
模型分爲編碼器解碼器兩個部分。

  • 編碼器由6個相同的層堆疊在一起,每一層又有兩個支層。第一個支層是一個多頭的自注意機制,第二個支層是一個簡單的全連接前饋網絡。在兩個支層外面都添加了一個residual的連接,然後進行了layer nomalization的操作。模型所有的支層以及embedding層的輸出維度都是 d m o d e l d_{model}
  • 解碼器也是堆疊了六個相同的層。不過每層除了編碼器中那兩個支層,解碼器還加入了第三個支層,如圖中所示同樣也用了residual以及layer normalization。

Encoder
Encoder由 N = 6 N=6 個相同的layer組成,layer指的就是上圖左側的單元,最左邊有個「Nx」,這裏是 x 6 x6 個。每個Layer由兩個sub-layer組成,分別是multi-head self-attention mechanism和fully connected feed-forward network。其中每個sub-layer都加了residual connection和normalisation,因此可以將sub-layer的輸出表示爲:
在這裏插入圖片描述
接下來按順序解釋一下這兩個sub-layer:

  • 1、Multi-head self-attention

attention可由以下形式表示:
在這裏插入圖片描述
multi-head attention則是通過h個不同的線性變換對Q,K,V進行投影,最後將不同的attention結果拼接起來:
在這裏插入圖片描述
self-attention則是取Q,K,V相同。

另外,文章中attention的計算採用了scaled dot-product,即:

在這裏插入圖片描述

  • 2、Position-wise feed-forward networks

第二個sub-layer是個全連接層,之所以是position-wise是因爲處理的attention輸出是某一個位置i的attention輸出。

Decoder
Decoder和Encoder的結構差不多,但是多了一個attention的sub-layer,這裏先明確一下decoder的輸入輸出和解碼過程:

  • 輸出:對應 i i 位置的輸出詞的概率分佈
  • 輸入:encoder的輸出 & 對應 i 1 i-1 位置decoder的輸出。所以中間的attention不是self-attention,它的K,V來自encoder,Q來自上一位置decoder的輸出
  • 解碼:這裏要特別注意一下,編碼可以並行計算,一次性全部encoding出來,但解碼不是一次把所有序列解出來的,而是像 RNN一樣一個一個解出來的,因爲要用上一個位置的輸入當作attention的query
    明確瞭解碼過程之後最上面的圖就很好懂了,這裏主要的不同就是新加的另外要說一下新加的attention多加了一個mask,因爲訓練時的output都是ground truth,這樣可以確保預測第 i i 個位置時不會接觸到未來的信息。

加了mask的attention原理如圖(另附multi-head attention):
在這裏插入圖片描述

  • 3、Positional Encoding

除了主要的Encoder和Decoder,還有數據預處理的部分。Transformer拋棄了RNN,而RNN最大的優點就是在時間序列上對數據的抽象,所以文章中作者提出兩種Positional Encoding的方法,將encoding後的數據與embedding數據求和,加入了相對位置信息。

這裏作者提到了兩種方法:

  • 用不同頻率的sine和cosine函數直接計算
  • 學習出一份positional embedding

經過實驗發現兩者的結果一樣,所以最後選擇了第一種方法,公式如下:
在這裏插入圖片描述
作者提到,方法1的好處有兩點:

  • 任意位置的 P E p o s + k PE_{pos+k} 都可以被 P E p o s PE_{pos} 的線性函數表示,三角函數特性複習下:
    -在這裏插入圖片描述
  • 如果是學習到的positional embedding,(個人認爲)會像詞向量一樣受限於詞典大小。也就是隻能學習到「位置2對應的向量是(1,1,1,2)」這樣的表示。所以用三角公式明顯不受序列長度的限制,也就是可以對 比所遇到序列的更長的序列 進行表示。

參考:https://state-of-art.top/2019/01/17/Transformer%E5%8E%9F%E7%90%86%E5%92%8C%E5%AE%9E%E7%8E%B0-%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/
https://zhuanlan.zhihu.com/p/44121378

二、BERT

論文地址:https://arxiv.org/pdf/1810.04805.pdf

一、語言模型

  1. 文本的表徵:

要讓機器識別文字,處理文字,需要將語言文字編碼爲數字表示,文本表徵即文本的「數字表示「。

爲什麼要進行文本表徵?兩個原因:一.模型運算需要數字; 二.模型的運算是連續的,而文本數據是離散的。

插播ps: 什麼叫文本數據是離散的?——例如:對於V<{開心,很開心,非常開心},我們無法定義任意兩詞之間的詞,換句話說,如果」開心「代表心情的值是1,「很開心」代表心情的值是2,我們無法找到一個代表心情的值是1.5的詞。

常見的文本表徵的模型有:

傳統的: one-hot(問題:維度高)、tf-idf(詞頻統計)

基於詞向量的: Word2vec、doc2vec、glove、festext(基於特定任務、結構簡單)

基於語言模型: ELMO、GPT、BERT (基於文本特徵的,需要大量數據集)

  1. 詞向量的問題

熟悉基於深度學習的NLP問題,大部分模型首先需要進行的就是詞彙的embedding,即將詞彙映射到一個固定維度的向量上,來表徵文本。最常見的Embedding的方法是 word2vec,它有兩種訓練方式:CBOW(用周圍的詞預測當前的詞) 和 Skip-Gram(用當前詞預測周圍詞)。這種詞向量能夠學習到詞語間的共現關係,但它是存在問題的,如下:

詞向量的建立在分佈式假設前提下:即,相同上下文語境的詞有相似的含義;

如:
西 美國總統特朗普決定在墨西哥邊境修建隔離牆
西 聽說美國的那個川普總統要在墨西哥邊上修個牆
兩句話中特朗普和川普,表示相同的語義,但依照詞向量的建模方法,他們擁有不同的上下文,就會有不同的詞向量,因此詞向量無法處理同義詞的問題。

因此:提出結合上下文的動態表徵,如ELMO、GPT、BERT基於語言模型的表徵

  1. 什麼是語言模型

語言模型:給定前文的基礎上,從概率上預測下文的內容;隨着前文的越詳細,預測的目標越明確。

傳統語言模型:

N元語法模型:當前詞的出現概率依賴於它前面N個詞,它存在的問題是,它的依賴是短程依賴,僅依賴於前N個詞,但 N越大數據越稀疏,且需要的算力越大。

因此爲增加數據的長程依賴,提出了神經語言模型。

神經語言模型: RNN 、LSTM、GRU等

2.1 BERT 原理

BERT模型的全稱是Bidirectional Encoder Representations from Transformers,它是一種新型的語言模型。之所以說是一種新型的語言模型,是因爲它通過聯合調節所有層中的雙向Transformer來訓練預訓練深度雙向表示。

想深入瞭解BERT模型,首先應該理解語言模型。預訓練的語言模型對於衆多自然語言處理問題起到了重要作用,比如問答任務、命名實體識別以及情感識別。目前將預訓練的語言模型應用到NLP任務主要有兩種策略,一種是基於特徵的語言模型,如ELMo模型;另一種是基於微調的語言模型,如 GPT。這兩類語言模型各有其優缺點,而BERT的出現,似乎融合了它們所有的優點,因此纔可以在諸多後續特定任務上取得最優的效果。

2.2 BERT模型總體結構

BERT是一種基於微調的多層雙向Transformer編碼器,其中的Transformer與原始的Transformer是相同的,並且實現了兩個版本的BERT模型,在兩個版本中前饋大小都設置爲4層:

lBERTBASE:L=12,H=768,A=12,Total Parameters=110M

lBERTLARGE:L=24,H=1024,A=16,Total Parameters=340M

其中層數(即Transformer blocks塊)表示爲L,隱藏大小表示爲H,自注意力的數量爲A。

2.3 BERT模型輸入

輸入表示可以在一個詞序列中表示單個文本句或一對文本(例如,[問題,答案])。對於給定的詞,其輸入表示是可以通過三部分Embedding求和組成。Embedding的可視化表示如下圖所示:
在這裏插入圖片描述

  • token Embeddings表示的是詞向量,第一個單詞是CLS標誌,可以用於之後的分類任務,對於非分類任務,可以忽略詞向量;

  • Segment Embeddings用來區別兩種句子,因爲預訓練不只做語言模型還要做以兩個句子爲輸入的分類任務;

  • Position Embeddings是通過模型學習得到的。

2.4 BERT模型預訓練任務

BERT模型使用兩個新的無監督預測任務對BERT進行預訓練,分別是Masked LM和Next Sentence Prediction:

2.4.1 Masked LM

爲了訓練深度雙向Transformer表示,採用了一種簡單的方法:隨機掩蓋部分輸入詞,然後對那些被掩蓋的詞進行預測,此方法被稱爲「Masked LM」(MLM)。預訓練的目標是構建語言模型,BERT模型採用的是bidirectional Transformer。那麼爲什麼採用「bidirectional」的方式呢?因爲在預訓練語言模型來處理下游任務時,我們需要的不僅僅是某個詞左側的語言信息,還需要右側的語言信息。

在訓練的過程中,隨機地掩蓋每個序列中15%的token,並不是像word2vec中的cbow那樣去對每一個詞都進行預測。MLM從輸入中隨機地掩蓋一些詞,其目標是基於其上下文來預測被掩蓋單詞的原始詞彙。與從左到右的語言模型預訓練不同,MLM目標允許表示融合左右兩側的上下文,這使得可以預訓練深度雙向Transformer。Transformer編碼器不知道它將被要求預測哪些單詞,或者哪些已經被隨機單詞替換,因此它必須對每個輸入詞保持分佈式的上下文表示。此外,由於隨機替換在所有詞中只發生1.5%,所以並不會影響模型對於語言的理解。

2.4.2 Next Sentence Prediction

很多句子級別的任務如自動問答(QA)和自然語言推理(NLI)都需要理解兩個句子之間的關係,譬如上述Masked LM任務中,經過第一步的處理,15%的詞彙被遮蓋。那麼在這一任務中我們需要隨機將數據劃分爲等大小的兩部分,一部分數據中的兩個語句對是上下文連續的,另一部分數據中的兩個語句對是上下文不連續的。然後讓Transformer模型來識別這些語句對中,哪些語句對是連續的,哪些對子不連續。

2.5 模型比較

ELMo、GPT、BERT都是近幾年提出的模型,在各自提出的時候都取得了不錯的成績。並且相互之間也是相輔相成的關係。

3個模型比較如下:
在這裏插入圖片描述
再往前看,在NLP中有着舉足輕重地位的模型和思想還有Word2vec、LSTM等。

Word2vec作爲里程碑式的進步,對NLP的發展產生了巨大的影響,但Word2vec本身是一種淺層結構,而且其訓練的詞向量所「學習」到的語義信息受制於窗口大小,因此後續有學者提出利用可以獲取長距離依賴的LSTM語言模型預訓練詞向量,而此種語言模型也有自身的缺陷,因爲此種模型是根據句子的上文信息來預測下文的,或者根據下文來預測上文,直觀上來說,我們理解語言都要考慮到左右兩側的上下文信息,但傳統的LSTM模型只學習到了單向的信息。

在這裏插入圖片描述

三、BERT實現文本分類

正在研究。。。。。
如何使用BERT實現中文的文本分類(附代碼)

參考: http://www.javashuo.com/article/p-brhtlruj-hv.html
https://zhuanlan.zhihu.com/p/50717786