0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

中文預(yù)訓(xùn)練模型ERNIE使用指南

WpOh_rgznai100 ? 來源:lq ? 2019-08-02 09:15 ? 次閱讀

最近在工作上處理的都是中文語料,也嘗試了一些最近放出來的預(yù)訓(xùn)練模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比對(duì)之后還是覺得百度的ERNIE效果會(huì)比較好,而且使用十分方便,所以今天就詳細(xì)地記錄一下。希望大家也都能在自己的項(xiàng)目上取得進(jìn)展~

1、A Glance at ERNIE

關(guān)于ERNIE模型本身的話這篇不會(huì)做過多介紹,網(wǎng)上的介紹文檔也很多了,相信從事NLP的同學(xué)們肯定都非常熟悉啦。

2、ERNIE源碼淺嘗

Okay,當(dāng)我們了解了ERNIE模型的大體框架及原理之后,接下來就可以深入理解一下具體的實(shí)現(xiàn)啦。ERNIE是基于百度自己的深度學(xué)習(xí)框架飛槳(PaddlePaddle)搭建的,(百度推這個(gè)飛槳的力度還是蠻大的,還開放了免費(fèi)算力),大家平時(shí)煉丹用的更多的可能是TensorFlow和Pytorch,這里關(guān)于運(yùn)行ERNIE的飛槳環(huán)境安裝可以參考快速安裝指南:

https://www.paddlepaddle.org.cn/#quick-start

2.1 關(guān)于輸入

模型預(yù)訓(xùn)練的輸入是基于百科類、資訊類、論壇對(duì)話類數(shù)據(jù)構(gòu)造具有上下文關(guān)系的句子對(duì)數(shù)據(jù),利用百度內(nèi)部詞法分析工具對(duì)句對(duì)數(shù)據(jù)進(jìn)行字、詞、實(shí)體等不同粒度的切分,然后基于 tokenization.py 中的 CharTokenizer 對(duì)切分后的數(shù)據(jù)進(jìn)行 token 化處理,得到明文的 token 序列及切分邊界,然后將明文數(shù)據(jù)根據(jù)詞典config/vocab.txt 映射為 id 數(shù)據(jù),在訓(xùn)練過程中,根據(jù)切分邊界對(duì)連續(xù)的 token 進(jìn)行隨機(jī) mask 操作。經(jīng)過上述預(yù)處理之后的輸入樣例為:

11048 492 1333 1361 1051 326 2508 5 1803 1827 98 164 133 2777 2696 983 121 4 199 634 551 844 85 14 2476 1895 33 13 983 121 23 7 1093 24 46 660 12043 2 1263 6328 33 121 126 398 276 315 5 63 44 35 25 12043 2;0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 5455;-1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 00 -1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 -1;0

一共有五個(gè)部分組成,每個(gè)部分之間用分號(hào);隔開:

token_ids:輸入句子對(duì)的表示;

sentence_type_ids:0或者1表示token屬于哪一個(gè)句子;

position_ids:絕對(duì)位置編碼

seg_labels:表示分詞邊界信息,0表示詞首、1表示非詞首、-1為占位符

next_sentence_label:表示該句子對(duì)是否存在上下句的關(guān)系(0為無1為有)

reader.pretraining.py中的parse_line函數(shù).

2.2 關(guān)于mask策略batching.py

我們知道,相較于BERT,ERNIE最大的改進(jìn)就是中文 + 短語/實(shí)體掩碼(這個(gè)短語掩碼的操作后來也被BERT采用訓(xùn)練出了WWM-BERT),所以我們首先來看看ERNIE的掩碼機(jī)制是怎么樣實(shí)現(xiàn)的。

2.3 關(guān)于infer過程代碼改寫

ERNIE代碼很方便使用,但是有一個(gè)不足的地方就是目前官方還沒有給出infer.py文件,也就是模型訓(xùn)練之后給出快速推理結(jié)果的文件。Github上簡(jiǎn)直萬人血書求接口呀。

所以我們的目的就是需要改寫源碼,完成這樣一個(gè)接口:輸入為我們需要預(yù)測(cè)的文件predict.tsv,調(diào)用接口后輸出為相應(yīng)任務(wù)的結(jié)果pred_result。下面我們以分類任務(wù)為例,改寫一個(gè)infer接口。

Step 1. finetune下的classifier.py

在文件中完成predict函數(shù)

Step 2. run_classifier.py

修改predict_only=True時(shí)的邏輯

Step 3. finetune_args.py

在該文件中添加一個(gè)參數(shù)do_predict

OK, 篇幅有限后面還要介紹具體ERNIE實(shí)戰(zhàn),源碼閱讀部分就先這樣,其實(shí)剩下的很多都跟BERT代碼比較相似,感興趣的同學(xué)也可以參考之前的BERT源碼分析系:https://blog.csdn.net/Kaiyuan_sjtu/article/details/90265473

3、ERNIE實(shí)戰(zhàn)指南

上面扯的都是務(wù)虛的,接下來我們務(wù)實(shí)地來看看ERNIE這個(gè)預(yù)訓(xùn)練模型的具體應(yīng)用。和BERT相比,ERNIE的使用更加簡(jiǎn)單,在之前介紹過的BERT模型實(shí)戰(zhàn)之多文本分類(https://blog.csdn.net/Kaiyuan_sjtu/article/details/88709580)中,我們需要手動(dòng)改寫一個(gè)適應(yīng)自己任務(wù)的Processor,而對(duì)于ERNIE來說,簡(jiǎn)單到只需要三步:

把數(shù)據(jù)準(zhǔn)備成要求的格式(源碼中使用tsv格式,不過在bert中我們也說過了,可以修改成各種格式的)

寫一下訓(xùn)練腳本run_script.sh

跑腳本得到結(jié)果bashrun_script.sh

3.1 準(zhǔn)備工作

對(duì)于最近大火的預(yù)訓(xùn)練模型來說,絕大多數(shù)我們是不太可能自己從頭開始訓(xùn)練的,最多使用的是官方開源的模型進(jìn)行特定任務(wù)的Finetune。所以第一步就是下載模型代碼(https://github.com/PaddlePaddle/ERNIE/tree/develop/ERNIE

)以及相應(yīng)的參數(shù)(https://baidu-nlp.bj.bcebos.com/ERNIE_stable-1.0.1.tar.gz)。

接下去就是準(zhǔn)備我們?nèi)蝿?wù)的數(shù)據(jù),使其符合ERNIE模型輸入要求。一般來說字段之間都是label和text_a用制表符分割,對(duì)于句對(duì)任務(wù)還需要額外的text_b字段。在后面我們會(huì)具體介紹每種任務(wù)的示例輸入。

ok,前面我們一直強(qiáng)調(diào)ERNIE是超友好上手超快的模型,下面我們結(jié)合實(shí)際任務(wù)來看一看到底有多簡(jiǎn)單~

3.2 情感分類

情感分類是屬于非常典型的NLP基礎(chǔ)任務(wù)之一,因?yàn)橹癇ERT寫過文本分類,所以這里我們就稍微換一換口味~這里我們只考慮最簡(jiǎn)單情況的情感分類任務(wù),即給定一個(gè)輸入句子,要求模型給出一個(gè)情感標(biāo)簽,可以是只有正負(fù)的二分類,也可以是包括中性情感的三分類。ok,我們來看看數(shù)據(jù),網(wǎng)上隨便找了一個(gè)財(cái)經(jīng)新聞數(shù)據(jù)集,數(shù)據(jù)來源于雪球網(wǎng)上萬得資訊發(fā)布的正負(fù)***題,數(shù)據(jù)集中包含17149條新聞數(shù)據(jù),包括日期、公司、代碼、正/負(fù)面、標(biāo)題、正文6個(gè)字段,其中正面新聞12514條,負(fù)面新聞4635條。大概長(zhǎng)這樣:

處理成ERNIE分類任務(wù)所需要的輸入,大概長(zhǎng)這樣:

將處理完成的數(shù)據(jù)和前面下載好的預(yù)訓(xùn)練模型參數(shù)放置到合適的位置,就可以開始寫我們跑模型的腳本文件了:

嗯,這樣一個(gè)任務(wù)就結(jié)束了…運(yùn)行腳本后等待輸出結(jié)果即可,是不是很簡(jiǎn)單~

當(dāng)然如果你還想玩點(diǎn)花樣的話,就可以多看看論文。比如復(fù)旦之前有一篇文章是在BERT的基礎(chǔ)上,將ABSA情感分類的單句分類任務(wù)轉(zhuǎn)變成了句子對(duì)的相似度匹配任務(wù)。簡(jiǎn)單來說就是通過構(gòu)建輔助句子,把輸入這家餐館的鍋包肉超好吃變成了這家餐館的鍋包肉超好吃 + 菜品口感的情感是正的,論文表明這一trick是會(huì)比單句分類的效果更好。更具體的細(xì)節(jié)可以參考論文:《UtilizingBERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence》(https://www.aclweb.org/anthology/N19-1035)。

3.3 命名實(shí)體識(shí)別

命名實(shí)體識(shí)別也是NLP的一個(gè)基礎(chǔ)任務(wù),之前在博客中也有過介紹:【論文筆記】命名實(shí)體識(shí)別論文(https://blog.csdn.net/Kaiyuan_sjtu/article/details/89143573)關(guān)于NER的處理思路也是跟上面情感分類的大同小異,只不過NER是屬于序列標(biāo)注任務(wù),在運(yùn)行腳本的時(shí)候注意使用源碼中的run_senquence_labeling.py。

4、有趣的ISSUE

Github上比源碼更有價(jià)值的是對(duì)應(yīng)的issue,一個(gè)好的開源項(xiàng)目會(huì)吸引很多人的關(guān)注,issue區(qū)里會(huì)有很多有趣的思考,所以大家千萬不要錯(cuò)過噢~下面就列幾個(gè)我覺得比較有意思的issue供大家參考。

4.1關(guān)于batch_size

https://github.com/PaddlePaddle/LARK/issues/4

剛打開ERNIE腳本打算跑的同學(xué)可能會(huì)發(fā)現(xiàn),它的batch_size竟然是8192,我的天哪(小岳岳臉),這不得炸!于是乎你非常機(jī)智地把batch_size改為了32,美滋滋地輸入bash script/pretrain.py,然后自信地敲下Enter鍵。嗯???報(bào)錯(cuò)???

報(bào)的什么錯(cuò)大家感興趣的自己去復(fù)現(xiàn)吧~

對(duì),在pretrain的時(shí)候這里的batch_size指的是所有輸入token的總數(shù),所以才會(huì)那么大~

4.2關(guān)于Mask機(jī)制的邏輯

https://github.com/PaddlePaddle/LARK/issues/33

正如我開篇說的,ERNIE的最大創(chuàng)新就是它的mask機(jī)制,這一點(diǎn)的代碼實(shí)現(xiàn)也在issue區(qū)被熱烈討論

4.3關(guān)于獲取輸入的中間向量表示

https://github.com/PaddlePaddle/LARK/issues/41

有時(shí)候我們會(huì)需要獲取句子Embedding 和 tokenEmbeddings,可參照下面的方案。

4.4 預(yù)測(cè)被masked的詞

https://github.com/PaddlePaddle/LARK/issues/135

將一個(gè)句子的某個(gè)詞語mask后,然后使用模型去預(yù)測(cè)這個(gè)詞語,得到候選詞和詞語的概率

4.5. ERNIE模型部署

飛槳(PaddlePaddle)模型的部署可以在官方說明文檔中找到

https://www.paddlepaddle.org.cn/documentation/docs/zh/1.4/advanced_usage/deploy/inference/index_cn.html

5、Some Tips

最后一部分打算說一下關(guān)于使用預(yù)訓(xùn)練模型的一些小tips:

學(xué)習(xí)率是第一種重要的參數(shù),當(dāng)你開始著手調(diào)參時(shí)優(yōu)先從學(xué)習(xí)率開始。

根據(jù)你的任務(wù)來選擇預(yù)訓(xùn)練模型。每個(gè)模型的訓(xùn)練大規(guī)模語料是不一樣的,這就說明了有些模型天生就是更加適用于某個(gè)領(lǐng)域。

所有的預(yù)訓(xùn)練模型為了在盡可能多的下游任務(wù)上取得較好的效果,所使用的訓(xùn)練語料的覆蓋范圍都是非常大的,但這也帶來了一個(gè)問題----過于general。也就是說如果你的任務(wù)所屬domain與訓(xùn)練語料的相差較大,比如關(guān)于醫(yī)學(xué)材料學(xué)之類的領(lǐng)域,反而不容易取得好的效果。所以我們可以在特定領(lǐng)域下嘗試post-train預(yù)訓(xùn)練模型。

目前來說,對(duì)于中文領(lǐng)域的NLP任務(wù),可以優(yōu)先選擇ERNIE。聽小道消息說,ERNIE 2.0快出來了,據(jù)說效果很猛。

不要過分迷信預(yù)訓(xùn)練模型?。?!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3243

    瀏覽量

    48842
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5503

    瀏覽量

    121169

原文標(biāo)題:超詳細(xì)中文預(yù)訓(xùn)練模型ERNIE使用指南

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【大語言模型:原理與工程實(shí)踐】大語言模型預(yù)訓(xùn)練

    大語言模型的核心特點(diǎn)在于其龐大的參數(shù)量,這賦予了模型強(qiáng)大的學(xué)習(xí)容量,使其無需依賴微調(diào)即可適應(yīng)各種下游任務(wù),而更傾向于培養(yǎng)通用的處理能力。然而,隨著學(xué)習(xí)容量的增加,對(duì)預(yù)訓(xùn)練數(shù)據(jù)的需求也相
    發(fā)表于 05-07 17:10

    FreeRTOS實(shí)時(shí)內(nèi)核使用指南_中文

    FreeRTOS實(shí)時(shí)內(nèi)核使用指南_中文.pdf
    發(fā)表于 04-08 17:38

    FreeRTOS實(shí)時(shí)內(nèi)核使用指南_中文

    本帖最后由 lee_st 于 2018-2-3 14:18 編輯 FreeRTOS實(shí)時(shí)內(nèi)核使用指南_中文
    發(fā)表于 02-03 14:17

    keil編譯器使用指南中文).pdf

    keil編譯器使用指南中文).pdf
    發(fā)表于 08-14 12:08

    TI StellarisWare中文顯示使用指南

    TI StellarisWare中文顯示使用指南
    發(fā)表于 10-29 10:21 ?14次下載
    TI StellarisWare<b class='flag-5'>中文</b>顯示<b class='flag-5'>使用指南</b>

    小米在預(yù)訓(xùn)練模型的探索與優(yōu)化

    導(dǎo)讀:預(yù)訓(xùn)練模型在NLP大放異彩,并開啟了預(yù)訓(xùn)練-微調(diào)的NLP范式時(shí)代。由于工業(yè)領(lǐng)域相關(guān)業(yè)務(wù)的復(fù)雜性,以及工業(yè)應(yīng)用對(duì)推理性能的要求,大規(guī)模
    的頭像 發(fā)表于 12-31 10:17 ?2617次閱讀
    小米在<b class='flag-5'>預(yù)</b><b class='flag-5'>訓(xùn)練</b><b class='flag-5'>模型</b>的探索與優(yōu)化

    基于BERT的中文科技NLP預(yù)訓(xùn)練模型

    深度學(xué)習(xí)模型應(yīng)用于自然語言處理任務(wù)時(shí)依賴大型、高質(zhì)量的人工標(biāo)注數(shù)據(jù)集。為降低深度學(xué)習(xí)模型對(duì)大型數(shù)據(jù)集的依賴,提出一種基于BERT的中文科技自然語言處理預(yù)
    發(fā)表于 05-07 10:08 ?14次下載

    如何實(shí)現(xiàn)更綠色、經(jīng)濟(jì)的NLP預(yù)訓(xùn)練模型遷移

    NLP中,預(yù)訓(xùn)練模型Finetune是一種非常常見的解決問題的范式。利用在海量文本上預(yù)訓(xùn)練得到的Bert、GPT等
    的頭像 發(fā)表于 03-21 15:33 ?2208次閱讀

    一種基于亂序語言模型預(yù)訓(xùn)練模型-PERT

    由于亂序語言模型不使用[MASK]標(biāo)記,減輕了預(yù)訓(xùn)練任務(wù)與微調(diào)任務(wù)之間的gap,并由于預(yù)測(cè)空間大小為輸入序列長(zhǎng)度,使得計(jì)算效率高于掩碼語言模型。PERT
    的頭像 發(fā)表于 05-10 15:01 ?1550次閱讀

    利用視覺語言模型對(duì)檢測(cè)器進(jìn)行預(yù)訓(xùn)練

    預(yù)訓(xùn)練通常被用于自然語言處理以及計(jì)算機(jī)視覺領(lǐng)域,以增強(qiáng)主干網(wǎng)絡(luò)的特征提取能力,達(dá)到加速訓(xùn)練和提高模型泛化性能的目的。該方法亦可以用于場(chǎng)景文本檢測(cè)當(dāng)中,如最早的使用ImageNet
    的頭像 發(fā)表于 08-08 15:33 ?1409次閱讀

    ERNIE 3.0 Tiny新模型,壓縮部署“小”“快”“靈”!歡迎在 NGC 飛槳容器中體驗(yàn) PaddleNLP 最新版本

    PaddleNLP 又帶著新功能和大家見面了。本次更新,為大家?guī)?文心 ERNIE 3.0 Tiny 輕量級(jí)模型 ,刷新了中文模型的 SOTA 成績(jī);通過
    的頭像 發(fā)表于 02-22 07:05 ?950次閱讀

    什么是預(yù)訓(xùn)練 AI 模型

    預(yù)訓(xùn)練 AI 模型是為了完成特定任務(wù)而在大型數(shù)據(jù)集上訓(xùn)練的深度學(xué)習(xí)模型。這些模型既可以直接使用,
    的頭像 發(fā)表于 04-04 01:45 ?1453次閱讀

    什么是預(yù)訓(xùn)練AI模型?

    預(yù)訓(xùn)練 AI 模型是為了完成特定任務(wù)而在大型數(shù)據(jù)集上訓(xùn)練的深度學(xué)習(xí)模型。這些模型既可以直接使用,
    的頭像 發(fā)表于 05-25 17:10 ?1045次閱讀

    預(yù)訓(xùn)練模型的基本原理和應(yīng)用

    預(yù)訓(xùn)練模型(Pre-trained Model)是深度學(xué)習(xí)和機(jī)器學(xué)習(xí)領(lǐng)域中的一個(gè)重要概念,尤其是在自然語言處理(NLP)和計(jì)算機(jī)視覺(CV)等領(lǐng)域中得到了廣泛應(yīng)用。預(yù)
    的頭像 發(fā)表于 07-03 18:20 ?2837次閱讀

    大語言模型預(yù)訓(xùn)練

    能力,逐漸成為NLP領(lǐng)域的研究熱點(diǎn)。大語言模型預(yù)訓(xùn)練是這一技術(shù)發(fā)展的關(guān)鍵步驟,它通過在海量無標(biāo)簽數(shù)據(jù)上進(jìn)行訓(xùn)練,使模型學(xué)習(xí)到語言的通用知識(shí)
    的頭像 發(fā)表于 07-11 10:11 ?435次閱讀