本系列將對預訓練語言模型進行初步探索,本部分為第一部分,對預訓練模型的優點以及發展歷史進行簡要介紹。
引言回顧近年來基於深度學習的NLP技術的重大事件,就不得不提到由ELMo/GPT/BERT帶來的預訓練模型熱潮。在最近剛結束的2020年ACL大會上,「不要停止預訓練:將語言模型應用於目標領域和任務上」[^1]這樣看似標題黨的論文獲得了ACL2020 best paper的榮譽提名。[^2]這裡所說預訓練思想的本質是模型參數不再是隨機初始化,而是通過一些任務(如語言模型)對模型進行預訓練從而使模型得到一個初始化的參數。[^3]
而所謂的預訓練語言模型,其實就是預先在一個比較大的語料庫上進行訓練並且能夠獲得通用的語言表示。也就是預訓練語言模型已經擁有一個初始的參數,在面對具體任務時,根據該任務的數據集對該預訓練模型進行參數微調即可,從而不需要重新訓練一個模型。
為什麼預訓練對於傳統的非預訓練語言模型,如果要進行某個具體的任務時,都需要大量注釋好的數據集進行訓練與學習。這是數據的性質決定的,因為對於文本數據,提取出對類別具有決定性作用的特徵是很難的。傳統方式諸如TF-IDF方法也無非只是提取出一些關於詞的統計性的特徵,但是對於一個文本,它富含的信息遠不止幾個關鍵詞的詞頻,還包括語序,詞義以及整體的語義等。但是要讓模型學到通用的語義,是需要大量數據集的進行學習的。
以我們人類為例,在我們小學時是很難讀懂大學時的文章,這是由我們的知識儲備所決定的。當人們學習過足夠多的知識,讀過足夠多的書之後,那很少有能讀不懂的文章了。而這裡的預訓練模型恰恰如同一個學富五車的學者,而普通非預訓練模型就如同三歲小孩,相比之下自然就有優勢了。
前面提到,由於注釋成本極其昂貴,對於大多數NLP任務而言,構建大規模的標記數據集是一項巨大的挑戰,尤其是對於語法和語義相關的任務。相反,大規模的未標記語料庫相對容易構建,使用大規模的未標記語料庫來預訓練模型是相對容易的。自2018年以來,預訓練模型在NLP各種任務上的SOTA效果也是用事實證明預訓練模型相比於傳統模型的優越。邱錫鵬教授發表的關於NLP預訓練模型的綜述[^4]也總結了預訓練模型的以下三個優點:
在龐大的無標註數據上進行預訓練可以獲取更通用的語言表示,並有利於下遊任務;為模型提供了一個更好的初始化參數,在目標任務上具備更好的泛化性能、並加速收斂;是一種有效的正則化手段,避免在小數據集上過擬合(一個隨機初始化的深層模型容易對小數據集過擬合)。預訓練語言模型的發展近些年預訓練模型的發展首先要從Word2Vec[^5][^6]說起,它的核心思想是通過詞的上下文得到詞的向量化表示。方法有兩種:CBOW和Skip-gram。CBOW是通過附近的詞來預測中心詞,Skip-gram則是通過中心詞預測附近的詞。訓練得到的這些詞向量可以進行一些線性的語義預算,如「皇帝-皇后=男-女」。
但是這些詞向量都是上下文無關的。也就是說,同一個詞在不同的語境中詞向量卻是相同的,很明顯這就導致詞向量模型缺乏詞義消歧(WSD)的能力。ELMo[^7]就是針對這個問題進行優化:ELMo通過多層的stack LSTM去學習詞的複雜用法;ELMo提出pre-training+finetuning的方法,現在大語料庫中預訓練得到詞向量,再根據下遊任務的語料庫對上面得到的詞向量進行微調。
不管是Word2Vec還是ELMo,所使用的將預訓練好的語言模型應用到下遊任務的方式是都是基於特徵的。在ELMo模型出來不久,OpenAI GPT-1[^ 8]就使用了另外一種方式,基於微調,即引入一些特定於任務的參數,使用下遊任務的訓練集對預訓練模型參數進行微調訓練。
ELMo和GPT-1有個共同點就是他們的預訓練語言模型都是單向的,然而BERT[^9]指出,這樣的技術限制了預訓練模型表示的效果,因為這樣預訓練得到的模型僅僅只能學到單方向的語義。BERT作者受到完形填空任務的啟發,通過一個新的預訓練任務來解決前面的單向約束:「遮蔽語言模型」(MLM Masked Language Model)。通過這個預訓練任務就使得預訓練模型獲得了雙向的語義。除此之外,BERT還提出了「下一個句子預測」(NSP Next Sentence Prediction)的預訓練任務,這個任務將前後兩個句子建立其聯繫,在多句子語義理解或問答任務中有非常好的效果。由於BERT的這兩個全新的預訓練任務,它在當時大幅度刷新了11個NLP任務的最優結果。
隨著GPT-1,BERT的誕生,根據不同的預訓練任務,基於不同網絡結構等預訓練模型被不斷提出。例如基於排列語言模型(PLM Permutation Language Modeling)的XLNet[^10]。當然也有對預訓練模型任務或者語料庫進行優化而產生的預訓練模型,例如RoBERTa[^11]就是對BERT的預訓練任務以及數據集進行適當調整產生的。
本文剩下部分將如下安排。首先對BERT的網絡結構模型Transformer的原理進行分析,之後將深入探索BERT,理解其預訓練任務以及微調過程,再來就是對XLNet和RoBERTa進行簡要介紹。
參考文獻[^1]: Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks
[^2]: https://zhuanlan.zhihu.com/p/149210123
[^3]: https://zhuanlan.zhihu.com/p/76912493
[^4]: Pre-trained Models for Natural Language Processing: A Survey
[^5]: Distributed Representations of Sentences and Documents:https://arxiv.org/abs/1405.4053
[^6]: Efficient Estimation of Word Representations in Vector Space: https://arxiv.org/abs/1301.3781
[^7]: Deep contextualized word representations:https://arxiv.org/abs/1405.4053
[^8]: Improving Language Understanding
[^9]: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[^10]: XLNet: Generalized Autoregressive Pretraining for Language Understanding
[^11]: RoBERTa: A Robustly Optimized BERT Pretraining Approach