ALBERT+BiLSTM+CRF實現序列標注


一、模型框架圖

二、分層介紹

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+tBPerson>I-Person+tI-Person>O+t0>B-Location+tB-Location>O+tO>END

es=eEmissionScore+TransitionScore

訓練過程:

在訓練的時候,BiLSTM層和CRF層的所有參數都會統一求導納入到訓練步驟中,BiLSTM層主要訓練其神經網絡的參數,而CRF層的參數就是上述轉移矩陣,會首先初始化一個轉移矩陣參數,然后通過求導不斷改變其轉移矩陣參數,其訓練的目標就是使得正確的路徑是所有路徑中出現的概率最大,也就是上文的P(y|x)最大。

#初始化轉移矩陣
trans = tf.get_variable("transitions",shape=[self.num_tags + 1, self.num_tags + 1],initializer=self.initializer)

#CRF層的返回結果就是最新的轉移矩陣參數,每一次更新后,再把新的參數傳進去,繼續更新
log_likelihood, trans = crf_log_likelihood(
                inputs=logits,
                tag_indices=targets,
                transition_params=trans,
                sequence_lengths=lengths+1)

損失函數通常會變為-log(p(y|x)),這樣就轉換成了求解最小值,利用梯度下降法求解即可。

總結:其實BiLSTM+CRF與傳統CRF類似,都是有兩部分組成,只不過BiLSTM層負責了發射分數的訓練,而CRF層負責轉移分數的訓練。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM