常見算法面試之樣本不均衡的解決辦法、交叉熵以及HMM、MEMM vs CRF


 

---恢復內容開始---

1、樣本類別不均衡的解決辦法

  • 把數據進行采用的過程中通過相似性同時生成並插樣“少數類別數據”,叫做SMOTE算法
  • 對數據先進行聚類,再將大的簇進行隨機欠采樣或者小的簇進行數據生成
  • 把監督學習變成無監督學習,舍棄掉標簽把問題轉化為一個無監督問題,如異常檢測
  • 先對多數類別進行隨機的欠采樣,並結合boosting算法進行集成學習

1.1、簡單通用的算法有哪些

  • 對較多的那個類別進行欠采樣(under-sampling),舍棄一部分數據,使其與較少類別的數據相當
  • 對較少的類別進行過采樣(over-sampling),重復使用一部分數據,使其與較多類別的數據相當
  • 閾值調整(threshold moving),將原本默認為0.5的閾值調整到  較少類別 / (較少類別+較多類別) 即可

很明顯可以看出,第一種和第二種方法都會明顯的改變數據分布,我們的訓練數據不再是真實數據的無偏表述。第一種方法中,我們浪費了很多數據,第二種方法中無中生有或者重復使用了數據,會導致過擬合的發生。

因此欠采樣的邏輯中往往會結合集成學習來有效地使用數據,假設正例數據n,而反例數據m個。我們可以通過欠采樣,隨機無重復的生成(k=n/m)個反例子集,並將每個子集都與相同正例數據合並生成k個新的訓練樣本。我們在k個訓練樣本上分別訓練一個分類器,最終將k個分類器的結果結合起來,比如求平均值。這就是Easy Ensemble。

但其實不難看出,這樣的過程是需要花時間處理數據和編程的,對於很多知識和能力有限的人來說難度比較大。特此推薦兩個簡單有效且效果中上的做法:

  • 簡單的調整閾值,不對數據進行任何處理。此處特指將分類閾值從0.5調整到正例比例
  • 使用現有的集成學習分類器,如隨機森林或者xgboost,並調整分類閾值

提出這樣建議的原因有很多。首先,簡單的閾值調整從經驗上來看往往比過采樣和欠采樣有效。其次,如果對統計學知識掌握有限,而且編程能力一般,在集成過程中容易出錯,不如使用現有的集成學習並調整分類閾值。

1.2、一個簡單但有效的方案

  • 不對數據進行過采樣和欠采樣,但是用現有的集成學習模型,如隨機森林
  • 輸出隨機森林的預測概率,調整閾值得到最終結果
  • 選擇合適的評估標准,如precision@n

這種難度很低,也規避了不少容易出錯的地方。我們使用集成學習降低過擬合風險,使用閾值調整規避和采樣問題,同時選擇合適的評估手段以防止偏見。而且這些都是現成的模型,5-10行的Python就可以實現。

 

二、交叉熵函數系列問題?與最大似然函數的關系和區別?

交叉熵用來衡量在給定的真實分布下,使用非真實分布所指定的策略消除系統的不確定性所需要付出的努力的大小。

交叉熵的公式為:\sum_{k=1}^N p_k \log_2 \frac{1}{q_k},其中p_k 表示真實分布,q_k 表示非真實分布。

交叉熵越低,表示非真實分布越接近真實分布,因此,交叉熵越低越好。

如何去衡量不同策略之間的差異呢?這就需要用到相對熵(KL散度,物理意義就是用來度量兩個函數的相似度或者相近程度),用來衡量兩個取值為正的函數或概率分布之間的差異,即:

KL(f(x) || g(x)) =  \sum_{ x \in X} f(x) * \log_2 \frac{f(x)}{g(x)}

現在假設我們想知道某個策略和最優策略之間的差異,我們就可以用相對熵來衡量這兩者之間的差異。即,相對熵 = 某個策略的交叉熵 - 信息熵(根據系統真實分布計算而得的信息熵,為最優策略),公式如下:

KL(p || q) = H(p,q) - H(p) = 

 \sum_{k=1}^N p_k \log_2 \frac{1}{q_k} - \sum_{k=1}^N p_k \log_2 \frac{1}{p_k} = \sum_{k=1}^N p_k \log_2 \frac{p_k}{q_k}

 

1)交叉熵損失函數的物理意義:用於描述模型預測值與真實值的差距大小

2)最小化交叉熵的本質就是對數似然函數的最大化

3)對數似然函數的本質就是衡量在某個參數下,整體的估計和真實情況一樣的概率,越大代表越相近;而損失函數的本質就是衡量預測值和真實值之間的差距,越大代表越不相近。

三、HMM、MEMM vs CRF 對比

1、馬爾科夫假設

應該是齊次性假設,這樣假設:馬爾科夫鏈(x_{1},\cdots,x_{n}) 里的 x_{i}總是只受 x_{i-1} 一個人的影響。馬爾科夫假設這里相當於就是1-gram。

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

2、馬爾科夫性

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

2.1、判別式模型

判別模型是直接對P(Y | X)進行建模,就是說,直接根據X特性來對Y建模訓練。具體的,我的訓練過程是確定構件P(Y | X) 模型里面“復雜映射關系”中的參數,完了再去inference一批新的sample。

判別式模型的特征總結如下:

1)對P(Y | X)建模

2)對所有的樣本只構建一個模型,確認總體判別邊界

3)觀測到輸入什么特征,就預測最可能的label

4)判別式的優點:對數據量要求沒生成式的嚴格,速度也會快,小數據量下准確率也會好些。

2.2、生成式模型

在訓練模型中,學習到的是X與Y的聯合模型P(X,Y),需要確定維護這個聯合概率分布的所有的信息參數。完了之后在inference再對新的sample計算P(Y | X),導出Y。

學習階段,建模: P(X,Y)=P(X|Y)P(Y),然后 P(Y|X) = \frac{P(X,Y)}{P(X)}

生成式總結有如下特點:

1. 對P(X , Y) 建模

2. 這里主要講分類問題,要對每個label(y_{i} )都需要建模,最終選擇最優概率的label為結果,所以 沒有什么判別邊界。

3. 中間生成聯合分布,並可生成采樣數據。

4. 生成式模型的優點在於,所包含的信息非常齊全,我稱之為“上帝信息”,所以不僅可以用來輸入label,還可以干其他的事情。生成式模型關注結果是如何產生的。但是生成式模型需要非常充足的數據量以保證采樣到了數據本來的面目,所以速度相比之下,慢。

 

 

 2.3 序列建模

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

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

  • 節點之間有關聯依賴性/無關聯依賴性
  • 序列的節點是隨機的/確定的
  • 序列是線性變化/非線性的
  • .......

對不同的序列有不同的問題需求,常見的序列建模方法總結如下:

1.擬合,預測未來節點(或走勢分析):

  a. 常規序列建模方法:AR、MA 、ARMA 、ARIMA

  b. 回歸擬合

  c. Neural Networks

2. 判斷不同序列類別,及分類問題:HMM、CRF、General Classifier (ML models、NN models)

3. 不同時序對應的狀態的分析,及序列標注問題:HMM、CRF、RecurrentNNs

 

3. HMM

3.1 理解HMM

實際上我們碰到的更多的使用HMM的場景是每個節點Xi 下還附帶着另一個節點 Y_{i},正所謂隱含馬爾科夫模型,那么除了正常的節點,還要將隱含狀態節點也得建模進去。正兒八經地,將X_{i} 、 Y_{i}  換成i_{i} 、o_{i} ,並且他們的名稱變為狀態節點、觀測節點。狀態節點正是我們的隱狀態。

HMM屬於典型的生成式模型。對照2.1的講解,應該是要從訓練數據中學到數據的各種分布,那么有哪些分布呢以及是什么呢?直接正面回答的話,正事HMM的5要素,其中有3個就是整個數據的不同角度的概率分布:

N,隱藏狀態 N = {q1,...,qN},隱藏節點不能隨意取,只能限定取包含在隱藏狀態集中的符號。

M,觀測集 M = \lbrace v_{1}, \cdots, v_{M} \rbrace ,同樣我的觀測節點不能隨意取,只能限定取包含在觀測狀態集中的符號。

A,狀態轉移概率矩陣,這個就是其中一個概率分布。他是個矩陣, A= [a_{ij}]_{N \times N} (N為隱藏狀態集元素個數),其中 a_{ij} = P(i_{t+1}|i_{t}), i_{t} 即第i個隱藏狀態節點,即所謂的狀態轉移。

B,觀測概率矩陣,這是另一個概率分布。 B = [b_{ij}]_{N \times M}(N為隱藏狀態集元素個數,M為觀測集元素個數),其中 b_{ij} = P(o_{t}|i_{t}), o_{t}即第i個觀測節點, i_{t}即第i個隱狀態節點,即所謂所謂的觀測概率(發射概率)。

π ,在第一個隱狀態節點i_{t} ,我得人工單獨賦予,我第一個隱狀態節點的隱狀態是N中的每一個的概率分別是多少,然后π 就是其概率分布

所以圖看起來是這樣的:

 

模型先去學習要確定以上5要素,之后在inference階段的工作流程是:首先,隱狀態節點i_{t}是不能直接觀測到的數據節點,o_{t} 才是能觀測到的節點,並且注意箭頭的指向表示了依賴生成條件關系,i_{t} 在A的指導下生成下一個隱狀態節點i_{t+1},並且i_{t} 在B的指導下生成依賴於該i_{t}的觀測節點 o_{t},並且我們只能觀測到序列(o_{1}, \cdots, o_{i}) 。

下面來點高層次的理解:

1. 根據概率圖分類,可以看到HMM屬於有向圖,並且是生成式模型,直接對聯合概率分布建模P(O,I) = \sum_{t=1}^{T}P(O_{t} | O_{t-1})P(I_{t} | O_{t}) (注意,這個公式不在模型運行的任何階段能體現出來,只是我們都去這么來表示HMM是個生成式模型,他的聯合概率P(O , I)就是這么計算的)。

2. 並且B中b_{ij} = P(o_{t}|i_{t}) ,這意味着o對i有依賴性。

3. 在A中a_{ij} = P(i_{t+1}|i_{t}),也就是說只遵循了一階馬爾科夫假設,1-gram。如果數據依賴超過1-gram,那肯定HMM是考慮不進去的。

3.2 模型運行過程

模型的運行過程(工作流程)對應了HMM的3個問題。

3.2.1 學習訓練過程

對照2.1的講解,HMM學習訓練的過程,就是找出數據的分布情況,也就是模型參數的確定。

主要學習算法按照訓練數據除了觀測狀態序列(o_{1}, \cdots, o_{i}) 是否還有隱狀態序列(i_{1}, \cdots, i_{i}) 分為:

  • 極大似然估計,with 隱狀態序列
  • Baum-Welch(前向后向),without 隱狀態序列 

1. 極大似然估計

一般做NLP的序列標注等任務,在訓練階段肯定有隱狀態序列的。

  • step 1.算A

       \hat{a_{ij}} = \frac{A_{ij}}{\sum_{j=1}^{N}A_{ij}}

  • step 2. 算B

  \hat{b_{j}}(k) = \frac{B_{jk}}{\sum_{k=1}^{M}B_{jk}}  

  • step 3. 直接估計π

2. Baum-Welch(前向后向)

就是一個EM的過程,EM的過程就是初始化一套值,然后迭代計算,根據結果再調整,再迭代,最后收斂。。。。。因為沒有隱狀態序列(i_{1}, \cdots, i_{i}) 信息,所以必須先給初值a_{ij}^{0}, b_{j}(k)^{0}, \pi^{0} ,初步確定模型,然后再迭代計算出a_{ij}^{n}, b_{j}(k)^{n}, \pi^{n} ,中間計算過程會用到給出的觀測狀態序列(o_{1}, \cdots, o_{i})。另外,收斂性由EM的XXX定理保證。

3.2.2 序列標注(解碼)過程

學習完了HMM的分布參數,也就確定了一個HMM模型。需要注意的是,這個HMM是對我這一批全部的數據進行訓練所得到的參數。序列標注問題也就是“預測過程”,通常稱為解碼過程。對應了序列建模問題3.對於序列標注問題,我們只需要學習出一個HMM模型即可,后面所有的新的sample都用這個HMM去apply。

 目的是,在學習后已知了P(Q,O) ,現要求出P(Q|O) ,進一步

Q_{max} = argmax_{allQ}\frac{P(Q,O)}{P(O)}

在直白點就是,現在要在給定的觀測序列下找出一條隱狀態序列,條件是這個隱狀態序列的概率是最大的那個。

具體地,都是用Viterbi算法解碼,是用DP思想減少重復的計算。viterbi算法其實就是多步驟每步多選擇模型的最優選擇問題,其在每一步的所有選擇都保存了前序所有步驟到當前步驟當前選擇的最小總代價(或者最大價值)以及當前代價的情況下前繼步驟的選擇。依次計算完所有步驟后,通過回溯的方法找到最優選擇路徑。

回溯方法的基本思想就是按照輸入數組的順序,每一層遞歸處理一個元素,當處理最后一層的時候,也就是把數組中的所有元素都處理完的時候,把當前結果加入到最后的返回結果中。值得注意的是,每次在遞歸到下一層之前,我們加入了某個要處理的元素X,在下一層遞歸返回之后,我們要還會加入新的元素Y。那么在這一層遞歸中就相當於處理了不止一個新的元素。

Viterbi計算有向無環圖的一條最大路徑,應該還好理解,如圖:

關鍵是注意,每次工作熱點區只涉及到t 與 t - 1,這對應了DP的無后效性的條件。

3.2.3 序列概率過程

實際上,序列概率過程對應了序列建模問題2,即序列分類。

在3.2.2第一句話有說,在序列標注問題中,用一批完整的數據訓練出了一支HMM模型即可。但,在序列分類問題中就不是訓練一個HMM模型了。應該這么做(結合語音分類識別的例子):

目標:識別聲音是A發出的還是B發出的。

HMM建模過程:

1. 訓練:將所有A說的語音數據作為dataset_A,將所有B說的語音數據作為dataset_B(當然,先要分別對dataset_A、dataset_B做預處理encode為元數據節點,形成sequences),然后分別用dataset_A、dataset_B去訓練出HMM_A / HMM_B

2. inference:來了一條新的sample(sequence),我不知道是A的還是B的,沒問題,分別用HMM_A / HMM_B計算一遍序列的概率得到P_{A}(S)、P_{B}(S) ,比較兩者大小,那個概率大說明哪個更合理,更大概率作為目標類別。

所以,本小節的理解重點在於,如何對一條序列計算其整體的概率。即目標是計算出P(O|λ) 。詳情可見李航老師整理的:

  • 直接計算法(窮舉搜索)
  • 前向算法
  • 后向算法

后面兩個算法采用了DP思想,減少計算量,每一直接引用前一個時刻的計算結果以避免重復計算,跟Viterbi一樣的技巧。

 

4、MEMM

MEMM,即最大熵馬爾科夫模型,屬於判別式模型。

4.1 理解MEMM

MEMM正因為是判別模型,所以上來就直接為了確定邊界而去建模,比如說序列求概率(分類)問題,直接考慮找出函數分類邊界。

HMM中,觀測節點o_{i} 依賴隱藏狀態節點i_{i},也就意味着我的觀測節點只依賴當前時刻的隱藏狀態。但在更多的實際場景下,觀測序列是需要很多特征來刻畫的,比如說,在做NER時,標注i_{i}不僅跟當前狀態o_{i}相關,還跟前后標注o_{j}(j \neq i)相關,比如字母大小寫、詞性等等。

為此,提出來的MEMM模型就是能夠直接允許“定義特征”,直接學習條件概率,即P(i_{i}|i_{i-1},o_{i}) (i = 1,\cdots,n),總體為:

P(I|O) = \prod_{t=1}^{n}P(i_{i}|i_{i-1},o_{i}), i = 1,\cdots,n

 

並且,P(i|i^{'},o) 這個概率通過最大熵分類器建模(取名MEMM的原因):

P(i|i^{'},o) = \frac{1}{Z(o,i^{'})} exp(\sum_{a})\lambda_{a}f_{a}(o,i)

 

重點來了,這是ME的內容,也是理解MEMM的關鍵:Z(o,i^{'}) 這部分是歸一化;f_{a}(o,i) 是特征函數,具體點,這個函數是需要去定義的;λ 是特征函數的權重,這是個未知參數,需要從訓練階段學習得到。

比如可以這么定義特征函數:

\begin{equation} f_{a}(o,i) = \begin{cases} 1& \text{滿足特定條件},\\ 0& \text{other} \end{cases} \end{equation}

其中,特征函數 f_{a}(o,i) 個數可任意制定,(a = 1, \cdots, n)

所以總體上,MEMM的建模公式這樣:

P(I|O) = \prod_{t=1}^{n}\frac{ exp(\sum_{a})\lambda_{a}f_{a}(o,i) }{Z(o,i_{i-1})} , i = 1,\cdots,n

 

MEMM需要注意兩點:

 

1. 與HMM的 o_{i} 依賴 i_{i} 不一樣,MEMM當前隱藏狀態 i_{i} 應該是依賴當前時刻的觀測節點o_{i}和上一時刻的隱藏節點 i_{i-1}

2. 需要注意,之所以圖的箭頭這么畫,是由MEMM的公式決定的,而公式是由creator定義出來的。

 

走一遍完整的流程:

step 1. 先定義特征函數f_{a}(o,i)

step 2. 在給定的數據上,訓練數據,確定參數,即確定了MEMM模型

step 3. 用確定的模型做序列標注問題或者序列求概率問題

 

4.2 模型運行過程

MEMM模型的工作流程也包括了學習訓練問題、序列標注問題、序列求概率問題。

 

4.2.1 學習訓練過程

一套MEMM由一套參數唯一確定,同樣地,我需要通過訓練數據學習這些參數。MEMM模型很自然需要學習里面的特征權重λ。

不過跟HMM不同的是,因為HMM是生成式模型,參數即為各種概率分布元參數,數據量足夠可以用最大似然估計。而判別式模型是用函數直接判斷,學習邊界,MEMM即通過特征函數來界定。但同樣,MEMM也有極大似然估計法、梯度下降、牛頓迭代法、擬牛頓下降、BFGS、L-BFGS等等。

 

4.2.2 序列標注過程

還是跟HMM一樣,用學習好的MEMM模型,在新的sample(觀測序列  o_{1}, \cdots, o_{i})上找出一條概率最大最可能的隱狀態序列i_{1}, \cdots, i_{i} 。

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

4.2.3 序列求概率過程

跟HMM舉的例子不一樣,也是分別去為每一批數據訓練構建特定的MEMM,然后根據序列在每個MEMM模型的不同得分概率,選擇最高分數的模型為wanted類別。

 

4.3 標注偏置

1. 現象

由於局部歸一化問題,MEMM傾向於選擇擁有更少轉移的狀態。

 

用viterbi算法解碼MEMM,狀態1傾向於轉換到狀態2,同時狀態2qingxi傾向於保留在狀態2.解碼過程細節(需要會viterbi算法這個前提):

P(1-> 1-> 1-> 1)= 0.4 x 0.45 x 0.5 = 0.09 ,
P(2->2->2->2)= 0.2 X 0.3 X 0.3 = 0.018,
P(1->2->1->2)= 0.6 X 0.2 X 0.5 = 0.06,
P(1->1->2->2)= 0.4 X 0.55 X 0.3 = 0.066
但是得到的最優的狀態轉換路徑是1->1->1->1,為什么呢?因為狀態2可以轉換的狀態比狀態1 要多,從而使轉移概率降低,即MEMM傾向於選擇擁有更少轉移的狀態。
 
2.解釋原因
MEMM公式:

 P(I|O) = \prod_{t=1}^{n}\frac{ exp(\sum_{a})\lambda_{a}f_{a}(o,i) }{Z(o,i_{i-1})} , i = 1,\cdots,n

∑ 求和的作用在概率中是歸一化,但是這里歸一化放在了指數內部,管這叫local歸一化。viterbi求解過程,是用dp的狀態轉移公式(MEMM的沒展開,參考下面的CRF公式),因為是局部歸一化,所以MEMM的viterbi的轉移公式的第二部分出現了問題,導致dp無法正確的遞歸到全局最優。

  \delta_{i+1} = max_{1 \le j \le m}\lbrace \delta_{i}(I) + \sum_{i}^{T}\sum_{k}^{M}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i) \rbrace

5、CRF

 5.1 理解CRF

請看第一張概率圖模型架構圖,CRF上面是馬爾科夫隨機場(馬爾科夫網絡),而條件隨機場是在給定的隨機變量X(具體對應觀測序列o_{1}, \cdots, o_{i} )條件下,隨機變量Y(具體對應隱狀態序列 i_{1}, \cdots, i_{i} 的馬爾科夫隨機場)

 廣義的CRF的定義是:滿足P(Y_{v}|X,Y_{w},w \neq v) = P(Y_{v}|X,Y_{w},w \sim v) 的馬爾科夫隨機場叫做條件隨機場(CRF)

不過一般說CRF為序列建模,就專指CRF線性鏈:

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

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示意圖中,每一個(I_{i} \sim O_{i} )對為一個最大團,即在上式中c = i。並且線性鏈CRF滿足P(I_{i}|O,I_{1},\cdots, I_{n}) = P(I_{i}|O,I_{i-1},I_{i+1})  。

所以CRF的建模公式如下:

P(I | O)=\frac{1}{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)}

CRF的重點概念:判別式模型、特征函數

1. 特征函數

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 表示這是第幾個特征函數,並且每個特征函數都附屬一個權重 \lambda_{k},每個團里面,將為 token 構造 M 個特征,每個特征執行一定的限定作用,然后建模時再為每個特征函數加權求和。
  • Z(O) 是用來歸一化的,為了形成概率值
  • P (I | O)表示了在給定的一條觀測序列 O=(o_{1},\cdots, o_{i}) 條件下,用CRF所求出來的隱狀態序列I=(i_{1},\cdots, i_{i}) I=(i_{1},\cdots, i_{i})的概率,這里的 / 是一條序列,有多個元素(一組隨機變量),而至於觀測序列O=(o_{1},\cdots, o_{i}) ,它可以是一整個訓練語料的所有觀測序列;也可以是在inference階段的一句sample,比如說對於序列標注問題,對一條sample進行預測,可能能得到P_{j}(I | O)(j=1,…,J)J條隱狀態  I  ,但我肯定最終選的是最優概率那條。

對於CRF,可以為他定義兩款特征函數:轉移特征&狀態特征。建模總公式展開:

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)}=\frac{1}{Z(O)} e^{ [ \sum_{i}^{T}\sum_{j}^{J}\lambda_{j}t_{j}(O,I_{i-1},I_{i},i) + \sum_{i}^{T}\sum_{l}^{L}\mu_{l}s_{l}(O,I_{i},i) ] }

 

其中:

  • t_{j} 為 i 處的轉移特征,對應權重 \lambda_{j},每個 token 都有 J 個特征,轉移特征針對的是前后token 之間的限定。
  • 舉個例子:

\begin{equation} t_{k=1}(o,i) = \begin{cases} 1& \text{滿足特定轉移條件,比如前一個token是‘I’},\\ 0& \text{other} \end{cases} \end{equation}

  • sl 為 i 處的狀態特征,對應權重μl,每個token 都有L個特征
  • 舉個例子:
  • \begin{equation} s_{l=1}(o,i) = \begin{cases} 1& \text{滿足特定狀態條件,比如當前token的POS是‘V’},\\ 0& \text{other} \end{cases} \end{equation}

  •  

一般情況下,不把兩種特征區分開,而是合在一起:

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)}

滿足特征條件就取值為1,否則沒貢獻

再進一步理解的話,需要把特征函數部分拿出來:

Score = \sum_{i}^{T}\sum_{k}^{M}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i)

為 token_{i} 打分,滿足條件的就有所貢獻。最后將所得的分數進行log線性表示,求和后歸一化,即可得到概率值......

P(y|x;\omega) = \frac{ exp(\omega·\phi(x,y)) }{ \sum_{y^{'}\in Y }exp(\omega·\phi(x,y^{‘})) }

CRF完美的滿足這個形式,所以又可以歸入到 log-linear models 之中。

5.2  模型運行過程

  • step1. 先預定特征函數 f_{a}(o,i)
  • step2. 在給定數據上,訓練模型,確定參數\lambda_{k}
  • step3. 用確定的模型做序列標注問題或者序列求概率問題。

5.2.1 學習訓練過程

一套CRF由一套參數λ唯一確定(先定義好各種特征函數)。

同樣,CRF用極大似然估計方法、梯度下降、牛頓迭代、擬牛頓迭代、IIS、BFGS、L-BFGS等等。能用在log-linear models 上的求參方法都可以用過來

5.2.2 序列標注過程

和HMM一樣,用學習好的CRF模型,在新的sample(觀測序列o_{1}, \cdots, o_{i})上找出一條概率最大最可能的隱狀態序列i_{1}, \cdots, i_{i} 。

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

我們就定義 i 處的局部狀態為 \delta_{i}(I) ,表示在位置 i 處的隱狀態的各種取值可能為 I ,然后遞推位置 i+1 處的隱狀態,寫出來的DP轉移公式為:

\delta_{i+1} = max_{1 \le j \le m}\lbrace \delta_{i}(I) + \sum_{i}^{T}\sum_{k}^{M}\lambda_{k}f_{k}(O,I_{i-1},I_{i},i) \rbrace

5.2.3 序列求概率過程

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

5.3 CRF++ 分析

1. 定義模板

在CRF++下,應該是先定義特征模板,然后用模板自動批量產生大量的特征函數。每一條模板將在每一個token處生產若干個特征函數。

CRF++的模板(template)有U系列(unigram)、B系列(bigram),不過U模板都可以完成2-gram的作用。

2. 產生特征函數

CRF++會產生大量的特征。每個特征都會try每個標注label ,總共將生成N * L = i * k^{'} * L個特征函數以及對應的權重出來。N表示每一套特征函數N= i * k^{'} ,L表示標注集元素個數。

3. 求參

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

 

6. 總結:HMM vs. MEMM vs. CRF 

首先,CRF,HMM,MEMM都常用來做序列標注的建模,像分詞、詞性標注、以及命名實體標注

隱馬模型一個最大的缺點就是由於其輸出獨立性假設,導致其不能考慮上下文的特征,限制了特征的選擇,最大熵隱馬模型則解決了隱馬的問題,可以任意選擇特征,但由於其在每一節都要進行歸一化,所以只能找到局部最優值,同時也帶來了標記偏置問題,即凡是訓練語料中未出現的情況全都忽略掉。條件隨機場很好的解決了這一問題,他並不在每一個節點進行歸一化,而是所有特征進行歸一化,因此可以求得全局的最優值。

1. HMM -> MEMM: HMM模型中存在兩個假設:一是輸出觀察值之間嚴格獨立,二是狀態的轉移過程中當前狀態只與前一狀態有關。但實際上序列標注問題不僅和單詞相關,而且和觀察序列的長度,單詞的上下文,等等相關。MEMM解決了HMM輸出獨立性假設的問題。因為HMM只限定了在觀測與狀態之間的依賴,而MEMM引入自定義特征函數,不僅可以表達觀測之間的依賴,而MEMM引入自定義特征函數,不僅可以表達觀測之間的依賴,還可以表示當前觀測與前后多個狀態之間的復雜依賴。

2. MEMM->CRF:

  • CRF不僅解決了HMM輸出獨立性假設的問題,還解決了MEMM的標注偏置問題,MEMM容易陷入局部最優是因為只在局部做歸一化,而CRF統計了全局概率,在做歸一化時考慮了數據在全局的分布,而CRF統計了全局概率,在做歸一化時考慮了數據在全局的分布,而不是僅僅在局部歸一化,這樣就解決了MEMM中的標記偏置問題。使得序列標注的解碼變得最優解。
  • HMM、MEMM屬於有向圖,所以考慮了x與y的影響,但沒將x當做整體考慮進去(這點問題應該只有HMM)。CRF屬於無向圖,沒有這種依賴性,克服此問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM