通俗易懂的理解BiLSTM-CRF模型中的CRF层
通俗易懂的理解BiLSTM-CRF模型中的CRF層
本文轉載自知乎最通俗易懂的BiLSTM-CRF模型中的CRF層介紹
注:本文章所有的圖片均為兩幅重復的,請忽略第二幅~
本文翻譯自GitHub博客上的原創文章,結尾有原文鏈接。文章沒有晦澀的數學公式,而是通過實例一步一步講解CRF的實現過程,是入門CRF非常非常合適的資料。
概述
該文章系列包括以下內容:
- 概念介紹 — 基于 BiLSTM-CRF模型中的命名實體識別任務中的CRF層解釋
- 例子詳解 — 用一個玩具的例子詳細解釋CRF是如何工作的
- Chainer實現 — 用基于Chainer包的代碼實現CRF層
背景知識
你唯一需要了解的是什么叫命名實體識別。如果你不了解神經網絡,CRF以及其他相關知識也沒有關系,我會用通俗易懂的語言來解釋清楚。
在命名實體識別領域,基于神經網絡的實現方法是非常流行和常用的。舉個例子,該文講述的用詞嵌入和字嵌入的BiLSTM-CRF模型就是其中一種。我將以該模型為例解釋CRF層的工作原理。
如果你不知道BiLSTM 和 CRF的實現細節,只需要記住他們是命名實體識別模型中兩個不同的層。
我們規定在數據集中有兩類實體,人名和組織機構名稱。所以,其實在我們的數據集中總共有5類標簽:
B-Person (人名的開始部分)
I- Person (人名的中間部分)
B-Organization (組織機構的開始部分)
I-Organization (組織機構的中間部分)
O (非實體信息)
此外,x 是包含了5個單詞的一句話(w0,w1,w2,w3,w4)。還有,在句子x中[w0,w1]是人名,[w3]是組織機構名稱,其他都是“O”。
先來簡要的介紹一下該模型。
如下圖所示:
首先,句中的每個單詞是一條包含詞嵌入和字嵌入的詞向量,詞嵌入通常是事先訓練好的,字嵌入則是隨機初始化的。所有的嵌入都會隨著訓練的迭代過程被調整。
其次,BiLSTM-CRF的輸入是詞嵌入向量,輸出是每個單詞對應的預測標簽。
盡管不需要了解BiLSTM的實現細節,但為了更好的理解CRF層,我們還是需要知道一下BiLSTM的輸出到底是什么意思。
如上圖所示,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層的輸入,類別序列中分數最高的類別就是我們預測的最終結果。
正如你所發現的,即使沒有CRF層,我們照樣可以訓練一個基于BiLSTM的命名實體識別模型,如下圖所示。
因為BiLSTM模型的結果是單詞對應各類別的分數,我們可以選擇分數最高的類別作為預測結果。如W0,“B-Person”的分數最高(1.5),那么我們可以選定“B-Person”作為預測結果。同樣的,w1是“I-Person”, w2是“O”,w3是 “B-Organization” ,w4是 “O”。
盡管我們在該例子中得到了正確的結果,但實際情況并不總是這樣。來看下面的例子。
顯然,這次的分類結果并不準確。
CRF層可以加入一些約束來保證最終預測結果是有效的。這些約束可以在訓練數據時被CRF層自動學習得到。
可能的約束條件有:
- 句子的開頭應該是“B-”或“O”,而不是“I-”。
- “B-label1 I-label2 I-label3…”,在該模式中,類別1,2,3應該是同一種實體類別。比如,“B-Person I-Person” 是正確的,而“B-Person I-Organization”則是錯誤的。
- “O I-label”是錯誤的,命名實體的開頭應該是“B-”而不是“I-”。
有了這些有用的約束,錯誤的預測序列將會大大減少。
CRF層中的損失函數包括兩種類型的分數,而理解這兩類分數的計算是理解CRF的關鍵。
第一個類型的分數是發射分數(狀態分數)。這些狀態分數來自BiLSTM層的輸出。如下圖所示,w0被預測為B-Person的分數是1.5.
為方便起見,我們給每個類別一個索引,如下表所示:
Xiyj代表狀態分數,i是單詞的位置索引,yj是類別的索引。根據上表,
表示單詞w1被預測為B?Organization的分數是0.1。
我們用tyiyj來表示轉移分數。例如,tB?Person,I?Person=0.9表示從類別B?Person→I?Person的分數是0.9。因此,我們有一個所有類別間的轉移分數矩陣。
為了使轉移分數矩陣更具魯棒性,我們加上START 和 END兩類標簽。START代表一個句子的開始(不是句子的第一個單詞),END代表一個句子的結束。
下表是加上START和END標簽的轉移分數矩陣。
如上表格所示,轉移矩陣已經學習到一些有用的約束條件:
- 句子的第一個單詞應該是“B-” 或 “O”,而不是“I”。(從“START”->“I-Person 或 I-Organization”的轉移分數很低)
- “B-label1 I-label2 I-label3…”,在該模式中,類別1,2,3應該是同一種實體類別。比如,“B-Person I-Person” 是正確的,而“B-Person I-Organization”則是錯誤的。(“B-Organization” -> “I-Person”的分數很低)
- “O I-label”是錯誤的,命名實體的開頭應該是“B-”而不是“I-”。
要怎樣得到這個轉移矩陣呢?
實際上,轉移矩陣是BiLSTM-CRF模型的一個參數。在訓練模型之前,你可以隨機初始化轉移矩陣的分數。這些分數將隨著訓練的迭代過程被更新,換句話說,CRF層可以自己學到這些約束條件。
CRF損失函數由兩部分組成,真實路徑的分數 和 所有路徑的總分數。真實路徑的分數應該是所有路徑中分數最高的。
例如,我們的數據集中有如下幾種類別:
一個包含5個單詞的句子,可能的類別序列如下:
- 1. START B-Person B-Person B-Person B-Person B-Person END
- 2. START B-Person I-Person B-Person B-Person B-Person END
- ……
- 10. START B-Person I-Person O B-Organization O END
- N. O O O O O O O
每種可能的路徑的分數為Pi,共有N條路徑,則路徑的總分是
,e是常數e。
如果第十條路徑是真實路徑,也就是說第十條是正確預測結果,那么第十條路徑的分數應該是所有可能路徑里得分最高的。
根據如下損失函數,在訓練過程中,BiLSTM-CRF模型的參數值將隨著訓練過程的迭代不斷更新,使得真實路徑所占的比值越來越大。
現在的問題是:
計算真實路徑分數,eSi,是非常容易的。
我們先集中注意力來計算Si
以“START B-Person I-Person O B-Organization O END”這條真實路徑來說:
句子中有5個單詞,w1,w2,w3,w4,w5
加上START和END 在句子的開始位置和結束位置,記為,w0,w6
Si = EmissionScore + TransitionScore
這些分數來自BiLSTM層的輸出,至于x0,START 和x6,END ,則設為0。
這些分數來自于CRF層,將這兩類分數加和即可得到Si 和 路徑分數eSi
如何計算所有路徑的總分呢?我們將以一個玩具的例子詳細講解。
這部分是最重要的并且也是比較難的,但不用擔心,我將用玩具的例子盡可能簡單的講清楚里面的細節。
Step 1
我們定義的損失函數如下:
現在我們把它變成對數損失函數:
由于我們的訓練目標通常是最小化損失函數,所以我們加上負號:
前面我們已經很清楚如何計算真實路徑得分,現在我們需要找到一個方法去計算
Step 2:回憶一下狀態分數 和 轉移分數
為了簡化問題,我們假定我們的句子只有3個單詞組成:
X = [w0, w1 ,w2]
另外,我們只有兩個類別:
LabelSet = {l1, l2}
狀態分數如下:
轉移矩陣如下:
Step 3:開始奮斗!(紙和筆準備好!)
記住:我們的目標是:
整個過程是一個分數的積聚過程。它的實現思想有點像動態規劃。首先,w0所有路徑的總分先被計算出來,然后,我們計算w0 -> w1的所有路徑的得分,最后計算w0 -> w1 -> w2的所有路徑的得分,也就是我們需要的結果。
接下來,你會看到兩個變量:obs和 previous。Previous存儲了之前步驟的結果,obs代表當前單詞所帶的信息。
如果我們的句子只有一個單詞,我們就沒有之前步驟的結果,所以Previous 是空。我們只能觀測到狀態分數 obs =【x01,x02】
W0 的所有路徑總分就是:
(請集中注意)
你可能疑惑為啥要擴展previous 和 obs 矩陣呢?因為這樣操作可以是接下來的計算相當高效,你很快就能意會到這點。
實際上,第二次迭代過程也就完成了。
發現了嗎,這其實就是我們的目標,
讀到這邊,差不多就大功告成了。這一步,我們再重復一次之前的步驟。
跟上一步驟一樣。我們用新的previous計算總分:
完結,撒花!
我們最終得到了我們的目標,
,我們的句子中共有3個單詞和兩個類別,所以共有8條路徑。
2.6 對句子的單詞詞性做預測
在之前章節我們學習了BiLSTM-CRF模型的基本結構和CRF的損失函數。現在你可以用各種開源框架搭建你自己的BiLSTM-CRF模型(Keras, Chainer, TensorFlow等)。用這些框架最爽的事情就是你不用自己實現反向傳播這個過程,并且有的框架已經實現CRF層,這樣只需要添加一行代碼就能在你的模型中實現CRF過程。
本章我們會探索如何用我們訓練好的模型去預測一個句子每個單詞的詞性。
Step 1:BiLSTM-CRF模型得到的發射分數和轉移分數
假定我們的句子共3個單詞組成:
并且,我們已經從我們的模型中得到了發射分數和轉移分數,如下:
轉移矩陣:
Step 2:開始預測
如果你熟悉Viterbi算法,理解這一步的知識點將會非常容易。當然,如果你不熟悉也無所謂,整個預測過程和之前求所有路徑總分的過程非常類似。我將逐步解釋清楚,我們先從左到右的順序來運行預測算法。
你將會看到兩類變量:obs 和 previous。Previous存儲了上一個步驟的最終結果,obs代表當前單詞包含的信息(發射分數)。
Alpha0 是歷史最佳的分數 ,alpha1 是最佳分數所對應的類別索引。這兩類變量的詳細信息待會會做說明。先來看下面的圖片:你可以把這兩類變量當做狗狗去森林里玩耍時在路上做的標記,這些標記可以幫助狗狗找到回家的路。
現在,我們來觀測第一個單詞W0,很顯然,W0所對應的最佳預測類別是非常容易知道的。比如,如果
,顯然,最佳預測結果是l2。
看到這里,你可能好奇這跟之前求所有路徑分數的算法沒什么區別,別急,你馬上就會看到不同之處啦!
在下一次迭代前更改previous的值:
舉個例子,如果我們的得分如下:
那么我們的previous應該是:
這是什么意思呢?其實也就是說previous存儲的是當前單詞對應各類別的最佳路徑得分。W1被預測為L1類別的最高分是0.5,路徑是L2->L1,W1被預測為L2類別的最高分是0.4,路徑是L2->L2。
這邊,我們有兩個變量來儲存歷史信息,alpha0 和 alpha1.
在本次迭代中,我們將最佳分數存儲到alpha0 :
同時,最佳分數所對應的類別索引存儲到alpha1:
類別L1的索引是0,L2的索引是1,所以(1,1)=(L2,L2)。表示當前最佳分數0.5對應的路徑是L2->L1,最佳分數0.4對應的路徑是L2->L2。(1,1)可以理解為前一單詞分別對應的類別索引。
上面scores有錯誤,應該是0.5+x21+t11 等
更改previous的值:
假如我們的得分是:
現在我們的previous是:
現在,我們選取previous[0] 和previous[1]中最大的分數作為最佳路徑。也就是0.9對應的路徑是我們的預測結果。
同時,每個類別對應的最大得分添加到alpha0 和 alpha1中:
(1,1),(0.5,0.4):表示w0屬于類別L2的時,w1屬于L1的概率(0.5)和屬于L2的概率(0.4) 取得最大值。
(1,0),(0.8,0.9):
表示w1屬于類別L2的時,w2屬于L1的概率取得最大值;最終L2–>L2–>L1的概率為0.8
表示w1屬于類別L1的時,w2屬于L2的概率取得最大值,最終L2–>L1–>L2的概率為0.9
Step 3:根據最大得分找到最佳路徑
這是最后一步,alpha0 和 alpha1將被用來找到最佳路徑。
先看alpha0,alpha0中最后一個單詞對應的類別得分分別是0.8 和 0.9,那么0.9對應的類別L2就是最佳預測結果。再看alpha1,L2對應的索引是0, “0”表示之前一個單詞對應的類別是L1,所以W1-W2的最佳路徑是: L1->L2
接著往前推,alpha1=(1,1),我們已經知道W1的預測結果是L1,對應的索引是0,(1,1)[0] = 1,所以W0對應的類別是L2。
所以我們預測的最佳路徑是 L2-> L1 -> L2 。
原始文章鏈接:
https://createmomo.github.io/2017/09/12/CRF_Layer_on_the_Top_of_BiLSTM_1/
https://createmomo.github.io/2017/09/23/CRF_Layer_on_the_Top_of_BiLSTM_2/
https://createmomo.github.io/2017/10/08/CRF-Layer-on-the-Top-of-BiLSTM-3/
https://createmomo.github.io/2017/10/17/CRF-Layer-on-the-Top-of-BiLSTM-4/
https://createmomo.github.io/2017/11/11/CRF-Layer-on-the-Top-of-BiLSTM-5/
https://createmomo.github.io/2017/11/24/CRF-Layer-on-the-Top-of-BiLSTM-6/
總結
以上是生活随笔為你收集整理的通俗易懂的理解BiLSTM-CRF模型中的CRF层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vcpkg 简明教程
- 下一篇: svnserver 修改配置后重启