這篇文章主要介紹怎麼用我們的nlp工具包訓練及部署一個ner模型,以及分享一下當中的心得。
我們模型將會採用以下的設定:
資料集 - Chinese-Literature-NER-RE-Dataset
預訓練模型 - distilbert-base-multilingual-cased
資料預處理 - nlprep
模型訓練 - tfkit
演示及api - nlp2go
colab - 3lineNER
首先,安裝所需要的套件
1 |
|
下載/預處理
資料集下載,並且轉成繁體
1 |
|
我們所採用的是Chinese-Literature-NER-RE-Dataset資料集
這個資料集有分7個NER的tag,從下圖可見Time metric organization abstract 這幾類佔比很少,估計這幾類的表現都不會太好;此外,metric和time的資料也很接近,估計也容易混淆。後續可以考慮合併Metric和Time這兩類,用focal loss減緩資料不平衡帶來的問題。
模型訓練
用distilbert訓練模型,由於很快overfilling,幾個epoch即可
1 |
|
Distilbert 相比bert少了40%的參數,快了兩倍多,有Bert 97%的準確度。很值得拿來嘗試一下效果,其中的multilingual版本更可以支援中文,讓我們可以在colab上面也可以很快訓練出來。
從訓練的log來看,模型很快就開始overfitting,對此的可以適當調小learning rate,去減緩這種情況。
1 |
|
另一個比較有趣的現象,是testing 的loss蠻高的,但對於準確度反而卻上升了
1 |
|
這件事情其實也是合理
loss 所希望的是將一個tag的機率預測到 1
accuracy 則是這個機率最大就可以了
假設一個例子:
gold label 是 time
predict - time 0.43 metric 0.33 …..
time這一項距離1很遠,loss還蠻大的。但同時time這一項的機率最大,因此這是一個正確的預測,accuracy會是1。
猜測這裡會發生這個情況,是因為資料不平衡假設time和metric難以分類所導致。
部署和試用
選出訓練效果最好的模型,部署restful api或cli
1 |
|
驗證是不是最好的模型,我們可以對每一個模型都算一下f1,看看效果如何
1 |
|
之後用nlp2go去部署模型,cli模式可以讓我們在colab上嘗試不同的輸入。也可以不加cli參數,直接host一個restful api的server,可以用 get 或者 post來獲得我們的結果:
1 |
|