先來一張圖。
本文主要援引復旦大學邱錫鵬教授的論文:NLP預訓練模型綜述,對預訓練模型進行了一些梳理
模型參數的數量增長迅速,而為了訓練這些參數,就需要更大的數據集來避免過擬合,而大規模的標注數據集成本又非常高。而相比之下,大規模未標注的語料卻很容易構建。
為了利用大量的未標注文本數據,我們可以先從其中學習一個好的表示,再將這些表示用在別的任務中。這一通過 PTMs 從未標注大規模數據集中提取表示的預訓練過程在很多 NLP 任務中都取得了很好的表現。
預訓練的優點可以總結為以下三點:
- 在大規模語料上通過預訓練學習通用語言表示對下游任務很有幫助;
- 預訓練提供了更好的模型初始化參數,使得在目標任務上有更好的泛化性能和更快的收斂速度;
- 預訓練是一種有效的正則化方法,能夠避免在小數據集上過擬合。
范式區分
這個區分主要是依據于網絡深度表示方法來進行代際劃分。
1.詞嵌入(Embedding)屬于第一代預訓練模型
靜態、淺層的模型訓練。
例如:
word2vec(CBOW/Skip-Gram),paragraph vector,Skip-thought vectors, Context2Vec
這種嵌入方式有兩個局限:一是一個詞通過這種方法獲得的詞嵌入總是靜態且與上下文無關的,無法處理多義詞;二是難以解決不在詞匯表中的詞
2.其他的深度模型,都可以劃為第二代預訓練模型。
諸如LSTM、ELMo,GPT,BERT
任務區分
按任務進行劃分,就是傳統的機器學習任務,可以分成無監督學習,監督學習和自監督學習。
1.監督學習(Supervised learning)
這幾個詞應該很熟悉了,監督學習就是要提供標注好的語料信息。
最常見的就是CoVe,因為提供語料這種,開銷非常大,所以在這方面的研究就比較少了,重點還是在無監督和自監督方面。
2.無監督學習 (Unsupervised learning)
無監督學習就是不需要標注好的語料信息。
無監督的有aoto-regressive LM, BiLM這種。
具體訓練過程是基于一個大的語料,通過最大似然估計 (MLE) 訓練計算一個句子出現的概率。
但是我理解,語言跟圖像最大的區別就是,語言是對真實世界的抽象表達,而圖像(尤其是照片)是對真實世界的記錄,所以單純的運用無監督的整體效果也不是太好,相當于抽象中的抽象。
3.自監督學習(self Supervised)
自監督學習就是提供一些定制好的規則,算法自行按照規則去總結對應的語料特征,本質上來講自監督也是一種監督學習。
所以目前最火熱的就是自監督學習,這方面,沒有有監督學習那么大的前期開銷,又能避免完全自學的模式,所以能夠有比較好的表現,而且在算力上也能夠負擔的起。
所以,在自監督學習里面,又產生了很多自監督方法。
像現在最流行的BERT,GPT,XLNet都屬于自監督的范圍。
這里,自監督方法又分成兩大派別,八大小方案
1)基于上下文 (Context Based)
a. 語言模型(LM Language Model)
這個是在無監督訓練的基礎上,獲取到一個初始的預訓練模型,然后疊加
b. 去噪自編碼器 (DAE:Denoising auto encoder)
DAE 的目的是通過向輸入文本中添加噪聲,利用含噪聲的樣本去重構不含噪聲的輸入。主要有五個實現方式:擋住 (MASK) token、刪除 token、填充 token、句子排列、文本輪換。
c. 掩碼語言模型 (MLM:Masked Language Model)
MLM 隨機選出一些詞用 [MASK] 標記,然后去預測被 MASK 的詞。但由于被 MASK 的詞并不出現在 fine-tuning 的過程中,會導致預訓練和微調的過程出現不一致性。針對這種情況,BERT 通過 80% [MASK],10% 隨機 token,10% 原 token 的方式來進行 mask。
而 MLM 的一種變體, Seq2SeqMLM ,則是通過將 encoder-decoder (Seq2Seq) 應用到 MLM 上,這種變體有利于 Seq2Seq 類型的下游任務,比如 QA,總結和機器翻譯。這一結構主要用在 MASS 和 T5 中。
而在 BERT 之后的很多論文都對 MLM 做了一些改進以增強性能,作者將其總結為 E-MLM (Enhanced Masked Language Modeling)。
其中 RoBERTa 使用動態 masking,UniLM 將對 mask 的預測擴展到三種任務:單向、雙向和 Seq2Seq。XLM 通過一種串聯并行雙語句對叫做 TLM (translation language modeling) 的模型實現 MLM。
而 SpanBERT 和 StructBERT 則是引入了結構化信息。而 ERINE (Baidu) 則是選擇 MASK 實體和短語,E-BERT 和 ERINE (THU) 則是利用了實體 embedding 方法,這三者都是借助了外部知識來豐富 MLM。
我在這里畫了一條虛線連接DAE和MLM,是因為這兩個方法再BERT中就是搭配來使用的,而且現在這基本上成了一種比較標準化的方案。
d. 排列語言模型(Permuted Language Model)
針對 MLM 中使用 MASK 導致的預訓練與微調過程的不一致,Permuted Language Modeling (PLM) 對于一個給定序列,生成其所有可能排列進行采樣作為訓練的目標。值得注意的是,PLM 并不改變原始文本的位置,而是重新定義 token 預測的順序。
2)基于對比(Contrastive Based)
CTL (Contrastive Learning) 基于一種“learning by comparison”的思路,假設某些觀測文本對比隨機采樣文本在語義上更相似,通過構建正樣本和負樣本并度量距離來實現學習。CTL 通常比 LM 具有更少的計算復雜度,也因此成為一個值得選擇的 PTMs 訓練標準。
a. 最大化互信息(DIM:Deep Info Max)
DIM 最初是在 CV 領域提出的用于最大化圖像全局特征與局部特征之間的互信息(Mutual Information)的方法。
InfoWord 將 DIM 引入到語義表達學習中,提出用 DIM objective 以最大化句子的全局表示和一個 N-gram 的具備表示之間的互信息。
b. 替換token檢測(RTD:Replaced token detection)
RTD 根據上下文來預測 token 是否替換。
CBOW 的負采樣(negetive sampling) 就可以看作是一個 RTD 的簡單版本,其中采樣是根據詞匯表中的分布進行采樣。
ELECTRA模型基于 RTD 提出了一種新的 generator-discriminator 框架。首先用 MLM 任務訓練 generator,再用 generator 的權重初始化 discriminator,再用判別任務(判別哪些 token 被 generator 替換過)訓練 discriminator。
最終在下游任務只需要對 discriminator 進行 fine-tuning。RTD也是一種很好的解決 MLM 導致的不一致問題的方法。
WKLM 則是通過在實體層面(entity-level)進行詞替換,替換為同一個實體類型的實體名。
c. 預測下一句 (NSP:Next Sentence Prediction)
NSP 訓練模型區分兩個輸入語句是否為訓練語料中連續的片段,在選擇預訓練句對時,第二個句子 50% 是第一個句子實際的連續片段,50% 是語料中的隨機段落。NSP 能夠教會模型理解兩個輸入句子之間的聯系,從而使得如 QA 和 NLI 這種對此類信息敏感的下游任務受益。
然而,近來 NSP 的必要性也遭到了質疑,XLNet 的作者發現不用 NSP loss 的單句訓練優于使用 NSP 的句對訓練。RoBERTa 的作者進一步分析表明:在對單個文本中的文本塊訓練時,去除 NSP 會在下游任務稍微提高性能。
d.句子順序預測(SOP:Sentence Order Prediction)
NSP 結合了主題預測相關性預測,而因為主題預測更容易,模型將更依賴于主題預測。為更好建模句子之間的相關性,ALBERT 提出使用 SOP loss 替換 NSP loss,SOP 使用一個文檔中的兩個連續片段作為正樣本,將這兩個片段交換順序作為負樣本。
采用了 SOP 的 ALBERT 在多項下游任務中結果都優于 BERT。StructBERT 和 BERTje 也使用 SOP 作為自監督學習任務。
可以說使用SOP替代NSP已經成為一種必然。
特定的優化項區分
自從預訓練模型出世之后,就開始了圍繞著這些模型的改進和優化。這些優化有針對特定任務的優化譬如說機器翻譯;有針對模型本身的優化譬如說剪枝,參數共享等等;有針對特定場景的優化,比如生物領域預訓練,特殊語種預訓練;有模型增強方案,比如加入知識圖譜;有拓展范圍的優化,比如多模態。
1.知識引入
這個主要就是在原有的語料基礎上,增加新的知識,比如說特定領域的語料,或者是增加特定知識的特征輸入,比如說有直接把知識圖譜的三元組直接embedding以后作為特征輸入的。有些效果還很不錯。我理解,這相當于對原來的網絡關系可以起到一個強化的作用,比起隨機學習來說要有一定的效果。
LIBERT: linguistically-informed BERT ,通過附加語言約束任務納入了語言知識。
SentiLR: 通過對每個單詞添加情感極性,將 MLM 拓展至 Label-Aware MLM (LA-MLM),在多個情感分類任務達到 SOTA。
SenseBERT: 不僅能預測被 mask 的 token,還能預測 WordNet 中的 supersense。
ERINE (THU): 將知識圖譜中預訓練的實體嵌入與文本中相應的實體提及相結合,以增強文本表示。
KnowBERT: 端到端將帶實體連接模型與實體表示集成。
KEPLER: 將知識嵌入和語言模型對象聯合。
K-BERT: 不同于以上幾個模型通過實體嵌入引入知識圖譜中的結構化信息,K-BERT 通過直接將知識圖譜中相關三元組引入句子,獲得一個 BERT 的拓展的樹形輸入。
K-Adapter: 針對不同預訓練任務獨立訓練不同的適配器以引入多種知識,以解決上述模型在注入多種知識出現的遺忘問題。
2.模型壓縮
模型壓縮主要是為了控制模型的大小,提高模型的可用性,比如說要把模型部署在空間和算力較小的機器上,手機上或者其他的平臺。
剪枝(pruning): 去除不那幺重要的參數(e.g. 權重、層數、通道數、attention heads)
量化(weight quantization): 使用占位更少(低精度)的參數
參數共享(parameter sharing): 相似模型單元間共享參數
知識蒸餾(knowledge diistillation): 用一些優化目標從大型 teacher 模型學習一個小的 student 模型。
3.多模態 MultiModal Machine Learning (MMML)
多模態機器學習,英文全稱 MultiModal Machine Learning (MMML),旨在通過機器學習的方法實現處理和理解多源模態信息的能力。目前比較熱門的研究方向是圖像、視頻、音頻、語義之間的多模態學習。
隨 PTMs 在 NLP 領域的廣泛應用,一些多模態 PTMs 也被設計出來,在一些語音、視頻、圖像數據集上進行了預訓練,比如:
圖像-語言: 用于圖像問答(VQA) 和圖像理解 (VCR),代表模型有 ViLBERT、LXMERT、VisualBERT、B2T2、VLBERT、 Unicoder-VL、UNITER
視頻-語言: VideoBERT、CBT
音頻-文本: 用于端到端語音問答(SQA) 任務,如 SpeechBERT
文本-代碼:這里我還發現一個好玩的,CodeBERT。使用了6種編程語言和自然語言進行訓練,支持Go, Java, PHP, Python等等,可以理解自然語言并生成代碼,或者根據代碼添加注釋,這個有點意思,有興趣的可以實測一下
4.領域預訓練
這個就是針對于特定領域的語料進行的模型訓練。因為原生的Bert預訓練模型是使用的公開數據集,對于特定領域內容的采集并不豐富,所以在特定領域內容上的表現可能不是很好。
所以有能力的機構或者產品都會根據自己的情況來決定是否要進行領域自適應。
使用本領域的數據進行一個模型訓練,一些大廠都會做這一步,不過如果你的算力無法支撐全部重新訓練,那還是老老實實用公開的PTM吧。
5.多語言
多語言也是在數據上的一些變更,把單一語言語料擴充到多種語言上面,對于跨語言 NLP 任務是很重要的。早期工作著力于學習來自同一語義環境下的多語言詞嵌入,這一方法往往缺乏語言間的校準。近期有如下幾個多語言 PTMs:
Multilingual-BERT: M-BERT,在 Wikipedia 上 104 種種語言的文本上進行 MLM 訓練,每個訓練樣本都是單語言的,也沒有專門設計跨語言目標,但即便如此,M-BERT 在跨語言任務上表現還是非常好。
XLM: 通過結合跨語言任務 TLM (translation language modeling),提升了 M-BERT 的性能。
Unicoder: 提出三個跨語言預訓練任務:1) cross-lingual word recovery; 2) cross-lingual paraphrase classification; 3) cross-lingual masked language model。
6.特定語言
這個其實跟特定領域類似,就不多說了。比如BERT-wwm,ZEN,NEZHA,ERNIE (Baidu),BERTje,CamemBERT, FlauBERT ,RobBERT
一些開源的模型
word2vec:
https://github.com/tmikolov/word2vec
GloVe:
https://nlp.stanford.edu/projects/glove
FastText:
https://github.com/facebookresearch/fastText
Transformers:
https://github.com/huggingface/transformers
Fairseq:
https://github.com/pytorch/fairseq
Flair:
https://github.com/flairNLP/flair
AllenNLP:
https://github.com/allenai/allennlp
FastNLP:
https://github.com/fastnlp/fastNLP
Chinese-BERT:
https://github.com/ymcui/Chinese-BERT-wwm
BERT:
https://github.com/google-research/bert
RoBERTa:
https://github.com/pytorch/fairseq/tree/master/examples/roberta
XLNet:
https://github.com/zihangdai/xlnet/
ALBERT:
https://github.com/google-research/ALBERT
T5:
https://github.com/google-research/text-to-text-transfer-transformer
ERNIE (Baidu):