BERT原理

 

  預訓練模型架構中的不同。BERT使用雙向Transformer。OpenAI GPT使用left-to-right的Transformer。ELMo使用訓練好的left-to-right和right-to-left的LSTM的拼接爲下游任務形成特徵。在這3方面中,只有BERT表示在所有層中同時受坐上下文和右上下文約束。

 

層數L,隱藏層大小H,自注意力頭(self-attention heads)A,設置feed-forward/filter的大小爲4H:

模型大小:

  BERT(base): L=12,H=768,A=12, Total Parameters=110M

  BERT(large): L=12,H=1024,A=16,Total Parameters=340M

BERT(base)的模型大小和OpenAI GPT大小差不多,但是BERT Transformer使用雙向自注意力機制,GPT Transformer使用受限自注意力(每個token僅處理它左側上下文),在文獻中雙向Transformer通常被視作Transformer encoder,但是隻有左側上下文版本被視作Transformer decoder,因爲通常可以用作文本生成。

 

輸入表示

  能夠在一個token序列中明確表示出單個文本句子或文本對(例如[問題,答案]),輸入表示是由累加token、segment、位置嵌入三者構成。

  1. 使用WordPiece嵌入和3w個token的詞彙表。用##表示分詞。
  2. 使用學到懂得位置嵌入,支持序列長度到512個字符。
  3. 每個序列的第一個token爲了明確是否是分類嵌入的特殊嵌入(用[CLS]表示)。最終隱藏狀態(Transformer的輸出)被用作分類任務的聚合序列表示。非分類任務,這個向量忽略。
  4. 句子對被一起打包成一個單序列。我們用兩種方式區分句子。首先,將兩者用特殊字符([SEP]切分開)。第二,添加一個已學到的句子A(learned sentence A)嵌入到第一個句子的每個token中,句子B嵌入到第二個句子的每個token中。
  5. 對於單個句子的輸入,只使用句子A嵌入。

 

預訓練任務(關鍵創新):

  並沒有使用傳統從左到右或從右到左的語言模型預訓練BERT。而是使用兩個無監督預測任務預訓練BERT。

Task1:Masked LM

  直覺上,深度雙向模型比左到右和右到左的淺層連接模型更有效果。不幸的是,標準條件的語言模型可能只被訓練左到右或右到左;因爲在多層上下文中,雙向的條件允許每個詞直接“see itself”

  爲了訓練一個深度雙向表示,採用直接方法將輸入一定百分比token做隨機masking,然後只預測mask掉的tokens。通常叫這種方法“masked LM”(MLM),在Taylor1953年文章中也被稱作Cloze任務。在此case中,最終通過詞彙表相當於mask tokens的隱藏向量被喂到輸出softmax,就像標準LM一樣。在我們所有的實驗中,我們隨機地用每一個序列mask掉15%的所有WordPiece tokens。與去噪自動編碼器(Vincent el al.,2008)不同,我們僅僅預測masked掉的詞而不是從整體輸入中重新構建。

  儘管這能讓我們構建一個雙向預訓練模型,這種方式有兩個缺點。

1.我們創建了一個結餘預訓練和fine-tuning之間不匹配,因爲在fine-tune期間[MASK]token從不被看到。爲了避免這些,我們不總是用實際的[MASK]字段替換“masked”掉的詞。相反,訓練數據生成隨機選擇15%的tokens。例如在句子my dog is hairy中選擇了hairy。然後經過下列處理:

數據生成器將做下列處理,而不是始終用MASK替換已選詞語:

  1)80%的時間:用[MASK]字符替換詞語。例如,my dog is hairy -> my dog is [MASK]

  2)10%的時間:用隨機詞語替換詞語。例如,my dog is hairy -> my dog is apple

  3)10%的時間:不改變詞語。例如,my dog is hairy -> my dog is hairy。做這些目的是偏移向量表示作爲實際觀測到的詞語。

  Transformer編碼器並不知道詞語是要被預測還是被隨機詞語替換,因此它被迫保持每個輸入token的上下文表示。另外,因爲隨機替換隻發生在所有tokens的1.5%(例如10% of 15%),這似乎不會損害模型理解能力。

  2.使用MLM的第二個缺點是,每一批中只有15%的tokens被預測,意味着該模型需要更多的預訓練步驟才能收斂。(實驗證明MLM收斂平均速度確實比從左到右的模型更慢),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。

Task 2:Next Sentence Prediction

  許多重要的下游任務,例如Question Answering和基於理解兩文本句子關係的自然語言推理任務,並沒有通過語言模型直接獲得。爲了訓練一個能夠理解句子關係的模型,我們預訓練了一個二分類的next sentence prediction任務,可以從任何單語語料中生成。尤其,當從每條預訓練樣本中選擇A和B句子,B有50%的可能是A的下一個句子,也有50%的可能是來自隨機語料庫的隨機句子。例如:

Input = [CLS] the man went to [MASK] store [SEP]

he bought a gallon [MASK] milk [SEP]

Label = IsNext

Input = [CLS] the man [MASK] to the store [SEP]

penguin [MASK] are flight ##less birds [SEP]

Label = NotNext

  NotNext完全隨機,並且最終預訓練模型在這個任務上實現了97%-98%的準確率。

預訓練的處理過程

  預訓練處理過程主要根據現有語言模型的文章段。使用BooksCorpus(800M 詞語)和英文wikipedia做預訓練語料的拼接。Wikipedia語料我們僅抽取文本段落,並且忽略了lists、tables、

和headers。爲了抽取長的連續序列,關鍵是使用文檔級語料庫而不是一個打亂順序後的句子級語料庫,例如十億Word Benchmark(Chelba et al.,2013).

  爲了生成每個訓練輸入序列,從語料中採樣兩個文本塊,我們稱爲“句子“,儘管它比一般單句更長(也可以更短)。第一句接收A嵌入,第二句接收B嵌入。50%的時間B是實際A的下一句,50%的時間是隨機句子,這被”next sentence prediction”任務完成。他們被採樣,以至於合併後長度<=512個字符。LM掩蓋是在統一用15%掩蓋率的WordPiece字符標記化後被應用的,並且沒有考慮部分詞塊。

  我們用256個序列分批量(256 sequences * 512 tokens=128000 token/batch)迭代1000000次,大約是33億詞語料庫的40輪次。我們使用Adam優化器學習率1e-4, =0.9, =0.999,0.01的L2權重衰減率,學習率前1000次迭代學習率緩和並且線性衰減。在所有層中使用0.1的dropout能力。和OpenAI GPT中一樣,我們使用gelu激活函數而不是標準relu。訓練損失是平均masked LM似然和平均next sentence prediction似然的總和。

  訓練BERT(base)是在4塊雲TPU配置(共16個tpu chips)。訓練BERT(large)是在16塊TPU(共64塊chips)中。每次預訓練都需要4天時間完成。

 

Fine-tuning處理過程

  對於序列級的分類任務,BERT直接fine-tuning。爲了獲得輸入序列的固定維度的pooled,我們用輸入的第一個字符token的最終隱藏狀態(Transformer的輸出),通過構建特殊[CLS]詞嵌入表示。我們把這個向量表示爲C。對於分類層W=的fine-tuning期間,只有新參數被增加,K是分類標籤的個數。標籤概率P用標準softmax計算P=softmax()。BERT和W的所有參數被聯合fine-tuned以最大化正確標籤對數概率。對於塊級別和字符級別的預測任務,必須以特定任務的方式稍作修改以上處理過程。

  對於fine-tuning,除了批量大小、學習率和訓練迭代次數之外,大多數模超參數和預訓練的相同。Dropout率總是保持在0.1。最佳超參數值是特定任務的,但我們發現以下可能值得範圍在素有任務中都有效:

  Batch size:16,32

  Learning rate(adam): 5e-5, 3e-5, 2e-5

  Number of epochs: 3, 4

  與小數據集相比,我們也觀察到,大數據集(例如100k+標籤訓練示例)對超參數選擇的敏感度遠小很多。微調通常非常快,只需對上述參數進行詳細探索並選擇在開發集上最優的模型即可。

BERT與GPT的對比

 GPT用BooksCorpus(800M詞語)做訓練;BERT用BooksCorpus(800M詞語)和Wikipedia(2500M詞語)做訓練。

  GPT使用句子分隔標記([SEP])and分類器標記([CLS])僅是在fine-tuning期間;BERT在預訓練期間學會[CLS],[SEP]和句子A/B嵌入。

  GPT一個batch用32000詞語的批量訓練10^6 步;BERT用一批量128000詞語訓練100w步。

  在所有fine-tuning試驗中GPT均使用5e-5的學習率;BERT選擇針對特定任務中在開發集中表現最好的fine-tuning學習率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章