天天看點

【論文閱讀】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding論文内容摘要(Abstract)1. 介紹(Introduction)2. 相關工作(略)3. BERT4. 個人總結

文章目錄

  • 論文内容
  • 摘要(Abstract)
  • 1. 介紹(Introduction)
  • 2. 相關工作(略)
  • 3. BERT
    • 3.1 預訓練BERT(Pre-training BERT)
  • 4. 個人總結

論文内容

論文位址: https://arxiv.org/abs/1810.04805

官方代碼位址 : https://github.com/google-research/bert

摘要(Abstract)

BERT全稱Bidirectional Encoder Representations from Transformers,其是一個基于Transformer模型、使用無監督方式訓練的預訓練模型。

隻要簡單的在BERT下遊接個輸出層進行特定的任務,可能就直接是SOTA(state-of-the-art)模型了,就這麼牛。

1. 介紹(Introduction)

BERT的訓練使用的是“masked laguage model”(MLM)預訓練任務,具體為随機掩蓋住輸入中的部分詞,目标就是根據上下文來預測這些被蓋住的詞是什麼。例如:

輸入:我正在學習深度[MASK],目前學到了BERT一節,有點[MASK]。

期望輸出:學習,難

同時還使用了NSP(Next Sentence Prediction)任務,具體為給兩句話,讓網絡做二分類任務,區分這兩句話是不是一對兒。例如:

輸入:窗前明月光,疑是地上霜

期望輸出:1

輸入:鋤禾日當午,李白吃蕃薯

期望輸出:0

2. 相關工作(略)

3. BERT

基于BERT的架構需要兩個階段:pre-training和fine-tuning。

其中pre-training是使用無标簽的文本資料,是通過“masked language model”(MLM)任務來進行訓練。

而fine-tuning是使用上面的預訓練模型,然後使用帶有标簽的資料進行特定任務。

如下圖所示:

【論文閱讀】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding論文内容摘要(Abstract)1. 介紹(Introduction)2. 相關工作(略)3. BERT4. 個人總結

上述包含的縮寫含義如下:

  • [CLS]

    : class的縮寫,其是一個特殊符号,每個輸入樣本的最前面都會增添一個這玩意。
  • Tok X

    :Token的縮寫,Tok 1表示目前句子中的第一個詞,以此類推
  • [SEP]

    : separator的縮寫,表示分隔符。用來分割兩個句子。
  • E

    : embedding的縮寫,表示該token被embedding後的向量
  • C

    :表示

    [CLS]

    這個特殊的token經過BERT後的向量
  • T

    :表示對應Token經過BERT後的向量
  • NSP

    : Next Sentence Prediction任務
  • Mask LM

    : masked laguage model, MLM任務
  • 灰色箭頭⇧:Tok到E之間的箭頭,表示輸入,即Tok為輸入
  • 紅色箭頭⇧:表示下遊任務
  • MNLI, NER, SQuAD

    : 三種特定的任務。

上圖表示的内容表示使用BERT進行特定任務分兩步:先對BERT進行Pre-training,然後再進行Fine-Tuning

左邊表示Pre-training,具體步驟為:

  1. 首先找一對兒句子(Unlabeled Sentence A and B pair)。例如:A:床前明月光,B: 疑是地上霜。
  2. 然後對A句子和B句子的部分詞進行Mask,得到Masked Sentence A和Masked Sentence B。例如: 床[MASK]前明月[MASK],疑是[MASK]上霜
  3. 在句子前加入

    [CLS]

    特殊token,兩個句子中間加入

    [SEP]

    特殊token。例如

    [CLS]床[MASK]前明月[MASK][SEP]疑是[MASK]上霜

  4. 将第三步的這些token都送給BERT,最終BERT會為每個token都輸出一個向量。例如:BERT的輸出Tensor的Shape為(13, 768),其中13表示有13個token,其中第0個就是

    [CLS]

    這個特殊token的輸出向量,其包含了整句話的上下文,第1個是

    這個token的輸出向量,依次類推。
  5. 之後會使用第4步的輸出向量做兩個任務:①NSP任務,使用

    [CLS]

    的輸出向量來預測A,B兩句話是不是一對兒。 ;②Maksed LM任務, 使用各

    [MASK]

    token的輸出來預測這個token具體是什麼。

    5.1 對于NSP任務,是将

    [CLS]

    token的輸出向量送給後面的全連接配接層做二分類任務,判斷A,B兩句話是不是一對兒。

    5.2 對于Masked LM任務,則是使用全連接配接層+Softmax做多分類任務,來預測這個token是什麼。使用的是Cross Entropy Loss。

當完成Pre-training後,就可以拿BERT進行特定的任務了,也就是右圖。在右圖中,使用的問答(Question Answer)任務,輸入為問題(Question)和一段話(Paragraph),輸出為Start/End Span,即答案在這段話的什麼位置。例如:

Question:菜徐坤練習了多少年。

Paragraph:我是練習時長兩年半的蔡徐坤,擅長唱跳、Rap、籃球。

Anwser:兩年半

輸出: start=6, end=8, span=3。表示答案在Paragraph中的第6-8個字元,字元數量為3。
           
因為有Span的存在,是以Start和End隻需要一個即可。

由于BERT輸出的是向量,是以要進行下遊任務的預測,還需要接一個全連接配接層,這是圖上沒有畫出來的。

Model Architecture

BERT模型是一個多層雙向TransformerEncoder(multi-layer bidirectional Transformer encoder),即是多個Transformer Encoder堆疊起來的。

論文中提出了兩種尺寸的BERT模型:

  • B E R T B A S E \bf{BERT_{BASE}} BERTBASE​:12層,hidden size為768,Attention Head數為12,共110M個參數。
  • B E R T L A R G E \bf{BERT_{LARGE}} BERTLARGE​:24層,hidden size為1024,Attention Head數為16,共340M個參數。

Input/Output Representations

在BERT中對于token的編碼是将 Token Emebdding、Segment Embeddings和Position Embedding相加得的。也就是每個Token都包含了詞資訊、位置資訊和所在段落的資訊。這三種embedding都是通過學習得到的。如下圖所示:

【論文閱讀】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding論文内容摘要(Abstract)1. 介紹(Introduction)2. 相關工作(略)3. BERT4. 個人總結

3.1 預訓練BERT(Pre-training BERT)

作者使用兩種無監督任務來對BERT進行預訓練任務。

任務1: Masked LM :将輸入的句子拿出15%的token進行替換,然後讓網絡預測原始的token是什麼。對于被替換的token,并不是全部變成

[MASK]

,而是選擇80%的token替換成

[MASK]

,10%的token随機變成其他token,10%的token不做任何改變。對于預測,就是BERT後面接個全連接配接層+Softmax,使用Cross Entropy Loss。

任務2:Next Sentence Prediction(NSP):預測輸入中的兩句話是不是一對兒。訓練樣本中,50%是一對兒,剩下的50%不是一對兒。最終,該任務可以達到97%-98%的精準率。

由于是使用NSP任務,在沒有進行fine-tuning前,

[CLS]

token對應的輸出向量并不能很好的對整個句子進行表示。

訓練資料:BooksCorpus(800M words),English Wikipedia(2500M words)

4. 個人總結

BERT本身比較簡單,是以原論文對于BERT架構的描述并不過,大多都是在将用在下遊任務後的效果。

其核心思想主要是以下幾點:

  1. 在Transformer的Token Embedding和Position Embedding基礎上,又增加了Segment Embedding,用于區分增加段落資訊
  2. 僅使用了Transformer的EncoderLayer,然後堆疊多層,就是BERT
  3. 使用MLM任務和NSP任務對BERT進行預訓練

如果對BERT的實作感興趣,可以參考我的另一篇文章:

BERT源碼實作與解讀(Pytorch): https://blog.csdn.net/zhaohongfei_358/article/details/126892383

繼續閱讀