1. 程式人生 > >BERT的理解

BERT的理解

最近BERT大火,所以最近也開始研究這個模型,將自己的簡單認識記錄了下來

從模型的創新角度看一般,創新不大,但是實驗的效果太好了,基本重新整理了很多NLP的任務的最好效能,另外一點是BERT具備廣泛的通用性,就是說絕大部分NLP任務都可以採用類似的兩階段模式直接去提升效果。

與最近的語言表徵模型不同,BERT基於所有層中的左、右語境進行聯合調整,來預訓練深層雙向表徵。只需要增加一個輸出層,就可以對預訓練的BERT表徵進行微調,就能夠為更多的任務建立當前的最優模型

1、預訓練模型

BERT是一個預訓練的模型,那麼什麼是預訓練呢?舉例子進行簡單的介紹
假設已有A訓練集,先用A對網路進行預訓練,在A任務上學會網路引數,然後儲存以備後用,當來一個新的任務B,採取相同的網路結構,網路引數初始化的時候可以載入A學習好的引數,其他的高層引數隨機初始化,之後用B任務的訓練資料來訓練網路,當載入的引數保持不變時,稱為"frozen",當載入的引數隨著B任務的訓練進行不斷的改變,稱為“fine-tuning”,即更好地把引數進行調整使得更適合當前的B任務

優點:當任務B的訓練資料較少時,很難很好的訓練網路,但是獲得了A訓練的引數,會比僅僅使用B訓練的引數更優

2、BERT模型

BERT:全稱是Bidirectional Encoder Representation from Transformers,即雙向Transformer的Encoder,BERT的模型架構基於多層雙向轉換解碼,因為decoder是不能獲要預測的資訊的,模型的主要創新點都在pre-traing方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation

其中“雙向”表示模型在處理某一個詞時,它能同時利用前面的詞和後面的詞兩部分資訊,這種“雙向”的來源在於BERT與傳統語言模型不同,它不是在給你大牛股所有前面詞的條件下預測最可能的當前詞,而是隨機遮掩一些詞,並利用所有沒被遮掩的詞進行預測

下圖展示了三種預訓練模型,其中 BERT 和 ELMo 都使用雙向資訊,OpenAI GPT 使用單向資訊

可以從git上下載已經訓練好的公開模型,對下載的模型檔案進行解壓,可以看到裡面有5個檔案,其中bert_model.ckpt開頭的檔案是負責模型變數載入的,而vocab.txt是訓練時中文文字採用的字典,而bert_config.json是BERT在訓練時,可選調整的一些引數

3、BERT的輸入部分

bert的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最後增加兩個識別符號號。每個單詞有三個embedding:位置資訊embedding,這是因為NLP中單詞順序是很重要的特徵,需要在這裡對位置資訊進行編碼;單詞embedding,這個就是我們之前一直提到的單詞embedding;第三個是句子embedding,因為前面提到訓練資料都是由兩個句子構成的,那麼每個句子有個句子整體的embedding項對應給每個單詞。把單詞對應的三個embedding疊加,就形成了Bert的輸入。

如上圖所示,輸入有A句[my dog is cute]和B句[he likes playing]這兩個自然句,我們首先需要將每個單詞及特殊符號都轉化為詞嵌入向量,因為神經網路只能進行數值計算。其中特殊符[SEP]是用於分割兩個句子的符號,前面半句會加上分割碼A,後半句會加上分割碼B
因為要建模句子之間的關係,BERT 有一個任務是預測 B 句是不是 A 句後面的一句話,而這個分類任務會藉助 A/B 句最前面的特殊符 [CLS] 實現,該特殊符可以視為彙集了整個輸入序列的表徵。
最後的位置編碼是 Transformer 架構本身決定的,因為基於完全注意力的方法並不能像 CNN 或 RNN 那樣編碼詞與詞之間的位置關係,但是正因為這種屬性才能無視距離長短建模兩個詞之間的關係。因此為了令 Transformer 感知詞與詞之間的位置關係,我們需要使用位置編碼給每個詞加上位置資訊。

總結一下:
(1)token embeddings表示的是詞向量,第一個單詞是CLS,可以用於之後的分類任務
(2)segment embeddings用來區別兩種句子,因為預訓練不光做LM還要做以兩個句子為輸入的分類任務
(3)position embeddings表示位置資訊

4、NLP的四大類任務

(1)序列標註:分詞、實體識別、語義標註……
(2)分類任務:文字分類、情感計算……
(3)句子關係判斷:entailment、QA、自然語言推理
(4)生成式任務:機器翻譯、文字摘

上圖給出示例,對於句子關係類任務,很簡單,和GPT類似,加上一個起始和終結符號,句子之間加個分隔符即可。對於輸出來說,把第一個起始符號對應的Transformer最後一層位置上面串接一個softmax分類層即可。對於分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關係判斷任務類似改造;對於序列標註問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最後一層每個單詞對應位置都進行分類即可。從這裡可以看出,上面列出的NLP四大任務裡面,除了生成類任務外,Bert其它都覆蓋到了,而且改造起來很簡單直觀。(https://zhuanlan.zhihu.com/p/49271699

5、模型的評價

(1)優點

BERT是截止至2018年10月的最新的的state of the art模型,通過預訓練和精調可以解決11項NLP的任務。使用的是Transformer,相對於rnn而言更加高效、能捕捉更長距離的依賴。與之前的預訓練模型相比,它捕捉到的是真正意義上的bidirectional context資訊

(2)缺點

作者在文中主要提到的就是MLM預訓練時的mask問題:

1)[MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現;

2)每個batch只有15%的token被預測,所以BERT收斂得比left-to-right模型要慢(它們會預測每個token)

6、GLUE語料集的介紹

實驗資料以及對應的NLP任務
MNLI:蘊含關係推斷
QQP:問題對是否等價
QNLI:句子是都回答問句
SST-2:情感分析
CoLA:句子語言性判斷
STS-B:語義相似
MRPC:句子對是都語義等價
RTE:蘊含關係推斷
WNLI:蘊含關係推斷

7、git網址https://github.com/google-research/bert

 

關於bert知識乾貨的彙總https://zhuanlan.zhihu.com/p/50717786