5 分鐘入門 Google 最強NLP模型:BERT

BERT (Bidirectional Encoder Representations from Transformers)

10月11日,Google AI Language 發佈了論文

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

提出的 BERT 模型在 11 個 NLP 任務上的表現刷新了記錄,包括問答 Question Answering (SQuAD v1.1),推理 Natural Language Inference (MNLI) 等:

GLUE :General Language Understanding Evaluation
MNLI :Multi-Genre Natural Language Inference
SQuAD v1.1 :The Standford Question Answering Dataset
QQP : Quora Question Pairs 
QNLI : Question Natural Language Inference
SST-2 :The Stanford Sentiment Treebank
CoLA :The Corpus of Linguistic Acceptability 
STS-B :The Semantic Textual Similarity Benchmark
MRPC :Microsoft Research Paraphrase Corpus
RTE :Recognizing Textual Entailment 
WNLI :Winograd NLI
SWAG :The Situations With Adversarial Generations

讓我們先來看一下 BERT 在 Stanford Question Answering Dataset (SQuAD) 上面的排行榜吧: https://rajpurkar.github.io/SQuAD-explorer/


BERT 可以用來幹什麼?

BERT 可以用於問答系統,情感分析,垃圾郵件過濾,命名實體識別,文檔聚類等任務中,作爲這些任務的基礎設施即語言模型,

BERT 的代碼也已經開源: https://github.com/google-research/bert 我們可以對其進行微調,將它應用於我們的目標任務中,BERT 的微調訓練也是快而且簡單的。

例如在 NER 問題上,BERT 語言模型已經經過 100 多種語言的預訓練,這個是 top 100 語言的列表: https://github.com/google-research/bert/blob/master/multilingual.md

只要在這 100 種語言中,如果有 NER 數據,就可以很快地訓練 NER。


BERT 原理簡述

BERT 的創新點在於它將雙向 Transformer 用於語言模型, 之前的模型是從左向右輸入一個文本序列,或者將 left-to-right 和 right-to-left 的訓練結合起來。 實驗的結果表明,雙向訓練的語言模型對語境的理解會比單向的語言模型更深刻, 論文中介紹了一種新技術叫做 Masked LM(MLM),在這個技術出現之前是無法進行雙向語言模型訓練的。

BERT 利用了 Transformer 的 encoder 部分。 Transformer 是一種注意力機制,可以學習文本中單詞之間的上下文關係的。 Transformer 的原型包括兩個獨立的機制,一個 encoder 負責接收文本作爲輸入,一個 decoder 負責預測任務的結果。 BERT 的目標是生成語言模型,所以只需要 encoder 機制。

Transformer 的 encoder 是一次性讀取整個文本序列,而不是從左到右或從右到左地按順序讀取, 這個特徵使得模型能夠基於單詞的兩側學習,相當於是一個雙向的功能。

下圖是 Transformer 的 encoder 部分,輸入是一個 token 序列,先對其進行 embedding 稱爲向量,然後輸入給神經網絡,輸出是大小爲 H 的向量序列,每個向量對應着具有相同索引的 token。

圖片 by Rani Horev

當我們在訓練語言模型時,有一個挑戰就是要定義一個預測目標,很多模型在一個序列中預測下一個單詞, “The child came home from ___” 雙向的方法在這樣的任務中是有限制的,爲了克服這個問題,BERT 使用兩個策略:

1. Masked LM (MLM)

在將單詞序列輸入給 BERT 之前,每個序列中有 15% 的單詞被 [MASK] token 替換。 然後模型嘗試基於序列中其他未被 mask 的單詞的上下文來預測被掩蓋的原單詞。

這樣就需要:

  1. 在 encoder 的輸出上添加一個分類層
  2. 用嵌入矩陣乘以輸出向量,將其轉換爲詞彙的維度
  3. 用 softmax 計算詞彙表中每個單詞的概率

BERT 的損失函數只考慮了 mask 的預測值,忽略了沒有掩蔽的字的預測。這樣的話,模型要比單向模型收斂得慢,不過結果的情境意識增加了。

圖片 by Rani Horev

2. Next Sentence Prediction (NSP)

在 BERT 的訓練過程中,模型接收成對的句子作爲輸入,並且預測其中第二個句子是否在原始文檔中也是後續句子。 在訓練期間,50% 的輸入對在原始文檔中是前後關係,另外 50% 中是從語料庫中隨機組成的,並且是與第一句斷開的。

爲了幫助模型區分開訓練中的兩個句子,輸入在進入模型之前要按以下方式進行處理:

  1. 在第一個句子的開頭插入 [CLS] 標記,在每個句子的末尾插入 [SEP] 標記。
  2. 將表示句子 A 或句子 B 的一個句子 embedding 添加到每個 token 上。
  3. 給每個 token 添加一個位置 embedding,來表示它在序列中的位置。

爲了預測第二個句子是否是第一個句子的後續句子,用下面幾個步驟來預測:

  1. 整個輸入序列輸入給 Transformer 模型
  2. 用一個簡單的分類層將 [CLS] 標記的輸出變換爲 2×1 形狀的向量
  3. 用 softmax 計算 IsNextSequence 的概率

在訓練 BERT 模型時,Masked LM 和 Next Sentence Prediction 是一起訓練的,目標就是要最小化兩種策略的組合損失函數。


如何使用 BERT?

BERT 可以用於各種NLP任務,只需在覈心模型中添加一個層,例如:

  1. 在分類任務中,例如情感分析等,只需要在 Transformer 的輸出之上加一個分類層
  2. 在問答任務(例如SQUAD v1.1)中,問答系統需要接收有關文本序列的 question,並且需要在序列中標記 answer。 可以使用 BERT 學習兩個標記 answer 開始和結尾的向量來訓練Q&A模型。
  3. 在命名實體識別(NER)中,系統需要接收文本序列,標記文本中的各種類型的實體(人員,組織,日期等)。 可以用 BERT 將每個 token 的輸出向量送到預測 NER 標籤的分類層。

在 fine-tuning 中,大多數超參數可以保持與 BERT 相同,在論文中還給出了需要調整的超參數的具體指導(第3.5節)。


學習資料: https://arxiv.org/pdf/1810.04805.pdf https://www.lyrn.ai/2018/11/07/explained-bert-state-of-the-art-language-model-for-nlp/ https://medium.com/syncedreview/best-nlp-model-ever-google-bert-sets-new-standards-in-11-language-tasks-4a2a189bc155

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