本篇文章為大家展示了中文預(yù)訓(xùn)練模型ERNIE該如何使用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、無為ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的無為網(wǎng)站制作公司
最近在工作上處理的都是中文語料,也嘗試了一些最近放出來的預(yù)訓(xùn)練模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比對之后還是覺得百度的ERNIE效果會比較好,而且使用十分方便,所以今天就詳細(xì)地記錄一下。希望大家也都能在自己的項目上取得進(jìn)展~
1、A Glance at ERNIE
關(guān)于ERNIE模型本身的話這篇不會做過多介紹,網(wǎng)上的介紹文檔也很多了,相信從事NLP的同學(xué)們肯定都非常熟悉啦。
2、ERNIE源碼淺嘗
Okay,當(dāng)我們了解了ERNIE模型的大體框架及原理之后,接下來就可以深入理解一下具體的實現(xiàn)啦。ERNIE是基于百度自己的深度學(xué)習(xí)框架飛槳(PaddlePaddle)搭建的,(百度推這個飛槳的力度還是蠻大的,還開放了免費算力),大家平時煉丹用的更多的可能是TensorFlow和Pytorch,這里關(guān)于運行ERNIE的飛槳環(huán)境安裝可以參考快速安裝指南(https://www.paddlepaddle.org.cn/#quick-start)。
2.1 關(guān)于輸入
模型預(yù)訓(xùn)練的輸入是基于百科類、資訊類、論壇對話類數(shù)據(jù)構(gòu)造具有上下文關(guān)系的句子對數(shù)據(jù),利用百度內(nèi)部詞法分析工具對句對數(shù)據(jù)進(jìn)行字、詞、實體等不同粒度的切分,然后基于 tokenization.py中的 CharTokenizer 對切分后的數(shù)據(jù)進(jìn)行 token 化處理,得到明文的 token 序列及切分邊界,然后將明文數(shù)據(jù)根據(jù)詞典 config/vocab.txt 映射為 id 數(shù)據(jù),在訓(xùn)練過程中,根據(jù)切分邊界對連續(xù)的 token 進(jìn)行隨機(jī) mask 操作。經(jīng)過上述預(yù)處理之后的輸入樣例為:
1 1048 492 1333 1361 1051 326 2508 5 1803 1827 98 164 133 2777 2696 983 121 4 19 9 634 551 844 85 14 2476 1895 33 13 983 121 23 7 1093 24 46 660 12043 2 1263 6 328 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 0 0 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 1 1;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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55;-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 0 0 -1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 -1;0
一共有五個部分組成,每個部分之間用分號;隔開:
token_ids:輸入句子對的表示;
sentence_type_ids:0或者1表示token屬于哪一個句子;
position_ids:絕對位置編碼
seg_labels: 表示分詞邊界信息,0表示詞首、1表示非詞首、-1為占位符
next_sentence_label:表示該句子對是否存在上下句的關(guān)系(0為無1為有)
reader.pretraining.py中的parse_line函數(shù).
2.2 關(guān)于mask策略 batching.py
我們知道,相較于BERT,ERNIE最大的改進(jìn)就是中文 +短語/實體掩碼(這個短語掩碼的操作后來也被BERT采用訓(xùn)練出了WWM-BERT),所以我們首先來看看ERNIE的掩碼機(jī)制是怎么樣實現(xiàn)的。
2.3 關(guān)于infer過程代碼改寫
ERNIE代碼很方便使用,但是有一個不足的地方就是目前官方還沒有給出infer.py文件,也就是模型訓(xùn)練之后給出快速推理結(jié)果的文件。Github上簡直萬人血書求接口呀。
所以我們的目的就是需要改寫源碼,完成這樣一個接口:輸入為我們需要預(yù)測的文件predict.tsv,調(diào)用接口后輸出為相應(yīng)任務(wù)的結(jié)果pred_result。下面我們以分類任務(wù)為例,改寫一個infer接口。
Step 1. finetune下的classifier.py
在文件中完成predict函數(shù)
Step 2. run_classifier.py
修改predict_only=True時的邏輯
Step 3. finetune_args.py
在該文件中添加一個參數(shù)do_predict
OK,篇幅有限后面還要介紹具體ERNIE實戰(zhàn),源碼閱讀部分就先這樣,其實剩下的很多都跟BERT代碼比較相似,感興趣的同學(xué)也可以參考之前的 BERT源碼分析系列(https://blog.csdn.net/Kaiyuan_sjtu/article/details/90265473)
3、ERNIE實戰(zhàn)指南
上面扯的都是務(wù)虛的,接下來我們務(wù)實地來看看ERNIE這個預(yù)訓(xùn)練模型的具體應(yīng)用。和BERT相比,ERNIE的使用更加簡單,在之前介紹過的BERT模型實戰(zhàn)之多文本分類(https://blog.csdn.net/Kaiyuan_sjtu/article/details/88709580)中,我們需要手動改寫一個適應(yīng)自己任務(wù)的Processor,而對于ERNIE來說,簡單到只需要三步:
把數(shù)據(jù)準(zhǔn)備成要求的格式(源碼中使用tsv格式,不過在bert中我們也說過了,可以修改成各種格式的)
寫一下訓(xùn)練腳本sh
跑腳本得到結(jié)果bash run_script.sh
準(zhǔn)備工作
對于最近大火的預(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用制表符分割,對于句對任務(wù)還需要額外的text_b字段。在后面我們會具體介紹每種任務(wù)的示例輸入。
ok,前面我們一直強(qiáng)調(diào)ERNIE是超友好上手超快的模型,下面我們結(jié)合實際任務(wù)來看一看到底有多簡單~
情感分類
情感分類是屬于非常典型的NLP基礎(chǔ)任務(wù)之一,因為之前BERT寫過文本分類,所以這里我們就稍微換一換口味~這里我們只考慮最簡單情況的情感分類任務(wù),即給定一個輸入句子,要求模型給出一個情感標(biāo)簽,可以是只有正負(fù)的二分類,也可以是包括中性情感的三分類。ok,我們來看看數(shù)據(jù),網(wǎng)上隨便找了一個財經(jīng)新聞數(shù)據(jù)集,數(shù)據(jù)來源于雪球網(wǎng)上萬得資訊發(fā)布的正負(fù)面新聞標(biāo)題,數(shù)據(jù)集中包含17149條新聞數(shù)據(jù),包括日期、公司、代碼、正/負(fù)面、標(biāo)題、正文6個字段,其中正面新聞12514條,負(fù)面新聞4635條。大概長這樣:
處理成ERNIE分類任務(wù)所需要的輸入,大概長這樣:
將處理完成的數(shù)據(jù)和前面下載好的預(yù)訓(xùn)練模型參數(shù)放置到合適的位置,就可以開始寫我們跑模型的腳本文件了:
嗯,這樣一個任務(wù)就結(jié)束了…運行腳本后等待輸出結(jié)果即可,是不是很簡單~
當(dāng)然如果你還想玩點花樣的話,就可以多看看論文。比如復(fù)旦之前有一篇文章是在BERT的基礎(chǔ)上,將ABSA情感分類的單句分類任務(wù)轉(zhuǎn)變成了句子對的相似度匹配任務(wù)。簡單來說就是通過構(gòu)建輔助句子,把輸入這家餐館的鍋包肉超好吃變成了這家餐館的鍋包肉超好吃 + 菜品口感的情感是正的,論文表明這一trick是會比單句分類的效果更好。更具體的細(xì)節(jié)可以參考論文:
《Utilizing BERT for Aspect-Based Sentiment Analysis via Constructing Auxiliary Sentence》:https://www.aclweb.org/anthology/N19-1035
命名實體識別
命名實體識別也是NLP的一個基礎(chǔ)任務(wù),之前在博客中也有過介紹:【論文筆記】命名實體識別論文:https://blog.csdn.net/Kaiyuan_sjtu/article/details/89143573
關(guān)于NER的處理思路也是跟上面情感分類的大同小異,只不過NER是屬于序列標(biāo)注任務(wù),在運行腳本的時候注意使用源碼中的run_senquence_labeling.py
4、有趣的ISSUE
Github上比源碼更有價值的是對應(yīng)的issue,一個好的開源項目會吸引很多人的關(guān)注,issue區(qū)里會有很多有趣的思考,所以大家千萬不要錯過噢~下面就列幾個我覺得比較有意思的issue供大家參考。
關(guān)于batch_size
剛打開ERNIE腳本打算跑的同學(xué)可能會發(fā)現(xiàn),它的batch_size竟然是8192,我的天哪(小岳岳臉),這不得炸!于是乎你非常機(jī)智地把batch_size改為了32,美滋滋地輸入bash script/pretrain.py,然后自信地敲下Enter鍵。嗯???報錯???
報的什么錯大家感興趣的自己去復(fù)現(xiàn)吧~
對,在pretrain的時候這里的batch_size指的是所有輸入token的總數(shù),所以才會那么大~
關(guān)于Mask機(jī)制的邏輯
正如我開篇說的,ERNIE的最大創(chuàng)新就是它的mask機(jī)制,這一點的代碼實現(xiàn)也在issue區(qū)被熱烈討論
關(guān)于獲取輸入的中間向量表示
有時候我們會需要獲取句子 Embedding 和 token Embeddings,可參照下面的方案
預(yù)測被masked的詞
將一個句子的某個詞語mask后,然后使用模型去預(yù)測這個詞語,得到候選詞和詞語的概率
上述內(nèi)容就是中文預(yù)訓(xùn)練模型ERNIE該如何使用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前標(biāo)題:中文預(yù)訓(xùn)練模型ERNIE該如何使用
文章出自:http://m.newbst.com/article2/jhsjoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站排名、全網(wǎng)營銷推廣、營銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)