由于我沒有讀過原論文,該部落格寫的内容幾乎來自于李宏毅老師的BERT課程,連結放在的最後。該部落格用于梳理筆記,以便後面複習的時候使用。如果後面讀了相關論文或者有了新的了解會進行更改補充。
由于是小白版本的内容,是以不會涉及到任何公式,僅用于了解該模型的作用。
目錄
- 1 ELMo
- 2 BERT
-
- 2.1 Why Encoder?
- 2.2 BERT如何做pre-train
-
- 2.2.1 Masked LM
- 2.2.2 Next Sentence Prediction
- 2.3 BERT的下遊任務
-
- 2.3.1 文本分類任務
- 2.3.2 token分類任務
- 2.3.3 兩句話分類任務
- 2.3.4 其他任務
- 3 GPT
- 4 參考
1 ELMo
上文中介紹了
contextualized word embedding
,簡單來說就是同樣的詞在不同的語境中可能會有不同的含義。之前的pre-train model并沒有考慮這種情況,而是一個詞一個embedding,就導緻了在不同的語境環境中表現能力有所欠缺。而
contextualized word embedding
就可以很好地避免這個問題,給每個token在不同語境中一個embedding,進而使得表達相同意思的時候有相近的embedding。連結如下:BERT學習筆記(3)——self-supervised learning and pre-train model。
ELMo(Embeddings from Language Model)就是
contextualized word embedding
的pre-train model。ELMo是一個
RNN based model
(實際上是使用的LSTM,但是LSTM是RNN的變體嘛),其思想就是将一個詞語前後的上下文資訊編碼到該詞語的詞向量中。其編碼的方式就是使用上下文預測下一個出現的詞語。由于單個LSTM隻能讀取目标詞語前面或者後面的資訊,是以需要雙向的LSTM才能夠實作讀取到目标詞語前後的資訊:
對于我們需要預測的
退了
而言,正向的RNN讀取到
退了
,這時需要預測
就
,
退了
通過RNN後會吐出一個向量,這個向量就是正向的LSTM輸出的
退了
的向量。反向的LSTM讀取到
退了
,這時需要預測
潮水
,
退了
通過RNN後會吐出一個向量,這個向量就是反向的LSTM輸出的
退了
的向量。接着将正向與反向的
退了
的向量拼接在一起,就得到了
退了
的embedding。
但是由于ELMo有很多層雙向LSTM,每一層都會輸出一個拼接的
退了
的向量,是以需要考慮如何取舍這些向量。
在ELMo中,對這群向量的做法是,将每一層輸出的向量乘上不同的權重後再加起來作為這個詞的embedding。
這個權重是與下遊任務放到一起訓練的。右圖是論文中在不同下遊任務上對這個權重的大小的一個可視化。也就展現了在不同的下遊任務中,不同層輸出的權重是不同的。
但是ELMo有個很大的問題,就是盡管使用了雙向LSTM,能夠讀到目标詞語的上文與下文,但是針對單向LSTM是無法讀取到下一部分的資訊的(就是正向LSTM在預測目标詞語時無法讀取到後文,反向LSTM在預測目标詞語時讀取不到上文)。而這個問題BERT就解決了。
2 BERT
BERT (Bidirectional Encoder Representations from Transformers)
就解決了ELMo中單個子產品無法通讀全文的問題。
BERT是一個自監督的模型,無需任何标注資料就可以自己學習。其實質就是一個Transformer的Encoder,輸入一個sequence,輸出一堆embeddings。
在進行中文的時候,大家習慣性的操作可能是jieba分詞等工具先将一句話給分詞後再輸入到model中,但是這樣做有個問題就是中文中
詞語
的數量是很多的,就會導緻向量空間很大。是以輸入
字
的話可以有效緩解這個問題。
2.1 Why Encoder?
那麼再說到為何要使用Encoder,由于剛剛也提到說ELMo的單個子產品無法通讀全文,但是
self-attention
卻可以。在
self-attention
中,token與token之間的位置差異就被抹除了(在不考慮positional encoding的情況下),而且對于模型而言,可以一次性的讀取到一個sequence的内容。而Encoder中正好就用的是
Multi-Head attention
,就解決了這個問題。
2.2 BERT如何做pre-train
接着就是BERT是如何做預訓練。由于BERT是個自監督模型,那麼肯定需要針對輸入的資料生成訓練資料與标簽。其任務與ELMo差不多,隻不過ELMo是通過上文預測下一個文本,而BERT則有兩種任務。
2.2.1 Masked LM
BERT預訓練的第一個任務叫
Masked LM
,就是輸入一堆文本,将其中部分詞彙給摳掉(文章中是15%),根據上下文來預測這個摳掉的詞是啥。這個摳的方式有很多,比如直接替換為一個
[MASK]
标簽,或者換成另外一個錯誤的字,再或者不做任何操作。
Google并沒有在每次都mask掉這些單詞,而是在确定要Mask掉的單詞之後,80%的時候會直接替換為[Mask],10%的時候将其替換為其它任意單詞,10%的時候會保留原始Token[1]。
- 80%:my dog is hairy -> my dog is [mask]
- 10%:my dog is hairy -> my dog is apple
- 10%:my dog is hairy -> my dog is hairy
經過BERT後,需要預測的token會吐出一個vector,将其輸入到一個線性分類器裡面,預測這個位置出現的token的機率。再将這個機率與之前掩蓋的時候的ground truth作交叉熵得出損失。這裡需要注意兩個點:
- 由于分類器是線性的,是以需要BERT吐出很好的representation;
- 為何是個多分類器?這是因為輸出的結果是整個詞表中出現的詞的機率,經過softmax後提取出其中機率值最大的那個數,是以是個多分類任務。
其實在這方面,BERT和
CBOW
挺像的,隻不過一個用的是
self-attention
看的整句話,而CBOW隻有一個滑動視窗。這畢竟也受限于當年的計算力不夠。
2.2.2 Next Sentence Prediction
BERT除了
Masked LM
以外,還在預訓練的時候有另外一個操作:
Next Sentence Prediction
(兩者是同步進行的,雖然後面論文證明了
Next Sentence Prediction
是沒啥效果的)。其核心就是将兩句話拼接在一起,中間用一個
[SEP]
标簽分隔,句首再用一個
[CLS]
标簽做分類。由于訓練語料中可以明确知道兩句話是不是上下句,是以可以很容易得出Ground Truth。而BERT訓練的就是判斷兩句話是否是連貫的,如果連貫,那麼
[CLS]
在經過一個線性二分類器後,輸出
YES
,否則輸出
NO
。
2.3 BERT的下遊任務
2.3.1 文本分類任務
這類任務主要就是給輸入的文本一整個标簽,比如情感分析是給整個輸入一個積極、消極、中性等标簽。
其使用方式就是在文本前加入一個
[CLS]
标簽,這個标簽經過BERT後的輸出放入到一個線性的分類器中,輸出類别。這個線性分類器是随機初始化的,需要進行訓練,而訓練過程中可以對BERT的參數進行微調。
2.3.2 token分類任務
token分類任務和之前的任務類似,隻是說之前的文檔分類隻需要對
[CLS]
标簽做分類,而token分類是需要對每一個token做分類。
2.3.3 兩句話分類任務
這個任務主要就是将兩句話放在一起,對兩句話做一個分類任務。就比如NLI任務,給定前提,給定假設,判斷假設是否正确。其和第一個任務類似,隻不過是兩句話而已。
2.3.4 其他任務
由于其他任務不是我的研究方向,是以這裡不多贅述,如果有興趣可以看下面的連結。
3 GPT
GPT (Generative Pre-Training)
這裡順帶提一句,為什麼說順帶,主要是因為這東西畢竟太龐大了,也不是我們這種窮人用得起的,大概了解下就好了……
BERT是Encoder,而GPT則是Decoder,其任務就是輸入上文,預測下文。其Decoder就是采用的
Masked Multi-Head Self-attention
,輸入的時候是看不到後文的。
4 參考
[1] 大師兄. 詞向量之BERT[EB/OL]. (2021-04-09)[2021-09-01]. https://zhuanlan.zhihu.com/p/48612853
[2] 越前小龍馬. 李宏毅-BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, and more[EB/OL]. (2020-05-07)[2021-09-01]. https://www.bilibili.com/video/BV1eV411d7Kp?p=1
[3] zxx88880. 台大教授 李宏毅 bert[EB/OL]. (2019-07-05)[2021-09-01]. https://www.bilibili.com/video/BV1C4411A78Z?from=search&seid=12011319225852042827
[4] 愛學習的涼飯爺. 李宏毅機器學習2021課程 《自監督學習》合集 從芝麻街開始的故事[EB/OL]. (2021-04-17)[2021-09-01]. https://www.bilibili.com/video/BV1Gf4y1p7Yo?p=1