NLP ——從0開始快速上手百度 ERNIE
三、具體實(shí)現(xiàn)過(guò)程
開始寫代碼!
ChnSentiCorp任務(wù)運(yùn)行的shell腳本是 ERNIE/ernie/run_classifier.py,該文件定義了分類任務(wù)Fine-tuning 的詳細(xì)過(guò)程,下面我們將通過(guò)如下幾個(gè)步驟進(jìn)行詳細(xì)剖析:
環(huán)境準(zhǔn)備。導(dǎo)入相關(guān)的依賴,解析命令行參數(shù);
實(shí)例化ERNIE 模型,優(yōu)化器以及Tokenizer, 并設(shè)置超參數(shù)
定義輔助函數(shù)
運(yùn)行訓(xùn)練循環(huán)
1. 環(huán)境準(zhǔn)備
import相關(guān)的依賴,解析命令行參數(shù)。
import syssys.path.a(chǎn)ppend('./ERNIE')import numpy as npfrom sklearn.metrics import f1_scoreimport paddle as Pimport paddle.fluid as Fimport paddle.fluid.layers as Limport paddle.fluid.dygraph as D
from ernie.tokenizing_ernie import ErnieTokenizerfrom ernie.modeling_ernie import ErnieModelForSequenceClassification2. 實(shí)例化ERNIE 模型,優(yōu)化器以及Tokenizer, 并設(shè)置超參數(shù)
設(shè)置好所有的超參數(shù),對(duì)于ERNIE任務(wù)學(xué)習(xí)率推薦取 1e-5/2e-5/5e-5, 根據(jù)顯存大小調(diào)節(jié)BATCH大小, 最大句子長(zhǎng)度不超過(guò)512.
BATCH=32MAX_SEQLEN=300LR=5e-5EPOCH=10
D.guard().__enter__() # 為了讓Paddle進(jìn)入動(dòng)態(tài)圖模式,需要添加這一行在最前面
ernie = ErnieModelForSequenceClassification.from_pretrained('ernie-1.0', num_labels=3)optimizer = F.optimizer.Adam(LR, parameter_list=ernie.parameters())tokenizer = ErnieTokenizer.from_pretrained('ernie-1.0')3. 定義輔助函數(shù)
(1)定義函數(shù) make_data,將文本數(shù)據(jù)讀入內(nèi)存并轉(zhuǎn)換為numpy List存儲(chǔ)。
def make_data(path): data = [] for i, l in enumerate(open(path)): if i == 0: continue l = l.strip().split(' ') text, label = l[0], int(l[1]) text_id, _ = tokenizer.encode(text) # ErnieTokenizer 會(huì)自動(dòng)添加ERNIE所需要的特殊token,如[CLS], [SEP] text_id = text_id[:MAX_SEQLEN] text_id = np.pad(text_id, [0, MAX_SEQLEN-len(text_id)], mode='constant') # 對(duì)所有句子都補(bǔ)長(zhǎng)至300,這樣會(huì)比較費(fèi)顯存; label_id = np.a(chǎn)rray(label+1) data.a(chǎn)ppend((text_id, label_id)) return data
train_data = make_data('./chnsenticorp/train/part.0')test_data = make_data('./chnsenticorp/dev/part.0')
(2)定義函數(shù)get_batch_data,用于獲取BATCH條樣本并按照批處理維度stack到一起。
def get_batch_data(data, i): d = data[i*BATCH: (i + 1) * BATCH] feature, label = zip(*d) feature = np.stack(feature) # 將BATCH行樣本整合在一個(gè)numpy.a(chǎn)rray中 label = np.stack(list(label)) feature = D.to_variable(feature) # 使用to_variable將numpy.a(chǎn)rray轉(zhuǎn)換為paddle tensor label = D.to_variable(label) return feature, label4. 運(yùn)行訓(xùn)練循環(huán)
隊(duì)訓(xùn)練數(shù)據(jù)重復(fù)EPOCH遍訓(xùn)練循環(huán);每次循環(huán)開頭都會(huì)重新shuffle數(shù)據(jù)。在訓(xùn)練過(guò)程中每間隔100步在驗(yàn)證數(shù)據(jù)集上進(jìn)行測(cè)試并匯報(bào)結(jié)果(acc)。
for i in range(EPOCH): np.random.shuffle(train_data) # 每個(gè)epoch都shuffle數(shù)據(jù)以獲得最佳訓(xùn)練效果; #train for j in range(len(train_data) // BATCH): feature, label = get_batch_data(train_data, j) loss, _ = ernie(feature, labels=label) # ernie模型的返回值包含(loss, logits);其中l(wèi)ogits目前暫時(shí)不需要使用 loss.backward() optimizer.minimize(loss) ernie.clear_gradients() if j % 10 == 0: print('train %d: loss %.5f' % (j, loss.numpy())) # evaluate if j % 100 == 0: all_pred, all_label = [], [] with D.base._switch_tracer_mode_guard_(is_train=False): # 在這個(gè)with域內(nèi)ernie不會(huì)進(jìn)行梯度計(jì)算; ernie.eval() # 控制模型進(jìn)入eval模式,這將會(huì)關(guān)閉所有的dropout; for j in range(len(test_data) // BATCH): feature, label = get_batch_data(test_data, j) loss, logits = ernie(feature, labels=label) all_pred.extend(L.a(chǎn)rgmax(logits, -1).numpy()) all_label.extend(label.numpy()) ernie.train() f1 = f1_score(all_label, all_pred, average='macro') acc = (np.a(chǎn)rray(all_label) == np.a(chǎn)rray(all_pred)).a(chǎn)stype(np.float32).mean() print('acc %.5f' % acc)
訓(xùn)練過(guò)程中單次迭代輸出的日志如下所示:
train 0: loss 0.05833acc 0.91723train 10: loss 0.03602train 20: loss 0.00047train 30: loss 0.02403train 40: loss 0.01642train 50: loss 0.12958train 60: loss 0.04629train 70: loss 0.00942train 80: loss 0.00068train 90: loss 0.05485train 100: loss 0.01527acc 0.92821train 110: loss 0.00927train 120: loss 0.07236train 130: loss 0.01391train 140: loss 0.01612
包含了當(dāng)前 batch 的訓(xùn)練得到的Loss(ave loss)和每個(gè)Epochde 精度(acc)信息。訓(xùn)練完成后用戶可以參考快速運(yùn)行中的方法使用模型體驗(yàn)推理功能。
其它特性
ERNIE 還提供了混合精度訓(xùn)練、模型蒸餾等高級(jí)功能,可以在 README 中獲得這些功能的使用方法。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
圖片新聞
-

OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
-

馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-

機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-

存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-

長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-

豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-

字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-

員工持股爆雷?廣汽埃安緊急回應(yīng)
最新活動(dòng)更多
-
11月7日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
11月20日立即報(bào)名>> 【免費(fèi)下載】RISC-V芯片發(fā)展現(xiàn)狀與測(cè)試挑戰(zhàn)-白皮書
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來(lái)的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
11月28日立即下載>> 【白皮書】精準(zhǔn)洞察 無(wú)線掌控——283FC智能自檢萬(wàn)用表
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 海康威視數(shù)智系統(tǒng)“上崗”,重慶垃圾中轉(zhuǎn)站煥新
- 3 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰(shuí)是“蘋果”?
- 4 拐點(diǎn)已至!匯川領(lǐng)跑工控、埃斯頓份額第一、新時(shí)達(dá)海爾賦能扭虧為盈
- 5 L3自動(dòng)駕駛延期,逼出車企技術(shù)自我淘汰
- 6 隱退4年后,張一鳴久違現(xiàn)身!互聯(lián)網(wǎng)大佬正集體殺回
- 7 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 8 7倍機(jī)器人大牛股:高管股東套現(xiàn)VS機(jī)構(gòu)兇猛抱團(tuán),該信誰(shuí)?
- 9 八部門聯(lián)手放行L3自動(dòng)駕駛!巨頭開始拼搶萬(wàn)億市場(chǎng)?
- 10 OpenAI發(fā)布的AI瀏覽器,市場(chǎng)為何反應(yīng)強(qiáng)烈?
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市



分享





