有了中文文字和實現模型後,我們還差個什麼?還差了中文預訓練語言模型提升效果呀。
對於中文領域的預訓練語言模型,我們最常用的就是 BERT 了,這並不是說它的效果最好,而是最為方便。昨天,國內開發者 brightmart 開源了最新的 RoBERTa 中文預訓練語言模型,開發社群又有新的中文模型可以用了。
專案地址:https://github.com/brightmart/roberta_zh
專案表示,該中文預訓練模型為 24 層的 base 版,它使用了 10G 文字進行資料訓練,包含新聞、社群問答、百科資料等。
模型下載地址:https://storage.googleapis.com/roberta_zh/roberta_model/roeberta_zh_L-24_H-768_A-12.zip
作者同時計劃進行下一步的預訓練工作,並逐漸開源更大的 RoBERTa 中文預訓練模型。
GitHub 專案介紹開源計劃如下:
24 層 RoBERTa 模型 (roberta_l24_zh),使用 30G 檔案訓練,9 月 8 日
12 層 RoBERTa 模型 (roberta_l12_zh),使用 30G 檔案訓練,9 月 8 日
6 層 RoBERTa 模型 (roberta_l6_zh),使用 30G 檔案訓練,9 月 8 日
PyTorch 版本的模型 (roberta_l6_zh_pytorch),9 月 8 日
30G 中文語料,預訓練格式,可直接訓練(bert、xlent、gpt2),9 月 8 日
測試集測試和效果對比,9 月 14 日
看來該專案還要過幾天才會完善,但它已經非常值得期待了。那麼一般我們常用的中文預訓練語言模型又有什麼呢?
中文預訓練語言模型都有什麼
目前呼叫預訓練語言模型最主流的專案就是 huggingface 的 pytorch-transformers 了,它幾乎包含所有主流的預訓練語言模型,並且使用起來非常便捷。機器之心也曾使用過這個庫,它從 Tokenize、轉化為字元的 ID 到最終計算出隱藏向量表徵,提供了整套 API,我們可以快速地將其嵌入到各種 NLP 系統中。
但是在使用過程中,我們會發現中文的預訓練模型非常少,只有 BERT-Base 提供的那種。雖然它的效能也不差,但既然 XLNet 等用英文訓練的模型效果更好,那麼我們還是更希望有這些資源的。
值得注意的是,pytorch-transformers 同時支援匯入 TensorFlow 預訓練的模型與 PyTorch 預訓練的模型,它們倆都可以匯入到庫中。
清華的預訓練 BERT
早兩個月,清華大學開源了一個名為 OpenCLaP 的專案,即多領域開源中文預訓練語言模型庫。它提供了幾種中文預訓練 BERT,並表示它們可以直接透過 huggingface 的 pytorch-transformers 專案呼叫。
OpenCLaP 專案地址:https://github.com/thunlp/OpenCLaP
圖注:OpenCLaP 目前釋出的預訓練語言模型。
機器之心也嘗試過在 pytorch-transformers 專案中匯入清華預訓練的百度百科 BERT,我們發現這也是沒問題的,它能正常工作。
除此之外,百度也開源了預訓練語言模型 ERNIE,不過目前只有 ERNIE 1.0 Base 提供了中文預訓練模型,ERNIE 2.0 目前還只提供英文預訓練模型。當然,如果要使用 ERNIE,我們需要了解 PaddlePaddle 框架,並透過 ernie_encoder.py 抽取句子與 Token 的隱藏向量表示。
現在,也許常用的中文預訓練語言模型又要再新增一項,中文 RoBERTa。
中文 RoBERTa
作者按照 RoBERTa 論文主要精神訓練了這一模型,並進行了多項改進和調整:
資料生成方式和任務改進:取消下一個句子預測,並且資料連續從一個文件中獲得 (見:Model Input Format and Next Sentence Prediction,DOC-SENTENCES);
更大更多樣性的資料:使用 30G 中文訓練,包含 3 億個句子,100 億個字 (即 token)。由於新聞、社群討論、多個百科,保羅永珍,覆蓋數十萬個主題;
訓練更久:總共訓練了近 20 萬,總共見過近 16 億個訓練資料 (instance); 在 Cloud TPU v3-256 上訓練了 24 小時,相當於在 TPU v3-8(128G 視訊記憶體) 上需要訓練一個月;
更大批次:使用了超大(8k)的批次 batch size;
調整最佳化器引數;
使用全詞 mask(whole word mask)。
圖注:全詞 Mask 和其他文字處理方法對比。
作者表示,在本專案中,沒有實現 dynamic mask。
RoBERTa:站在 BERT 的肩膀上
說起 RoBERTa 模型,一些讀者可能還會感到有些陌生。但是實際來看,RoBERTa 模型更多的是基於 BERT 的一種改進版本。是 BERT 在多個層面上的重大改進。
RoBERTa 在模型規模、算力和資料上,主要比 BERT 提升了以下幾點:
更大的模型引數量(從 RoBERTa 論文提供的訓練時間來看,模型使用 1024 塊 V 100 GPU 訓練了 1 天的時間)
更多的訓練資料(包括:CC-NEWS 等在內的 160GB 純文字)
此外如下所示,RoBERTa 還有很多訓練方法上的改進。
1. 動態掩碼
BERT 依賴隨機掩碼和預測 token。原版的 BERT 實現在資料預處理期間執行一次掩碼,得到一個靜態掩碼。而 RoBERTa 使用了動態掩碼:每次向模型輸入一個序列時都會生成新的掩碼模式。這樣,在大量資料不斷輸入的過程中,模型會逐漸適應不同的掩碼策略,學習不同的語言表徵。
2. 更大批次
RoBERTa 在訓練過程中使用了更大的批數量。研究人員嘗試過從 256 到 8000 不等的批數量。
3. 文字編碼
Byte-Pair Encoding(BPE)是字元級和詞級別表徵的混合,支援處理自然語言語料庫中的眾多常見詞彙。
原版的 BERT 實現使用字元級別的 BPE 詞彙,大小為 30K,是在利用啟發式分詞規則對輸入進行預處理之後學得的。Facebook 研究者沒有采用這種方式,而是考慮用更大的 byte 級別 BPE 詞彙表來訓練 BERT,這一詞彙表包含 50K 的 subword 單元,且沒有對輸入作任何額外的預處理或分詞。
RoBERTa 的實際效果
雖然沒有中文預訓練模型的效果比較,但 RoBERTTa 的作者對比了 RoBERTA(large)、BERT(large)和 XLNET 在不同任務上的表現結果。
結果可以看到,RoBERTa 相比於其他預訓練語言模型,在多個任務上實現了 SOTA。