后 BERT 时代的那些 NLP 预训练模型
本文介紹對于 BERT 的 Pretraining 過程進行改進的幾篇文章,包括?Pre-Training with Whole Word Masking for Chinese BERT、ERNIE: Enhanced Representation through Knowledge Integration?和?ERNIE 2.0: A Continual Pre-training Framework for Language Understanding。
注意:這幾篇文章都是對 BERT 模型的 Pretraining 階段的 Mask 進行了不同方式的改進,但是對于 BERT 模型本身(基于 Mask LM 的 Pretraining、Transformer 模型和 Fine-tuning)沒有做任何修改。
因此對于不需要 Pretraining 的用戶來說,只要把 Google 提供的初始模型替換成這些模型就可以直接享受其改進了(百度的 ERNIE 和 ERNIE 2.0 是基于 PaddlePaddle 的,TensorFlow 和 PyTorch 用戶需要借助第三方工具進行轉換)。
閱讀本文前,讀者需要了解 BERT 的基本概念,不熟悉的讀者可以先學習 BERT 課程?[1]、BERT 模型詳解?[2]?和 BERT 代碼閱讀?[3]。
Whole Word Masking
基本思想
注:雖然我這里介紹的是哈工大與科大訊飛的論文?Pre-Training with Whole Word Masking for Chinese BERT,但是 Whole Word Mask 其實是 BERT 的作者提出來的。他們并沒有發論文,因為這是一個很簡單(但是很有效)的改進。
由于中文的特殊性,BERT 并沒有提供中文版的 Pretraining 好的 Whole Word Masking 模型。中文版的 Pretraining Whole Word Masking 模型可以在這里下載:
https://github.com/ymcui/Chinese-BERT-wwm
為了解決 OOV 的問題,我們通常會把一個詞切分成更細粒度的 WordPiece(不熟悉的讀者可以參考機器翻譯 · 分詞?[4]?和?WordpieceTokenizer?[5])。BERT 在 Pretraining 的時候是隨機 Mask 這些 WordPiece 的,這就可能出現只 Mask 一個詞的一部分的情況,比如下面的例子:
▲?圖.?Whole Word Mask模型的示例
probability 這個詞被切分成 ”pro”、”#babi” 和 ”#lity”3 個 WordPiece。有可能出現的一種隨機 Mask 是把 ”#babi” Mask 住,但是 ”pro”和”#lity” 沒有被 Mask。這樣的預測任務就變得容易了,因為在”pro”和”#lity”之間基本上只能是”#babi”了。這樣它只需要記住一些詞(WordPiece 的序列)就可以完成這個任務,而不是根據上下文的語義關系來預測出來的。
類似的中文的詞”模型”也可能被 Mask 部分(其實用”琵琶”的例子可能更好,因為這兩個字只能一起出現而不能單獨出現),這也會讓預測變得容易。
為了解決這個問題,很自然的想法就是詞作為一個整體要么都 Mask 要么都不 Mask,這就是所謂的 Whole Word Masking。這是一個很簡單的想法,對于 BERT 的代碼修改也非常少,只是修改一些 Mask 的那段代碼。對于英文來說,分詞是一個(相對)簡單的問題。哈工大與科大訊飛的論文對中文進行了分詞,然后做了一些實驗。
實現細節
數據預處理
Pretraining
Whole Word Masking 可以看做是對原來 BERT 模型的一個改進,一種增加任務難度的方法,因此我們并不是從頭開始 Pretraining,而是基于原來 Google 發布的中文模型繼續訓練的(我感覺另外一個原因就是沒有那么多計算資源從頭開始)。
這里使用了 batch 大小為 2,560,最大長度為 128 訓練了 100k 個 steps,其中初始的 learning rate 是 1e-4 (warm-up ratio 是 10%)。然后又使用最大長度為 512(batch 大小改小為 384)訓練了 100k 個 steps,這樣讓它學習更長距離的依賴和位置編碼。
BERT 原始代碼使用的是 AdamWeightDecayOptimizer,這里換成了 LAMB 優化器,因為它對于長文本效果更好。
Fine-tuning
Fine-tuning 的代碼不需要做任何修改,只不過是把初始模型從原來的基于 WordPiece 的 Pretraining 的模型改成基于 Whole Word Masking 的 Pretraining 模型。
實驗結果
閱讀理解任務
▲?圖.?CMRC 2018數據集上的實驗結果
▲?圖.?DRCD數據集上的實驗結果
▲?圖.?CJRC數據集上的實驗結果
▲?圖.?NER任務的實驗結果
自然語言推理? (Natural Language Inference)
對于自然語言推理任務 XNLI 中的中文數據進行了實驗,結果如下。
▲?圖.?XNLI中文數據集的實驗結果圖
情感分類 (Sentiment Classification)
在 ChnSentiCorp 和 Sina Weibo 兩個數據集上的實驗結果如下。
▲?圖.?情感分類任務的實驗結果
句對匹配 (Sentence Pair Matching)
在 LCQMC 和 BQ Corpu 數據集上的實驗結果為:
▲?圖.?句對匹配任務的實驗結果
文檔分類
▲?圖.?THUCNews數據集上的實驗結果
一些技巧
下面是論文作者在實現時的一些技巧總結:
初始的 learning rate 是最重要的超參數,一定要好好調。
BERT 和 BERT-wwm 的 learning rate 是相同的,但是如果使用 ERNIE,則需要調整。
BERT 和 BERT-wwm 使用 Wiki 訓練,因此在比較正式和標準的數據集上效果較好。而百度的 ERNIE 使用了網頁和貼吧等數據,因此在非正式的語境中效果較好。
對于長文本,比如閱讀理解和文檔分類等任務,建議使用 BERT 和 BERT-wwm。
如果任務的領域和 Wiki 等差異很大,并且我們有較多未標注數據,那么建議使用領域數據進行 Pretraining。
對于中文(簡體和繁體),建議使用 BERT-wwm(而不是 BERT)的 Pretraining 模型。
更新
https://github.com/ymcui/Chinese-BERT-wwm
ERNIE
基本思想
ERNIE 是百度在論文?ERNIE: Enhanced Representation through Knowledge Integration?提出的模型,它其實比 Whole Word Masking 更早地提出了以此為單位的 Mask 方法。
雖然它的這個名字有些大:通過知識集成的增強表示(ERNIE),但是它的思想其實和前面的 Whole Word Masking 非常類似,只是把 Masking 的整體從詞多大到短語(phrase)和實體(entity)而已。
這篇論文的發表時間其實比前面的 Whole Word Masking 要早,因此我們可以認為 Whole Word Masking 可能借鑒了其思想(arXiv 上的這篇論文的時間是 2019/4/19;而 BERT 更新英文 Whole Word Masking 模型的時間是 2019/5/31)?我這里把它放到后面介紹的目的是為了能讓百度的兩篇論文放到一起。
▲?圖.?ERNIE和BERT的對比
如上圖所示,ERNIE 會把 phrase “a series of”和entity “J. K. Rowling”作為一個整體來 Mask(或者不 Mask)。
當然,這里需要用 NLP 的工具來識別 phrase 和 entity。對于英文的 phrase,可以使用 chunking 工具,而中文是百度自己的識別 phrase 的工具。entity 識別工具的細節論文里沒有提及。
Pretraining的數據
訓練數據包括中文 Wiki、百度百科、百度新聞和百度貼吧數據,它們的句子數分別是 21M, 51M, 47M 和 54M,因此總共 173M 個句子。
此外把繁體中文都轉換成了簡體中文,英文都變成了小寫,模型的詞典大小是 17,964。
多層級Mask的訓練
ERNIE 沒有使用 WordPiece,而是把詞作為基本的單位。它包括 3 種層級的 Masking:基本、phrase 和 entity,如下圖所示。
▲?圖. 一個句子的不同層級的Masking
訓練的時候首先基于基本級別的 Masking 訓練,對于英語來說,用空格分開的就是詞;對于中文來說,就是字。基本級別對于英文來說和 BERT 的 Whole Word Masking 類似,但是對于中文來說就是等價于最原始的 BERT。
接著基于 phrase 級別的 Masking 進行訓練,這樣它可以學到短語等更高層的語義。最后使用 entity 級別的 Masking 來訓練。
Dialogue Language Model
除了 Mask LM 之外,對于對話數據(貼吧),ERNIE 還訓練了所謂的 Dialogue LM,如下圖所示。
▲?圖. Dialogue Language Model
原始對話為 3 個句子:“How old are you?”、“8.”和“Where is your hometown?”。模型的輸入是 3 個句子(而不是 BERT 里的兩個),中間用 SEP 分開,而且分別用 Dialogue Embedding Q 和 R 分別表示 Query 和 Response 的 Embedding,這個 Embedding 類似于 BERT 的 Segment Embedding,但是它有 3 個句子,因此可能出現 QRQ、QRR、QQR 等組合。
實驗
論文在 XNLI、LCQMC、MSRA-NER、ChnSentiCorp 和 NLPCC-DBQA 等 5 個中文 NLP 任務上做了和 BERT 的對比實驗,如下表所示:
Ablation分析
論文使用了 10% 的數據來做分析,如下表所示:
▲?圖.?不同Mask策略的Ablation分析
只用基本級別(中文的字),測試集上的結果是 76.8%,使用了 phrase 之后,能提高 0.5% 到 77.3%,再加上 entity 之后可以提高到 77.6%。
為了驗證 Dialog LM 的有效性,論文對于 10% 的數據的抽取方式做了對比,包括全部抽取百科、百科(84%)+新聞(16%)和百科(71.2%)+新聞(13%)+貼吧(15.7%)的三種抽取數據方式。在 XLNI 任務上的對比結果為:
▲?圖.?Dialog LM作用的Ablation分析
可以看到 Dialog LM 對于 XLNI 這類推理的任務是很有幫助的。注:我認為這個實驗有一定問題,提升可能是由于數據(貼吧)帶來的而不是 Dialog LM 帶來的。更好的實驗可能是這樣:再訓練一個模型,數據為百科(84%)+新聞(16%)和百科(71.2%)+新聞(13%)+貼吧(15.7%),但是這次不訓練 Dialog LM,而是普通的 Mask LM,看看這個模型的結果才能說明 Dialog LM 的貢獻。
完形填空對比
此外,論文還實驗完形填空的任務對比了 BERT 和 ERNIE 模型。也就是把一些測試句子的實體去掉,然后讓模型來預測最可能的詞。下面是一些示例(不知道是不是精心挑選出來的):
▲?圖.?Dialog LM作用的Ablation分析
ERNIE 2.0
基本思想
ERNIE 2.0 的名字又改了:A Continual Pre-training framework for Language Understanding。這個名字低調務實了一些,但是和縮寫 ERNIE 似乎沒有太大關系。
作者認為之前的模型,比如 BERT,只是利用詞的共現這個統計信息通過訓練語言模型來學習上下文相關的 Word Embedding。ERNIE 2.0 希望能夠利用多種無監督(弱監督)的任務來學習詞法的(lexical)、句法(syntactic)和語義(semantic)的信息,而不僅僅是詞的共現。
因為引入了很多新的任務,所以作為 multi-task 來一起訓練是非常自然的想法。但是一下就把所有的任務同時來訓練可能比較難以訓練(這只是我的猜測),因此使用增量的方式會更加簡單:首先訓練一個 task;然后增加一個新的 Task一起來 multi-task Learning;然后再增加一個變成 3 個 task 的 multi-task Learning……
ERNIE 2.0 框架
根據前面的介紹,ERNIE 2.0 其實是一種框架(方法),具體是用 Transformer 還是 RNN 都可以,當然更加 BERT 等的經驗,使用 Transformer 會更好一些。ERNIE 2.0 框架的核心就是前面的兩點:構造多個無監督的任務來學習詞法、句法和語義的信息;增量的方式來進行 Multi-task learning。
ERNIE 2.0 框架如下圖所示:
▲?圖. ERNIE 2.0框架
持續的(continual)pretraining 過程包括兩個步驟。第一步我們通過大數據和先驗知識來持續的構造無監督任務。第二步我們增量的通過 multi-task learning 來更新 ERNIE 模型。
對于 pre-training 任務,我們會構造不同類型的任務,包括詞相關的(word-aware)、結構相關的(structure-aware)和語義相關的(semantic-aware)任務,分別來學習詞法的、句法的和語義的信息。所有這些任務都只是依賴自監督的或者弱監督的信號,這些都可以在沒有人工標注的條件下從大量數據獲得。
對于 multi-task pre-training,ERNIE 2.0 使用增量的持續學習的方式來訓練。具體來說,我們首先用一個簡單的任務訓練一個初始的模型,然后引入新的任務來更新模型。當增加一個新的任務時,使用之前的模型參數來初始化當前模型。
引入新的任務后,并不是只使用新的任務來訓練,而是通過 multi-task learning 同時學習之前的任務和新增加的任務,這樣它就既要學習新的信息同時也不能忘記老的信息。通過這種方式,ERNIE 2.0 可以持續學習并且累積這個過程中學到的所有知識,從而在新的下游任務上能夠得到更好的效果。
如下圖所示,持續 pre-training 時不同的 task 都使用的是完全相同的網絡結構來編碼上下文的文本信息,這樣就可以共享學習到的知識。我們可以使用 RNN 或者深層的 Transformer 模型,這些參數在所有的 pre-training 任務是都會更新。
▲?圖:ERNIE 2.0框架的multi-task learning架構圖
如上圖所示,我們的框架有兩種損失函數。一種是序列級別的損失,它使用 CLS 的輸出來計算;而另一種是 token 級別的損失,每一個 token 都有一個期望的輸出,這樣就可以用模型預測的和期望的值來計算 loss。不同的 pre-training task 有它自己的損失函數,多個任務的損失函數會組合起來作為本次 multi-task pre-training 的 loss。
模型的網絡結構
模型采樣和 BERT 類似的 Transformer Encoder 模型。為了讓模型學習到任務特定的信息,ERNIE 2.0 還引入了 Task Embedding。每個 Task 都有一個 ID,每個 Task 都編碼成一個可以學習的向量,這樣模型可以學習到與某個特定Task相關的信息。
網絡結果如下圖所示:
▲?圖:ERNIE 2.0框架的網絡結構
除了 BERT 里有的 Word Embedding、Position Embedding 和 Sentence Embedding(基本等價于 Segment Embedding)。圖上還有多了一個 Task Embedding。此外 Encoder 的輸出會用來做多個 Task(包括 word-aware、structural-aware 和 semantic-aware)的 multi-task learning,而不是像 BERT 那樣只是一個 Mask LM 和 next sentence prediction(而 XLNet 只有一個 Permuatation LM)。
Pre-training Tasks
Word-aware Tasks
1. Knowledge Masking Task:這其實就是 ERNIE 1.0 版本的任務,包括 word、phrase 和 entity 級別的 mask 得到的任務。
2. Capitalization Prediction Task:預測一個詞是否首字母大小的任務。對于英文來說,首字符大小的詞往往是命名實體,所以這個任務可以學習到一些 entity 的知識。
3. Token-Document Relation Task:預測當前詞是否出現在其它的 Document 里,一個詞如果出現在多個 Document 里,要么它是常見的詞,要么它是這兩個 Document 共享的主題的詞。這個任務能夠讓它學習多個 Document 的共同主題。
Structure-aware Tasks
1. Sentence Reordering Task:給定一個段落(paragraph),首先把它隨機的切分成 1 到 m 個 segment。然后把 segment 隨機打散(segment 內部的詞并不打散),讓模型來恢復。那怎么恢復呢?這里使用了一種最簡單粗暴的分類的方法,總共有??種分類。這就是一個分類任務,它可以讓模型學習段落的篇章結構信息。
2. Sentence Distance Task:兩個句子的”距離”的任務,對于兩個句子有 3 種關系(3 分類任務):它們是前后相鄰的句子;它們不相鄰但是屬于同一個 Document;它們屬于不同的 Document。
Semantic-aware Tasks
1. Discourse Relation Task:這個任務會讓模型來預測兩個句子的語義或者修辭(rhetorical)關系,follow 的是?Mining discourse markers for unsupervised sentence representation learning?[9]?的工作,感興趣的讀者可以閱讀這篇文章。
2. IR Relevance Task:這是利用搜索引擎(百度的優勢)的數據,給定 Query 和搜索結果(可以認為是相關網頁的摘要),可以分為 3 類:強相關、弱相關和完全不相關。
實驗
論文對于英文,在 GLUE 數據集上和 BERT 以及 XLNet 做了對比;在中文數據集上和 BERT 以及 ERNIE1.0 做了對比實驗。
Pretraining數據
英文數據使用了 Wiki 和 BookCorpus,這和 BERT 是一樣的,此外還爬取了一些 Reddit 的數據。另外使用了 Discovery 數據集來作為篇章結構關系數據。對于中文,使用了百科、新聞、對話、搜索和篇章結構關系數據。詳細情況如下表所示:
▲?圖.?Pretraining數據詳情
Pretraining的設置
為了和 BERT 對比,我們使用和它完全一樣的設置。基本(base)模型包含 12 層,每層 12 個 self-attention head,隱單元大小是 768。對于大(large)模型包含 24 層,16 個 self-attention head,隱單元 1024。XLNet 模型的設置和 BERT 也是一樣的。
ERNIE 2.0 的基本模型使用 48 塊 NVIDIA 的 v100 GPU 來訓練,而大模型使用 64 塊 v100 GPU 訓練。ERNIE 2.0 使用?PaddlePaddle 實現,這是百度開源的一個深度學習平臺。
論文使用了 Adam 優化器,其中?β1=0.9,β2=0.98,batch 大小是 393216 個 token。英語的 learning rate 是? 5e-5 而中文是 1.28e-4。learning rate decay 策略是?noam?[10],前 4000 step 是 warmup。為了結束內存,使用的是 float16。每個 pretraining 都訓練到收斂為止。
實驗任務
英文實驗使用的是?GLUE?[11];而中文任務和前面的 Whole Word Masking 差不多,這里就不詳細列舉了,感興趣的讀者可以參考論文或者代碼。
實驗結果
英文的結果如下表所示:
▲?圖.?GLUE數據集上的實驗結果?
我們可以看到,不論是基本的模型還是大的模型,ERNIE 2.0 在測試集上的效果都是 SOTA 的。
中文的結果如下表所示:
▲?圖.?中文數據集上的實驗結果?
代碼
感興趣的讀者可以下載 Pre-training 好的 ERNIE 2.0 模型和 Fine-tuning 的代碼(但是沒有 Pre-training 的代碼和數據):
https://github.com/PaddlePaddle/ERNIE
展望
我們可以看到進入 2019 年之后,無監督的 Contextual Word Embedding 成為 NLP 領域最熱門的研究方向,沒過多久就會有新的模型出來刷榜。這一方面說明了在海量的未標注的文本里包含了大量有用的語義知識,因此我們希望通過這些數據進行無監督的 pre-training。
從 ERNIE 2.0 的成功來看,通過構造更多的任務可以讓模型學習更多的知識,成功的關鍵是怎么構造任務的監督信號(顯然不能人工標注)。
另外,對于這種靠模型和訓練數據的大小簡單粗暴的刷榜的行為是否可持續,近期也是引起了學術界的持續關注。因為這個方向只能是有數據和計算資源的少數商業公司才有資本去這樣玩,很多論文其實并沒有太大的創新。
另外很多論文的結論其實可能是有矛盾的。比如最近 Facebook 的?RoBERTa: A Robustly Optimized BERT Pretraining Approach?[12],它并沒任何模型結構,只是改進了 pretraining 的方法就在某些數據集上比 XLNet 的效果要好,這不禁讓人懷疑 XLNet 的改進到底是有 Permutation LM 帶來的還是只是因為它訓練的比 BERT 要好。
包括 ERNIE 1.0 提出的所謂的 Knowledge(也就是 phrase 和 entity),但是哈工大和訊飛的簡單的 Whole Word Masking 模型就做的比 ERNIE 1.0 更好,這也讓人懷疑 ERNIE 1.0 的改進是不是由于它的數據帶來的(它是有了 wiki 之外的百度百科、新聞和貼吧等數據)。
另一方面,如果大家把注意力都集中到刷榜,而不是從更本質的角度思考 NLP 甚至 AI 的問題,只是等待硬件的進步,這也是很讓人擔憂的事情。在BERT的成功是否依賴于虛假相關的統計線索?一文里我也分析了學術界對于這種暴力美學的擔憂,有興趣的讀者也可以閱讀一下這篇文章。
相關鏈接
[1] https://fancyerii.github.io/2019/03/05/bert-prerequisites/
[2] https://fancyerii.github.io/2019/03/09/bert-theory/
[3] https://fancyerii.github.io/2019/03/09/bert-codes/
[4]?https://fancyerii.github.io/books/mt/#%E5%88%86%E8%AF%8D
[5]?https://fancyerii.github.io/2019/03/09/bert-codes/#wordpiecetokenizer
[6] https://dumps.wikimedia.org/zhwiki/latest/
[7] https://github.com/attardi/wikiextractor/blob/master/WikiExtractor.py
[8] http://ltp.ai/
[9]?https://arxiv.org/pdf/1903.11850.pdf
[10]?https://arxiv.org/pdf/1706.03762
[11] https://gluebenchmark.com/
[12]?https://arxiv.org/pdf/1907.11692
點擊以下標題查看更多往期內容:?
基于DGCNN和概率圖的輕量級信息抽取模型
ACL 2019 | 基于知識增強的語言表示模型
自然語言處理中的語言模型預訓練方法
一大批中文(BERT等)預訓練模型等你認領!
當Bert遇上Keras:這可能是Bert最簡單的打開姿勢
站在BERT肩膀上的NLP新秀們:XLMs、MASS和UNILM
基于小樣本學習的意圖識別冷啟動
#好 書 推 薦#
?深度學習理論與實戰:基礎篇?
李理 / 編著
本書不僅包含人工智能、機器學習及深度學習的基礎知識,如卷積神經網絡、循環神經網絡、生成對抗網絡等,而且也囊括了學會使用 TensorFlow、PyTorch 和 Keras 這三個主流的深度學習框架的*小知識量;不僅有針對相關理論的深入解釋,而且也有實用的技巧,包括常見的優化技巧、使用多 GPU 訓練、調試程序及將模型上線到生產系統中。
本書希望同時兼顧理論和實戰,使讀者既能深入理解理論知識,又能把理論知識用于實戰,因此本書每介紹完一個模型都會介紹其實現,讀者閱讀完一個模型的介紹之后就可以運行、閱讀和修改相關代碼,從而可以更加深刻地理解理論知識。
?長按識別二維碼查看詳情?
?
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 訪問作者博客
總結
以上是生活随笔為你收集整理的后 BERT 时代的那些 NLP 预训练模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解读小米MoGA:超过MobileNet
- 下一篇: 直播报名 | 官方解读NVIDIA黑科技