1. 程式人生 > >[白話解析]用水滸傳為例學習最大熵馬爾科夫模型

[白話解析]用水滸傳為例學習最大熵馬爾科夫模型

# [白話解析]用水滸傳為例學習最大熵馬爾科夫模型 ## 0x00 摘要 本文將盡量使用易懂的方式,儘可能不涉及數學公式,而是從整體的思路上來看,運用感性直覺的思考來解釋最大熵馬爾可夫模型。並且從名著中找了個具體應用場景來幫助大家深入這個概念。 在機器學習過程中,會遇到很多晦澀的概念,相關數學公式很多,大家理解起來很有困難。遇到類似情況,我們應該多從直覺角度入手思考,用類別或者舉例來**附會**,這樣往往會有更好的效果。 我在講解論述過程中給自己的要求是:在生活中或者名著中找一個例子,然後用自己的話語闡述出來。 ## 0x01 背景 在前文[[白話解析\]以水滸傳為例學習隱馬爾可夫模型](https://www.cnblogs.com/rossiXYZ/p/12430955.html)中,我們用 "樑中書突圍大名府為例" 講解了隱馬爾可夫模型,但是現實中情況可能更復雜,比如樑中書突圍遇到了宋江,他再次選擇從宋江處突圍的可能性會變低,因為宋江身邊肯定是梁山大部分好漢,突圍難度太大。但是如果遇到史進,危險性就沒有那麼大了。 這種情況只用隱馬爾科夫模型就很難解決,需要引入最大熵馬爾可夫模型了。 最大熵馬爾可夫模型(Maximum Entropy Markov Model,MEMM)的思想把HMM和最大熵結合起來,可以提取特徵以泛化模型能力,結合上下文依賴,直接判別減少建模負擔。下面就來詳述。 ### 1. 隱馬爾科夫模型的缺點 HMM是一種生成模型,定義了聯合概率分佈,其中y和x分別表示觀察序列和相對應的標註序列的隨機變數。為了能夠定義這種聯合概率分佈,生成模型需要枚舉出所有可能的觀察序列,這在實際運算過程中很困難的,因此我們需要將觀察序列的元素看作是彼此孤立的個體,即假設每個元素彼此獨立,任何時刻的觀察結果只依賴於該時刻的狀態。 目標函式和預測目標函式不匹配,HMM學到的是狀態和觀察序列的聯合分佈P(Y,X),而預測問題中,我們須要的是條件概率P(Y|X)。HMM必須計算出所有的潛在可能路徑的概率值大小(然後再挑概率值最大的那一個作為最終結果) HMM僅僅依賴於每個狀態和它相應的觀察物件,但是對於某一個觀測值,它可能並非由一個隱藏狀態決定的,而是兩個以上的隱藏狀態綜合作用而產生的,那麼這時HMM就無能為力了。 HMM模型的這個假設前提是在比較小的資料集上是合適的,但實際上在大量真實的語料中觀察序列更多的是一種多重互動特徵形式表現,觀察元素之間廣泛存在長程相關性。在命名實體識別的任務中,由於實體本身結構所具有的複雜性,利用簡單的特徵函式往往無法涵蓋所有的特性,這時HMM的假設前提使得它無法使用複雜特徵(它無法使用多於一個標記的特徵)。 ### 2. 最大熵模型的特點 最大熵模型的優點:首先,最大熵統計模型獲得的是所有滿足約束條件的模型中資訊熵極大的模型;其次,最大熵統計模型可以靈活地設定約束條件,通過約束條件的多少可以調節模型對未知資料的擬合程度;再次,他還能自然地解決了統計模型中引數平滑的問題。 最大熵模型的不足:首先,最大熵統計模型中二值化特徵只是記錄特徵的出現是否,而文字分類需要知道特徵的強度,因此,它在分類方法中不是最優的。其次,由於演算法收斂的速度比較慢,所以導致最大熵模型它的計算代價比較大,時空開銷大;再次,資料稀疏問題比較嚴重。 最大熵模型可以使用任意的複雜相關特徵,在效能上最大熵分類器超過了bayes分類器。但是,作為一種分類器模型,這兩種方法有一個共同的缺點:每個詞都是單獨進行分類的,標記之間的關係無法得到充分利用。具有馬爾可夫鏈的HMM模型可以建立標記之間的馬爾科夫關聯性,這是最大熵模型所沒有的。所以一個很自然的想法就是將兩者的優勢結合起來,這就得到了最大熵馬爾可夫模型
。 ### 3. MEMM的引入 最大熵馬爾可夫模型(Maximum Entropy Markov Model,MEMM)的思想是利用 HMM 框架預測給定輸入序列的序列標籤,同時結合多項 Logistic 迴歸(又名最大熵,其給出了可以從輸入序列中提取特徵的型別和數量上的自由度)。這個模型允許狀態轉移概率依賴於序列中彼此之間非獨立的 特徵上,從而將上下文資訊引入到模型的學習和識別過程中,提高了識別的精確度,召回率也大大的提高,有實驗證明,這個新的模型在序列標註任務上表現的比 HMM和無狀態的最大熵模型要好得多。 - MEMM解決了HMM輸出獨立性假設的問題。因為HMM只限定在了觀測與狀態之間的依賴,而MEMM引入自定義特徵函式,不僅可以表達觀測之間的依賴,還可表示**當前觀測與前後多個狀態之間**的複雜依賴;( 這個複雜依賴是通過特徵函式來做到的,比如該單詞的 “前面單詞/後面單詞” 分別是什麼 ) - MEMM考慮到相鄰狀態之間依賴關係。且考慮整個觀察序列,因此MEMM的表達能力更強; - MEMM不考慮P(X),減輕了建模的負擔。同一時候學到的是目標函式是和預測函式一致; HMM是生成式模型,引數即為各種概率分佈元引數,資料量足夠可以用最大似然估計
。 而MEMM是判別式模型。是用函式直接判別,學習邊界,MEMM即通過特徵函式來界定。**這裡由於去掉了獨立性假設,所以不能給出聯合概率分佈,只能求後驗概率,所以是判別模型**。但同樣,MEMM也有極大似然估計方法、梯度下降、牛頓迭代、擬牛頓下降、BFGS、L-BFGS等等。 ## 0x02 最大熵模型 因為HMM我們已經在前文了解,所以本文重點是最大熵模型的介紹。 ### 1. Logistic 迴歸 通常,機器學習分類器通過從所有可能的 y_i 中選擇有最大的 P(y|x) 的那個,來決定將哪個輸出標籤 y 分配給輸入 x。在分類任務中,logistic 迴歸通過計算給定觀察的屬於每個可能類別的概率,然後選擇產生最大概率的類別。 Logistic 迴歸是用於分類的一種監督學習演算法,它的本質是線性迴歸。Logistic 迴歸用條件極大似然估計進行訓練。這意味著我們將選擇引數 w,使對給定輸入值 x 在訓練資料中 y 標籤的概率最大化
。通常可以運用隨機梯度下降法、L-BFGS 或共軛梯度法來求此函式的最大值,即找到最優權重。 最大熵模型屬於log-linear model,在給定訓練資料的條件下對模型進行極大似然估計或正則化極大似然估計。 ### 2. 最大熵原理 最大熵原理(Principle of Maximum Entropy):將已知事實作為制約條件,求得可使熵最大化的概率分佈作為正確的概率分佈。而在機器學習裡,就是如果沒有資料說明,就不要隨便為模型加假設。 最大熵原理的實質就是,在已知部分知識的前提下,關於未知分佈最合理的推斷就是:符合已知知識後 “最不確定或最隨機的推斷” 是我們可以作出的唯一不偏不倚的選擇,任何其它的選擇都意味著我們增加了其它的約束和假設,這些約束和假設根據我們掌握的資訊無法作出。 例如,投擲一個骰子,如果問"每個面朝上的概率分別是多少",你會說是等概率,即各點出現的概率均為1/6。因為對這個"一無所知"的色子,什麼都不確定,而假定它每一個朝上概率均等則是最合理的做法。從投資的角度來看,這是風險最小的做法,而從資訊理論的角度講,就是保留了最大的不確定性,也就是說讓熵達到最大。 實踐經驗和理論計算都告訴我們,在完全無約束狀態下,均勻分佈等價於熵最大(有約束的情況下,不一定是概率相等的均勻分佈。 比如,給定均值和方差,熵最大的分佈就變成了正態分佈 )。 ### 3. 最大熵模型 最大熵模型(Maximum Entropy Modeling) : 如果你有資料,請通過你的資料建立先驗資訊(在這裡叫做約束條件),剩下的未知部分,請讓他們均勻分佈,也就是讓他們的熵最大。 因為我們如果要搭建一個最大熵模型來實現分類,那麼我們定義模型 p(y|x),這個模型應該是:在 "滿足事先已約束" 的條件下的模型中選擇熵最大的模型,即讓不確定的資訊等可能的發生。這樣我們就得到了最終的分類模型。 即,給定一個訓練樣本集,我們希望尋找一個分佈符合如下兩個條件(Given a set of training examples, we wish to find a distribution which): - 滿足已知的約束條件(satisfies the input constraints) - 最大化其不確定性(maximizes the uncertainty) ### 4. 已知的約束條件 #### 上下文 & 特徵函式 我們做分類問題,看到的資料往往是每個例項對應一個類別。 比如說詞性標註中一個詞對應一個標註。 為了下面討論的方便,將類別稱為Outcome,將每個例項的上下文環境叫做Context。 例項被稱為Event,一個例項是Outcome與Context的二元組。 比如,一個多維的向量x,x的每個維度都是一個特徵,可以認為 x 對應了一個 Context(特徵的集合)。然後這條樣本對應了一個label(Outcome)。 問題就是資料並不是乖乖地排列好,x的每個維度都已經取好值等著我們分類了,所以出現了這個東西:特徵函式。我們使用特徵函式來表示約束條件,即 特徵函式也就是用來指示元素是否屬於某一個子集。 比如記 w 是句子 s 的某個單詞,w是有很多維度的,則用來表示這些維度的特徵函式可以是: - w在句首 - w在句尾 - w的字首是xxx - w的字尾是xxx - w前面的單詞是xxx 可以看出,這些特徵函式針對這個單詞 w 的判別結果,就構成了 w 的上下文 Context。比如: w不在句首,w在句尾..... #### 特徵函式 給定一個訓練資料集 $$ T = \{ (x_1, y_1), (x_2, y_2) ... (x_N, y_N) \} $$ 為了表示資料,我們從資料中抽取了一系列的特徵。一般說的“特徵”都是指輸入的特徵,而最大熵模型中的“特徵”指的是輸入和輸出共同的特徵。每個特徵與每個類別都能組成一個特徵,應該用乘法原理計數。也就是說,我們可以將**X的每一維度特徵下的每個取值與某個類別**配對,並**同樣的用一個引數來描繪這個配對的緊密程度**。 可以這麼理解:就是把普遍意義上的"輸入的特徵"拆分處理變成"輸入和輸出共同的特徵"。 比如原來是: $$ \{ X = 1 \} ==> \{ Y = Class_i \} $$ 現在是 $$ f(x,y) = \begin{cases} 1 & \text{當x,y滿足某一事實} \\[2ex] 0 & \text{當不滿足該事實} \end{cases} $$ 比如每個特徵函式可以是從Context到0-1的二值函式。 $$ f(x,y) = \begin{cases} 1 & \text{if $x$ = "is" and y = v} \\[2ex] 0 & \text{otherwise} \end{cases} $$ 我們