概率圖模型學習筆記:HMM,MEMM,CRF

一、寫在前面Preface

今天看到了之前收藏吃灰的一篇寫的很好的概率圖的學習筆記,自己也想總結一下,今天還有很多事情都沒有完成,看到了之後就覺得可以花一些時間好好研究一下,總結一些這段時間的研究,因爲之前在B站了完整看了sh大佬的視頻講解,對於HMM 還有MEMM,CRF也有一些自己的理解,今天正好趁着這個機會,一鼓做氣都寫一下,不往這段時間的投入,之後也不知道會不會用起,但希望想起來的時候我可以說,我曾經愛過~

因爲接觸了NLP相關的東西,不得不學習這些傳統的序列模型,面試的時候也有人問我這些模型,但只可惜當時一知半解,就隨便講了一些自己是研究深度學習方面的,LSTM,RNN 之類的過關了,但知不足而後進,正是這個道理,概率圖模型在我的理解中,就是使用圖的性質,將概率進行結合,HMM,MEMM ,CRF 則是一種模型的假設,一步步遞進更好的解決序列標註的問題。

這次藉助大佬的文章,將我自己的理解寫一下,僅供各位參考學習,如有不足,錯誤希望大家及時指明。概率圖模型的徹悟是關於理解生成式模型和判別式模型的關係。
我一直保持記錄博客的習慣,是將自己的理解輸出,記錄良好的文章,可以使我保持思路清晰,也可以反覆看自己理解的程度,在之後新的理解也可以加進來。
學習是一個將沒有結構的知識點融會貫通,使用一條繩子將知識點結構化,成爲體系之後纔可以牢牢的掌握,拿起繩子的一頭,所有東西都能拿的起來學習是一個熵減的過程,卓有成效的學習是可以使得混亂度越來越小的!記住這個思維習慣。

統計學習的思維定勢

統計機器學習所有的模型(個別instant model和優化算法以及其他的特種工程知識點除外)的工作流程都是如此:
a.訓練模型參數,得到模型(由參數唯一確定),
b.預測給定的測試數據。
拿這個流程去挨個學習模型,思路上會非常順暢。這一點可參見我另一篇文字介紹。

對初學者的關於機器學習的入門學習方式也順帶表達一下(empirical speaking):

a.完整特徵工程競賽
b.野博客理論入門理解
c.再回到代碼深入理解模型內部
d.再跨理論,查閱經典理論鉅作。這時感性理性都有一定高度,會遇到很多很大的理解上的疑惑,這時3大經典可能就可以發揮到最大作用了。

很多beginer,就比如說學CRF模型,然後一上來就擺一套複雜的公式,什麼我就問,這能理解的了嗎?這是正確的開啓姿勢嗎?當然了,也要怪那些博主,直接整一大堆核心公式,實際上讀者的理解門檻可能就是一個過渡性的細枝末節而已。沒有上下文的教育肯定是失敗的(這一點我又想吐槽國內絕大部分本科的院校教育模式)。所以說帶有完整上下文信息以及過程來龍去脈交代清楚纔算到位吧。

而不是一上來就死啃被人推薦的“經典資料”,這一點相信部分同學會理解。好比以前本科零基礎學c++ JAVA,上來就看primr TIJ,結果浪費了時間精力一直在門外兜圈。總結方法吸取教訓,應該快速上手代碼,纔是最高效的。經典最好是用來查閱的工具書,我目前是李航周志華和經典的那3本迭代輪詢看了好多輪,經常會反覆查詢某些model或理論的來龍去脈;有時候要查很多相關的東西,看這些書還是難以貫通,然後發現有些人的博客寫的會更容易去理解。所以另外,學習資料渠道也要充分才行。

二、預備知識Prerequisite

2.1 概率圖

概率圖是CRF HMM 的基礎,我們需要對概率圖有個整體的認知,這樣學習的知識纔不會是空中閣樓,如果看不懂,可以看過一遍之後在回過頭看,就能看明白了,都是這麼過來的。

2.1.1 概覽

在統計概率圖(probability graph models)中,參考宗成慶老師的書,是這樣的體系結構(個人非常喜歡這種類型的圖):
在這裏插入圖片描述
在概率圖模型中,數據(樣本)由公式G=(V,E)G=(V,E)建模表示:

  • VV表示節點,即隨機變量(放在此處的,可以是一個token或者一個label),具體地,用Y=(y1,,yn)Y=(y_1,⋯,y_n)爲隨機變量建模,注意YY現在是代表了一批隨機變量(想象對應一條sequence,包含了很多的token),P(Y)P(Y)爲這些隨機變量的分佈;
  • EE表示邊,即概率依賴關係。具體咋理解,還是要在後面結合HMM或CRF的graph具體解釋。

2.1.2 有向圖 vs. 無向圖

上圖可以看到,貝葉斯網絡(信念網絡)都是有向的,馬爾科夫網絡無向。所以,貝葉斯網絡適合爲有單向依賴的數據建模,馬爾科夫網絡適合實體之間互相依賴的建模。具體地,他們的核心差異表現在如何求P=(Y)P=(Y),即怎麼表示Y=y1,,ynY=(y_1,⋯,y_n)這個的聯合概率。

1. 有向圖

對於有向圖模型,這麼求聯合概率:
P(x1,,xn)=i=0P(xiπ(xi))P(x_1,⋯,x_n)=\sum_{i=0}{P(x_i|π(x_i))}
舉個例子,對於下面的這個有向圖的隨機變量(注意,這個圖我畫的還是比較廣義的):

在這裏插入圖片描述

應該這樣表示他們的聯合概率:
P(x1,,xn)=P(x1)P(x2x1)P(x3x2)P(x4x2)P(x5x3,x4)P(x_1,⋯,x_n)=P(x_1)·P(x_2|x_1)·P(x_3|x_2)·P(x_4|x_2)·P(x_5|x_3,x_4)
應該很好理解吧。

2. 無向圖

對於無向圖,我看資料一般就指馬爾科夫網絡(注意,這個圖我畫的也是比較廣義的)。
在這裏插入圖片描述
如果一個graph太大,可以用因子分解將P=(Y)P=(Y)寫爲若干個聯合概率的乘積。咋分解呢,將一個圖分爲若干個“小團”,注意每個團必須是“最大團”(就是裏面任何兩個點連在了一塊,具體……算了不解釋,就是最大連通子圖),則有:

P(Y)=1Z(x)cψc(Yc)P(Y)=\frac{1}{Z(x)}\prod_{c}{ψ_c(Y_c)}
, 其中Z(x)=Ycψc(Yc)Z(x)=\sum_{Y}\prod_c{ψ_c(Y_c)},公式應該不難理解吧,歸一化是爲了讓結果算作概率。

所以像上面的無向圖:

P(Y)=1Z(x)(ψ1(X1,X3,X4)ψ2(X2,X3,X4))P(Y)=\frac{1}{Z(x)}(ψ_1(X_1,X_3,X_4)·ψ_2(X_2,X_3,X_4))
其中,$ψ_c(Y_c)ψ_c(Y_c) $是一個最大團C上隨機變量們的聯合概率,一般取指數函數的:

ψc(Yc)=eE(Yc)=ekλkfk(c,yc,x)ψ_c(Y_c)=e^{−E(Y_c)}=e^{∑_kλ_kf_k(c,y|c,x)}

好了,管這個東西叫做勢函數。注意ekλkfk(c,yc,x)e^{∑_kλ_kf_k(c,y|c,x)} 是否有看到CRF的影子。

那麼概率無向圖的聯合概率分佈可以在因子分解下表示爲:
P(Y)=1Z(x)cψc(Yc)=1Z(x)cekλkfk(c,yc,x)=1Z(x)eckλkfk(yi,yi1,x,i)P(Y )=\frac{1}{Z(x)} \prod_{c}\psi_{c}(Y_{c} ) = \frac{1}{Z(x)} \prod_{c} e^{\sum_{k}\lambda_{k}f_{k}(c,y|c,x)} = \frac{1}{Z(x)} e^{\sum_{c}\sum_{k}\lambda_{k}f_{k}(y_{i},y_{i-1},x,i)}
注意,這裏的理解還蠻重要的,注意遞推過程,敲黑板,這是CRF的開端!
這個由Hammersly-Clifford law保證,具體不展開。

2.1.3 馬爾科夫假設&馬爾科夫性

這個也屬於前饋知識。

1. 馬爾科夫假設

額應該是齊次馬爾科夫假設,這樣假設:馬爾科夫鏈x1,,xn)(x_1,⋯,x_n)裏的xix_i總是隻受xi1x_{i−1}一個人的影響。
馬爾科夫假設這裏相當於就是個1-gram。

馬爾科夫過程呢?即,在一個過程中,每個狀態的轉移只依賴於前n個狀態,並且只是個n階的模型。最簡單的馬爾科夫過程是一階的,即只依賴於 前一個狀態。

2. 馬爾科夫性

馬爾科夫性是是保證或者判斷概率圖是否爲概率無向圖的條件。

三點內容:a. 成對,b. 局部,c. 全局。

我覺得這個不用展開。

2.2 判別式(generative)模型 vs. 生成式(discriminative)模型

在監督學習下,模型可以分爲判別式模型與生成式模型。

重點來了。上面有提到,我理解了HMM、CRF模型的區別是從理解了判別式模型與生成式模型的那刻,並且瞬間對其他的模型有一個恍然大悟。我記得是一年前就開始糾結這兩者的區別,但我只能說,栽在了一些爛博客上,大部分都沒有自己的insightful理解,也就是一頓官話,也真是難以理解。後來在知乎上一直琢磨別人的答案,然後某日早晨終於豁然開朗,就是這種感覺。

好了,我要用自己的理解來轉述兩者的區別了below。

先問個問題,根據經驗,A批模型(神經網絡模型、SVM、perceptron、LR、DT……)與B批模型(NB、LDA……),有啥區別不?(這個問題需要一些模型使用經驗)應該是這樣的:

  1. A批模型是這麼工作的,他們直接將數據的Y(或者label),根據所提供的features,學習,最後畫出了一個明顯或者比較明顯的邊界(具體怎麼做到的?通過複雜的函數映射,或者決策疊加等等mechanism),這一點線性LR、線性SVM應該很明顯吧。

  2. B批模型是這麼工作的,他們先從訓練樣本數據中,將所有的數據的分佈情況摸透,然後最終確定一個分佈,來作爲我的所有的輸入數據的分佈,並且他是一個聯合分佈P(X,Y)P(X,Y)注意X包含所有的特徵xix_i,Y包含所有的label)。然後我來了新的樣本數據(inference),好,我通過我學習來的模型的聯合分佈P(X,Y)P(X,Y),再結合新樣本給的X,通過條件概率就能出來Y:
    P(YX)=P(X,Y)P(X)P(Y|X)=\frac{P(X,Y)}{P(X)}
    好了,應該說清楚了。

1. 判別式模型

那麼A批模型對應了判別式模型。根據上面的兩句話的區別,可以知道判別模型的特徵了,所以有句話說:判別模型是直接對P(Y|X)P(Y|X)建模,就是說,直接根據X特徵來對Y建模訓練。

具體地,我的訓練過程是確定構件P(Y|X)P(Y|X)模型裏面“複雜映射關係”中的參數,完了再去inference一批新的sample。

所以判別式模型的特徵總結如下:

對P(Y|X)P(Y|X)建模
對所有的樣本只構建一個模型,確認總體判別邊界
觀測到輸入什麼特徵,就預測最可能的label
另外,判別式的優點是:對數據量要求沒生成式的嚴格,速度也會快,小數據量下準確率也會好些。

2. 生成式模型

同樣,B批模型對應了生成式模型。並且需要注意的是,在模型訓練中,我學習到的是X與Y的聯合模型P(X,Y)P(X,Y),也就是說,我在訓練階段是隻對P(X,Y)P(X,Y)建模,我需要確定維護這個聯合概率分佈的所有的信息參數。完了之後在inference再對新的sample計算P(Y|X)P(Y|X),導出Y ,但這已經不屬於建模階段了。

結合NB過一遍生成式模型的工作流程。學習階段,建模:P(X,Y)=P(X|Y)P(Y)P(X,Y)=P(X|Y)P(Y)(當然,NB具體流程去隔壁參考),然後P(Y|X)=P(X,Y)P(X)P(Y|X)=P(X,Y)P(X)。
另外,LDA也是這樣,只是他更過分,需要確定很多個概率分佈,而且建模抽樣都蠻複雜的。

所以生成式總結下有如下特點:

對P(X,Y)P(X,Y)建模
這裏我們主要講分類問題,所以是要對每個label(yiyi)都需要建模,最終選擇最優概率的label爲結果,所以沒有什麼判別邊界。(對於序列標註問題,那只需要構件一個model)
中間生成聯合分佈,並可生成採樣數據。
生成式模型的優點在於,所包含的信息非常齊全,我稱之爲“上帝信息”,所以不僅可以用來輸入label,還可以幹其他的事情。生成式模型關注結果是如何產生的。但是生成式模型需要非常充足的數據量以保證採樣到了數據本來的面目,所以速度相比之下,慢。
這一點明白後,後面講到的HMM與CRF的區別也會非常清晰。
最後identity the picture below:
在這裏插入圖片描述

2.3 序列建模

爲了號召零門檻理解,現在解釋如何爲序列問題建模。
在這裏插入圖片描述

序列包括時間序列以及general sequence,但兩者無異。連續的序列在分析時也會先離散化處理。常見的序列有如:時序數據、本文句子、語音數據、等等。

廣義下的序列有這些特點:

節點之間有關聯依賴性/無關聯依賴性
序列的節點是隨機的/確定的
序列是線性變化/非線性的
……
對不同的序列有不同的問題需求,常見的序列建模方法總結有如下:

擬合,預測未來節點(或走勢分析):
常規序列建模方法:AR、MA、ARMA、ARIMA
迴歸擬合
Neural Networks
判斷不同序列類別,即分類問題:HMM、CRF、General Classifier(ML models、NN models)
不同時序對應的狀態的分析,即序列標註問題:HMM、CRF、RecurrentNNs
在本篇文字中,我們只關注在2. & 3.類問題下的建模過程和方法。

三、HMM
3.1 理解HMM
3.2 模型運行過程
3.2.1 學習過程
3.2.2 序列標註(解碼)過程
3.2.3 序列概率過程

四、MEMM
4.1 理解MEMM
4.2 模型運行過程
4.2.1 學習過程
4.2.2 序列標註過程
4.2.3 序列概率過程
4.3 標註偏置?

五、CRF

我覺得一旦有了一個清晰的工作流程,那麼按部就班地,沒有什麼很難理解的地方,因爲整體框架已經胸有成竹了,剩下了也只有添磚加瓦小修小補了。有了上面的過程基礎,CRF也是類似的,只是有方法論上的細微區別。

5.1 理解CRF

請看第一張概率圖模型構架圖,CRF上面是馬爾科夫隨機場(馬爾科夫網絡),而條件隨機場是在給定的隨機變量X(具體,對應觀測序列o1,,oio_{1}, \cdots, o_{i})條件下,隨機變量Y(具體,對應隱狀態序列i1,,iii_{1}, \cdots, i_{i})的馬爾科夫隨機場。
廣義的CRF的定義是: 滿足P(YvX,Yw,wv)=P(YvX,Yw,wv)P(Y_{v}|X,Y_{w},w \neq v) = P(Y_{v}|X,Y_{w},w \sim v)的馬爾科夫隨機場叫做條件隨機場(CRF)。

不過一般說CRF爲序列建模,就專指CRF線性鏈(linear chain CRF):
在這裏插入圖片描述

在2.1.2中有提到過,概率無向圖的聯合概率分佈可以在因子分解下表示爲:

P(YX)=1Z(x)cψc(YcX)=1Z(x)cekλkfk(c,yc,x)=1Z(x)eckλkfk(yi,yi1,x,i)P(Y | X)=\frac{1}{Z(x)} \prod_{c}\psi_{c}(Y_{c}|X ) = \frac{1}{Z(x)} \prod_{c} e^{\sum_{k}\lambda_{k}f_{k}(c,y|c,x)} = \frac{1}{Z(x)} e^{\sum_{c}\sum_{k}\lambda_{k}f_{k}(y_{i},y_{i-1},x,i)}
而在線性鏈CRF示意圖中,每一個(I1 OiI_1~O_i)對爲一個最大團,即在上式中c = i。並且線性鏈CRF滿足P(IiO,I1,,In)=P(IiO,Ii1,Ii+1)P(I_{i}|O,I_{1},\cdots, I_{n}) = P(I_{i}|O,I_{i-1},I_{i+1})

所以CRF的建模公式如下:

Z(O)iψi(IiO)=1Z(O)iekλkfk(O,Ii1,Ii,i)=1Z(O)eikλkfk(O,Ii1,Ii,i){Z(O)} \prod_{i}\psi_{i}(I_{i}|O ) = \frac{1}{Z(O)} \prod_{i} e^{\sum_{k}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)} = \frac{1}{Z(O)} e^{\sum_{i}\sum_{k}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}

我要敲黑板了,這個公式是非常非常關鍵的,注意遞推過程啊,我是怎麼從∏∏跳到e∑e∑的。
不過還是要多囉嗦一句,想要理解CRF,必須判別式模型的概念要深入你心。正因爲是判別模型,所以不廢話,我上來就直接爲了確定邊界而去建模,因爲我創造出來就是爲了這個分邊界的目的的。比如說序列求概率(分類)問題,我直接考慮找出函數分類邊界。所以才爲什麼會有這個公式。所以再看到這個公式也別懵逼了,he was born for discriminating the given data from different classes. 就這樣。不過待會還會具體介紹特徵函數部分的東西。
除了建模總公式,關鍵的CRF重點概念在MEMM中已強調過:判別式模型、特徵函數。

  1. 特徵函數
    上面給出了CRF的建模公式:

P(IO)=1Z(O)eiTkMλkfk(O,Ii1,Ii,i)P(I | O)=\frac{1}{Z(O)} e^{\sum_{i}^{T}\sum_{k}^{M}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}
下標i表示我當前所在的節點(token)位置。
下標k表示我這是第幾個特徵函數,並且每個特徵函數都附屬一個權重λkλ_k,也就是這麼回事,每個團裏面,我將爲tokenitoken_i構造M個特徵,每個特徵執行一定的限定作用,然後建模時我再爲每個特徵函數加權求和。
Z(O)Z(O)是用來歸一化的,爲什麼?想想LR以及softmax爲何有歸一化呢,一樣的嘛,形成概率值。
再來個重要的理解。P(IO)P(I|O)這個表示什麼?具體地,表示了在給定的一條觀測序列O=(o1,,oi)O=(o_1,⋯,o_i)條件下,我用CRF所求出來的隱狀態序列I=(i1,,ii)I=(i1,⋯,ii)的概率,注意,這裏的I是一條序列,有多個元素(一組隨機變量),而至於觀測序列O=(o1,,oi)O=(o_1,⋯,o_i),它可以是一整個訓練語料的所有的觀測序列;也可以是在inference階段的一句sample,比如說對於序列標註問題,我對一條sample進行預測,可能能得到Pj(I|O)(j=1,…,J)Pj(I|O)(j=1,…,J)J條隱狀態I,但我肯定最終選的是最優概率的那條(by viterbi)。這一點希望你能理解。
對於CRF,可以爲他定義兩款特徵函數:轉移特徵&狀態特徵。
我們將建模總公式展開:

P(I|O)=1Z(O)e∑Ti∑Mkλkfk(O,Ii−1,Ii,i)=1Z(O)e[∑Ti∑Jjλjtj(O,Ii−1,Ii,i)+∑Ti∑Llμlsl(O,Ii,i)]
P(I|O)=1Z(O)e∑iT∑kMλkfk(O,Ii−1,Ii,i)=1Z(O)e[∑iT∑jJλjtj(O,Ii−1,Ii,i)+∑iT∑lLμlsl(O,Ii,i)]
其中:

tjitj爲i處的轉移特徵,對應權重tj爲i處的轉移特徵,對應權重\lambda_{j},每個,每個token_{i}KaTeX parse error: Expected '}', got 'EOF' at end of input: …n是‘I’,0other sl爲i處的狀態特徵,對應權重sliμl,,tokeni爲i處的狀態特徵,對應權重\mu_{l},每個,每個token_{i}都有L個特徵
舉個例子:
sl=1(o,i)={10滿足特定狀態條件,比如當前token的POS是‘V’,other
sl=1(o,i)={1滿足特定狀態條件,比如當前token的POS是‘V’,0other
不過一般情況下,我們不把兩種特徵區別的那麼開,合在一起:
P(I|O)=1Z(O)e∑Ti∑Mkλkfk(O,Ii−1,Ii,i)
P(I|O)=1Z(O)e∑iT∑kMλkfk(O,Ii−1,Ii,i)
滿足特徵條件就取值爲1,否則沒貢獻,甚至你還可以讓他打負分,充分懲罰。

再進一步理解的話,我們需要把特徵函數部分摳出來:
Score=∑iT∑kMλkfk(O,Ii−1,Ii,i)
Score=∑iT∑kMλkfk(O,Ii−1,Ii,i)
是的,我們爲tokenitokeni打分,滿足條件的就有所貢獻。最後將所得的分數進行log線性表示,求和後歸一化,即可得到概率值……完了又扯到了log線性模型。現在稍作解釋:

log-linear models take the following form:
P(y|x;ω)=exp(ω·ϕ(x,y))∑y′∈Yexp(ω·ϕ(x,y′))
P(y|x;ω)=exp(ω·ϕ(x,y))∑y′∈Yexp(ω·ϕ(x,y′))
我覺得對LR或者sotfmax熟悉的對這個應該秒懂。然後CRF完美地滿足這個形式,所以歸入到了log-linear models之中。

5.2 模型運行過程
模型的工作流程,跟MEMM是一樣的:

step1. 先預定義特徵函數fa(o,i)fa(o,i),
step2. 在給定的數據上,訓練模型,確定參數λkλk
step3. 用確定的模型做序列標註問題或者序列求概率問題。
可能還是沒做到100%懂,結合例子說明:

……
5.2.1 學習訓練過程
一套CRF由一套參數λλ唯一確定(先定義好各種特徵函數)。

同樣,CRF用極大似然估計方法、梯度下降、牛頓迭代、擬牛頓下降、IIS、BFGS、L-BFGS等等。各位應該對各種優化方法有所瞭解的。其實能用在log-linear models上的求參方法都可以用過來。

嗯,具體詳細求解過程貌似問題不大。

5.2.2 序列標註過程
還是跟HMM一樣的,用學習好的CRF模型,在新的sample(觀測序列o1,⋯,oio1,⋯,oi)上找出一條概率最大最可能的隱狀態序列i1,⋯,iii1,⋯,ii。

只是現在的圖中的每個隱狀態節點的概率求法有一些差異而已,正確將每個節點的概率表示清楚,路徑求解過程還是一樣,採用viterbi算法。

囉嗦一下,我們就定義i處的局部狀態爲δi(I)δi(I),表示在位置i處的隱狀態的各種取值可能爲I,然後遞推位置i+1處的隱狀態,寫出來的DP轉移公式爲:
δi+1=max1≤j≤m{δi(I)+∑iT∑kMλkfk(O,Ii−1,Ii,i)}
δi+1=max1≤j≤m{δi(I)+∑iT∑kMλkfk(O,Ii−1,Ii,i)}

這裏沒寫規範因子Z(O)Z(O)是因爲不規範化不會影響取最大值後的比較。
具體還是不展開爲好。

5.2.3 序列求概率過程
跟HMM舉的例子一樣的,也是分別去爲每一批數據訓練構建特定的CRF,然後根據序列在每個MEMM模型的不同得分概率,選擇最高分數的模型爲wanted類別。只是貌似很少看到拿CRF或者MEMM來做分類的,直接用網絡模型不就完了不……

應該可以不用展開,吧……

5.3 CRF++分析

本來做task用CRF++跑過baseline,後來在對CRF做調研時,非常想透析CRF++的工作原理,以identify以及verify做的各種假設猜想。當然,也看過其他的CRF實現源碼。

所以乾脆寫到這裏來,結合CRF++實例講解過程。

有一批語料數據,並且已經tokenized好了:

Nuclear
theory
devoted
major
efforts
……

並且我先確定了13個標註元素:

B_MAT
B_PRO
B_TAS
E_MAT
E_PRO
E_TAS
I_MAT
I_PRO
I_TAS
O
S_MAT
S_PRO
S_TAS

1. 定義模板

按道理應該是定義特徵函數纔對吧?好的,在CRF++下,應該是先定義特徵模板,然後用模板自動批量產生大量的特徵函數。我之前也蠻confused的,用完CRF++還以爲模板就是特徵,後面就搞清楚了:每一條模板將在每一個token處生產若干個特徵函數。

CRF++的模板(template)有U系列(unigram)、B系列(bigram),不過我至今搞不清楚B系列的作用,因爲U模板都可以完成2-gram的作用。

U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
B

所以,U00 - U09 我定義了10個模板。

2. 產生特徵函數

是的,會產生大量的特徵。
U00 - U04的模板產生的是狀態特徵函數;U05 - U09的模板產生的是轉移特徵函數。

在CRF++中,每個特徵都會try每個標註label(這裏有13個),總共將生成NL=ikLN∗L=i∗k^′∗L個特徵函數以及對應的權重出來。N表示每一套特徵函數N=ikN=i∗k^′,L表示標註集元素個數。

比如訓練好的CRF模型的部分特徵函數是這樣存儲的:

22607 B
790309 U00:%
3453892 U00:%)
2717325 U00:&
2128269 U00:’t
2826239 U00:(0.3534
2525055 U00:(0.593–1.118
197093 U00:(1)
2079519 U00:(1)L=14w2−12w−FμνaFaμν
2458547 U00:(1)δn=∫−∞En+1ρ˜(E)dE−n
1766024 U00:(1.0g
2679261 U00:(1.1wt%)
1622517 U00:(100)
727701U00:(1000–5000A)
2626520 U00:(10a)
2626689 U00:(10b)
……
2842814U07:layer/thicknesses/Using
2847533 U07:layer/thicknesses/are
2848651 U07:layer/thicknesses/in
331539 U07:layer/to/the
1885871U07:layer/was/deposited ……(數量非常龐大)

其實也就是對應了這樣的一個特徵函數:

func1 = if (output = B and feature=”U02:一”) return 1 else return 0
func2 = if (output = M and feature=”U02:一”) return 1 else return 0
func3 = if (output = E and feature=”U02:一”) return 1 else return 0
func4 = if (output = S and feature=”U02:一”) return 1 else return 0

比如模板U06會從語料中one by one逐句抽出這些各個特徵:

一/個/人/……
個/人/走/……

3. 求參

對上述的各個特徵以及初始權重進行迭代參數學習。

在CRF++ 訓練好的模型裏,權重是這樣的:

0.3972716048310705
0.5078838237171732
0.6715316559507898
-0.4198827647512405
-0.4233310655891150
-0.4176580083832543
-0.4860489836004728
-0.6156475863742051
-0.6997919485753300
0.8309956709647820
0.3749695682658566
0.2627347894057647
0.0169732441379157
0.3972716048310705
0.5078838237171732
0.6715316559507898 ……(數量非常龐大,與每個label的特徵函數對應,我這有300W個)

4. 預測解碼

這個就看不到viterbi怎麼走的了。
結果是這樣的:

Nuclear B_TAS
theory E_TAS
devoted O
major O
efforts O ……

5.4 LSTM+CRF

LSTM+CRF這個組合其實我在知乎上答過問題,然後順便可以整合到這裏來。

1、perspectively

大家都知道,LSTM已經可以勝任序列標註問題了,爲每個token預測一個label(LSTM後面接:分類器);而CRF也是一樣的,爲每個token預測一個label。

但是,他們的預測機理是不同的。CRF是全局範圍內統計歸一化的條件狀態轉移概率矩陣,再預測出一條指定的sample的每個token的label;LSTM(RNNs,不區分here)是依靠神經網絡的超強非線性擬合能力,在訓練時將samples通過複雜到讓你窒息的高階高緯度異度空間的非線性變換,學習出一個模型,然後再預測出一條指定的sample的每個token的label。

2、LSTM+CRF

既然LSTM都OK了,爲啥researchers搞一個LSTM+CRF的hybrid model?

哈哈,因爲a single LSTM預測出來的標註有問題啊!舉個segmentation例子(BES; char level),plain LSTM 會搞出這樣的結果:

input: “學習出一個模型,然後再預測出一條指定”

expected output: 學/B 習/E 出/S 一/B 個/E 模/B 型/E ,/S 然/B 後/E 再/E 預/B 測/E……

real output: 學/B 習/E 出/S 一/B 個/B 模/B 型/E ,/S 然/B 後/B 再/E 預/B 測/E ……

看到不,用LSTM,整體的預測accuracy是不錯indeed, 但是會出現上述的錯誤:在B之後再來一個B。這個錯誤在CRF中是不存在的,因爲CRF的特徵函數的存在就是爲了對given序列觀察學習各種特徵(n-gram,窗口),這些特徵就是在限定窗口size下的各種詞之間的關係。然後一般都會學到這樣的一條規律(特徵):B後面接E,不會出現E。這個限定特徵會使得CRF的預測結果不出現上述例子的錯誤。當然了,CRF還能學到更多的限定特徵,那越多越好啊!

好了,那就把CRF接到LSTM上面,把LSTM在time_step上把每一個hidden_state的tensor輸入給CRF,讓LSTM負責在CRF的特徵限定下,依照新的loss function,學習出一套新的非線性變換空間。

最後,不用說,結果還真是好多了呢。

LSTM+CRF codes, here. Go just take it.

六、總結

1. 總體對比

應該看到了熟悉的圖了,現在看這個圖的話,應該可以很清楚地get到他所表達的含義了。這張圖的內容正是按照生成式&判別式來區分的,NB在sequence建模下拓展到了HMM;LR在sequence建模下拓展到了CRF。
在這裏插入圖片描述

2. HMM vs. MEMM vs. CRF

將三者放在一塊做一個總結:

  1. HMM -> MEMM:
    HMM模型中存在兩個假設:一是輸出觀察值之間嚴格獨立,二是狀態的轉移過程中當前狀態只與前一狀態有關。但實際上序列標註問題不僅和單個詞相關,而且和觀察序列的長度,單詞的上下文,等等相關。MEMM解決了HMM輸出獨立性假設的問題。因爲HMM只限定在了觀測與狀態之間的依賴,而MEMM引入自定義特徵函數,不僅可以表達觀測之間的依賴,還可表示當前觀測與前後多個狀態之間的複雜依賴。
  2. MEMM -> CRF:
    1. CRF不僅解決了HMM輸出獨立性假設的問題,還解決了MEMM的標註偏置問題,MEMM容易陷入局部最優是因爲只在局部做歸一化,而CRF統計了全局概率,在做歸一化時考慮了數據在全局的分佈,而不是僅僅在局部歸一化,這樣就解決了MEMM中的標記偏置的問題。使得序列標註的解碼變得最優解。
    2. HMM、MEMM屬於有向圖,所以考慮了x與y的影響,但沒講x當做整體考慮進去(這點問題應該只有HMM)。CRF屬於無向圖,沒有這種依賴性,克服此問題。

有了這道開胃菜,接下來,讀者可以完成這些事情:完善細節算法、閱讀原著相關論文達到徹底理解、理解相關拓展概念、理論創新……

六、總結 Referrence

《統計學習方法》,李航
《統計自然語言處理》,宗成慶
《 An Introduction to Conditional Random Fields for Relational Learning》, Charles Sutton, Andrew McCallum
《Log-Linear Models, MEMMs, and CRFs》,ichael Collins

https://www.zhihu.com/question/35866596
https://www.cnblogs.com/en-heng/p/6201893.html
https://www.cnblogs.com/en-heng/p/6201893.html
https://github.com/timvieira/crf
https://github.com/shawntan/python-crf
http://videolectures.net/cikm08_elkan_llmacrf/
https://www.jianshu.com/p/55755fc649b1
https://www.cnblogs.com/pinard/p/7068574.html
https://www.zhihu.com/question/20279019
http://www.hankcs.com/ml/crf-code-analysis.html
http://blog.csdn.net/aws3217150/article/details/69212445
http://www.hankcs.com/nlp/the-crf-model-format-description.html
https://www.cnblogs.com/syx-1987/p/4077325.html
原文鏈接:https://blog.csdn.net/Scotfield_msn/article/details/79195517

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章