天天看點

【NLP】(task3上)預訓練語言模型——BERT

學習總結

  • 回顧​​【李宏毅深度學習CP18-19】自監督學習之BERT​​​和​​【李宏毅深度學習CP20】GPT3模型​​​,後者GPT-3講的比較少内容,而這次task3學習的主要是BERT和GPT-2,GPT2的連結:​​【NLP】(task3下)預訓練語言模型——GPT-2​​。
  • 三類NLP任務:語言模型、基礎任務、應用任務:
  • 基礎任務:中文分詞、詞性标注、句法分析、語義分析等
  • 應用任務:資訊抽取、情感分析、問答系統、機器翻譯、對話系統等

幾個問題小結:

(1)word2vec到BERT改進了什麼?

答:通過 Word2Vec,我們可以使用一個向量(一組數字)來恰當地表示單詞,并捕捉單詞的語義以及單詞和單詞之間的關系,其中包括CBOW(Continuous Bag-of-Words)模型和Skip-gram模型。CBOW所做的,與BERT一樣也是做一個空白,并要求它預測空白處的内容。

CBOW是一個非常簡單的模型,它使用兩個變換,有人會問,“為什麼它隻使用兩個變換?”,“它可以更複雜嗎?”——CBOW的作者Thomas Mikolov說可以用深度學習,但是之是以選擇線性模型,最大的擔心其實是算力問題(16年訓練一個非常大的模型還是比較困難的)。現在當你使用BERT的時候,就相當于一個深度版本的CBOW,你可以做更複雜的事情,而且BERT還可以根據不同的語境,從同一個詞彙産生不同的embedding(Contextualized embedding)。

(2)BERT預訓練是如何做mask的?BERT預訓練時mask的比例,可以mask更大的比例(大于80%)嗎?

答:mask的具體實作主要有兩種方法(都可以用):

【NLP】(task3上)預訓練語言模型——BERT
  • 第一種方法:用一個特殊的符号替換句子中的一個詞,我們用 "MASK "标記來表示這個特殊符号,你可以把它看作一個新字,這個字完全是一個新詞,它不在你的字典裡,這意味着mask了原文。
  • 第二種方法:随機把某一個字換成另一個字。中文的 "灣"字被放在這裡,然後你可以選擇另一個中文字來替換它,它可以變成 "一 "字,變成 "天 "字,變成 "大 "字,或者變成 "小 "字,我們隻是用随機選擇的某個字來替換它。

(3)BERT如何進行tokenize操作?有什麼好處?

答:BERT 基本上是一個訓練好的 Transformer 的 Encoder 的棧。但是 Encoder 的 Self Attention 層,每個 token 會把大部分注意力集中到自己身上,那麼這樣将容易預測到每個 token,模型學不到有用的資訊。BERT 提出使用 mask,把需要預測的詞屏蔽掉。

BERT 預訓練的第 2 個任務是兩個句子的分類任務。在上圖中,tokenization 這一步被簡化了,因為 BERT 實際上使用了 WordPieces 作為 token,而不是使用單詞本身。在 WordPiece 中,有些詞會被拆分成更小的部分。

(4)BERT模型特别大,單張GPU訓練僅僅隻能放入1個batch的時候,怎麼訓練?

答:google 官方bert本身不支援分布式訓練,是以有其他使用者自己修改了一個版本分支,官方bert也接受了:

分支位址:https://github.com/google-research/bert/pull/568

代碼位址:https://github.com/abditag2/bert

更多可以參考——​​​bert多GPU訓練​​

文章目錄

  • ​​學習總結​​
  • ​​一、前言​​
  • ​​二、句子分類(文本分類)​​
  • ​​三、模型架構​​
  • ​​3.1 大體介紹​​
  • ​​3.2 模型輸入​​
  • ​​3.3 模型輸出​​
  • ​​3.4 與卷積神經網絡進行對比​​
  • ​​四、詞嵌入(Embedding)的新時代​​
  • ​​4.1 回顧詞嵌入 and 語境化的詞嵌入模型​​
  • ​​(1)回顧詞嵌入​​
  • ​​(2)語境化的詞嵌入模型​​
  • ​​4.2 ULM-FiT:NLP 領域的遷移學習​​
  • ​​4.3 Transformer:超越 LSTM​​
  • ​​4.4 OpenAI Transformer:預訓練一個 Transformer Decoder 來進行語言模組化​​
  • ​​下遊任務的遷移學習​​
  • ​​五、BERT:從 Decoder 到 Encoder(敲黑闆)​​
  • ​​5.1 Masked Language Model(MLM 語言模型)​​
  • ​​5.2 兩個句子的任務(NSP)​​
  • ​​5.3 BERT在不同任務上的應用​​
  • ​​5.4 将 BERT 用于特征提取​​
  • ​​六、如何使用 BERT(代碼)​​
  • ​​Reference​​

一、前言

将Transformer模型結構發揚光大的一個經典模型:BERT。

BERT在2018年出現。2018 年是機器學習模型處理文本(或者更準确地說,自然語言處理或 NLP)的轉折點。我們對這些方面的了解正在迅速發展:如何最好地表示單詞和句子,進而最好地捕捉基本語義和關系?此外,NLP 社群已經釋出了非常強大的元件,你可以免費下載下傳,并在自己的模型和 ​

​pipeline​

​ 中使用。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT-ELMo-ULM-FIT

BERT的釋出是這個領域發展的最新的裡程碑之一,這個事件标志着NLP 新時代的開始。BERT模型打破了基于語言處理的任務的幾個記錄。在 BERT 的論文釋出後不久,這個團隊還公開了模型的代碼,并提供了模型的下載下傳版本,這些模型已經在大規模資料集上進行了預訓練。這是一個重大的發展,因為它使得任何一個建構建構機器學習模型來處理語言的人,都可以将這個強大的功能作為一個現成的元件來使用,進而節省了從零開始訓練語言處理模型所需要的時間、精力、知識和資源。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT訓練和微調

BERT 開發的兩個步驟:第 1 步,你可以下載下傳預訓練好的模型(這個模型是在無标注的資料上訓練的)。然後在第 2 步隻需要關心模型微調即可。

二、句子分類(文本分類)

使用 BERT 最直接的方法就是對一個句子進行分12dfgh類。這個模型如下所示:

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT句子分類

為了訓練這樣一個模型,你主要需要訓練分類器(上圖中的 Classifier),在訓練過程中 幾乎不用改動BERT模型。這個訓練過程稱為微調,它起源于Semi-supervised Sequence Learning 和 ULMFiT。

由于我們在讨論分類器,這屬于機器學習的監督學習領域。這意味着我們需要一個帶有标簽的資料集來訓練這樣一個模型。例如,在下面這個垃圾郵件分類器的例子中,帶有标簽的資料集包括一個郵件内容清單和對應的标簽(每個郵件是“垃圾郵件”或者“非垃圾郵件,即Not Spam”)。

【NLP】(task3上)預訓練語言模型——BERT

圖:垃圾郵件分類

其他一些例子包括:

1) 語義分析

  • 輸入:電影或者産品的評價。輸出:判斷這個評價是正面的還是負面的。

    資料集示例:SST (https://nlp.stanford.edu/sentiment)

2)Fact-checking

  • 輸入:一個句子。輸出:這個句子是不是一個斷言
  • 參考視訊:https://www.youtube.com/watch?v=ddf0lgPCoSo

三、模型架構

3.1 大體介紹

現在你已經通過上面的例子,了解了如何使用 BERT,接下來讓我們更深入地了解一下它的工作原理。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT base和large

論文裡介紹了兩種不同模型大小的 BERT:

  • BERT BASE - 與 OpenAI 的 Transformer 大小相當,以便比較性能
  • BERT LARGE - 一個非常巨大的模型,它取得了最先進的結果

BERT 基本上是一個訓練好的 Transformer 的 Encoder 的棧。

2 種不同大小規模的 BERT 模型都有大量的 Encoder 層(論文裡把這些層稱為 Transformer Blocks)- BASE 版本由 12 層 Encoder,Large 版本有 20 層 Encoder。同時,這些 BERT 模型也有更大的前饋神經網絡(分别有 768 個和 1024 個隐藏層單元)和更多的 attention heads(分别有 12 個和 16 個),超過了原始 Transformer 論文中的預設配置參數(原論文中有 6 個 Encoder 層, 512 個隐藏層單元和 8 個 attention heads)。

3.2 模型輸入

【NLP】(task3上)預訓練語言模型——BERT

圖:模型輸入

第一個輸入的 token 是特殊的 [CLS],它 的含義是分類(class的縮寫)。

就像 Transformer 中普通的 Encoder 一樣,BERT 将一串單詞作為輸入,這些單詞在 Encoder 的棧中不斷向上流動。每一層都會經過 Self Attention 層,并通過一個前饋神經網絡,然後将結果傳給下一個 Encoder。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT encoder

在模型架構方面,到目前為止,和 Transformer 是相同的(除了模型大小,因為這是我們可以改變的參數)。我們會在下面看到,BERT 和 Transformer 在模型的輸出上有一些不同。

3.3 模型輸出

每個位置輸出一個大小為 hidden_size(在 BERT Base 中是 768)的向量。對于上面提到的句子分類的例子,我們隻關注第一個位置的輸出(輸入是 [CLS] 的那個位置)。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT output

這個輸出的向量現在可以作為後面分類器的輸入。論文裡用單層神經網絡作為分類器,取得了很好的效果。

【NLP】(task3上)預訓練語言模型——BERT

圖:BERT 接分類器

如果你有更多标簽(例如你是一個電子郵件服務,需要将郵件标記為 “垃圾郵件”、“非垃圾郵件”、“社交”、“推廣”),你隻需要調整分類器的神經網絡,增加輸出的神經元個數,然後經過 softmax 即可。

3.4 與卷積神經網絡進行對比

對于那些有計算機視覺背景的人來說,這個向量傳遞過程,會讓人聯想到 VGGNet 等網絡的卷積部分,和網絡最後的全連接配接分類部分之間的過程。

【NLP】(task3上)預訓練語言模型——BERT

圖:CNN

四、詞嵌入(Embedding)的新時代

上面提到的這些新發展帶來了文本編碼方式的新轉變。到目前為止,詞嵌入一直是 NLP 模型處理語言的主要表示方法。像 Word2Vec 和 Glove 這樣的方法已經被廣泛應用于此類任務。在我們讨論新的方法之前,讓我們回顧一下它們是如何應用的。

4.1 回顧詞嵌入 and 語境化的詞嵌入模型

(1)回顧詞嵌入

單詞不能直接輸入機器學習模型,而需要某種數值表示形式,以便模型能夠在計算中使用。通過 Word2Vec,我們可以使用一個向量(一組數字)來恰當地表示單詞,并捕捉單詞的語義以及單詞和單詞之間的關系(例如,判斷單詞是否相似或者相反,或者像 “Stockholm” 和 “Sweden” 這樣的一對詞,與 “Cairo” 和 "Egypt"這一對詞,是否有同樣的關系)以及句法、文法關系(例如,“had” 和 “has” 之間的關系與 “was” 和 “is” 之間的關系相同)。

人們很快意識到,相比于在小規模資料集上和模型一起訓練詞嵌入,更好的一種做法是,在大規模文本資料上預訓練好詞嵌入,然後拿來使用。是以,我們可以下載下傳由 ​

​Word2Vec​

​ 和 ​

​GloVe​

​ 預訓練好的單詞清單,及其詞嵌入。下面是單詞 “stick” 的 Glove 詞嵌入向量的例子(詞嵌入向量長度是 200)。

【NLP】(task3上)預訓練語言模型——BERT

圖: wrod vector

單詞 “stick” 的​

​Glove​

​​詞嵌入 - 一個由200個浮點數組成的向量(四舍五入到小數點後兩位)。

由于這些向量都很長,且全部是數字,是以在文章中使用以下基本形狀來表示向量:

【NLP】(task3上)預訓練語言模型——BERT

圖:vector

(2)語境化的詞嵌入模型

如果我們使用 Glove 的詞嵌入表示方法,那麼不管上下文是什麼,單詞 “stick” 都隻表示為同一個向量。一些研究人員指出,像 “stick” 這樣的詞有多種含義。為什麼不能根據它使用的上下文來學習對應的詞嵌入呢?這樣既能捕捉單詞的語義資訊,又能捕捉上下文的語義資訊。于是,語境化的詞嵌入模型應運而生。

【NLP】(task3上)預訓練語言模型——BERT

圖:ELMO

語境化的詞嵌入,可以根據單詞在句子語境中的含義,賦予不同的詞嵌入。你可以檢視這個視訊 RIP Robin Williams(​​https://zhuanlan.zhihu.com/RIP Robin Williams​​)

​ELMo​

​ 沒有對每個單詞使用固定的詞嵌入,而是在為每個詞配置設定詞嵌入之前,檢視整個句子,融合上下文資訊。它使用在特定任務上經過訓練的雙向 LSTM 來建立這些詞嵌入。

【NLP】(task3上)預訓練語言模型——BERT

圖: ELMO embedding

​ELMo​

​​ 在語境化的預訓練這條道路上邁出了重要的一步。​

​ELMo LSTM​

​ 會在一個大規模的資料集上進行訓練,然後我們可以将它作為其他語言處理模型的一個部分,來處理自然語言任務。

那麼 ELMo 的秘密是什麼呢?

ELMo 通過訓練,預測單詞序列中的下一個詞,進而獲得了語言了解能力,這項任務被稱為語言模組化。要實作 ELMo 很友善,因為我們有大量文本資料,模型可以從這些資料中學習,而不需要額外的标簽。

【NLP】(task3上)預訓練語言模型——BERT

圖: ELMO 訓練

ELMo 預訓練過程的其中一個步驟:以 “Let’s stick to” 作為輸入,預測下一個最有可能的單詞。這是一個語言模組化任務。當我們在大規模資料集上訓練時,模型開始學習語言的模式。例如,在 “hang” 這樣的詞之後,模型将會賦予 “out” 更高的機率(因為 “hang out” 是一個詞組),而不是 “camera”。

在上圖中,我們可以看到 ELMo 頭部上方展示了 LSTM 的每一步的隐藏層狀态向量。在這個預訓練過程完成後,這些隐藏層狀态在詞嵌入過程中派上用場。

【NLP】(task3上)預訓練語言模型——BERT

圖:ELMO 訓練

ELMo 通過将隐藏層狀态(以及初始化的詞嵌入)以某種方式(向量拼接之後權重求和)結合在一起,實作了帶有語境化的詞嵌入。

【NLP】(task3上)預訓練語言模型——BERT

圖:ELMO 訓練

4.2 ULM-FiT:NLP 領域的遷移學習

ULM-FiT 提出了一些方法來有效地利用模型在預訓練期間學習到的東西 - 這些東西不僅僅是詞嵌入,還有語境化的詞嵌入。ULM-FiT 提出了一個語言模型和一套流程,可以有效地為各種任務微調這個語言模型。

現在,NLP 可能終于找到了好的方法,可以像計算機視覺那樣進行遷移學習了。

4.3 Transformer:超越 LSTM

Transformer 論文和代碼的釋出,以及它在機器翻譯等任務上取得的成果,開始讓人們認為它是 LSTM 的替代品。這是因為 Transformer 可以比 LSTM 更好地處理長期依賴。

Transformer 的 Encoder-Decoder 結構使得它非常适合機器翻譯。但你怎麼才能用它來做文本分類呢?你怎麼才能使用它來預訓練一個語言模型,并能夠在其他任務上進行微調(下遊任務是指那些能夠利用預訓練模型的監督學習任務)?

4.4 OpenAI Transformer:預訓練一個 Transformer Decoder 來進行語言模組化

事實證明,我們不需要一個完整的 Transformer 來進行遷移學習和微調。我們隻需要 Transformer 的 Decoder 就可以了。Decoder 是一個很好的選擇,用它來做語言模組化(預測下一個詞)是很自然的,因為它可以屏蔽後來的詞 。當你使用它進行逐詞翻譯時,這是個很有用的特性。

【NLP】(task3上)預訓練語言模型——BERT

圖: open ai模型

OpenAI Transformer 是由 Transformer 的 Decoder 堆疊而成的

這個模型包括 12 個 Decoder 層。因為在這種設計中沒有 Encoder,這些 Decoder 層不會像普通的 Transformer 中的 Decoder 層那樣有 Encoder-Decoder Attention 子層。不過,它仍然會有 Self Attention 層(這些層使用了 mask,是以不會看到句子後來的 token)。

有了這個結構,我們可以繼續在同樣的語言模組化任務上訓練這個模型:使用大規模未标記的資料來預測下一個詞。隻需要把 7000 本書的文字扔給模型 ,然後讓它學習。書籍非常适合這種任務,因為書籍的資料可以使得模型學習到相關聯的資訊。如果你使用 tweets 或者文章來訓練,模型是得不到這些資訊的。

【NLP】(task3上)預訓練語言模型——BERT

圖: open ai模型預測下一個詞

上圖表示:OpenAI Transformer 在 7000 本書的組成的資料集中預測下一個單詞。

下遊任務的遷移學習

現在,OpenAI Transformer 已經經過了預訓練,它的網絡層經過調整,可以很好地處理文本語言,我們可以開始使用它來處理下遊任務。讓我們先看下句子分類任務(把電子郵件分類為 ”垃圾郵件“ 或者 ”非垃圾郵件“):

【NLP】(task3上)預訓練語言模型——BERT

圖: open ai模型下遊任務

OpenAI 的論文列出了一些列輸入變換方法,來處理不同任務類型的輸入。下面這張圖檔來源于論文,展示了執行不同任務的模型結構和對應輸入變換。這些都是非常很巧妙的做法。

【NLP】(task3上)預訓練語言模型——BERT

圖: open ai微調

五、BERT:從 Decoder 到 Encoder(敲黑闆)

OpenAI Transformer 為我們提供了一個基于 Transformer 的可以微調的預訓練網絡。但是在把 LSTM 換成 Transformer 的過程中,有些東西丢失了。ELMo 的語言模型是雙向的,但 OpenAI Transformer 隻訓練了一個前向的語言模型。我們是否可以建構一個基于 Transformer 的語言模型,它既向前看,又向後看(用技術術語來說 - 融合上文和下文的資訊)。

5.1 Masked Language Model(MLM 語言模型)

那麼如何才能像 LSTM 那樣,融合上文和下文的雙向資訊呢?

一種直覺的想法是使用 Transformer 的 Encoder。但是 Encoder 的 Self Attention 層,每個 token 會把大部分注意力集中到自己身上,那麼這樣将容易預測到每個 token,模型學不到有用的資訊。BERT 提出使用 mask,把需要預測的詞屏蔽掉。

下面這段風趣的對話是部落格原文的。

BERT 說,“我們要用 Transformer 的 Encoder”。

Ernie 說,”這沒什麼用,因為每個 token 都會在多層的雙向上下文中看到自己“。

BERT 自信地說,”我們會使用 mask“。      
【NLP】(task3上)預訓練語言模型——BERT

圖: BERT mask

BERT 在語言模組化任務中,巧妙地屏蔽了輸入中 15% 的單詞,并讓模型預測這些屏蔽位置的單詞。

找到合适的任務來訓練一個 Transformer 的 Encoder 是一個複雜的問題,BERT 通過使用早期文獻中的 “masked language model” 概念(在這裡被稱為完形填空)來解決這個問題。

除了屏蔽輸入中 15% 的單詞外, BERT 還混合使用了其他的一些技巧,來改進模型的微調方式。例如,有時它會随機地用一個詞替換另一個詞,然後讓模型預測這個位置原來的實際單詞。

5.2 兩個句子的任務(NSP)

兩個句子的任務,即下一個句子預測(Next Sentence Prediction,NSP)

如果你回顧 OpenAI Transformer 在處理不同任務時所做的輸入變換,你會注意到有些任務需要模型對兩個句子的資訊做一些處理(例如,判斷它們是不是同一句話的不同解釋。将一個維基百科條目作為輸入,再将一個相關的問題作為另一個輸入,模型判斷是否可以回答這個問題)。

為了讓 BERT 更好地處理多個句子之間的關系,預訓練過程還包括一個額外的任務:給出兩個句子(A 和 B),判斷 B 是否是 A 後面的相鄰句子。

【NLP】(task3上)預訓練語言模型——BERT

圖: 2個句子任務

BERT 預訓練的第 2 個任務是兩個句子的分類任務。在上圖中,tokenization 這一步被簡化了,因為 BERT 實際上使用了 WordPieces 作為 token,而不是使用單詞本身。在 WordPiece 中,有些詞會被拆分成更小的部分。

5.3 BERT在不同任務上的應用

BERT 的論文展示了 BERT 在多種任務上的應用。

【NLP】(task3上)預訓練語言模型——BERT

圖: BERT應用

5.4 将 BERT 用于特征提取

使用 BERT 并不是隻有微調這一種方法。就像 ELMo 一樣,你可以使用預訓練的 BERT 來建立語境化的詞嵌入。然後你可以把這些詞嵌入用到你現有的模型中。論文裡也提到,這種方法在命名實體識别任務中的效果,接近于微調 BERT 模型的效果。

【NLP】(task3上)預訓練語言模型——BERT

圖: BERT特征提取那麼哪種向量最适合作為上下文詞嵌入?我認為這取決于任務。論文裡驗證了 6 種選擇(與微調後的 96.4 分的模型相比):

【NLP】(task3上)預訓練語言模型——BERT

圖: BERT特征選擇

六、如何使用 BERT(代碼)

将在篇章3中進行更為詳細的講解。

嘗試 BERT 的最佳方式是通過托管在 Google Colab 上的 BERT FineTuning with Cloud TPUs。如果你之前從來沒有使用過 Cloud TPU,那這也是一個很好的嘗試開端,因為 BERT 代碼可以運作在 TPU、CPU 和 GPU。

  • 模型是在 modeling.py(class BertModel)中定義的,和普通的 Transformer encoder 完全相同。
  • run_classifier.py 是微調網絡的一個示例。它還建構了監督模型分類層。如果你想建構自己的- 分類器,請檢視這個檔案中的 create_model() 方法。
  • 可以下載下傳一些預訓練好的模型。這些模型包括 BERT Base、BERT Large,以及英語、中文和包括 102 種語言的多語言模型,這些模型都是在維基百科的資料上進行訓練的。
  • BERT 不會将單詞作為 token。相反,它關注的是 WordPiece。tokenization.py 就是 tokenizer,它會将你的單詞轉換為适合 BERT 的 wordPiece。

Reference