語言模型的任務是根據一個句子裏的已知詞預測句子裏的未知詞,在自動填充(如:在電子郵件書寫過程當中的自動補全),機器翻譯,語音識別等方向有着普遍的應用,傳統的語言模型包括 n-gram,HMM 等。在 2003 年 Joshua Bengio 首次提出使用神經網絡來建模語言模型,因爲近期一系列有影響力的預訓練語言模型的工做都是基於神經網絡的,本章節將重點關注神經語言模型。算法
神經語言模型不只提供了強大的建模語言模型的工具,同時,也提供了詞,句子以及文本的向量表示。2013 年誕生了被你們普遍使用的 Word2Vec,利用語言模型做爲訓練任務,獲得詞的向量表示,這裏每一個詞的向量表示是固定的,與上下文無關,例如:「bank」的詞向量表示在「bank of China」和「river bank」這兩個不一樣的上下文裏面都是同樣的。2017 年 ELMo 利用雙向 LSTM 獲取了一個基於上下文的詞向量表示(contextualized word embedding),使得每一個詞的向量表示包含了上下文的語義信息,例如前面的例子裏面,「bank」一詞在使用 ELMo 獲得的 embedding 在不一樣的上下文是不同的。此後的一系列工做都採用了基於上下文的詞向量表示。網絡
一個革命性的工做是 2018 年誕生的 BERT,該工做將 Transformer 的架構引入了預訓練語言模型,並開啓了 Pretraining-Finetuning 的框架。該框架在預訓練階段基於大規模無監督語料進行兩個預訓練任務,分別是詞級別和句子級別的,一個是 MLM(Masked Language Modeling),另一個是 NSP(Next Sentence Prediction),MLM 是從一個部分被 Mask 的句子恢復這些被 Mask 掉的確實詞,NSP 是判斷一個句對是否是上下句,從而獲取基於上下文的詞和句子的表示。在 Finetune 階段,針對具體的下游任務,BERT 會微調中間層參數以調整詞的 Embedding 以及調整預測層的參數,成功的將預訓練學到的詞和句子的表示遷移到下游任務中,實現了對低資源任務的有效支撐。架構
預訓練語言模型的發展示狀app
因爲 BERT 取得的巨大成功,2019 年在預訓練語言模型方面涌現了一大批有效,實用而且帶給人來啓發的工做。因爲篇幅有限,本文未能列舉全部工做,只會挑選一些來闡述。下面在模型,預訓練任務和算法三個維度進行總結。框架
模型方面ide
模型方面主要有如下幾個方面的改進。函數
位置信息編碼方式。BERT 的網絡架構是一個多層的 Transformer 網絡,因爲 Transformer 並無直接考慮輸入的 token 的位置信息,原始的 Transformer 模型和 BERT 分別採用了函數式和參數式的絕對位置編碼方式,即每個位置上輸入的 token 會疊加一個與位置信息相關的一個 embedding(這個 embedding 稱爲絕對位置編碼:absolute position embedding,APE),前者的位置編碼是一個與位置相關的函數,後者則是模型參數的一部分,在預訓練過程當中學到的。此後,CMU 和 Google 提出的 Transformer-XL 和 XLNet 提出了相對位置編碼方式,即在每一層計算隱狀態的相互依賴的時候考慮它們之間的相對位置關係,這個相對位置信息表示爲一個相對位置編碼(relative position embedding,RPE),這兩個工做均在相對位置編碼中加入了可學習的參數。此後,華爲發佈的 NEZHA 模型使用了徹底函數式的相對位置編碼(相對位置編碼沒有任何須要學習的參數),實驗結果代表該位置編碼方式使得模型在各個下游任務上的效果均獲得明顯提高。工具
詞表 embedding 矩陣的分解與中間層的層共享。Google 發佈的 ALBERT 針對詞表 embedding 矩陣進行了矩陣分解,將原先的大小爲 V*H 的詞表 embedding 矩陣分解爲兩個大小分別爲 V*E 和 E*H 的 low-rank 矩陣相乘的形式,其中 V,H 分別爲詞表大小以及模型隱狀態維度,E 則是遠小於 V 和 H 的值,於是這個方法有效的減小了詞表 embedding 的參數。同時,該模型採用了層共享技術,並嘗試了共享中間層多頭注意力或者是 Feed Forward Network 的參數。實驗證實該方法在顯著少於原始 BERT 參數量的前提下在多個下游任務上大大超越了 BERT。性能
預訓練任務方面學習
在詞級別的訓練任務方面,一個爲你們普遍使用且證實有效的方法是全詞 Mask 技術。不一樣於原始的 BERT 模型 Mask 單個 Token,該技術在 MLM 預訓練任務中 Mask 整個詞而不是單個 Token(以下圖全詞 Mask 方法 Mask 了一整個詞「大興」),進而提高了任務難度使得 BERT 學到更多語義信息。此任務在 Google 發佈的英文 BERT 的訓練以及哈工大和科大訊飛聯合發佈的中文 BERT 模型以及華爲發佈的 NEZHA 模型中獲得了應用。
百度發佈的 ERNIE 模型在詞法,句法以及語義方面分別引入了若干任務。詞法方面,百度 ERNIE 採用了 Knowledge Masking 的方法,即 MLM 預訓練任務中 Mask 若干實體。句法方面,其採用了句子重排序以及句子距離計算的任務。語義方面,百度 ERNIE 使用了大量來自搜索引擎的數據,採起了信息檢索相關的任務。
CMU 和 Google 聯合發佈的 XLNet 框架統一了預訓練語言模型的 Autoencoder 和 Auto-regressive 兩種框架。預訓練階段,一改原始 BERT 經過引入 [MASK] 字符來恢復缺失詞,XLNet 則是經過 Auto-regressive 的方式,逐個生成一個句子中的缺失詞。這樣的方式使得預訓練和 Finetune 階段都不須要引入 [MASK] 字符,解決了原始 BERT 的預訓練和 Finetune 不一致(discrepancy)的問題(原始 BERT 的預訓練語料中包含 [MASK] 字符而 Finetune 則不包含)。與此同時,Auto-regressive 的生成方式也使得生成詞之間具備必定的依賴,後生成的詞會依賴以前生成的詞,解決了原始 BERT 中各個缺失詞互相之間獨立生成的問題。此外,訓練過程當中,XLNet 還將一個句子的缺失詞進行了屢次不一樣順序的生成,充分利用了語料的語義信息。
華盛頓大學和 Facebook 聯合發佈的 SpanBERT 模型還引入了 Span 預測任務,該任務 Mask 一個連續的 Span(例以下圖中「場」,「很」,「不」三個字),利用 Span 先後的兩個字的最上層表示(下圖中的 x3 和 x7)以及待預測字的位置信息來預測該字,以下圖中,待預測字爲「不」,Span 預測任務會使用 x3,x7 和「不」這個字的位置信息(就是 x3 和 x6 還有 p7,即「不」這個字的絕對位置編碼)來預測該字,「場」和「很」的預測也是一樣的方法。該方法使得 Span 先後的字的表示會包含 Span 中字的語義信息,因爲在訓練過程當中,一個句子會被隨機 Mask 不少次,因此句子中每一個字都有機會成爲 Span 的先後字,進而使得各個字學到的表示都會包含周圍 Span 的信息,Span 預測任務可以有效提升模型在下游的 Span 抽取任務(此任務的目標是獲取一段文字中目標片斷的開始和結束位置)的效果。
斯坦福大學提出的 ELECTRA 模型採用了生成對抗式的方法訓練模型。生成器採用了 BERT 模型,即一個 Denoising Autoencoder,恢復一個句子中被 Mask 的詞,因爲 BERT 不可能達到 100% 的復原,被恢復的詞有一些是原句中的原詞,有一些則被替換成了別的詞。辨別器也是一個多層的 Transformer 網絡,其訓練任務是辨別生成器輸出的句子中哪些詞是原詞,哪些是被替換的。在 ELECTRA 中,最終保留的是辨別器,因爲預訓練階段,在生成器中,各個句子中的每個詞的表示都被使用來進行一個二分類任務(便是否是原詞),相比原始的 BERT(只有 15% 不到的詞的表示被拿來作預測),ELECTRA 的 sample 的利用率很是之高,進而收斂很快,在相同的 FLOPS 的狀況下,性能優於 BERT,ROBERTa 等一樣規模的預訓練語言模型。
訓練算法
在訓練算法方面,當前有兩個普遍使用的方法。
第一個在訓練過程當中變量的精度方面作了優化,此方法被稱爲混合精度訓練(Mixed Precision Training),在傳統的深度學習訓練過程當中,全部的變量包括 weight,activation 和 gradient 都是用 FP32(單精度浮點數)來表示。而在混合精度訓練過程當中,每個 step 會爲模型的全部 weight 維護一個 FP32 的 copy,稱爲 Master Weights,在作前向和後向傳播過程當中,Master Weights 會轉換成 FP16(半精度浮點數)格式,權重,激活函數和梯度都是用 FP16 進行表示,最後梯度會轉換成 FP32 格式去更新 Master Weights。
第二個主要是優化算法方面的,此優化算法被稱爲LAMB 優化器,一般在深度神經網絡訓練的 Batch Size 很大的狀況下(超過必定閾值)會給模型的泛化能力帶來負面影響。而 LAMB 優化器經過一個自適應式的方式爲每一個參數調整 learning rate,可以在 Batch Size 很大的狀況下不損失模型的效果,使得模型訓練可以採用很大的 Batch Size,進而極大提升訓練速度。在訓練 BERT 的研究中,使用 LAMB 優化器在不損失模型效果的前提下,Batch Size 達到了超過 30k,使得 BERT 的訓練時間從 3 天降到了 76 分鐘。
總結與展望
預訓練語言模型在大規模無監督文本上進行預訓練,將獲得的詞和句子的表示成功遷移到普遍的下游任務上,並取得了巨大成功,尤爲對於低資源場景。2019 年涌現出的一大批在預訓練語言模型的探索工做主要圍繞在預訓練任務方面,經過設計任務使模型學到更加豐富有效的語義信息。
在將來,筆者認爲預訓練語言模型還有着巨大的發展空間。
筆者認爲模型方面的發展方向有兩條線:1,模型效果方面,根據 XLNet 的實驗,咱們看到當前即便 large 量級的模型還只能 underfit 海量的數據,所以,模型方面就效果而言還有很大的改進空間;2,訓練效率方面,當前的訓練各個預訓練語言模型在幾十塊 GPU 的算力下仍是須要若干天,算力和資金消耗巨大,如何巧妙設計模型,下降冗餘的計算也是一個重要問題。
此外,2019 年的大部分工做是基於 BERT 作了不少嘗試性的工做,好比:函數式相對位置編碼方面,通過嘗試發現效果好,但彷佛缺乏針對性,筆者認爲這是在模型的理論方面可解釋性不夠形成的,咱們很難理解 Transformer 架構到底有什麼欠缺,到底哪裏學很差,每一部分到底起到什麼做用,於是很難有針對性的改進方案。現有的解釋性工做大多集中在解釋預訓練語言模型的功能,如:學到的詞表示是否可以作詞法和句法分析等,原理性的解釋比較少,北京大學提出的 MacaronNET 是一個很好的原理方面的解釋性工做,用偏微分方程解釋 Transformer 的工做原理,從數學的角度準肯定量地闡釋了 Transformer 的機制,不過確實須要很強的數學功底才能吃透,2020 期待更多這方面的工做。