一、模型框架圖
二、分層介紹
1)ALBERT層
albert是以單個漢字作為輸入的(本次配置最大為128個,短句做padding),兩邊分別加上開始標識CLS和結束標識SEP,輸出的是每個輸入word的embedding。在該框架中其實主要就是利用了預訓練模型albert的詞嵌入功能,在此基礎上fine-tuning其后面的連接參數,也就是albert內部的訓練參數不參與訓練。
2)BiLSTM層
該層的輸入是albert的embedding輸出,一般中間會加個project_layer,保證其輸出是[batch_szie,num_steps, num_tags]。batch_size為模型當中batch的大小,num_steps為輸入句子的長度,本次配置為最大128,num_tags為序列標注的個數,如圖中的序列標注一共是5個,也就是會輸出每個詞在5個tag上的分數,由於沒有做softmax歸一化,所以不能稱之為概率值。
3)CRF層
如果沒有CRF層,直接按BiLSTM每個詞在5個tag的最大分數作為輸出的話,可能會出現【B-Person,O,I-Person,O,I-Location】這種序列,顯然不符合實際情況。CRF層可以加入一些約束條件,從而保證最終預測結果是有效的。
例如:
句子的開頭應該是“B-”或“O”,而不是“I-”。
“B-label1 I-label2 I-label3…”,在該模式中,類別1,2,3應該是同一種實體類別。比如,“B-Person I-Person” 是正確的,而“B-Person I-Location”則是錯誤的。
“O I-label”是錯誤的,命名實體的開頭應該是“B-”而不是“I-”。
這些約束可以在訓練數據時被CRF層自動學習得到,這種異常的序列出現概率就會大大降低。
三、如何訓練?
在從BiLSTM層進入到CRF層時,會有多種路徑選擇,像上圖中會有5x5x5x5x5種路徑可能,假設s是我們要尋找的正確路徑,其出現的概率如下:
es是當前序列的分數,分母是所有序列分數的和,這也是我們的求解loss function。
傳統CRF主要由特征函數組成,一個是狀態特征函數,一個是轉移特征函數,函數的值要么為1,要么為0,通過訓練其權重λ來改變特征函數的貢獻。而這里對路徑s的訓練沒有權重,但也是由兩部分組成:
1)EmissionScore(發射分數):由BiLSTM層訓練輸出的每個位置對各個tag的分數,就是上圖中輸出的紅色字體分數。
2)TransitionScore (轉移分數): 這部分主要由CRF層訓練得到,如下圖
所以,S=EmissionScore+TransitionScore
舉例:
對於序列來說,比如有一個序列是“START B-Person I-Person O B-Location O END”,則
EmissionScore=x0,START+x1,B-Person+x2,I-Person+x3,O+x4,B-Location+x5,O+x6,END
TransitionScore=tSTART−>B-Person+tB−Person−>I-Person+tI-Person−>O+t0−>B-Location+tB-Location