一大批中文(BERT等)预训练模型等你认领!
作者丨Zhe Zhao
機構丨RUC DBIIR & Tencent Research
研究方向丨自然語言處理
項目簡介
預訓練模型已經成為了 NLP 領域最重要的資源之一。當我們拿到一個 NLP 數據集時,首要任務是尋找一個預訓練模型。當然,目前大家會趨同的選擇 Google 發布的 BERT 模型 [1]。
不過本文將為大家提供更多的中文預訓練模型的選擇!本文將介紹如何利用一個預訓練模型框架 UER(Universal Encoder Representations)去使用性質各異的中文預訓練模型,從而在下游任務上取得比 Google BERT 更好的效果。?
預訓練模型一般分成四個部分:語料、編碼器、目標任務以及微調策略。已有的工作從這四個部分中選擇不同的模塊(比如選擇不同的目標任務),構成一個預訓練模型(如下圖所示)[1,2,3]。
▲?圖1. 預訓練模型和它們使用的模塊。BERT模型使用12層Transformer編碼器,遮罩語言模型+下一句子預測作為目標任務,并將整個模型遷移到下游任務進行微調
語料、編碼器、目標任務對于一個預訓練模型的性質有著重要的影響。雖然目前 Google BERT 模型一枝獨秀,但是 Google BERT 選擇的語料、編碼器、目標任務對于很多的下游任務數據集未必是合適的(Google BERT 使用中文維基百科語料+12 層 Transformer 編碼器+遮罩語言模型任務&句子預測任務)。
因此,我們這里提供了一個基于不同語料、不同編碼器以及不同目標任務的中文預訓練模型倉庫(model zoo)。UER 的代碼和模型倉庫可以在這里獲取:
https://github.com/dbiir/UER-py
用戶在模型倉庫中選擇適合下游任務的預訓練模型進行下載并在上面微調。話不多說,下面我們一起看看如何用 UER 和它的模型倉庫為我們的下游任務帶來 SOTA 的效果!
快速上手
我們首先以非常火的 BERT 模型 [1] 和豆瓣書評情感分類數據集 [6] 為例,看看 UER 配合著模型倉庫如何帶來更好的預訓練模型使用體驗(更好的表現&更高的效率)。我們以使用者的角度,來上手操作一番。
我們首先要下載預訓練模型。第一個下載的是 Google 官方的預訓練模型(github 項目包含了所有預訓練模型的下載地址)。我們把下載好的預訓練模型放到 models 文件夾中。然后我們執行如下命令:
這里簡單介紹一下各個選項的意義:--pretrained_model_path 指定預訓練模型的路徑;--vocab_path 指定詞典的路徑;下游任務數據集路徑通過 --train_path、--dev_path、--test_path 指定;--encoder 指定我們使用的編碼器,這里使用 BERT 中的 12 層 Transformer 編碼器。
通過在 Google BERT 模型上微調,這里得到了 87.01 的結果。這個結果和 UER 項目中給的 87.5 的準確率有差距。如果更改 seed 的話結果會有一定的波動。UER 項目給的結果是多次取平均得到的。?
下面,我們嘗試其它的預訓練模型,期待獲得更好的效果。這里首先通過在一個小規模書評語料上預訓練來得到一個更適合書評分類數據集的預訓練模型。
我們加載 Google BERT 預訓練模型,然后在小規模書評語料上進行無監督的預訓練。本文側重微調階段,即如何在下游任務上利用好模型倉庫中的預訓練模型。至于預訓練方面的細節,本文不加贅述。
UER 項目已經為我們提供了在小規模書評語料上預訓練好的模型。我們直接下載下來,放到 models 文件夾之中。下面進行分類任務。和前面執行 Google BERT 的命令相比,現在只需要替換預訓練模型的路徑(--pretrained_model_path):
通過在 book_review_model.bin 上進行微調,我們得到了 88.05 的結果,相對于 BERT 提升比較顯著。
上面的模型只是在小規模語料上訓練的結果。我們可以從 UER 的模型倉庫中去搜索更加合適的預訓練模型。Amazon_cls_model.bin 使用分類目標任務和 Amazon 評論語料 [10] 進行預訓練。由于這個模型的語料和書評語料性質接近,并利用了有監督信息 [3],所以這份預訓練模型可能對于書評數據集是一個很好的選擇。
實驗結果顯示,通過加載 amazon_cls_model.bin,我們得到了 88.65 的準確率。雖然 BERT 的效果已經非常厲害了,超出了之前的模型一大截距離,但是我們在 BERT 的基礎上仍然獲得了顯著的提升!
▲?表1.?加載不同預訓練模型在書評情感分類任務上的對比
BERT 模型非常強大,但是效率較低,這嚴重限制了 BERT 的使用場景。比如當我們使用 BERT 進行前向 inference 的時候,普通 CPU 一秒鐘只能處理兩三條。這在很多的場景中是不能接受的。因此,UER 還提供了一些基于輕量級編碼器的預訓練模型,以期實現更為快速的訓練過程,同時能夠兼顧準確率。
這里仍然使用上面的豆瓣書評數據集對模型進行評估。我們在模型倉庫中選擇一個基于 2 層 LSTM 編碼器的預訓練模型,lstm_reveiews_model.bin。這個模型首先在大規模混合語料上用語言模型(LM)作為目標任務進行預訓練,然后再在 Amazon 帶標簽的評論語料 [10] 上用語言模型(LM)和分類(CLS)目標任務進行預訓練。我們將這個預訓練模型用于豆瓣書評數據集上:
這里需要手動指定配置路徑--config_path,因為 classifier.py 默認使用的是 BERT 的配置。通過微調,我們得到了 86.68 的準確率。如果不加載預訓練模型(隨機初始化),LSTM 僅僅能得到 80.25 的準確率。由此可以看到預訓練模型的重要性。
下面我們將 LSTM 編碼器用于 ChnSentiCorp 情感分類數據集。我們只需要將命令行中的 train_path、dev_path、test_path 更改為相應路徑即可。
▲?表2.?使用輕量級編碼器和Google BERT模型進行對比
我們使用 LSTM 編碼器得到了 94.5 的準確率。可以看到使用合適的基于輕量級編碼器的預訓練模型可以在這兩個分類任務上得到非常有競爭力的結果。在實驗中,使用 2 層 LSTM 編碼器的預訓練模型比 BERT 快了 10 倍。
可以看到,在模型倉庫中選擇合適的預訓練模型用于情感分類任務,真的做到了又快又好!雖然編碼器的能力不如 BERT 的 12 層 transformer,但是得益于對語料和目標任務合理的選擇,我們仍然得到了比肩 BERT 的效果。期待輕量級的編碼器能在更多的下游任務上有好的表現!
最后我們使用 UER 進行了序列標注任務,數據集為 MSRA-NER。這里有兩個實驗。第一個用 Google 提供的 BERT 預訓練模型做序列標注,第二個用 UER 提供的在人民日報上使用 BERT 進行預訓練的模型。
由于 MSRA-NER 數據集是在新聞語料上進行的序列標注,選擇基于人民日報的預訓練模型是比較合適的選擇。下面是序列標注的腳本,我們分別使用 google_model.bin 和 rmrb_model.bin 作為預訓練模型:
▲?表3.?不同預訓練模型在MSRA-NER上的表現
最后實驗結果顯示使用人民日報模型的效果比 Google BERT 要好不少,相對于百度的 ERNIE 預訓練模型也有一定的優勢 [4]。通過上面幾個例子,可以看到在很多情況下,Google BERT 并非是最合適的預訓練模型。通過在 UER 模型倉庫中選擇合適的預訓練模型,可以幫助我們在下游任務得到更好的表現。
我們在知乎上對 UER 的使用進行了連載:
https://zhuanlan.zhihu.com/p/70389596?utm_source=wechat_session&utm_medium=social&utm_oi=771376727665446912?
里面記錄了我們使用 UER 遇到的各種情形和細節問題(包括預訓練和下游任務微調)。如果想立馬使用 UER 去得到有競爭力的結果,可以移步到我們的連載中去。
模型倉庫
上面我們介紹了如何使用 UER 去調用各種中文預訓練模型,這里進一步對這個項目提供的模型倉庫進行介紹。首先,這么多中文預訓練模型都是怎么得到的呢?事實上,模型倉庫中的預訓練模型均是由 UER 訓練得到的。這里對 UER 進行一個簡要的介紹。
UER 使用了解耦的設計框架。它的子編碼器、編碼器、目標任務之間有著清晰的接口,可以幫助我們對不同模塊進行輕松的組合。這個項目也實現了不少的模塊,為我們提供了豐富的示例。UER 的整體結構如下圖所示:
▲?圖2. UER-py框架
從圖 2 的上半部分可以看到,UER 實現了多個目標任務模塊、編碼器模塊以及子編碼器模塊。UER-py 目前實現了以下目標任務:
lm_target.py:語言模型
mlm_target.py:遮罩語言模型(完形填空測試)
nsp_target.py:下一句話預測
cls_target.py:分類
s2s_target.py:seq2seq,支持自編碼器和機器翻譯作為預訓練目標任務
bert_target.py:遮罩語言模型+下一句話預測以及實現了以下編碼器:以及實現了以下編碼器:
以及實現了以下編碼器:
rnn_encoder.py:包含(雙向)LSTM 和(雙向)GRU
cnn_encoder.py:包含 CNN 和 GatedCNN
attn_encoder.py:包含注意力神經網絡編碼器?
gpt_encoder.py:包含 GPT 編碼器?
bert_encoder.py:包含 BERT 編碼器?
mixed_encoder.py:包含基本編碼器的組合,例如 RCNN(RNN + CNN),CRNN(CNN + RNN)
子編碼器負責在字的特征上抽取信息得到詞的特征。子編碼器在預訓練模型上用得不多,一個使用子編碼器的經典的工作是 ELMO。得益于 UER 這種解耦的設計,我們可以輕松地使用不同的編碼器、目標任務的組合,訓練出不同性質的預訓練模型。
因此,UER 的模型倉庫提供了基于不同語料、編碼器、以及目標任務的預訓練模型。UER 項目給出了每一個預訓練模型的細節,比如在什么語料上訓練了多少步(參見 UER 項目中的 readme)。
圖 3 給出了我們已有的語料、編碼器、目標任務的組合。圖 4 給出了項目中預訓練模型下載鏈接和描述的截圖。
▲?圖3.?不同語料、編碼器、目標任務進行組合,得到不同性質的預訓練模型
▲?圖4.?Github項目中預訓練模型下載鏈接和描述的截圖
此外,UER 項目還給出了在大規模數據集上訓練的模型。這些數據集來自于 GLYPH:
https://github.com/zhangxiangxiao/glyph
這些大規模數據集屬于新聞主題分類和情感分析任務,每個數據集包括了從幾十萬到上百萬的訓練樣本。得到的預訓練模型能幫助我們直接驗證 BERT 在幾個大數據集上的效果。此外,這些預訓練模型還可以繼續用于其它下游任務數據集,相信將它們用于新聞、評論相關的任務會對結果有著顯著的提升。
未來工作
1. 發布的預訓練模型并沒有使用遮詞策略。百度的 ERNIE [4] 和哈工大&訊飛 [5] 最近的工作都顯示了遮詞對于預訓練模型的重要性。分詞信息對于中文 NLP 確實很重要,我們后續會發布引入多種改進策略的預訓練模型,包括遮詞策略、多任務學習等等。?
對于將分詞信息引入 BERT 這個思路,我們在之前也訓練了基于詞的 BERT 模型,并在以詞搜詞上取得了非常不錯的效果,大家可以關注這個工作。?
2. 我們一下子給出了接近二十個預訓練模型。或許用訓練這二十個模型的計算力,訓練一個超級模型會更好?我們之前在做詞向量的時候,發現大規模混合的語料帶來的收益非常之高,因此,后面我們希望后面集中力量在大語料上訓練一個大模型,并加入多種改進機制。
這里推薦下載該項目下的在?mixed-large?語料上使用?character?和?ngram?特征訓練的詞向量:
https://github.com/Embedding/Chinese-Word-Vectors
當然,這一批預訓練模型還是很有意義的。通過前面的實驗也看到,在不同任務上選擇合適的預訓練模型能幫助我們取得 SOTA 的結果。到底是訓練一個超集模型,還是訓練一批性質各異,滿足不同下游任務的預訓練模型?這仍然是一個開放的問題。
結束語
本文介紹了用 UER 訓練的一批中文預訓練模型,并展示了通過對這些預訓練模型進行合理的利用,可以取得非常有競爭力的表現(更好的效果,更高的效率)。當我們再面對一個數據集的時候,我們的預訓練模型選擇不再局限于 Google BERT(或者百度的 ERNIE [4],哈工大&訊飛的 BERT-wwm [5])。
UER 模型倉庫中的預訓練模型各有特點,適用于不同的場景。我們希望大家能夠關注我們的工作,聽到大家想要的預訓練模型,也希望這個工作對中文 NLP 領域能起到一點幫助。
參考資料
[1] Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.?
[2] Radford A, Narasimhan K, Salimans T, et al. Improving language understanding by generative pre-training[J]. 2018.?
[3]?Conneau A, Kiela D, Schwenk H, et al. Supervised learning of universal sentence representations from natural language inference data[J]. arXiv preprint arXiv:1705.02364, 2017.?
[4]?https://github.com/PaddlePaddle/LARK/tree/develop/ERNIE?
[5] https://github.com/ymcui/Chinese-BERT-wwm?
[6] Qiu Y, Li H, Li S, et al. Revisiting Correlations between Intrinsic and Extrinsic Evaluations of Word Embeddings[M]//Chinese Computational Linguistics and Natural Language Processing Based on Naturally Annotated Big Data. Springer, Cham, 2018: 209-221.?
[7] Liu X, Chen Q, Deng C, et al. LCQMC: A Large-scale Chinese Question Matching Corpus[C]//Proceedings of the 27th International Conference on Computational Linguistics. 2018: 1952-1962.?
[8]?http://tcci.ccf.org.cn/conference/2016/dldoc/evagline2.pdf?
[9] https://github.com/facebookresearch/XNLI?
[10] https://github.com/SophonPlus/ChineseNlpCorpus?
[11]?https://github.com/brightmart/nlp_chinese_corpus
點擊以下標題查看往期內容推薦:?
- ACL 2019 | 基于知識增強的語言表示模型 
- 圖神經網絡綜述:模型與應用 
- ICLR 2019最佳論文 | 用有序神經元表達層次結構 
- F-Principle:初探理解深度學習不能做什么 
- 復旦大學邱錫鵬:詞法、句法分析研究進展綜述 
- 基于小樣本學習的意圖識別冷啟動 
- 從CNN視角看在自然語言處理上的應用 
- 自然語言處理中的語言模型預訓練方法 
#投 稿 通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢??答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
??來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
? 投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
?
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 訪問項目
總結
以上是生活随笔為你收集整理的一大批中文(BERT等)预训练模型等你认领!的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 探秘 | 平安人寿人工智能研发团队北京研
- 下一篇: 成为大厂AI算法工程师,“NLP/CV”
