前段時間Google推出了重磅的模型BERT(Bidirectional Encoder Representations from Transformers),刷新的多項記錄,因為前面分析了一下Transformer模型,構建了基礎,然后現在總結學習一下Bert模型。
1、什么是BERT模型?
BERT=基于Transformer 的雙向編碼器表征,顧名思義,BERT模型的根基就是Transformer,來源于attention is all you need。其中雙向的意思表示它在處理一個詞的時候,能考慮到該詞前面和后面單詞的信息,從而獲取上下文的語義。
它們三者與Word2Vec、單向LSTM之間的對比
Model | 獲取長距離語義信息程度 | 能否左右上下文語義 | 是否可以并行 |
---|---|---|---|
Word2Vec | 1 | 能 | 能 |
單向LSTM | 2 | 不能 | 不能 |
ELMo | 2 | 能 | 不能 |
GPT | 3 | 不能 | 能 |
BERT | 3 | 能 | 能 |
ELMo采用的是雙向的LSTM的架構,所以能夠抓取到左右上下文的語義
由于GPT和BERT都采用了Transformer,所有它們都是能夠完成并行計算,但是由于GPT采用的是單向的,導致了每個token只能關注左側的語境,在文獻中被稱為了“Transformer解碼器”,而BERT采用了雙向的雙向的自注意機制,所以被稱為了“Transformer編碼器”。
2、BERT模型核心點
1、BERT的架構
BERT的模型架構基于了Transformer,實現了多層雙向的Transformer編碼器。文中有兩個模型,一個是1.1億參數的base模型,一個是3.4億參數的large模型。里面所設置的參數如下:
Model | Transformer層數(L) | Hidden units(H) | self-attention heads(A) | 總參數 |
---|---|---|---|---|
BERT(base) | 12 | 768 | 12 | 1.1億 |
BERT(large) | 24 | 1024 | 16 | 3.4億 |
其中base模型的參數和OpenAI的GPT的參數一致。目的就是為了同GPT的效果進行一個比較。
2、BERT的輸入表征
下圖表示了BERT的輸入表征
3、BERT中最核心的部分
(1)Masked Language Model(MLM)
為了實現深度的雙向表示,使得雙向的作用讓每個單詞能夠在多層上下文中間接的看到自己。文中就采用了一種簡單的策略,也就是MLM。
MLM:隨機屏蔽掉部分輸入token,然后再去預測這些被屏蔽掉的token。
這里實現的時候有兩個缺點
缺點1:預訓練與微調之間的不匹配,因為微調期間是沒有看到[Mask]token。
- Solution:不是總用實際的[Mask]token替換被“masked”的詞匯,而是采用訓練數據生成器隨機去選擇15%的token。
-
例子:句子= my dog is hairy, 選擇的token是hairy。執行的流程為:
Transformer不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入詞塊的分布式語境表征。此外,因為隨機替換只發生在所有詞塊的1.5%(即15%的10%),這似乎不會損害模型的語言理解能力。
缺點2:每個batch只預測了15%的token,這說明了模型可能需要更多的預訓練步驟才能收斂。
(2)Next Sentence Prediction
現在從句子的角度來考慮問題,預訓練了一個二值化下一句預測任務,該任務可以從任何單語語料庫中輕松生成。具體來說,選擇句子A和B作為預訓練樣本:A的下一句有50%的可能是B,另外50%的可能是來自語料庫的。
例子:
- 輸入=[CLS]男子去[MASK]商店[SEP]他買了一加侖[MASK]牛奶[SEP]
Label= IsNext - 輸入=[CLS]男人[面具]到商店[SEP]企鵝[面具]是飛行##少鳥[SEP]
Label= NotNext
4、預訓練過程
訓練批量大小為256個序列(256個序列*512個詞塊=128,000個詞塊/批次),持續1,000,000個步驟,這比33億個單詞語料庫大約40個周期
Item | 值或名稱 |
---|---|
學習率 | |
Adam β1 | 0.9 |
Adam β2 | 0.999 |
L2權重衰減 | 0.01 |
dropout | 0.1 |
激活函數 | gelu |
Model | TPU個數 | TPU芯片個數 | 每次預訓練天數 |
---|---|---|---|
BERT(Base) | 4 | 16 | 4 |
BERT(Large) | 16 | 64 | 4 |
5、微調過程
微調過程中,大多數模型超參數與預訓練相同。批量大小、學習率和訓練周期數量會有區別。最佳超參數值是特定于任務的,但我們發現以下范圍的可能值可以在所有任務中很好地工作:
參數 | 值 |
---|---|
Batch | 16,32 |
學習率Adam | 5e-5,3e-5,2e-5 |
周期 | 3,4 |
4、實驗部分
BERT應用到了11項NLP的任務上面
(1)GLUE數據集
上圖中,(a)和(b)是序列級任務,(c)和(d)是詞塊級任務。圖中E代表其輸入嵌入,Ti代表詞塊i的語境表征,[CLS]是分類輸出的特殊符號,[SEP]是分割非連續詞塊序列的特殊符號。
(2)斯坦福問答數據集SQuAD v1.1
斯坦福問答數據集SQuAD v1.1:一種100k眾包問答對的集合
任務:給出一個問題和包含答案的來自維基百科的一個段落,任務是預測該段落中的其答案文本的跨度
(3)命名實體識別(NER)
數據集:CoNLL 2003命名實體識別(NER)數據集,由200k個訓練單詞組成,這些單詞已注釋為人員、組織、位置、雜項或其他(非命名實體)。
5、實踐部分
嘗試用github上面的bert-ner中文的項目,跑了一下ner,具體操作如下:
git clone https://github.com/ProHiryu/bert-chinese-ner
然后需要將Google寫的bert的源碼給放到當前的文件夾下,可以采用git clone的方式
git clone https://github.com/google-research/bert
同時需要下載Google遇訓練好了模型,然后放到了checkpoint文件夾里面。下載地址是:https://github.com/ProHiryu/bert-chinese-ner
最后的文件目錄樹是
準好了之后,就可以進行訓練了:
python BERT_NER.py --data_dir=data/ --bert_config_file=checkpoint/bert_config.json --init_checkpoint=checkpoint/bert_model.ckpt --vocab_file=vocab.txt --output_dir=./output/result_dir/
最后寫在output文件下面,可以找到eval_results.txt文件,然后我們可以看到本次訓練的結果如下:
持續更新中...
參考資料
1、BERT
2、https://www.cnblogs.com/huangyc/p/9898852.html