NLP model — Google BERT

陳明佐
我就問一句,怎麼寫?
8 min readJul 22, 2019

早期NLP最一開始的方法是採用one hot,

比如:我們假設英文中常用的單詞有3萬個

那麼我們就用一個3萬維的向量表示這個詞,所有位置都置0

當我們想表示apple這個詞時,就在對應位置設置1

這種表示方式存在的問題就是,高維稀疏,高維是指有多少個詞,就需要多少個維度的向量

稀疏是指,每個向量中大部分值都是0。另外一個不足是這個向量沒有任何含義

後來出現了詞向量,word embedding,用一個低維稠密的向量去表示一個詞

通常這個向量的維度在幾百到上千之間,相比one hot幾千幾萬的維度就低了很多

詞與詞之間可以通過相似度或者距離來表示關係,相關的詞向量相似度比較高,或者距離比較近

不相關的詞向量相似度低,或者距離比較遠,這樣詞向量本身就有了含義

文本的表示問題就得到了解決。詞向量可以通過一些無監督的方法學習得到,比如CBOW或者Skip-Gram等

可以預先在語料庫上訓練出詞向量,以供後續的使用

順便提一句,在圖像中就不存在表示方法的困擾,因為圖像本身就是數值矩陣,計算機可以直接處理。

NLP中有各種各樣的任務,比如分類(Classification),問答(QA),實體命名識別(NER)等

對於這些不同的任務,最早的做法是根據每類任務定制不同的模型,輸入預訓練好的embedding

然後利用特定任務的數據集對模型進行訓練

這裡存在的問題就是,不是每個特定任務都有大量的標籤數據可供訓練

對於那些數據集非常小的任務,恐怕就難以得到一個理想的模型

圖像領域,在解決任務問題上,通常不會為了特定任務而重新設計一個模型。反而是利用通用模型

比如說 ImageNet、ResNet等模型上先做預處理、預訓練,再依照不同的任務、不同的數據進行模型參數的調整(Fine-tuning)

這個概念是引入轉移學習(Transfer Learning),再訓練只做些微的參數調整、也可以是整個模型重新訓練

而NLP領域也引入了這種做法,用一個通用模型,在非常大的語料庫上進行預訓練

然後在特定任務上進行微調,BERT就是這套方案的集大成者

BERT用了一個已有的模型結構,提出了一整套的預訓練方法和微調方法

討論BERT之前,必須先瞭解一樣是由Google提出,用於解決翻譯問題的

NLP — Transformer ( Attention is all you need )

以上圖結構作為一個基本單元,把N個這樣的基本單元順序連起來,就是BERT的算法模型

從Transformer連結中的描述可以看到,當輸入有多少個embedding,那麼輸出也就有相同數量的embedding

可以採用和RNN採用相同的叫法,把輸出叫做隱向量。在做具體NLP任務的時候,只需要從中取對應的隱向量作為輸出即可

BERT此篇論文的主要貢獻在於

  • 證明了雙向預訓練對語言表示的重要性
    與之前使用的單向語言模型進行預訓練不同,BERT使用遮蔽語言模型來實現預訓練的深度雙向表示
  • 論文表明,預先訓練的表示免去了許多工程任務需要針對特定任務修改體系架構的需求
    BERT是第一個基於微調的表示模型,它在大量的句子級和token級任務上實現了最先進的性能,強於許多面向特定任務體系架構的系統
  • BERT刷新了11項NLP任務的性能記錄
    本文還報告了BERT 的模型簡化研究(ablation study),表明模型的雙向性是一項重要的新成果
    相關代碼和預先訓練的模型將會公佈在goo.gl/language/bert

BERT並不是第一個提出預訓練加微調的方案

此前還有一套方案叫GPT(Improving Language Understanding by Generative Pre-Training),這也是BERT重點對比的方案

GPT的模型結構和BERT是相同的,都是上圖結構,只是BERT的模型規模更加龐大

GPT的pre-train方式如下所述,在一個8億單詞的語料庫上做訓練,給出前文,不斷地預測下一個單詞

比如這句話,Winter is coming,當給出第一個詞Winter之後,預測下一個詞is,之後再預測下一個詞coming

不需要標註數據,通過這種無監督訓練的方式,得到一個預訓練模型

BERT來自於Bidirectional Encoder Representations from Transformers首字母縮寫,這裡提到了一個雙向(Bidirectional)的概念

BERT在一個33億單詞的語料庫上做預訓練,語料庫就要比GPT大了幾倍

預訓練包括了兩個任務,第一個任務是隨機地扣掉15%的單詞,用一個掩碼MASK代替,讓模型去猜測這個單詞

第二個任務是,每個訓練樣本是一個上下句,有50%的樣本,下句和上句是真實的,另外50%的樣本,下句和上句是無關的

模型需要判斷兩句的關係。這兩個任務各有一個loss,將這兩個loss加起來作為總的loss進行優化

下面兩行是個例子,用括號標註的是扣掉的詞,用[MASK]來代替

正樣本:我[MASK](是)個算法工程師,我服務於WiFi萬能鑰匙這家[MASK](公司)。

負樣本:我[MASK](是)個算法工程師,今天[MASK](股票)又跌了。

我們來對比下GPT和BERT兩種預訓練方式的優劣:

GPT在預測詞的時候,只預測下一個詞,因此只能用到上文的信息,無法利用到下文的信息

而BERT是預測文中扣掉的詞,可以充分利用到上下文的信息,這使得模型有更強的表達能力,這也是BERT中Bidirectional的含義

在一些NLP任務中需要判斷句子關係,比如判斷兩句話是否有相同的含義

BERT有了第二個任務,就能夠很好的捕捉句子之間的關係

圖中那些複雜的連線表示的是詞與詞之間的依賴關係,BERT中的依賴關係既有前文又有後文,而GPT的依賴關係只有前文

“my dog is cute, he likes playing.” 的輸入形式

每個符號的輸入由3部分構成,一個是詞本身的embedding

第二個是表示上下句的embedding,如果是上句,就用A embedding,如果是下句,就用B embedding

最後,根據Transformer模型的特點,還要加上位置embedding

這裡的位置embedding是通過學習的方式得到的,BERT設計一個樣本最多支持512個位置

將3個embedding相加,作為輸入

需要注意的是,在每個句子的開頭,需要加一個Classification(CLS)符號,而SEP則代表特殊符號做為分隔

分類任務,分類任務包括對單句子的分類任務,比如判斷電影評論是喜歡還是討厭

多句子分類,比如判斷兩句話是否表示相同的含義

下圖則代表上述兩種分類任務。左邊表示兩個句子的分類,右邊是單句子分類

在輸出的隱向量中,取出CLS對應的向量C,加一層網絡W,並丟給softmax進行分類,得到預測結果P

計算過程如計算公式 P = softmax ( C・W’ )

在特定任務數據集中對Transformer模型的所有參數和網絡W共同訓練,直到收斂

新增加的網絡W是H*K維,H表示隱向量的維度,K表示分類數量

下圖C 以SQuAD v1.1為例,給出一個問題Question,並且給出一個段落Paragraph,然後從段落中標出答案的具體位置

需要學習一個開始向量S,維度和輸出隱向量維度相同,然後和所有的隱向量做點積,取值最大的詞作為開始位置

另外再學一個結束向量E,做同樣的運算,得到結束位置

附加一個條件,結束位置一定要大於開始位置

最後再看NER任務,實體命名識別,比如給出一句話,對每個詞進行標註,判斷屬於人名,地名,機構名,還是其他

圖(D)所示,加一層分類網絡,對每個輸出隱向量都做一次判斷

可以看到,這些任務,都只需要新增少量的參數,然後在特定數據集上進行訓練即可

從實驗結果來看,即便是很小的數據集,也能取得不錯的效果

Reference :

https://zhuanlan.zhihu.com/p/53099098

https://zhuanlan.zhihu.com/p/46652512

--

--