BERT簡介

毫不誇張的講,谷歌AI實驗室的BERT深刻影響了NLP的格局。

想像一下這樣一個在大量未標註數據集中訓練的模型,你僅僅只需要做一點的微調,就可以在11個不同的NLP任務上取得 SOTA結果。沒錯,BERT就是這樣,它徹底改變了我們設計NLP模型的方式。

BERT之後,許多NLP架構、訓練方法與語言模型如雨後春筍般湧現,比如谷歌的TransformerXL、OpenAI』s GPT-2、 XLNet、ERNIE2.0、 RoBERTa等。

註:在這篇文章中,我會提及許多Transformer的內容,如果你對Transformer不了解的話,可以先看看這篇文章——How do Transformers Work in NLP? A Guide to the Latest State-of-the-Art Models.

什麼是BERT?

你一定聽說過BERT,也知道了它是多麼不可思議以致改變了NLP的領域格局,但BERT究竟是什麼?

以下是BERT團隊對該框架的描述:BERT全稱Bidirectional Encoder Representations from Transformers(Transformers的雙向編碼表示),對未標註的文本,通過上下文約束預訓練深層雙向表示。訓練完成後,只需要對BERT預訓練模型進行fine-tune,再加上針對特定任務的輸出層就可以取得SOTA結果。

對新人來說這樣的解釋不夠明白,但這確實很好的總結了BERT的機制。接下來,我們一點點的進行剖析。

首先可以明確的是,BERT全稱Bidirectional Encoder Representations from Transformers,名字中的每一個單詞都有其意義,我們會在後面的段落一一介紹。從BERT的名字中,我們能得到最重要信息就是:BERT是基於Transformer架構的。

其次,BERT是在大量的未標註文本上預訓練得到,包括整個Wikipedia(有25億單詞)和圖書語料庫(8億單詞)。

預訓練這一步對BERT來講是至關重要的。正是由於如此龐大的語料庫的支撐,模型在訓練過程中才能對語言的工作原理進行更深入、更準確的提取,通過此過程提取到的知識對所有NLP任務來說都是『萬滑油』。

然後,BERT是「深度雙向」模型,雙向就意味着BERT在訓練過程中關注當前位置的上下文信息。

上下文信息對準確理解語義很重要的。看下面這個例子,兩句話中都包含了同一個單詞「bank」:

BETR捕獲上下文信息
BETR捕獲上下文信息

如果我們想僅依靠上文或者下文的信息去理解「bank」的含義,那麼對這兩句話中的「bank」,我們是無法區分它們的不同含義的。

解決方法就是在預測之前同時考慮上下文信息,BERT就是這樣做的。

最後,BERT最吸引人的在於,我們僅僅通過在模型後根據自己的需求加上輸出層部分就可以在各類NLP任務取得SOTA結果。

Word2Vec到BERT:NLP對語言表示的探索

「自然語言處理領域最大的挑戰之一就是訓練數據的短缺。NLP是一個多元領域,任務繁多,大多數特定領域的數據集僅僅包含幾千或幾十萬人工標註的數據。」——谷歌AI

Word2Vec和GloVe

預訓練模型從大量未標註文本數據中學習語言表示的思想來源於詞嵌入,如Word2Vec and GloVe。

詞嵌入改變了進行NLP任務的方式。通過嵌入,我們能夠捕獲單詞的上下文關係。

圖中所示的這些嵌入方法被廣泛用於下游NLP任務的訓練模型,以便獲取較好的預測結果。

之前的嵌入方法的一大缺陷在於只使用了很淺的語言模型,那就意味着它們捕獲到的信息是有限的。

另外一個缺陷就是這些嵌入模型沒有考慮單詞的上下文。就像之前提到的「bank」例子,在不同的語境下同一個單詞可能會有不同的含義。

然而,WordVec之類的模型將不同語境中的「bank」以同樣的向量表示。

於是,一些重要的信息被遺漏了。

ELMo與ULMFiT

ELMo是對語言多義性問題提出的解決方案——針對那些在不同上下文中具有不同含義的單詞。

從訓練淺層前饋網絡(Word2vec)開始,我們逐步過渡到使用複雜的雙向LSTM結構來訓練詞嵌入。

這意味着同一單詞根據其所在的上下文可以具有多個ELMO嵌入。

從那時起,我們開始注意到預訓練的優勢將使其在NLP任務中發揮重要作用。

ULMFiT更進一步,在文檔分類任務中,即使只有很少的數據(少於100),對該框架訓練的語言模型進行微調就能夠提供出色的結果。這意味着ULMFiT解決了NLP任務中的遷移學習問題。

這是我們提出的NLP遷移學習黃金公式:

NLP遷移學習 = 預訓練 + 微調

 在ULMFIT之後,許多NLP任務根據上述公式進行訓練,並獲得了新的基準。

OpenAI的GPT

OpenAI』s GPT進一步擴展了ULMFiT和ELMo中引入的pre-training和fine-tuning方法。

GPT的關鍵是用基於Transformer的結構取代了基於LSTM的語言建模結構。

不僅是文檔分類任務,GPT模型還可以對其他NLP任務進行

fine-tuned,例如常識推理,語義相似性和閱讀理解。

OpenAI的GPT在多項任務獲得SOTA結果,驗證了Transformer架構的魯棒性和有效性。  

就這樣,BERT在Transformer的基礎上橫空出世,並給NLP領域帶來巨大變革。

BERT出世

至此,解決NLP任務離不開這兩步:

1. 在未標註的大型文本語料庫上訓練語言模型(無監督或半監督)

2. 針對特定的NLP任務對大型語言模型進行微調,以充分利用預訓練模型的大量知識(監督)

接下來,我們將詳細了解BERT如何訓練模型,並在未來一段時間內成為NLP領域的行業標杆。

BERT是如何工作的?乾貨講解

深入BERT,理解為什麼BERT建立的語言模型如此有效。

1. BERT的結構

BERT架構建立在Transformer之上。 我們目前有兩個可用的變體:

  • BERT Base:12層(transformer模塊),12層注意力,1.1億參數
  • BERT Large:24層(transformer模塊),16層注意力,3.4億參數

與OpenAI的GPT模型相比,BERT Base模型大小與其相似,同時BERT Base的所有transformer層都僅包括編碼部分。

如果你對transformer結構了解不是很清楚,建議你先讀一下這篇文章。

現在我們已經了解了BERT的整體架構。在正式構建模型之前,需要先進行一些文本處理工作。

2. 文本預處理

BERT背後的開發人員添加了一組特定的規則來表示模型的輸入文本。其中許多都是創造性的設計選擇可以讓模型表現更好。

首先,每個輸入嵌入都是三個嵌入的組合:

1.位置嵌入:BERT學習並使用位置嵌入來表達單詞在句子中的位置。添加該嵌入是為了克服Transformer的局限性,與RNN不同,Transformer無法捕獲「序列」或「順序」信息

2.段嵌入:BERT也可以將句子作為任務的輸入(問題-解答)。因此,它為第一句話和第二句話學習了獨特的嵌入,以幫助模型區分它們。在上面的示例中,所有為EA的標記都屬於句子A(對於EB一樣)

3.令牌嵌入:這些是從WordPiece令牌詞彙表中為特定令牌學習的嵌入

對於給定的令牌,其輸入表示形式是通過將相應的令牌,段和位置嵌入相加而構造的。

這種全面的嵌入方案包含許多有用的模型信息。

這些預處理步驟的組合使BERT如此通用。

3. 預訓練任務

BERT對兩項NLP任務進行預訓練:

  • 遮掩語言模型
  • 下句預測

讓我們更詳細地理解這兩個任務!

a. 遮掩語言模型(雙向)

BERT是深層的雙向模型,該網絡從第一層到最後一層始終關注當前單詞的上下文進行信息捕獲。

單詞序列預測
單詞序列預測

傳統的語言模型要麼是利用從右到左的文本信息進行訓練預測下一個單詞(例如GPT),要麼是使用從左到右的文本信息進行訓練,這使模型不可避免的丟失一些信息,從而導致錯誤。

ELMo試圖通過訓練兩個LSTM語言模型(一個利用從左到右的文本信息,一個利用從右到左的文本信息),並將它們進行連接來解決這個問題。這樣雖然在一定程度上取得進步,但還遠遠不夠。

相對於GPT與ELMo,BERT在利用上下文信息這一方面取得重要突破,如上圖所示。

圖中的箭頭表示一層到下一層的信息流,頂部的綠色框表示每個輸入單詞的最終表示。

從以上圖片可以明顯看到:BERT是雙向的,GPT是單向的(從左到右的信息流),ELMo是淺層雙向的。

關於遮掩語言模型——這是BERT雙向編碼的奧秘。

對這樣一個句子——「I love to read data science blogs on Analytics Vidhya」,我們怎樣用它訓練雙向語言模型呢。

我們首先將「Analytics」替換為「[MASK]」, 「[MASK]」  表示將該位置的單詞掩蓋。

然後我們需要訓練一個模型,使其能夠預測mask掉的單詞:「I love to read data science blogs on [MASK] Vidhya.」

這就是遮掩語言模型的關鍵。BERT的作者還介紹了一些遮掩語言模型的注意事項:

  • 為了防止模型過於關注特定位置或被遮掩的標記,研究人員隨機遮掩15%的單詞
  • 被遮掩的單詞並不總是[MASK]取代,在針對特定任務的微調階段是不需要[MASK]標記的
  • 為此,研究人員的一般做法是:(對 15%需要[MASK] 單詞 )
  • (15%的)80%的單詞被[MASK]遮掩
  • 其餘10%的單詞被其他隨機單詞取代
  • 其餘10%的單詞保持不變

在我之前的一篇文章中,我詳細介紹了如何在Python中實現遮掩語言模型:Introduction to PyTorch-Transformers: An Incredible Library for State-of-the-Art NLP (with Python code)

b. 下句預測

遮掩語言模型(MLMs)學習單詞之間的關係。

此外,BERT還對下句預測任務進行訓練以學習句子之間的關係。

這類任務的典型例子就是問答系統。

任務很簡單,給A和B兩個句子,判斷B是A之後的下一句,或只是一個隨機句子?

由於這是一個二分類問題,將語料庫中的句子分解為句子對就可以得到大量訓練數據。與MLMs類似,作者也給出在進行下句預測任務時的注意事項。具體通過這個例子進行說明:

對於一個包含10萬句子的數據集,我們可以得到5萬句子對作訓練數據。

  • 訓練數據中的50%,第二句是真實的下句
  • 另外的50%,第二句是語料庫中的隨機句子
  • 前50%的標籤是『IsNext』,後50%的標籤是『NotNext』

在建模過程中結合遮掩語言模型(MLMs)和下句預測(NSP)兩個預訓練任務,這就使得BERT成為一個與任務無關的模型,經過簡單fine-tuning即可適用到其他下游任務。

超越BERT:NLP的最新技術

BERT激起了人們對NLP領域的極大興趣,尤其是Transformer的廣泛應用。 這也導致越來越多的實驗室和組織開始研究pre-training, transformers 和 fine-tuning等任務。

BERT之後,一些新的項目在NLP各項任務中取得了更好的結果。 比如RoBERTa,這是Facebook AI對BERT和DistilBERT的改進,而後者其實就是BERT的更輕巧,便捷的版本。

你可以在regarding State-of-the-Art NLP in this article了解更多BERT之後的改進模型。

本文轉自 公眾號AI開發者,原文地址