雖然doccano的自動標(biāo)注使用默認(rèn)的UIE模型可以識別出一定的實體,但是在特定領(lǐng)域或者因為實體類別名不能被理解很多實體是識別不了的,所以我們可以通過自己標(biāo)注的數(shù)據(jù)對模型進(jìn)行微調(diào)來滿足我們Auto Labeing的需求。
預(yù)處理doccano標(biāo)注的數(shù)據(jù)
該章節(jié)詳細(xì)說明如何通過doccano.py
腳本對doccano平臺導(dǎo)出的標(biāo)注數(shù)據(jù)進(jìn)行轉(zhuǎn)換,一鍵生成訓(xùn)練/驗證/測試集。
在本地部署UIE模型
下載模型壓縮包:
本來是要通過一定的方法(GitZip)才能在整體的大項目倉庫中下載的,不詳細(xì)講,這里直接給壓縮包。
PaddleNLP-model_zoo.zip - 藍(lán)奏云 (lanzoub.com)

抽取式任務(wù)數(shù)據(jù)轉(zhuǎn)換
- 當(dāng)標(biāo)注完成后,在 doccano 平臺上導(dǎo)出
JSONL(relation)
形式的文件,并將其重命名為doccano_ext.json
后,放入./data
目錄下。 - 通過 doccano.py 腳本進(jìn)行數(shù)據(jù)形式轉(zhuǎn)換,然后便可以開始進(jìn)行相應(yīng)模型訓(xùn)練。
python doccano.py \
--doccano_file ./data/doccano_ext.json \
--task_type "ext" \
--save_dir ./data \
--negative_ratio 5
當(dāng)然也可以將這個命令保存為tran.sh
文件
訓(xùn)練UIE模型
- 使用標(biāo)注數(shù)據(jù)進(jìn)行小樣本訓(xùn)練,模型參數(shù)保存在
./checkpoint/
目錄。
tips: 推薦使用GPU環(huán)境,否則可能會內(nèi)存溢出。CPU環(huán)境下,可以修改model為uie-tiny
,適當(dāng)調(diào)下batch_size。
增加準(zhǔn)確率的話:--num_epochs 設(shè)置大點多訓(xùn)練訓(xùn)練
可配置參數(shù)說明:
-
model_name_or_path
:必須,進(jìn)行 few shot 訓(xùn)練使用的預(yù)訓(xùn)練模型??蛇x擇的有 "uie-base"、 "uie-medium", "uie-mini", "uie-micro", "uie-nano", "uie-m-base", "uie-m-large"。 -
multilingual
:是否是跨語言模型,用 "uie-m-base", "uie-m-large" 等模型進(jìn)微調(diào)得到的模型也是多語言模型,需要設(shè)置為 True;默認(rèn)為 False。 -
output_dir
:必須,模型訓(xùn)練或壓縮后保存的模型目錄;默認(rèn)為None
。 -
device
: 訓(xùn)練設(shè)備,可選擇 'cpu'、'gpu' 、'npu'其中的一種;默認(rèn)為 GPU 訓(xùn)練。 -
per_device_train_batch_size
:訓(xùn)練集訓(xùn)練過程批處理大小,請結(jié)合顯存情況進(jìn)行調(diào)整,若出現(xiàn)顯存不足,請適當(dāng)調(diào)低這一參數(shù);默認(rèn)為 32。 -
per_device_eval_batch_size
:開發(fā)集評測過程批處理大小,請結(jié)合顯存情況進(jìn)行調(diào)整,若出現(xiàn)顯存不足,請適當(dāng)調(diào)低這一參數(shù);默認(rèn)為 32。 -
learning_rate
:訓(xùn)練最大學(xué)習(xí)率,UIE 推薦設(shè)置為 1e-5;默認(rèn)值為3e-5。 -
num_train_epochs
: 訓(xùn)練輪次,使用早停法時可以選擇 100;默認(rèn)為10。 -
logging_steps
: 訓(xùn)練過程中日志打印的間隔 steps 數(shù),默認(rèn)100。 -
save_steps
: 訓(xùn)練過程中保存模型 checkpoint 的間隔 steps 數(shù),默認(rèn)100。 -
seed
:全局隨機種子,默認(rèn)為 42。 -
weight_decay
:除了所有 bias 和 LayerNorm 權(quán)重之外,應(yīng)用于所有層的權(quán)重衰減數(shù)值??蛇x;默認(rèn)為 0.0; -
do_train
:是否進(jìn)行微調(diào)訓(xùn)練,設(shè)置該參數(shù)表示進(jìn)行微調(diào)訓(xùn)練,默認(rèn)不設(shè)置。 -
do_eval
:是否進(jìn)行評估,設(shè)置該參數(shù)表示進(jìn)行評估。
該示例代碼中由于設(shè)置了參數(shù) --do_eval
,因此在訓(xùn)練完會自動進(jìn)行評估。
微調(diào)命令
export finetuned_model=./checkpoint/model_best
python finetune.py \
--device gpu \
--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 16 \
--per_device_train_batch_size 16 \
--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
訓(xùn)練完成的結(jié)果:
驗證UIE模型效果
通過運行以下命令進(jìn)行模型評估:
python evaluate.py \
--model_path ./checkpoint/model_best \
--test_path ./data/dev.txt \
--batch_size 16 \
--max_seq_len 512
根據(jù)我們手動標(biāo)注的數(shù)據(jù)訓(xùn)練微調(diào)后,再次測試自有標(biāo)注的領(lǐng)域數(shù)據(jù),返回的準(zhǔn)確率為88%.
部署微調(diào)后的UIE模型
本地終端定制模型一鍵預(yù)測
paddlenlp.Taskflow
裝載定制模型,通過task_path
指定模型權(quán)重文件的路徑,路徑下需要包含訓(xùn)練好的模型權(quán)重文件model_state.pdparams
。
from pprint import pprint
from paddlenlp import Taskflow
schema = ['出發(fā)地', '目的地', '費用', '時間']#根據(jù)自身實體類別修改
# 設(shè)定抽取目標(biāo)和定制化模型權(quán)重路徑
my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best')
pprint(my_ie("城市內(nèi)交通費7月5日金額114廣州至佛山"))
經(jīng)過測試,原本無法預(yù)測出來的類型在引入自己標(biāo)注的模型之后就可以識別出來了。自此我們可以實現(xiàn)標(biāo)注的數(shù)據(jù)用于訓(xùn)練,訓(xùn)練的模型又可以提升我們標(biāo)注的速率。
模型快速服務(wù)化部署
在UIE的服務(wù)化能力中我們提供基于PaddleNLP SimpleServing 來搭建服務(wù)化能力,通過幾行代碼即可搭建服務(wù)化部署能力。
在上一篇文章如何使用doccano+flask+花生殼+服務(wù)器實現(xiàn)命名實體識別ner自動標(biāo)注 - 孤飛 - 博客園 (cnblogs.com)中的部署代碼里,我們修改task_path
模型路徑為剛剛微調(diào)過后的即可完成識別。
from flask import Flask, request, jsonify
from paddlenlp import Taskflow
app = Flask(__name__)
# 在這里定義你想要識別的實體類型
# UIE具有zero-shot能力,所以類型可以隨便定義,但是識別的好壞不一定
schema = ['出發(fā)地', '目的地', '費用', '時間']#根據(jù)自身實體類別修改
# 第一運行時,聯(lián)網(wǎng)狀態(tài)下會自動下載模型
# device_id為gpu id,如果寫-1則使用cpu,如果寫0則使用gpu
ie = Taskflow('information_extraction', schema=schema, device_id=0,task_path='./uie/checkpoint/model_best/')#添加了tesk_path指向新的模型
def convert(result):
result = result[0]
formatted_result = []
for label, ents in result.items():
for ent in ents:
formatted_result.append(
{
"label": label,
"start_offset": ent['start'],
"end_offset": ent['end']
})
return formatted_result
@app.route('/', methods=['POST'])
def get_result():
text = request.json['text']
print(text)
result = ie(text)
formatted_result = convert(result)
return jsonify(formatted_result)
if __name__ == '__main__':
# 這里寫端口的時候一定要注意不要與已有的端口沖突
# 這里的host并不是說訪問的時候一定要寫0.0.0.0,但是這里代碼要寫0.0.0.0,代表可以被本網(wǎng)絡(luò)中所有的看到
# 如果是其他機器訪問你創(chuàng)建的服務(wù),訪問的時候要寫你的ip
app.run(host='0.0.0.0', port=88)
參考文章:
PaddleNLP/doccano 數(shù)據(jù)轉(zhuǎn)換 GitHub
PaddleNLP/README.md 模型微調(diào) GitHub
信息抽取UIE(二)--小樣本快速提升性能(含doccona標(biāo)注-阿里云開發(fā)者社區(qū) (aliyun.com)
解決報錯:cannot import name 'strtobool' from 'paddlenlp.trainer.argparser'文章來源:http://www.zghlxwxcb.cn/news/detail-421482.html
Question 使用uie,標(biāo)好數(shù)據(jù)再用doccano.py腳本的時候發(fā)生錯誤:cannot import name 'strtobool' from 'paddlenlp.trainer.argparser' · Issue #5257 · PaddlePaddle/PaddleNLP (github.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-421482.html
到了這里,關(guān)于對doccano自動標(biāo)注使用的默認(rèn)UIE模型進(jìn)行微調(diào)以提高特定領(lǐng)域的實體識別能力,提高標(biāo)注速度的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!