跟著這篇部落格來走的,最後加入了CRF++的比較試驗:

github程式碼也在上面的連結中

兩篇經典的論文:

Bidirectional LSTM-CRF Models for Sequence Tagging

1。Abstract:

state of the art (or close to) accuracy on POS, chunking and

NER data sets, less dependence on word embedding

2。Introduction:

LSTM:use both past and future input features

CRF:use sentence level tag information

3。Model:

Bi-LSTM:BPTT、dropout

BiLSTM+CRF、CRF++比較實驗與思考

Neural Architectures for Named Entity Recognition

1。Abstract:

models rely on character-based word representations learned from the supervised

corpus and unsupervised word representations learned from unannotated corpora

2。Introduction:

NER problem: a very small amount of supervised training data available,few constraints on word

(1)NER consist of multiple tokens BiLSTM+CRF和stack-LSTM 字向量

(2)one token:詞向量

dropout提高泛化

3。Model:

LSTM直接輸入對POS較有效,對NER這種對外部語料依賴性很大的效果較差,因此把LSTM輸出作為打分矩陣,表示某個詞被標註為某個標籤的機率

BiLSTM+CRF、CRF++比較實驗與思考

打分系數,其中A為標籤轉移得分,訓練時使用極大似然估計

4。Parameterization and Training

變數:打分矩陣A,BILSTM計算P引數,詞向量

若A隨機生成 似乎效果也不是很好

為了更好的效果,把LSTM輸出全連線接入線性隱層

5。word embeddings

BiLSTM+CRF、CRF++比較實驗與思考

隨機生成字母向量表,根據LSTM正序逆序加上原先詞向量獲得最後的詞向量(也可用cnn提取字首字尾特徵)

實驗用的是github已完整實現的命名實體識別的程式碼

ner語料為msra語料庫

作者的預設資料都是到40輪,我只跑了15輪到達相對接近的準確率就停下來了

無CRF Bilstm後接softmax輸出 loss一下子就下降到很低(區域性資訊易擬合?)在0。03左右一直波動,準確率緩慢提高

BiLSTM+CRF、CRF++比較實驗與思考

有CRF預設資料 loss穩定變小最後到0。15左右 但準確率變化已經比較少了 比不接CRF的更快擬合 總體準確率比無CRF的更高 ORG組織名明顯比無CRF的好多了 看起來對於組織名的實體識別 前後幾個字的線性加權特別重要

BiLSTM+CRF、CRF++比較實驗與思考

以下單跑一個CRF++的

引數:-f 3 -c 4

跑了1小時就完成了…傳統方法還是快

accuracy is 0。141521111264 recall is 0。939211555823 f is 0。245978061254

準確率出了很大問題

準確率公式記錯了。。導致結果出了問題 一開始還以為是crf++引數的問題 這過程中一些自己的猜想在最後進行否定和解釋

CRF++結果:引數 –f 1 –c 4

地名:accuracy is 0。845963416311 recall is 0。9573540856 f is 0。89821845794

組織:accuracy is 0。852735323525 recall is 0。9008601177 f is 0。87613736425

人名:accuracy is 0。916380494505 recall is 0。9549114331 f is 0。93524927714

實驗對比:

三個準確率為地名、組織、人名

BILSTM+softmax(15輪)準確率分別為85%、70%、81%

BILSTM+CRF(15輪)準確率分別為84%、85%、91%

作者跑了40輪準確率分別為91%、85%、87%

CRF++跑準確率分別為91%、85%、86%

如下表

BiLSTM+CRF、CRF++比較實驗與思考

實驗效果總結:

目前來看BILSTM+CRF效果略優於CRF++,只有BILSTM效果明顯最差

時間來看,普通語料CRF++1 2個小時肯定能跑完,而用深度學習模型跑了15輪大概用了4個小時(只是接近穩定而已),是傳統模型的好幾倍。

結論:

1。訓練集和測試集差距比較大,訓練集普通句子多,命名實體少,測試集命名實體多了很多,但是這並不影響實驗結果

2。在網上看到其他人用crf++做NER達到90%準確率,是先提取出了更多特徵:詞性、是否為實體結尾詞、是否為句子結尾詞等等,準確率能進一步提高。注:常用特徵工程可用spacy包來做。

3。NER訓練語料特別“稀疏”,但這並不會導致欠擬合,傳統方法、深度學習方法都是這樣,CRF++只使用出現3次以上特徵對結果影響也不大

4。調參對傳統方法CRF++影響並不大,正則化係數、特徵選擇等引數改變對結果影響不到1%,但深度學習方法引數選擇不好效果遠遠不如傳統方法CRF++

為什麼LSTM+CRF是最好的baseline?提供一些可能的可解釋性:

1。crf構造字元間的特徵對應關係,而lstm提供了詞向量的泛化,比如“我”和“是”的對應關係,經過lstm的泛化後相近語義的兩個字元也得到了這種對應關係。

2。lstm提供了長距離的依賴建模,加強了區域性視窗(當前字元以及上下字元)的聯絡關係,序列標註問題比較簡單就得到了還可以的效果。