天天看點

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

由于我沒有讀過原論文,該部落格寫的内容幾乎來自于李宏毅老師的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才能夠實作讀取到目标詞語前後的資訊:

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

對于我們需要預測的

退了

而言,正向的RNN讀取到

退了

,這時需要預測

退了

通過RNN後會吐出一個向量,這個向量就是正向的LSTM輸出的

退了

的向量。反向的LSTM讀取到

退了

,這時需要預測

潮水

退了

通過RNN後會吐出一個向量,這個向量就是反向的LSTM輸出的

退了

的向量。接着将正向與反向的

退了

的向量拼接在一起,就得到了

退了

的embedding。

但是由于ELMo有很多層雙向LSTM,每一層都會輸出一個拼接的

退了

的向量,是以需要考慮如何取舍這些向量。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

在ELMo中,對這群向量的做法是,将每一層輸出的向量乘上不同的權重後再加起來作為這個詞的embedding。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

這個權重是與下遊任務放到一起訓練的。右圖是論文中在不同下遊任務上對這個權重的大小的一個可視化。也就展現了在不同的下遊任務中,不同層輸出的權重是不同的。

但是ELMo有個很大的問題,就是盡管使用了雙向LSTM,能夠讀到目标詞語的上文與下文,但是針對單向LSTM是無法讀取到下一部分的資訊的(就是正向LSTM在預測目标詞語時無法讀取到後文,反向LSTM在預測目标詞語時讀取不到上文)。而這個問題BERT就解決了。

2 BERT

BERT (Bidirectional Encoder Representations from Transformers)

就解決了ELMo中單個子產品無法通讀全文的問題。

BERT是一個自監督的模型,無需任何标注資料就可以自己學習。其實質就是一個Transformer的Encoder,輸入一個sequence,輸出一堆embeddings。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

在進行中文的時候,大家習慣性的操作可能是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學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

經過BERT後,需要預測的token會吐出一個vector,将其輸入到一個線性分類器裡面,預測這個位置出現的token的機率。再将這個機率與之前掩蓋的時候的ground truth作交叉熵得出損失。這裡需要注意兩個點:

  1. 由于分類器是線性的,是以需要BERT吐出很好的representation;
  2. 為何是個多分類器?這是因為輸出的結果是整個詞表中出現的詞的機率,經過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

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

2.3 BERT的下遊任務

2.3.1 文本分類任務

這類任務主要就是給輸入的文本一整個标簽,比如情感分析是給整個輸入一個積極、消極、中性等标簽。

其使用方式就是在文本前加入一個

[CLS]

标簽,這個标簽經過BERT後的輸出放入到一個線性的分類器中,輸出類别。這個線性分類器是随機初始化的,需要進行訓練,而訓練過程中可以對BERT的參數進行微調。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

2.3.2 token分類任務

token分類任務和之前的任務類似,隻是說之前的文檔分類隻需要對

[CLS]

标簽做分類,而token分類是需要對每一個token做分類。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

2.3.3 兩句話分類任務

這個任務主要就是将兩句話放在一起,對兩句話做一個分類任務。就比如NLI任務,給定前提,給定假設,判斷假設是否正确。其和第一個任務類似,隻不過是兩句話而已。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

2.3.4 其他任務

由于其他任務不是我的研究方向,是以這裡不多贅述,如果有興趣可以看下面的連結。

3 GPT

GPT (Generative Pre-Training)

這裡順帶提一句,為什麼說順帶,主要是因為這東西畢竟太龐大了,也不是我們這種窮人用得起的,大概了解下就好了……

BERT是Encoder,而GPT則是Decoder,其任務就是輸入上文,預測下文。其Decoder就是采用的

Masked Multi-Head Self-attention

,輸入的時候是看不到後文的。

BERT學習筆記(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 參考

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

繼續閱讀