-
數據格式
”O”表示非實體;”B”表示實體;”I”表示實體內
-
BiLSTM + CRF 模型
模型的結構:
- 句子𝑥中的每一個單元都代表着由character embedding或word embedding構成的向量。其中,character embedding是隨機初始化的,word embedding是通過數據訓練得到的。所有的 embeddings 在訓練過程中都會調整到最優。
- 這些 embeddings 為BiLSTM-CRF模型的輸入,輸出的是句子𝑥中每個單元的標簽。
盡管一般不需要詳細了解BiLSTM層的原理,但是為了更容易知道CRF層的運行原理,我們需要知道BiLSTM的輸出層。這些分值將作為CRF的輸入. 如下圖所示, BiLSTM層的輸出為每一個標簽的預測分值,例如對於單元𝑤0,BiLSTM層輸出的是1.5 (B-Person), 0.9 (I-Person), 0.1 (B-Organization), 0.08 (I-Organization) 0.05 (O)
如下圖(1)所示, “B-Person”有最高分值—— 1.5,因此我們可以挑選“B-Person”作為w0的預測標簽. 同理,我們可以得到w1—“I-Person”,w2—“O” ,w3—“B-Organization”,w4—“O”. 由於BiLSTM的輸出為單元的每一個標簽分值,我們可以挑選分值最高的一個作為該單元的標簽。雖然我們可以得到句子x中每個單元的正確標簽,但是我們不能保證標簽每次都是預測正確的(如下圖2所示), 即所謂的標記偏置的問題。所以CRF的功能就是增加了一些約束規則,來大大降低預測錯誤的概率。
(圖1)
(圖2)
-
CRF的作用
CRF層可以為最后預測的標簽添加一些約束來保證預測的標簽是合法的。在訓練數據訓練過程中,這些約束可以通過CRF層自動學習到。
這些約束可以是:
- 句子中第一個詞總是以標簽“B-“ 或“O”開始,而不是“I-”
- 標簽“B-label1 I-label2 I-label3 I-…”, label1, label2, label3應該屬於同一類實體。例如,“B-Person I-Person” 是合法的序列, 但是“B-Person I-Organization” 是非法標簽序列。
- 標簽序列“O I-label” is 非法的.實體標簽的首個標簽應該是“B-“ ,而非“I-“, 換句話說,有效的標簽序列應該是“O B-label”。
現在大家可能會有一個疑問標簽的score怎么計算?
- 標簽的Score
如下圖所示, 確切的說,這個矩陣是 BiLSTM-CRF 模型的一個參數。在你訓練模型之前,你可以隨機地初始化矩陣中所有的 transition score。在之后的訓練過程中,這些隨機初始化的 score 將會被自動更新。換句話說,CRF 層可以自己學習到這些約束。我們並不需要手動創建這樣一個矩陣。這些分數值會隨着訓練的迭代次數的增加,變得越來越 “合理”。
根據CRF的約束分析,我們可以知道:
- 句子中的第一個單詞的標記應該是以“B-“ 或者 “O”開頭, 並不會是 “I-”形式的標記。(“START” 到 “I-Person or I-Organization” 的轉移值非常的小。)
- 在“B-label1 I-label2 I-label3 I-…”這樣形式的標注序列中, label1, label2, label3 … 應該是同種實體的標簽。比如,“B-Person I-Person” 是合理有效的標注序列,而 “B-Person I-Organization” 則不是。(“B-Organization” to “I-Person” 轉移值為0.0003)
- 標簽序列“O I-label” 是 非法的.實體標簽的首個標簽應該是“B-” ,而非“I-”(“START” to “I-Person”)
-
損失函數
CRF 的損失函數由真實轉移路徑值和所有可能轉移路徑值兩部分組成。真實路徑表示在所有可能轉移路徑中具有最高 score 的路徑。比如, 我們也有一個由 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
…
i.START B-Person I-Person O B-Organization O END
…
N.O O O O O O O
假定每一個可能的路徑有一個分數值𝑃𝑖 , 那么對於所有 N 條可能的路徑的總分數值為𝑃𝑡𝑜𝑡𝑎𝑙=𝑃1+𝑃2+𝑃3+…+𝑃𝑁=𝑒𝑆1+𝑒𝑆2+𝑒𝑆3+…+𝑒𝑆𝑁,e 是數學常量 e。
那么有Loss Function——>𝐿𝑜𝑠𝑠𝐹𝑢𝑛𝑐𝑡𝑖𝑜𝑛=𝑃𝑅𝑒𝑎𝑙𝑃𝑎𝑡ℎ/𝑃1+𝑃2+𝑃3+…+𝑃𝑁, 在訓練階段,BiLSTM-CRF模型的參數值將會一直不停的被更新,來提高真實路徑的分數值所占的比重。
現在把損失函數變成log損失函數:
參考文獻:
https://www.jianshu.com/p/566c6faace64
https://createmomo.github.io/2017/09/12/CRF_Layer_on_the_Top_of_BiLSTM_1/