網(wǎng)站建設(shè)合同有效期河北網(wǎng)站seo外包
文章目錄
- 1.安裝環(huán)境(可略過(guò))
- 2.模型簡(jiǎn)介(略讀)
- 抽取任務(wù)輸入輸出示例:
- 1.實(shí)體識(shí)別
- 2.關(guān)系抽取
- 3.快速上手(主菜)
- (1)轉(zhuǎn)換數(shù)據(jù)
- ==標(biāo)注數(shù)據(jù)樣例==
- (2)生成訓(xùn)練數(shù)據(jù)
- ==訓(xùn)練數(shù)據(jù)樣例==
- (3)微調(diào)訓(xùn)練
1.安裝環(huán)境(可略過(guò))
模型快速?gòu)?fù)現(xiàn)的基本思路,只要兩步,一是安裝環(huán)境,二是跑模型。
安裝GPU版本的paddlepaddle看參照此博客,如果不幸地,你報(bào)錯(cuò)缺少libcudart動(dòng)態(tài)庫(kù)文件,請(qǐng)參照此博客解決環(huán)境安裝問(wèn)題,畢竟安裝環(huán)境是AIer不可逾越的鴻溝。
2.模型簡(jiǎn)介(略讀)
知其然也知其所以然,能到快速上手階段,肯定已經(jīng)了解了UIE的一些相關(guān)介紹,這里僅從偏實(shí)踐角度,簡(jiǎn)短剖析一下任務(wù)細(xì)節(jié),具體介紹可參照官方github。
UIE(Universal Information Extraction) 針對(duì)少樣本、低資源、不同領(lǐng)域等場(chǎng)景,實(shí)現(xiàn)從非結(jié)構(gòu)化文本中抽取結(jié)構(gòu)化信息,包含了實(shí)體識(shí)別、關(guān)系抽取、事件抽取、情感分析、評(píng)論抽取等任務(wù)。
該任務(wù)的亮點(diǎn)在于:
(1)將多任務(wù)的信息抽取統(tǒng)一為一個(gè)抽取模板
(2)基于結(jié)構(gòu)化生成的預(yù)訓(xùn)練模型,可以實(shí)現(xiàn)少樣本、跨領(lǐng)域的模型微調(diào),且能夠達(dá)到工業(yè)級(jí)可應(yīng)用的SOTA效果。
統(tǒng)一模板可結(jié)合UIE整體框架來(lái)理解,如下圖所示。
其底座是基于T5模型預(yù)訓(xùn)練的,多任務(wù)模型那就少不了prompt,這個(gè)prompt設(shè)計(jì)也非常巧妙,把prompt提示抽象成兩種類別,Spotting進(jìn)行實(shí)體識(shí)別,Associating進(jìn)行關(guān)系類別識(shí)別,那么格式化就是:[spot] 實(shí)體類別 [asso] 關(guān)系類別 [text]。與實(shí)體識(shí)別、關(guān)系抽取、事件抽取任務(wù)聯(lián)系起來(lái),實(shí)體識(shí)別、事件觸發(fā)詞識(shí)別以及事件論元識(shí)別就是在做Spotting操作,找取目標(biāo)信息片段,關(guān)系抽取、事件論元與事件觸發(fā)詞之間的關(guān)系是做Associating操作,尋找目標(biāo)信息片段之間的關(guān)系。
對(duì)于不同的抽取任務(wù)只要給出統(tǒng)一的schema,那么模型就會(huì)自動(dòng)將其組裝為prompt喂給模型,進(jìn)行Spotting、Associating操作。
抽取任務(wù)輸入輸出示例:
1.實(shí)體識(shí)別
from pprint import pprint>>> from paddlenlp import Taskflow
schema = [‘時(shí)間’, ‘選手’, ‘賽事名稱’] # Define the schema for entity extraction
ie = Taskflow(‘information_extraction’, schema=schema)
pprint(ie(“2月8日上午北京冬奧會(huì)自由式滑雪女子大跳臺(tái)決賽中中國(guó)選手谷愛(ài)凌以188.25分獲得金牌!”)) # Better print results using pprint
[{‘時(shí)間’: [{‘end’: 6,
‘probability’: 0.9857378532924486,
‘start’: 0,
‘text’: ‘2月8日上午’}],
‘賽事名稱’: [{‘end’: 23,
‘probability’: 0.8503089953268272,
‘start’: 6,
‘text’: ‘北京冬奧會(huì)自由式滑雪女子大跳臺(tái)決賽’}],
‘選手’: [{‘end’: 31,
‘probability’: 0.8981548639781138,
‘start’: 28,
‘text’: ‘谷愛(ài)凌’}]}]
2.關(guān)系抽取
schema = {‘競(jìng)賽名稱’: [‘主辦方’, ‘承辦方’, ‘已舉辦次數(shù)’]} # Define the schema for relation extraction>>> ie.set_schema(schema) # Reset schema>>> pprint(ie(‘2022語(yǔ)言與智能技術(shù)競(jìng)賽由中國(guó)中文信息學(xué)會(huì)和中國(guó)計(jì)算機(jī)學(xué)會(huì)聯(lián)合主辦,百度公司、中國(guó)中文信息學(xué)會(huì)評(píng)測(cè)工作委員會(huì)和中國(guó)計(jì)算機(jī)學(xué)會(huì)自然語(yǔ)言處理專委會(huì)承辦,已連續(xù)舉辦4屆,成為全球最熱門(mén)的中文NLP賽事之一?!?)
[{‘競(jìng)賽名稱’: [{‘end’: 13,
‘probability’: 0.7825402622754041,
‘relations’: {‘主辦方’: [{‘end’: 22,
‘probability’: 0.8421710521379353,
‘start’: 14,
‘text’: ‘中國(guó)中文信息學(xué)會(huì)’},
{‘end’: 30,
‘probability’: 0.7580801847701935,
‘start’: 23,
‘text’: ‘中國(guó)計(jì)算機(jī)學(xué)會(huì)’}],
‘已舉辦次數(shù)’: [{‘end’: 82,
‘probability’: 0.4671295049136148,
‘start’: 80,
‘text’: ‘4屆’}],
‘承辦方’: [{‘end’: 39,
‘probability’: 0.8292706618236352,
‘start’: 35,
‘text’: ‘百度公司’},
{‘end’: 72,
‘probability’: 0.6193477885474685,
‘start’: 56,
‘text’: ‘中國(guó)計(jì)算機(jī)學(xué)會(huì)自然語(yǔ)言處理專委會(huì)’},
{‘end’: 55,
‘probability’: 0.7000497331473241,
‘start’: 40,
‘text’: ‘中國(guó)中文信息學(xué)會(huì)評(píng)測(cè)工作委員會(huì)’}]},
‘start’: 0,
‘text’: ‘2022語(yǔ)言與智能技術(shù)競(jìng)賽’}]}]
以上的兩個(gè)任務(wù)可以直接利用paddlenlp的Taskflow直接輸出結(jié)果,這是預(yù)訓(xùn)練模型通用的抽取任務(wù),輸出效果也不錯(cuò)。Taskflow可理解為paddle為是產(chǎn)業(yè)實(shí)踐研發(fā)的任務(wù)框架,包含數(shù)據(jù)的預(yù)處理、模型推理、后處理等任務(wù)執(zhí)行所遵循的框架。細(xì)分場(chǎng)景中一般需要一定的標(biāo)注數(shù)據(jù)進(jìn)行微調(diào)。
3.快速上手(主菜)
項(xiàng)目中代碼結(jié)構(gòu),如果不修改模型,不部署,僅微調(diào)的話,僅用到doccano.py、finetune.py、evaluate.py就足夠了。
├── utils.py # 數(shù)據(jù)處理工具
├── model.py # 模型組網(wǎng)腳本
├── doccano.py # 數(shù)據(jù)標(biāo)注腳本
├── doccano.md # 數(shù)據(jù)標(biāo)注文檔
├── finetune.py # 模型微調(diào)、壓縮腳本
├── evaluate.py # 模型評(píng)估腳本
└── README.md
(1)轉(zhuǎn)換數(shù)據(jù)
將自己的數(shù)據(jù)直接轉(zhuǎn)化為doccona標(biāo)注后的數(shù)據(jù)示例,為什么不直接轉(zhuǎn)換為喂給模型的訓(xùn)練、驗(yàn)證數(shù)據(jù),因?yàn)楣俜教峁┝宿D(zhuǎn)換腳本,里面包含正負(fù)樣例構(gòu)造、shuffle以及劃分訓(xùn)練、驗(yàn)證、測(cè)試集,非常方便。
標(biāo)注數(shù)據(jù)樣例
{"id": 1, "text": "昨天晚上十點(diǎn)加班打車(chē)回家58元", "relations": [], "entities": [{"id": 0, "start_offset": 0, "end_offset": 6, "label": "時(shí)間"}, {"id": 1, "start_offset": 11, "end_offset": 12, "label": "目的地"}, {"id": 2, "start_offset": 12, "end_offset": 14, "label": "費(fèi)用"}]}
{"id": 2, "text": "三月三號(hào)早上12點(diǎn)46加班,到公司54", "relations": [], "entities": [{"id": 3, "start_offset": 0, "end_offset": 11, "label": "時(shí)間"}, {"id": 4, "start_offset": 15, "end_offset": 17, "label": "目的地"}, {"id": 5, "start_offset": 17, "end_offset": 19, "label": "費(fèi)用"}]}
注:我剛開(kāi)始糾結(jié)該示例任務(wù)的schema = [‘出發(fā)地’, ‘目的地’, ‘費(fèi)用’, ‘時(shí)間’],有的示例數(shù)據(jù)沒(méi)有“目的地”無(wú)法定位offset怎么辦?
準(zhǔn)備標(biāo)注數(shù)據(jù)的時(shí)候,沒(méi)有的實(shí)體類別項(xiàng),忽略不記錄就行。
因?yàn)檗D(zhuǎn)換為訓(xùn)練數(shù)據(jù)集的時(shí)候,每個(gè)示例是根據(jù)類別分別轉(zhuǎn)換的,如第一條數(shù)據(jù),會(huì)轉(zhuǎn)化為抽取"時(shí)間"類別數(shù)據(jù),抽取"目的地"類別數(shù)據(jù),抽取"費(fèi)用"類別數(shù)據(jù)的3條數(shù)據(jù),"出發(fā)地"類別就不用管。
(2)生成訓(xùn)練數(shù)據(jù)
經(jīng)過(guò)doccona標(biāo)注后的數(shù)據(jù)樣例,通過(guò)doccona.py進(jìn)行轉(zhuǎn)換,生成訓(xùn)練集、驗(yàn)證集、測(cè)試集,命令如下所示。
python doccano.py \--doccano_file ./data/doccano_ext.json \--save_dir ./data \--splits 0.8 0.1 0.1
訓(xùn)練數(shù)據(jù)樣例
{"content": "出租車(chē)從酒店到公司一共34元時(shí)間是10月21日", "result_list": [{"text": "10月21日", "start": 17, "end": 23}], "prompt": "時(shí)間"}
{"content": "二零一九年十一月十三日晚上十點(diǎn)三十四分加班打車(chē)回家,四十三元", "result_list": [{"text": "家", "start": 24, "end": 25}], "prompt": "目的地"}
{"content": "月五號(hào)凌晨0點(diǎn)08分打車(chē)回家三十點(diǎn)五元", "result_list": [{"text": "家", "start": 13, "end": 14}], "prompt": "目的地"}
(3)微調(diào)訓(xùn)練
因?yàn)槲矣卸鄰堬@卡,一開(kāi)始想用多卡并行微調(diào)訓(xùn)練,沒(méi)想到還需要安裝一個(gè)ncll2,果斷放棄,選擇單卡也能微調(diào),且速度挺快。總共100多條標(biāo)注數(shù)據(jù),生成訓(xùn)練集600多條數(shù)據(jù),10多分鐘就訓(xùn)練完了。
注意,我修改的參數(shù),–device gpu:8 指定了特定的gpu,batch_size改為了8,因?yàn)轱@卡內(nèi)存被別程序占用,8才能跑起來(lái)。
微調(diào)命令如下所示:
python finetune.py \--device gpu:8 \--logging_steps 10 \--save_steps 100 \--eval_steps 100 \--seed 42 \--model_name_or_path uie-base \--output_dir $finetuned_model \--train_path data/train.txt \--dev_path data/dev.txt \--max_seq_length 512 \--per_device_eval_batch_size 8 \--per_device_train_batch_size 8 \--num_train_epochs 20 \--learning_rate 1e-5 \--label_names "start_positions" "end_positions" \--do_train \--do_eval \--do_export \--export_model_dir $finetuned_model \--overwrite_output_dir \--disable_tqdm True \--metric_for_best_model eval_f1 \--load_best_model_at_end True \--save_total_limit 1
參考:
[1].https://mp.weixin.qq.com/s/lL950H9T7UFsJRopuWQ59w
[2].https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/README.md#%E6%A8%A1%E5%9E%8B%E5%BE%AE%E8%B0%83