天天看點

BERT介紹

這篇介紹以下最近大熱的BERT,它在11個NLP任務中重新整理了成績,效果确實驚人。不過在介紹論文之前我還是想說這項工作不是很好複現,如果沒有足夠的資源就不要想了 。我覺得很可能未來的利用價值在于直接使用作者公布的預訓練好的模型。

回顧

現在有很多利用預訓練的語言表征來完成下遊NLP任務的研究,作者把它們概括為兩類feature-based和fine-tuning:

分類 代表 task-specific模型 使用方案
feature-based ELMo 需要 把表征作為feature提供給下遊任務
fine-tuning OpenAI GPT,(前文介紹過的) ULMFiT 不需要 fine tune預訓練的參數

這兩類方法的共性在于它們在預訓練中都使用了一樣的目标函數,也都使用了單向的語言模型。

作者對這些方法的批評在于它們沒有很好的利用上下文的資訊。盡管如ELMo這樣的算法利用了正向和反向的語言模型,可本質上仍然是兩個unidirectional模型的疊加。對于SQuAD這種閱讀了解式的任務,能夠同時從兩個方向提取context資訊至關重要,然而現存的方法有巨大的局限性。

BERT, OpenAI GPT, 和ELMo之間的差別如圖示:

BERT介紹

創新

作為fine-tuning這一類的方法,作者提出了改進的方案:BERT(Bidirectional Encoder Representations from Transformers)

具體做法是,

  1. 采取新的預訓練的目标函數:the “masked language model” (MLM) 随機mask輸入中的一些tokens,然後在預訓練中對它們進行預測。這樣做的好處是學習到的表征能夠融合兩個方向上的context。這個做法我覺得非常像skip-gram。過去的同類算法在這裡有所欠缺,比如上文提到的ELMo,它用的是兩個單向的LSTM然後把結果拼接起來;還有OpenAI GPT,雖然它一樣使用了transformer,但是隻利用了一個方向的注意力機制,本質上也一樣是單項的語言模型。
  2. 增加句子級别的任務:“next sentence prediction”

    作者認為很多NLP任務比如QA和NLI都需要對兩個句子之間關系的了解,而語言模型不能很好的直接産生這種了解。為了了解句子關系,作者同時pre-train了一個“next sentence prediction”任務。具體做法是随機替換一些句子,然後利用上一句進行IsNext/NotNext的預測。

在實際的預訓練中,這兩個任務是jointly training

BERT模型

模型架構

論文使用了兩種模型:

B E R T B A S E BERT_{BASE} BERTBASE​: L=12, H=768, A=12, Total Parameters=110M

B E R T L A R G E BERT_{LARGE} BERTLARGE​: L=24, H=1024, A=16, Total Parameters=340M

這裡L是layers層數(即Transformer blocks個數),H是hidden vector size, A是self-attention的“頭數”。

在NLP領域,10層以上的layer還是比較“驚人”的,印象中當年Attention is All You Need第一次提出transformer的時候,在MT任務中用到了6層。當然從結構上來講,transformers之間用的是residual connection,并且有batch normarlization這種“正常”操作,多層不是什麼問題。有意思的是在于這麼多層的結構究竟學到了什麼?NLP不能和CV做簡單的類比,網絡層數并不是“多多益善”;有論點認為低層偏向于文法特征學習,高層偏向于語義特征學習。希望将來的研究能夠給出更充分更有啟發性的觀點。

輸入的表示

針對不同的任務,模型能夠明确的表達一個句子,或者句子對(比如[問題,答案])。對于每一個token, 它的表征由其對應的token embedding, 段表征(segment embedding)和位置表征(position embedding)相加産生。如下圖:

BERT介紹

具體細節如下:

  • 論文使用了WordPiece embeddings
  • 使用了positional embeddings, 長達512位,即句子的最大長度
  • 每句話的第一個token總是[CLS]。對應它的最終的hidden state(即Transformer的輸出)用來表征整個句子,可以用于下遊的分類任務。
  • 模型能夠處理句子對。為差別兩個句子,用一個特殊token [SEP]隔開它們,另外針對不同的句子,把學習到的Segment embeddings 加到每個token的embedding上(如圖)
  • 對于單個句子僅使用一個Segment embedding
預訓練的任務

Masked LM

具體細節論文上解釋的很清楚了,這裡從略了。

提一下值得注意的一點吧:為了達到真正的bidirectional的LM的效果,作者創新性的提出了Masked LM,但是缺點是如果常常把一些詞mask起來,未來的fine tuning過程中模型有可能沒見過這些詞。這個量積累下來還是很大的。因為作者在他的實作中随機選擇了句子中15%的WordPiece tokens作為要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

    為什麼要以一定的機率保持不變呢? 這是因為剛才說了,如果100%的時間都用[MASK]來取代被選中的詞,那麼在fine tuning的時候模型會有一些沒見過的詞。那麼為啥要以一定的機率使用随機詞呢?這是因為Transformer要保持對每個輸入token分布式的表征,否則Transformer很可能會記住這個[MASK]就是"hairy"。至于使用随機詞帶來的負面影響,文章中說了,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的機率,其影響是可以忽略不計的。

Next Sentence Prediction

具體做法很容易了解,這裡仍然從略。

簡單說一下這麼做的原因。很多NLP的任務比如QA和NLI都需要了解兩個句子之間的關系,而語言模型并不能直接反應這種關系。為了是預訓練出來的模型很好的适應這些任務,作者提出了這樣的一個預訓練任務。實驗表明,增加這樣的一個任務在針對下遊的QA和NLI任務時效果非常好。

在預訓練中文章使用了BooksCorpus(800M 詞)和English Wikipedia(2,500M 詞)。

微調過程

對于句子級的分類任務,BERT的微調方法非常直覺。論文用剛才介紹過的特殊符号[CLS]來對應整個句子的表征。我們隻需要把它作為輸入通過一層網絡,最後做softmax就可以了。

實驗

GLUE

GLUE是一個自然語言任務集合,它包括以下這些資料集:

名稱 全名 用途
MNLI Multi-Genre NLI 蘊含關系推斷
QQP Quora Question Pairs 問題對是否等價
QNLI Question NLI 句子是否回答問句
SST-2 Stanford Sentiment Treebank 情感分析
CoLA Corpus of Linguistic Acceptability 句子語言性判斷
STS-B Semantic Textual Similarity 語義相似
MRPC Microsoft Research Paraphrase Corpus 句子對是否語義等價
RTE Recognizing Texual Entailment 蘊含關系推斷
WNLI Winograd NLI 蘊含關系推斷

包含了各種了解句子含義和關系的任務。看一下效果:

BERT介紹

BERT在每一個單項上的表現都是最優。一個很有意思的現象是:在所有的任務上 B E R T L A R G E BERT_{LARGE} BERTLARGE​遠超過 B E R T B A S E BERT_{BASE} BERTBASE​,其中甚至包括那些僅有少量訓練資料的任務。

Ablation Studies

BERT本身包含了很多創新點,下面看一下各個部分的貢獻。

先看一下pre-training中所用到的各種技術的重要性。

BERT介紹

No NSP : 沒有next sentence prediction(NSP)任務

LTR & No NSP: 沒有MLM,而是用Left-to-Right(LTR) LM

+BiLSTM: fine-tuning過程中,在LTR & No NSP上增加一個随機初始化的BiLSTM

另外作者還實驗了模型大小,預訓練步數,已經feature-based版本的BERT,實驗結果也非常令人信服。特别要強調的一點是:我們知道在大型任務中大的模型會帶來持續的效果增長,但是這是我們第一次看見,隻要模型經過了足夠的預訓練,在小任務中大模型也能夠帶來顯著的增長。

總結

BERT絕對是一項裡程碑式的工作。我想可能利用語言模型預訓練然後在fine-tuning這條路可能已經走到底了。無論是從技術上還是從資源上來講。技術上來講,BERT使用了masked lm和下一句預測的聯合訓練方法,在加上12層( B E R T B A S E BERT_{BASE} BERTBASE​)的transformer,的确碾壓ELMo,ULMFiT,OpenAI GPT; 從資源上講,開銷巨大,個人很難複現其工作。相信很多人在等着Google釋出模型。它有可能是CV領域利用image net預訓練出的那些著名模型在NLP領域的對等物。這同時也是Transformer的巨大勝利,它的self attention機制和position embedding相信會赢得更大的關注。理論上來講,還是存在那麼多的未知:12層或者24層的架構究竟學到了什麼?這不是CV領域,低層學文法特征,高層學語義特征不足以解釋其效果; 另外實驗中的複雜模型竟然在小資料集上也表現優異,個人覺得這不是經過了充足的預訓練就能夠解釋清楚的。

關注公衆号《沒啥深度》有關自然語言處理的深度學習應用,偶爾也有關計算機視覺

BERT介紹

繼續閱讀