Pytorch學習筆記13----LSTM+CRF模型的CRF層原理與代碼理解


1.LSTM+CRF概述

對於命名實體識別來講,目前比較流行的方法是基於神經網絡,例如,論文[1]提出了基於BiLSTM-CRF的命名實體識別模型,該模型采用word embedding和character embedding(在英文中,word embedding對應於單詞嵌入式表達,character embedding對應於字母嵌入式表達;在中文中,word embedding對應於詞嵌入式表達,character embedding對應於字嵌入式表達;接下來的示例中我們都假設是英文的場景),我將用該模型作為示例來解釋CRF層的工作原理。

1.1 參數定義

假設,我們的數據集中有兩種實體類型:人名和機構名,因此,在我們的數據集中有5種實體標簽:

  • B-Person
  • I- Person
  • B-Organization
  • I-Organization
  • O

假設x是一個句子,該句子由5個單詞組成:w0,w1,w2,w3,w4,而且在句子x中,[w0,w1]組成一個人名,[w2,w3]為一個機構名,其他單詞標簽都是"O"。

1.2 BiLSTM-CRF模型

接下來,簡明介紹一下該模型。
示意圖如下所示:

    • 首先,句子x中的每個單詞表達成一個向量,該向量包含了上述的word embedding和character embedding,其中character embedding隨機初始化,word embedding通常采用預訓練模型初始化。所有的embeddings 將在訓練過程中進行微調。
    • 其次,BiLSTM-CRF模型的的輸入是上述的embeddings,輸出是該句子xxx中每個單詞的預測標簽。

從上圖可以看出,BiLSTM層的輸出是每個標簽的得分,如單詞w0,BiLSTM的輸出為1.5(B-Person),0.9(I-Person),0.1(B-Organization), 0.08 (I-Organization) and 0.05 (O),

這些得分就是CRF層的輸入。
將BiLSTM層預測的得分喂進CRF層,具有最高得分的標簽序列將是模型預測的最好結果。

1.3 如果沒有CRF層將如何

根據上文,能夠發現,如果沒有CRF層,即我們用下圖所示訓練BiLSTM命名實體識別模型:

 

因為BiLSTM針對每個單詞的輸出是標簽得分,對於每個單詞,我們可以選擇最高得分的標簽作為預測結果。
例如,對於w0,“B-Person"得分最高(1.5),因此我們可以選擇“B-Person”最為其預測標簽;同樣的,w1的標簽為"I-Person”,w2w_2w2的為"O", w3w_3w3的標簽為"B-Organization",w4w_4w4的標簽為"O"。

按照上述方法,對於x雖然我們得到了正確的標簽,但是大多數情況下是不能獲得正確標簽的,例如下圖的例子:

 

顯然,輸出標簽“I-Organization I-Person” 和 “B-Organization I-Person”是不對的。

1.4 CRF能夠從訓練數據中學習到約束條件

CRF層可以對最終的約束標簽添加一些約束條件,從而保證預測標簽的有效性。而這些約束條件是CRF層自動從訓練數據中學到。
約束可能是:

  • 一句話中第一個單詞的標簽應該是“B-“ or “O”,而不能是"I-";
  • “B-label1 I-label2 I-label3 I-…”中,label1, label2, label3 …應該是相同的命名實體標簽。如“B-Person I-Person”是有效的,而“B-Person I-Organization” 是無效的;
  • “O I-label” 是無效的。一個命名實體的第一個標簽應該以 “B-“ 開頭,而不能以“I-“開頭,換句話說, 應該是“O B-label”這種模式;

有了這些約束條件,無效的預測標簽序列將急劇減少。

2.CRF層

在CRF層的損失函數中,有兩種類型的得分,這兩種類型的得分是CRF層的關鍵概念。

2.1 發射得分

第一個得分為發射得分,該得分可以從BiLSTM層獲得。如圖2.1所示,w0標記為B-Person的得分是1.5。

 

為了后續敘述方便,我們將給每個標簽一個索引,如下表所示:

Label Index
B-Person 0
I-Person 1
B-Organization 2
I-Organization 3
O 4

我們采用xi,yj來表達發射矩陣,其中i表示第i單詞,yj表示標簽索引。例如,根據圖2.1,

該表達式的意思是將w1w_1w1標記為 B-Organization的概率為0.1。

2.2 轉移得分

我們采用xi,yj表示轉移得分,例如,tBPerson,IPerson=0.9t_{B-Person,I-Person}=0.9tBPerson,IPerson=0.9表示標簽B-Person轉移到I-Person的得分為0.9,因此,我們將獲得一個轉移得分矩陣,該矩陣存儲着所有標簽相互轉移之間的得分。

為了使轉移得分矩陣的魯棒性更好,我們將額外再加兩個標簽:START和END,START表示一句話的開始,注意這不是指該句話的第一個單詞,START后才是第一個單詞,同樣的,END代表着這句話的結束。

下表就是一個轉移得分矩陣的示例,該示例包含了START和END標簽。

  START B-Person I-Person B-Organization I-Organization O END
START 0 0.8 0.007 0.7 0.0008 0.9 0.08
B-Person 0 0.6 0.9 0.2 0.0006 0.6 0.009
I-Person -1 0.5 0.53 0.55 0.0003 0.85 0.008
B-Organization 0.9 0.5 0.0003 0.25 0.8 0.77 0.006
I-Organization -0.9 0.45 0.007 0.7 0.65 0.76 0.2
O 0 0.65 0.0007 0.7 0.0008 0.9 0.08
END 0 0 0 0 0 0 0

如上表所示,我們能夠發現轉移矩陣已經學習到了某些有用的約束條件。

  • 句子中第一個單詞的標簽應該是以“B-”或者"O"開頭,而不能以"I-"開頭(轉移得分中,從START到I-Person 和 I-Organization的得分都很低);
  • 模式“B-label1 I-label2 I-label3 I-…”中,label1, label2, label3 … 應該是相同的命名實體,例如“B-Person I-Person”是有效的,而 “B-Person I-Organization”是無效的。(該性質在轉移得分矩陣中的表現為,從B-Organization到I-Person的得分僅有0.0003);
  • “O I-label”是無效的,命名實體的第一個標簽應該是以“B-“ 開頭的而不該是以“I-“開頭的,換而言之,有效的標簽模式應該是“O B-label” (該性質在轉移得分矩陣中的表現是,得分tO,IPersont_{O,I-Person}tO,IPerson是很低的。)

現在,你可能比較關心的問題是:怎么得到該轉移矩陣?
其實,該矩陣是BiLSTM-CRF模型的一個參數,在訓練模型之前,可以隨機初始化該轉移得分矩陣,在訓練過程中,這個矩陣中的所有隨機得分將得到更新,換而言之,CRF層可以自己學習這些約束條件,而無需人為構建該矩陣。隨着不斷的訓練,這些得分會越來越合理。

3.CRF的損失函數

假設我們的標簽一共有tag_size個,那么BiLSTM的輸出維度就是tag_size,表示的是每個詞wi映射到tag的發射概率值(feats),設BiLSTM的輸出矩陣為P,其中Pi,j代表詞wi映射到tag_jCRF陣A則A_{i,j}代表表tag_i轉移到到tag_j的轉移概率。

對於輸入序列X對應的輸出tagtagtag序列y,定義分數為:

 

利用softmax函數,我們為每一個正確的tag序列y定義一個概率值

在訓練中,我們的目標就是最大化概率p(y│X) ,怎么最大化呢,用對數似然(因為p(y│X)中存在指數和除法,對數似然可以化簡這些運算)
對數似然形式如下:

 

所以我們將損失函數Loss定義為-log(p(y|X)),就可以利用梯度下降法來進行網絡的學習了。

 

 

參考博客:

https://blog.csdn.net/Suan2014/article/details/89419283

https://www.cnblogs.com/Nobody0426/p/10712835.html(損失函數講解的好)

https://blog.csdn.net/qq_39526294/article/details/104055944(實例不錯)


免責聲明!

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



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