文章目錄
- 論文内容
- 摘要(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是使用上面的預訓練模型,然後使用帶有标簽的資料進行特定任務。
如下圖所示:
上述包含的縮寫含義如下:
-
: class的縮寫,其是一個特殊符号,每個輸入樣本的最前面都會增添一個這玩意。[CLS]
-
:Token的縮寫,Tok 1表示目前句子中的第一個詞,以此類推Tok X
-
: separator的縮寫,表示分隔符。用來分割兩個句子。[SEP]
-
: embedding的縮寫,表示該token被embedding後的向量E
-
:表示C
這個特殊的token經過BERT後的向量[CLS]
-
:表示對應Token經過BERT後的向量T
-
: Next Sentence Prediction任務NSP
-
: masked laguage model, MLM任務Mask LM
- 灰色箭頭⇧:Tok到E之間的箭頭,表示輸入,即Tok為輸入
- 紅色箭頭⇧:表示下遊任務
-
: 三種特定的任務。MNLI, NER, SQuAD
上圖表示的内容表示使用BERT進行特定任務分兩步:先對BERT進行Pre-training,然後再進行Fine-Tuning
左邊表示Pre-training,具體步驟為:
- 首先找一對兒句子(Unlabeled Sentence A and B pair)。例如:A:床前明月光,B: 疑是地上霜。
- 然後對A句子和B句子的部分詞進行Mask,得到Masked Sentence A和Masked Sentence B。例如: 床[MASK]前明月[MASK],疑是[MASK]上霜
- 在句子前加入
特殊token,兩個句子中間加入[CLS]
特殊token。例如[SEP]
[CLS]床[MASK]前明月[MASK][SEP]疑是[MASK]上霜
- 将第三步的這些token都送給BERT,最終BERT會為每個token都輸出一個向量。例如:BERT的輸出Tensor的Shape為(13, 768),其中13表示有13個token,其中第0個就是
這個特殊token的輸出向量,其包含了整句話的上下文,第1個是[CLS]
這個token的輸出向量,依次類推。床
- 之後會使用第4步的輸出向量做兩個任務:①NSP任務,使用
的輸出向量來預測A,B兩句話是不是一對兒。 ;②Maksed LM任務, 使用各[CLS]
[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都是通過學習得到的。如下圖所示:
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架構的描述并不過,大多都是在将用在下遊任務後的效果。
其核心思想主要是以下幾點:
- 在Transformer的Token Embedding和Position Embedding基礎上,又增加了Segment Embedding,用于區分增加段落資訊
- 僅使用了Transformer的EncoderLayer,然後堆疊多層,就是BERT
- 使用MLM任務和NSP任務對BERT進行預訓練
如果對BERT的實作感興趣,可以參考我的另一篇文章:
BERT源碼實作與解讀(Pytorch): https://blog.csdn.net/zhaohongfei_358/article/details/126892383