1. 程式人生 > >CRF與LSTM在序列標註問題上的不同

CRF與LSTM在序列標註問題上的不同

標註跟分類最大的區別就是:標註採的特徵裡面有上下文分類結果,這個結果你是不知道的,他在“分類”的時候是跟上下文一起"分類的"。因為你要確定這個詞的分類得先知道上一個詞的分類,所以這個得整句話的所有詞一起解,沒法一個詞一個詞解。

而分類是根據當前特徵確定當前類別,分類的時候不需要考慮上下文的分類結果,但可以引入上下文的特徵。

LSTM:像RNN、LSTM、BILSTM這些模型,它們在序列建模上很強大,它們能夠capture長遠的上下文資訊,此外還具備神經網路擬合非線性的能力,這些都是crf無法超越的地方,對於t時刻來說,輸出層y_t受到隱層h_t(包含上下文資訊)和輸入層x_t(當前的輸入)的影響,但是y_t和其他時刻的y_t`是相互獨立的,感覺像是一種point wise,對當前t時刻來說,我們希望找到一個概率最大的y_t,但其他時刻的y_t`對當前y_t沒有影響,如果y_t之間存在較強的依賴關係的話(例如,形容詞後面一般接名詞,存在一定的約束),LSTM無法對這些約束進行建模,LSTM模型的效能將受到限制。

CRF:它不像LSTM等模型,能夠考慮長遠的上下文資訊,它更多考慮的是整個句子的區域性特徵的線性加權組合(通過特徵模版去掃描整個句子)。關鍵的一點是,CRF的模型為p(y | x, w),注意這裡y和x都是序列,它有點像list wise,優化的是一個序列y = (y1, y2, …, yn),而不是某個時刻的y_t,即找到一個概率最高的序列y = (y1, y2, …, yn)使得p(y1, y2, …, yn| x, w)最高,它計算的是一種聯合概率,優化的是整個序列(最終目標),而不是將每個時刻的最優拼接起來,在這一點上CRF要優於LSTM。

HMM:CRF不管是在實踐還是理論上都要優於HMM,HMM模型的引數主要是“初始的狀態分佈”,“狀態之間的概率轉移矩陣”,“狀態到觀測的概率轉移矩陣”,這些資訊在CRF中都可以有,例如:在特徵模版中考慮h(y1), f(y_i-1, y_i), g(y_i, x_i)等特徵。

CRF與LSTM:從資料規模來說,在資料規模較小時,CRF的試驗效果要略優於BILSTM,當資料規模較大時,BILSTM的效果應該會超過CRF。從場景來說,如果需要識別的任務不需要太依賴長久的資訊,此時RNN等模型只會增加額外的複雜度,此時可以考慮類似科大訊飛FSMN(一種基於視窗考慮上下文資訊的“前饋”網路)。

CNN+BILSTM+CRF:這是目前學術界比較流行的做法,BILSTM+CRF是為了結合以上兩個模型的優點,CNN主要是處理英文的情況,英文單詞是由更細粒度的字母組成,這些字母潛藏著一些特徵(例如:字首字尾特徵),通過CNN的卷積操作提取這些特徵,在中文中可能並不適用(中文單字無法分解,除非是基於分詞後)

,這裡簡單舉一個例子,例如詞性標註場景,單詞football與basketball被標為名詞的概率較高, 這裡字尾ball就是類似這種特徵。

           BILSTM+CRF的Tensorflow版本:https://github.com/chilynn/sequence-labeling,主要參考了GitHub - glample/tagger: Named Entity Recognition Tool的實現,tagger是基於theano實現的,每一輪的引數更新是基於一個樣本的sgd,訓練速度比較慢。sequence-labeling是基於tensorflow實現的,將sgd改成mini-batch sgd,由於batch中每個樣本的長度不一,訓練前需要padding,最後的loss是通過mask進行計算(根據每個樣本的真實長度進行計算)。