如何講解BERT

自從Google發出BERT paper 並且開源BERT 代碼後, hugging face 接着發出pytorch 版本。
對於pytorch 比較熟悉,並且bert的預訓練詞向量太強大,於是做項目總是用BERT。

但是面試時,卻講不好 BERT的細節。本文就是作爲自己的一個練習,如果講解BERT, BERT 裏面的關鍵點如何跟面試官講。

  1. 預訓練詞向量模型
  2. 基於transformer的雙向編碼器
  3. 構建模型時對文本的處理: positional embedding + segment embedding + token embedding
  4. BERT的預訓練任務(MLMs, NSP)

第一點: BERT 預訓練詞向量模型

首先,BERT是一個預訓練模型,預訓練的詞向量可用於下游微調任務。
對於預訓練詞向量,現在有很多這樣的模型(後BERT 時代,基於BERT 進行改進的,XLNet, MASS, UNILM, GPT/GPT-2等),在BERT 之前的也有(如 大型的Elmo, 還有最早的word2vec 和 GolVe).

爲何BERT 出現改變NLP?

"BERT代表Transformers的雙向編碼器。它被設計爲通過對左右的上下文的聯合來預訓練未標記文本得到深層的雙向表示。因此,只需一個額外的輸出層,就可以對預訓練的BERT模型進行微調,從而爲各種NLP任務創建SOTA結果。"

  1. BERT是基於Transformer架構的。

  2. BERT是在大量未標記文本的預訓練,包括整個Wikipedia(有25億個詞!)和圖書語料庫(有8億個單詞)。

    這個預訓練步驟是BERT成功背後的一半。這是因爲當我們在大型文本語料庫上訓練模型時,我們的模型開始獲得對語言工作原理的更深入和深入的瞭解。這種知識幾乎可用於所有NLP任務。

  3. BERT是"深度雙向"模型。雙向意味着BERT在訓練階段從目標詞的左右兩側上下文來學習信息。
    模型的雙向性對於真正理解語言的意義很重要

  4. BERT最令人印象深刻的方面。我們可以通過僅添加幾個其他輸出層來微調它,以創建用於各種NLP任務的最新模型。

Word2vec和Glove

通過在大型未標記文本數據上進行預訓練模型來學習語言表示的要求始於諸如Word2Vec和GloVe之類的詞嵌入。這些嵌入改變了我們執行NLP任務的方式。現在,我們有了嵌入,可以捕獲單詞之間的上下文關係.
word2vec是一個非常淺層的詞嵌入(輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax迴歸。 這個模型是如何定義數據的輸入和輸出呢?一般分爲CBOW(Continuous Bag-of-Words 與Skip-Gram兩種模型。CBOW模型的訓練輸入是某一個特徵詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。 Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好)

這些嵌入的一個限制是使用非常淺的語言模型。這意味着他們能夠獲取的信息的數量是有限的,這促使他們使用更深入、更復雜的語言模型(LSTMs和GRUs層)。

另一個關鍵的限制是,這些模型沒有考慮單詞的上下文。讓我們以“apple”爲例。同一個單詞在不同的上下文中有不同的意思。然而,像Word2Vec這樣的嵌入在多個不同的上下文中爲“apple”提供相同的詞嵌入。這是導致模型不準確的一個因素。

所有單詞在word2ve詞嵌入中,只有一個向量表示,所以無法解決一詞多意的問題。 要解決一詞多意,就要結合上下文,所以出現了Elmo,結合上下文的預訓練模型。

ELMo 和 ULMFiT

Elmo是NLP社區對一詞多義問題的迴應。相同的詞在不同的語境中有不同的含義。 從訓練淺層前饋什麼網絡(word2vec),逐步過渡到使用複雜雙向LSTM體系結構的層來訓練詞嵌入。這意味着同一個單詞可以根據它所在的上下文有多個Elmo嵌入。
ULMFiT 則更進一步。這個框架可以訓練語言模型,這些模型可以進微調,從而在各種文檔分類任務中,即使 使用更少的數據(少於100個示例)也可以提供更出色的結果。可以肯定的說ULMFiT破解了NLP 遷移學習的密碼。
NLP遷移學習的黃金法則: 預訓練+微調。
ULMFIT之後的大多數NLP的突破調整了上述等式的組成部分,並獲得了最先進的基準。

在這裏插入圖片描述

OpenAI 的GPT

OpenAI的GPT擴展了ULMFiT和ELMo引入的預訓練和微調方法。GPT本質上用基於轉換的體系結構取代了基於lstm的語言建模體系結構。
GPT 的模型可以微調到文檔分類以外的多個NLP任務, 如常識推理,語義相似性和閱讀理解。

GPT 還強調了Transformer框架的重要性,它具有簡單的體系結構並且比基於LSTM 的模型訓練的更快。還能通過使用注意力機制來學習數據中的複雜模式。

OpenAI的GPT通過實現多個最先進的技術,驗證了Transformer架構的健壯性和有用性。

這就是Transformer如何啓發了BERT以及接下來在NLP領域的所有突破。

第二點: BERT構架在Transformer之上

在淺層詞嵌入(word2vec 和glove)之後, 深度語言模型ElMo ULMFit 通過深度神經網絡挖掘上下文關係得到含有上下文的詞嵌入預訓練模型。再往後就是OpenAI 基於Elmo的拓展,將Transformer 替代LSTM 證明了transformer的爭議性。得到預訓練詞向量,只要經過目標任務的微調即可。

從此語言模型的任務就變成了一個2步過程:
1. 在大型無標籤文本語料庫(無監督或半監督)上訓練語言模型
2. 將這個大型模型微調到特定的NLP任務,以利用跟這個大型知識庫訓練模型(監督)

目前BERT 2個版本 BERT base: 12層transformer, 12個attention heads, 和1.1億個參數。 BERT large: 24層transformer,16個attention heads 和3.4億的參數。

爲了和GPT比較, BERT base與 GPT模型大小一樣。 所有的這些transformer層都是隻有Transformer的編碼器。

Transformer 裏面的幾個關鍵點: self-attention 機制 如何進行特徵提取?

請參考我另外一個Transformer提取的文章Transformer&&Attention

第三點: BERT對文本編碼處理(token embedding + positional embedding + segment embedding)

在這裏插入圖片描述
BERT 添加了一組特定的規則來表示模型的輸入文本,其中許多創造性的設計選擇,目的是使模型更好。
每個輸入的嵌入式3個嵌入的組合:

  1. 位置嵌入(positional embedding):BERT 學習並使用位置嵌入來表示句子中單詞的位置。這些是爲了克服Transformer的限制而添加的。 Transformer與RNN 不同,它不能捕獲“序列”或者“順序”信息。
  2. 段嵌入(segment embedding): BERT 還可以將句子對 作爲任務的輸入(可用於問答),這就是爲什麼它學習第一和第二句話的獨特嵌入,以幫助模型區分它們。(第一句話0, 第二句話標記爲1)
  3. 目標詞嵌入(token embedding):這些是從wordpiece 詞彙表中對特定詞彙學習到的嵌入。

對於給定的目標詞,其輸入表示是通過對相應的目標詞、段和位置的嵌入進行求和來構造的。
這種綜合的嵌入模型,使得BERT更加強大,不需要對模型的體系結構有任何更改就可以用它進行多任務訓練。

第四點: BERT 的預訓練任務(masked LM 和 Next sentence prediction)

BERT 接受兩個NLP 任務:

  • Masked Language model (遮蔽語言建模)
  • next sentence prediciton (下一句預測)

1. Masked Language Model (遮蔽的語言建模)–雙向性

BERT 被設計爲一個深度雙向模型,網絡有效地從第一層本身到最後一層來捕獲目標詞的左右上下文信息。

傳統上,我們要麼訓練語言模型預測句子中的下一個單詞(GPT中使用的從右到左的上下文),要麼訓練語言模型預測從左到右的上下文,這使得我們的模型容易由於信息丟失而產生錯誤。
Elmo 試圖通過從左到右 和 從右到左的上下文中訓練兩個LSTM 語言模型並對其進行淺層級連接來解決此問題。即使它在現有技術上有很大改進,但是還是不夠。

(我們相信深層雙向模型比從左到右或從右到左模型的淺層級鏈接更嚴格更強大- BERT)

這個就是BERT 在GPT 和Elmo 之間的改進

  • Elmo:從左到右多層LSTM + 從右到左多層LSTM + 最後淺層連接得到詞向量表示 (不算是完全意義上的雙向,因爲只在最後做了一個連接)
  • GPT:從左向右 單向Transformer 得到詞向量表示(單向的transformer)
  • BERT: 雙向 Transformer 得到詞向量表示 (真正的雙向的 transformer)
    在這裏插入圖片描述

BERT是雙向的,GPT是單向的(信息僅從左向右流動),而ELMO是淺雙向的

關於屏蔽語言模型:
假如我們有一句話,“我喜歡閱讀關於分析數據科學的博客”,我們想要訓練一個雙向的語言模型,與其試圖預測序列中的下一個單詞,還不如構建一個模型,從序列本身預測缺失的單詞。

我們把 “分析”換成 “[MASK]”,這是表示被屏蔽的單詞, 以這種方式進行訓練,使得它能夠預測 “分析” 這個詞語,所以句子變爲 “我喜歡閱讀關於[MASK]數據科學的博客”。
這是遮蔽語言模型的關鍵所在,BERT 還有一些細節:

  • 爲了防止模型過於關注一個特定的位置或被掩蓋的標記,研究人員隨機掩蓋了15%的單詞
  • 掩碼字並不是總是被[MASK]替換,因爲[MASK] 在調優期間不會出現
  • 因此,BERT 裏面採用以下方法;
    80%的情況,單詞被替換成[MASK]
    10%的情況,這些單詞被隨機替換
    剩下10%單詞保持不變。

BERT 的 MASK缺點:

  1. BERT是對word piece進行mask的,這樣如果一個詞是 'prediction’對應的word piece是‘pre#’ ‘#dic#’ ‘#tion’ ,如果中間的被[MASK],那麼根據前後很容易 預測出 中的單詞, 所以基於word piece的mask 使得預測任務變得簡單。 這個在後bert時代模型裏面有改進(XLNet 等 whole word mask機制)
  2. 同一個句子裏面有15%被mask,這樣預測的時候 相當於默認 這麼被mask的詞之間是相互獨立的,因爲在預測 maskA的時候, maskB是不知道的,但是實際上並不是獨立的,比如 前面mask一個單詞‘娛樂’, 後面mask一個單詞‘唱歌’並不獨立,但是如果mask 之後,則認爲2者互相獨立。(這個好像影響不大)

2. Next sentence prediction (下一句預測)

掩蔽語言模型(MLMs)學習理解單詞之間的關係。此外,BERT還接受了下一個句子預測任務的訓練,這些任務需要理解句子之間的關係。

句子之間關係的 任務 比如:問答系統。

任務很簡單。給定兩個句子——A和B, B是語料庫中A後面的下一個句子,還是一個隨機的句子?

由於它是一個二分類任務,因此可以通過將任何語料庫分成句子對來輕鬆生成數據。就像mlm一樣,作者在這裏也添加了一些注意事項。讓我們舉個例子:

假設我們有一個包含100,000個句子的文本數據集。因此,將有50,000個訓練例子或句子對作爲訓練數據。

  • 對於50%的對來說,第二個句子實際上是第一個句子的下一個句子
  • 對於剩下的50%,第二句是語料庫中的一個隨機句子
  • 第一種情況的標籤是“IsNext”,而第二種情況的標籤是“NotNext”

這就是爲什麼BERT能夠成爲一個真正的任務不可知的模型。它結合了掩蔽語言模型(MLM)和下一個句子預測(NSP)的預訓練任務。

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 6128
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章