在看了好多大牛們的博客之后,關於BERT有了一個大概的理解,將一些知識點整理到這里。
BERT概述
BERT的全稱是Bidirectional Encoder Representation from Transformers,利用了Transformer的Encoder部分,重點是預處理/訓練pre-training,創新點是將雙向 Transformer 用於語言模型
模型介紹
BERT采用了Transformer Encoder的模型來作為語言模型,Transformer模型來自於論文[4], 完全拋棄了RNN/CNN等結構,而完全采用Attention機制來進行input-output之間關系的計算,如下圖中左半邊部分所示,其中模型包括兩個sublayer:
- Multi-Head Attention 來做模型對輸入的Self-Attention
- Feed Forward 部分來對attention計算后的輸入進行變換
預訓練
這里為了能夠有利於token-level tasks例如序列標注,同時有利於sentence-level tasks例如問答,采用了兩個預訓練任務,目標就是做語言模型,使用兩個新的無監督預測任務對BERT進行預訓練
第一種是Masked LM:
為了訓練雙向特征,這里采用了Masked Language Model的預訓練方法,隨機mask句子中的部分token,然后訓練模型來預測被去掉的token。
具體操作是:
隨機mask語料中15%的token,然后將masked token 位置輸出的final hidden vectors送入softmax,來預測masked token。
這里如果都用標記[MASK]代替token會影響模型,所以在隨機mask的時候采用以下策略:
1)80%的單詞用[MASK]token來代替
my dog is hairy → my dog is [MASK]
2)10%單詞用任意的詞來進行代替
my dog is hairy → my dog is apple
3)10%單詞不變
my dog is hairy → my dog is hairy
這樣做的目的:Transformer encoder不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分布式上下文表示
為什么要以一定的概率保持不變呢? 如果100%的時間都用[MASK]來取代被選中的詞,那么在fine-tuning的時候模型會有一些沒見過的詞。
那么為啥要以一定的概率使用隨機詞呢?這是因為Transformer要保持對每個輸入token分布式的表征,否則Transformer很可能會記住這個[MASK]就是"hairy"。
至於使用隨機詞帶來的負面影響,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影響是可以忽略不計的。
第二種是Next Sentence Prediction
在 BERT 的訓練過程中,模型接收成對的句子作為輸入,並且預測其中第二個句子是否在原始文檔中也是后續句子。
在訓練期間,50% 的輸入對在原始文檔中是前后關系,另外 50% 中是從語料庫中隨機組成的,並且是與第一句斷開的。
Input = [CLS] the man went to [MASK] store [SEP]
penguin [MASK] are flight ## less birds [SEP]
Label = NotNext
he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]
訓練模型,使模型具備理解長序列上下文的聯系的能力
BERT的輸入部分
針對不同的任務,模型能夠明確的表達一個句子,或者句子對(比如[問題,答案])。如下圖所示,輸入包括三個embedding的求和,分別是:
- Token embedding 表示當前詞的embedding,每個句子有個句子整體的embedding項對應給每個單詞
- Segment Embedding 表示當前詞所在句子的index embedding
- Position Embedding 表示當前詞所在位置的index embedding,這是因為NLP中單詞順序是很重要的特征,需要在這里對位置信息進行編碼
bert的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最后增加兩個標識符號。把單詞對應的三個embedding疊加,就形成了Bert的輸入。
接下來進行Encoder,下圖是 Transformer 的 encoder 部分,輸入是一個 token 序列,先對其進行 embedding ,然后輸入給神經網絡,輸出是大小為 H 的向量序列,每個向量對應着具有相同索引的 token。
微調Fine-tuning
Fine-tuning方式是指在已經訓練好的語言模型的基礎上,加入少量的task-specific parameters, 例如對於分類問題在語言模型基礎上加一層softmax網絡,然后在新的語料上重新訓練來進行fine-tune。