【NLP 自然語言處理】Bert 簡介&將 Bert 加入 tf.Keras Model(附程式碼)
用自己的話彙整多篇 Bert 教學,挑選能夠方便加在各式神經網絡架構的方法
起源與影響
BERT(Bidirectional Encoder Representations for Transformers)是由 Wikipedia(25億字), BooksCorpus(8億字) 等未經標籤的大量文本資料作為 input,訓練而成的模型。由於他在廣泛的 NLP task 都有良好的表現(如 Question Answering (SQuAD v1.1), Natural Language Inference (MNLI)等)已在 ML 社群引起轟動並改變許多人建構 NLP 模型的方式,同時它也啟發了後續更多語言模型的出現(如 Google’s TransformerXL, OpenAI’s GPT-2, XLNet, ERNIE2.0, RoBERTa 等)
重點介紹
(1) BERT 的構造是由多個 Transformer encoders 相疊而成 (multi-layer bidirectional Transformer encoder)
- BERT base–12 layers (transformer), 12 attention heads, & 110 million parameters
- BERT Large–24 layers, 16 attention heads and, 340 million parameters
(2) BERT 與他的前代模型(OpenAI GPT)差異最大的部分是在於使用了 Bidirectional 的概念
- Bidirectional: BERT 的 self-attention layer 是雙向的,也就是訓練時會從 token(一個字符)的上、下文學習
- 上下文很重要是因為,同樣的字擺在不同的上下文位置,會有不同含意(contextual)
(3) Pre-training steps 對 BERT 的優異表現來說相當關鍵
文本前處理
文本資料在進入 BERT 模型做訓練前有先經過前處理:
(a) 句子開頭以 [CLS] 做標記、斷句時以 [SEP] 做標記
(b) Input Embedding 是 3 個部分的加總:Token, Segment, Position
- Token: 文字本身 WordPiece Token
使用 WordPiece Tokenization:以一個字作為單位,再反覆加入頻次高的組合字到模型中(ex: 音, 樂, 符, 音樂, 音符, 樂符, …)
- Segment: 文字屬於起頭句還是結尾句
- Position: 文字在句中的位置
Pre-training
在 pre-training 階段時是同時訓練兩個 task:
- Masked Language Model:把句子中的其中一個字蓋住,讓模型預測(最符合上下文語意)最可能是填入什麼字
- Next Sentence Prediction:給模型前一句,模型預測出下一句接續什麼最符合語意
使用 BERT 並在自己的模型中微調
Bert 可以用於以下任務:
- 單句分類 Single Sequence Classification
- 對句分類 Sequence Pair Classification
- 問答任務 Question-Answering
- 單句貼標 Single Sequence Tagging:對句中的每個文字都貼標,ex: NER (Named Entity Recognition)
Fine-tuning 時的注意事項:
- 文本資料量大於 10 萬時,超參數的影響較小
- 在資料量充足的情況下,pre-training steps 越多,精確度越好
將 Bert 加入 tf.Keras Model
接著呼叫寫好的 class:
可以看到將 Bert 加在 input layer 後的模型架構: