1. 程式人生 > >序列標註(BiLSTM-CRF/Lattice LSTM)

序列標註(BiLSTM-CRF/Lattice LSTM)

前言

在三大特徵提取器中,我們已經接觸了LSTM/CNN/Transormer三種特徵提取器,這一節我們將介紹如何使用BiLSTM實現序列標註中的命名實體識別任務,以及Lattice-LSTM的模型原理。

本文提到的模型在我的Github中均有相應程式碼實現(Lattice LSTM之後更新)

BiLSTM

對於LSTM我就不再多做介紹了,想要了解的小夥伴可以看我之前的文章。BiLSTM就是雙向LSTM,正向和反向提取句子資訊,將正向和反向輸出拼接在一起組成模型輸出。

既然我們將BiLSTM看作特徵提取器,意味著他的輸出我們可以將其看作特徵,作為另一個模型的輸入來用。有了這種思想,我們將BiLSTM的輸出輸入一個簡單的全連線神經網路就可以實現簡單的分類了。

BiLSTM-CRF

如果僅僅將BiLSTM最後全連線神經網路進行分類,這就意味著,每一個標籤輸出,只由上下文決定,即:

\[P(y_t|X, Y) = P(y_t|X)\]

但實際上,我們上一節瞭解到的,序列標註任務中,不同字的隱藏狀態之間通常是由相互聯絡的,如之前提到的IOBES標註,標籤S(單個實體),則其前後必定是標籤O(非實體字),標籤I(實體中間字),則其前後必定只會是I、B(實體開頭字)、E(實體結尾字)。顯然,這些資訊是不會包含在上述模型中的。

為了能夠考慮到隱藏狀態之間的相互關係,上文介紹的CRF模型就能提供作用了。我們記得之前的CRF模型引數化條件概率定義如下:

\[P(y|x)=\frac{1}{Z}exp(\sum_j\sum_{i=1}^{n-1}\lambda_it_j(y_{i+1}, y_i, x, i)+ \sum_k\sum_{i=1}^{n}\mu_ks_k(y_i, x, i))\]

其中:
\(t_j(y_{i-1}, y_i, x, i)\)為區域性特徵函式,該特徵由當前節點和上一個節點決定,稱其為狀態轉移特徵,用以描述相鄰節點以及觀測變數對當前狀態的影響;
\(s_k(y_i, x, i)\)為節點特徵函式,該特徵函式只和當前節點有關,稱其為狀態特徵;
\(\lambda\)和\(\mu\)是對應特徵函式的引數。

實際上,特徵函式\(t(·)\)就包含了我們之前提到的隱藏狀態之間的相互關係,\(s(·)\)包含了觀察變數的特徵表示對相應隱藏狀態的關係。之前我們提到過,將上述兩個特徵函式看作可學習引數的一部分,然後將其整合到狀態轉移矩陣中去了。在程式碼實現中,我們僅僅需要學習一個狀態轉移矩陣,就能實現一個完整的CRF,實際上,這個狀態轉移矩陣中,就包含了兩個特徵函式資訊。CRF對LSTM資訊的再利用,顯然比一個簡單的分類模型要強。

Lattice LSTM

之前我們討論的明明實體識別問題都是基於字的,主要是因為分詞過程將引入很多誤差來源,例如之前提到的OOV問題。但沒有分詞的過程使得基於字元的NER模型無法利用顯性的詞和詞序資訊來提取當前最有用的實體。如下圖

如果沒有加入顯性的詞序資訊,模型難以根據上下文判斷該句應該識別出來地名“南京市/長江大橋”還是應該識別出人物“南京市長/江大橋”。Lattice LSTM的做法是構造一個潛在實體詞典,當匹配到潛在實體出現的時候,將該潛在實體的資訊輸入到模型中輔助判斷,從而實現潛在相關命名實體消歧。其大致模型結構如下圖所示

模型的細節可以參考官方給出的程式碼,之後我有時間再給出自己的實現。

參考連結
https://arxiv.org/pdf/1805.02023.pdf
https://www.jianshu.com/p/9c99796ff8d9
https://zhuanlan.zhihu.com/p/38941