1. 程式人生 > >用深度學習做命名實體識別(六)-BERT介紹

用深度學習做命名實體識別(六)-BERT介紹

什麼是BERT?

BERT,全稱是Bidirectional Encoder Representations from Transformers。可以理解為一種以Transformers為主要框架的雙向編碼表徵模型。所以要想理解BERT的原理,還需要先理解什麼是Transformers。
Transformers簡單來說是一個將一組序列轉換成另一組序列的黑盒子,這個黑盒子內部由編碼器和解碼器組成,編碼器負責編碼輸入序列,然後解碼器負責將編碼器的輸出轉換為另一組序列。具體可以參考這篇文章《想研究BERT模型?先看看這篇文章吧!》

這裡需要注意的是,BERT使用的Transformers中在表示位置資訊時,沒有使用Positional Encoding,而是使用了Positional Embedding,所以位置資訊是訓練出來的,並且為了讓模型能同時考慮到單詞左邊和右邊的上下文資訊,BERT使用了雙向Transformers的架構。而由於位置資訊是採用的embedding的方式,所以對序列的最大長度就有所限制了,受限於訓練時最大序列的長度,這裡BERT預訓練模型的最大序列長度是512.也就是說如果訓練樣本超過了長度,就需要採用截斷或者其他方式以保證序列的長度在512以內。

BERT能做什麼?

  • 文字推理
    給定一對句子,預測第二個句子和第一個句子的關係:蘊含、矛盾、中性。
  • 問答
    給定問題和短文,從短文預測出對應span作為答案。
  • 文字分類
    比如對電影評論做情感預測。
  • 文字相似度匹配
    輸入兩個句子,計算語義相似度。
  • 命名實體識別
    給定一個句子,輸出句子中特定的實體,比如人名、地址、時間等。

怎麼使用BERT?

BERT有2種用法:

  • feature-based
    直接使用BERT預訓練模型提取出文字序列的特徵向量。比如文字相似度匹配。

  • fine-tuning
    在預訓練模型層上新增新的網路;凍結預訓練模型的所有層,訓練完成後,放開預訓練模型的所有層,聯合訓練解凍的部分和新增的部分。比如文字分類、命名實體識別等。

為什麼BERT能做到這些?

BERT在訓練的時候採用了無監督的方式,其主要採用2種策略來得到對序列的表徵。

MLM

為了訓練一個深度雙向表徵,作者簡單的隨機mask一些百分比的輸入tokens,然後預測那些被mask掉的tokens。這一步稱為“masked LM”(MLM),在一些文獻中,被稱為完型填空任務(Cloze task)。mask掉的tokens對應的最後的隱藏層向量餵給一個輸出softmax,像在標準的LM中一樣。在實驗中,作者為每個序列隨機mask掉了15%的 tokens。儘管這允許作者獲得雙向預訓練模型,其帶來的負面影響是在預訓練和微調模型之間創造了不匹配,因為[MASK]符號不會出現在微調階段。所以要想辦法讓那些被mask掉的詞的原本的表徵也被模型學習到,所以這裡作者採用了一些策略:
假設原句子是“my dog is hairy”,作者在3.1節 Task1中提到,會隨機選擇句子中15%的tokens位置進行mask,假設這裡隨機選到了第四個token位置要被mask掉,也就是對hairy進行mask,那麼mask的過程可以描述如下:

  • 80% 的時間:用[MASK]替換目標單詞,例如:my dog is hairy --> my dog is [MASK] 。
  • 10% 的時間:用隨機的單詞替換目標單詞,例如:my dog is hairy --> my dog is apple 。
  • 10% 的時間:不改變目標單詞,例如:my dog is hairy --> my dog is hairy 。 (這樣做的目的是使表徵偏向於實際觀察到的單詞。)

上面的過程,需要結合訓練過程的epochs來理解,每個epoch表示學完了一遍所有的樣本,所以每個樣本在多個epochs過程中是會重複輸入到模型中的,知道了這個概念,上面的80%,10%,10%就好理解了,也就是說在某個樣本每次餵給模型的時候,用[MASK]替換目標單詞的概率是80%;用隨機的單詞替換目標單詞的概率是10%;不改變目標單詞的概率是10%。

有的介紹BERT的文章中,講解MLM過程的時候,將這裡的80%,10%,10%解釋成替換原句子被隨機選中的15%的tokens中的80%用[MASK]替換目標單詞,10%用隨機的單詞替換目標單詞,10%不改變目標單詞。這個理解是不對的。

然後,作者在論文中談到了採取上面的mask策略的好處。大致是說採用上面的策略後,Transformer encoder就不知道會讓其預測哪個單詞,或者說不知道哪個單詞會被隨機單詞給替換掉,那麼它就不得不保持每個輸入token的一個上下文的表徵分佈(a distributional contextual representation)。也就是說如果模型學習到了要預測的單詞是什麼,那麼就會丟失對上下文資訊的學習,而如果模型訓練過程中無法學習到哪個單詞會被預測,那麼就必須通過學習上下文的資訊來判斷出需要預測的單詞,這樣的模型才具有對句子的特徵表示能力。另外,由於隨機替換相對句子中所有tokens的發生概率只有1.5%(即15%的10%),所以並不會影響到模型的語言理解能力。

NSP

許多下游任務,比如問答,自然語言推理等,需要基於對兩個句子之間的關係的理解,而這種關係不能直接通過語言建模來獲取到。為了訓練一個可以理解句子間關係的模型,作者為一個二分類的下一個句子預測任務進行了預訓練,這些句子對可以從任何單語言的語料中獲取到。特別是,當為每個預測樣例選擇一個句子對A和B,50%的時間B是A後面的下一個句子(標記為IsNext), 50%的時間B是語料庫中的一個隨機句子(標記為NotNext)。圖1中,C用來輸出下一個句子的標籤(NSP)。

”下個句子預測“的任務的例子:

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

還有哪些模型可以做到這些,它們和BERT的區別是什麼?

論文中作者提到了另外的兩個模型,分別是OpenAI GPT和ELMo。
圖3展示了這3個模型架構的對比:

  • BERT使用了雙向的Transformer架構,預訓練階段使用了MLM和NSP。
  • OpenAI GPT使用了left-to-right的Transformer。
  • ELMo分別使用了left-to-right和right-to-left進行獨立訓練,然後將輸出拼接起來,為下游任務提供序列特徵。

上面的三個模型架構中,只有BERT模型的表徵在每一層都聯合考慮到了左邊和右邊的上下文資訊。另外,除了架構不同,還要說明的一點是:BERT和OpenAI GPT是基於fine-tuning的方法,而ELMo是基於feature-based的方法。

更多細節

請閱讀原論文,或者參考筆者的這篇文章《BERT論文解讀》