BERT解讀

背景

之前我們解讀了ELMoOpenAI GPT,我們發現他們直接的比較各有優缺點,不同於OpenAI GPT的單向語言模型,ELMo用的是雙向語言模型,這能更好的捕捉文本語句中上下文的依賴關係,但是特徵提取器方面,ELMo用的是LSTM即RNN的網絡架構,OpenAI GPT用的是更強的transformer中的decoder部分進行建模。那麼我們能不能結合兩者的優勢呢?
將transformer和雙向語言模型進行融合,便得到NLP劃時代的,也是當下在各自NLP下流任務中獲得state-of-the-art的模型------BERT(Bidirectional Encoder Representations from Transformers), 其論文參考《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

BERT的思路

結合BERT的論文我們再來分析下這幾種預訓練模型的方式。BERT的論文指出,預訓練模型有兩種方式,即feature-based 和 fine-tuning。ELMo採用的是feature-based,因爲他它是先預訓練一個多層lstm,每層進行線性加權得到的embedding,作爲下游task-specific的任務的輸入,可以看作新的特徵;而OpenAI的GPT採用的是fine-tuning形式,因爲它在後續訓練是微調所有預訓練參數。
另外從語言模型角度,GPT是完全的單向語言模型;ELMo是不完全的雙向,因爲LSTM本質還是分別從左算到右邊,從右算到左,最後concat得到,並非真正意義的雙向,另外如果網絡加深,雙向LSTM會出現自己看到自己的情況。爲了解決這個,BERT提出了MLM(Masked Language Model)達到了真正的雙向深度語言模型。

模型架構

BERT 框架分爲兩個步驟,pre-train和fine-tuning,pre-train由多個pre-train相關task共同訓練模型參數,fine-tuning的時候用task-specific的帶標籤的數據進行supervised training,修正之前pre-train之後得到的所有參數,所以說對於不同的task儘管最終模型不同,pre-train的模型是一致的。

論文中指出BERT模型分爲BERTlargeBERT_{large}BERTbaseBERT_{base}BERTlargeBERT_{large}的參數爲L=24, H=1024,A=16, Total Parameters=340M,BERTbaseBERT_{base}的參數爲L=12, H=768, A=12, Total Parameters=110M,這裏L爲tranformer的層數,H爲hidden state的維度,A爲self-attention的head的個數。 這裏要注意的是雖然BERTbaseBERT_{base} 的參數和OpenAI GPT的一致,但是由於BERT採用的是真正的雙向語言模型,其transformer採用的是encoder部分,OpenAI GPT由於是單向語言模型,爲避免提前看到後面的單詞,需要mask當前時刻以後的單詞, 即self-attention只對當前時刻t之前的單詞進行,採用了masked self-attention,所以相當於用的相當於是transformer的decoder部分。

模型的輸入和輸出

在這裏插入圖片描述
bert的輸入可以是一個句子或者多個句子,每個輸入的開頭都有個特殊標記[CLS],最後一層這個標記的hidden state的輸出可用於下游的分類問題。當輸入多個句子的時候,爲了做區分,這裏採用了兩種方式:

  1. 學習到的segment embedding區分A句子還是B句子;
  2. 特殊符號[SEP]分割A和B句子

Token embedding這裏採用WordPiece embeddings.
Position embedding用去區分單詞在句子中的位置.
綜上如圖所示bert的輸入即爲segment embedding,token embedding, position embedding的疊加(均爲訓練得到),相對於transformer,這裏多個segment embeding,並且這裏segment embedding均爲學習到的,所以每個單詞的embedding融合了句子上下文的信息,一詞多義也能得到解決。

Pre-Train BERT

這裏有兩個預訓練任務,訓練數據是 BooksCorpus 和Wikipedia,這裏只忽略表格,標題,列表;並且這裏採用整篇文章而不是隨機shuffle的句子,有利於學習長文本的連續序列。

Task1: Masked LM (MLM)

這裏做法是隨機sample句子中的部分token進行mask,,然後用上下文預測被mask的token,類似於Cloze task(完形填空),具體做法是被mask的token的最後一層輸出的final state後接softmax輸出下一個詞的概率。對於每條句子,這裏隨機mask 15%的token。
但是這樣做是有缺點的,即被mask的token被特殊token[MASK] 代替,這就造成了pre-train和fine-tuning的不一致性,因爲我們fine-tuning可是沒有[MASK]這個特殊符號的。爲了減輕這個不一致性造成的影響,並不是總是用[MASK]這個特殊符號去替換那15%被mask的單詞。實際上這15%的token中

  1. 80%的token被[MASK]替換
  2. 10%的token被隨機token替換
  3. 10%的token保持不變
    這樣做的好處是,對於輸入,任何一個字都有可能是錯誤的,模型需要更多的去依賴整個上下文來預測,更具有泛化能力;另外減輕pre-train和fine-tuning的不一致的問題。因爲這裏只預測15%的token而不是和普通LM預測全部token,模型收斂會相對慢些。

Task2: Next Sentence Prediction(NSP)

爲了讓模型理解句子間的關係,增加了NSP的預訓練任務。訓練數據構造方式如下:50%的數據用用真實的下個句子,預測label爲1,50%句子從預料隨機取,預測label爲0。這個是通過前面提到的[CLS]的輸出然後softmax預測進行而分類的。

Fine-tuning BERT

在這裏插入圖片描述

  1. 分類任務,輸入端,可以是句子A和句子B可以是單一句子,[CLS] 接softmax用於分類。
  2. 答案抽取,比如SQuAd v1.0,訓練一個start和end 向量分別爲S,E ,對每個bert輸出向量(比如BERTbaseBERT_{base} 768維)和S 或 E計算dot product,之後對所有輸出節點的點乘結果進行softmax得到該節點對應位置的起始概率或者或終止概率, 假設BERT輸出向量爲T,則用S·Ti + E·Tj表示從i位置起始,j位置終止的分數,最大的分數對應i和j(i<j)即爲預測的answer span的起點終點,訓練的目標是最大化正確的起始,終點的概率
  3. SQuAD v2.0,和SQuAD 1.1的區別在於可以有答案不存在給定文本中
    ,因此增加利用CLS的節點輸出爲C,當最大的分數對應i,j在CLS時候不存在答案;預測的時候,當S·Ti + E·Tj的最大值小於S·C + E·C,並且可以當超過設置的某一個閾值時,不存在答案即可。

總結

優點

  1. 真正雙向語言模型,學習到更好的上下文信息
  2. 分類,對話等常見下游NLP任務,都可以用這一套框架,並且基於共享的預訓練參數進行fine-tune,並且取得了state-of-the-art的效果

缺點

  1. [MASK]符號在pre-train和fine-tune不一致的問題沒有徹底解決
  2. 只預測15%的token,訓練收斂較慢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章