熵的相關概念,第一次在決策樹那章做了簡單介紹,但是要想正確理解熵的確實需要下一番功夫。這次,我們在最大熵模型這章繼續來學習熵,理解熵在該模型中所扮演的角色。
以一個問題開始我們的學習:機器學習的目的或者意義是什么?
對于監督學習來說,我們希望通過現有獲得的觀測數據訓練一個數據模型,然后來對未知類別樣本和數據進行回歸和分類預測。
那么問題來了,什么樣的模型才是比較好的模型呢?也許熵可以給我們提供了另一種特別的視角。
好,讓我們重新看一下熵的定義:
\[ H(x) = - \sum_{x=1}^N P(x)log(P(x)) \]
\[ 0 <= H(x) <= log|N|,右邊等號成立當且僅當P(x)服從均勻分布 \]
比如,一個拋硬幣的實驗,得到正反兩面的概率分別都是0.5,相應系統的熵為1。也就是說,如果一個隨機變量的分布確定之后,熵也就唯一確定了。假設這里的$P(x)$是我們隨機變量的真實分布,因此這個熵是我們的下界,任何估計得到的數據分布的熵都應當大于等于它。
那么,最大熵模型以及同樣為指數模型的邏輯斯特回歸模型究竟是怎么和熵聯系起來的呢?為什么利用熵的約束可以使得我們訓練的模型可以很好地表征觀測數據。
首先,讓我們來看一下邏輯斯特回歸所使用的交叉熵損失函數:
\[ CE(x) = - \sum_{x=1}^N P(x)log(Q(x)) \]
\[ H(x) <= CE(x) , 等號成立當且僅當Q(x) = P(x) \]
因此,通過優化最小$CE(x)$會使得$Q(x)$盡量逼近真實數據分布$P(x)$。噢,原來通過最小化交叉熵可以使得模型朝著我們想要的方向進行優化,表達訓練樣本啊!
然后,我們再來看一下最大熵模型這邊又是什么情況。
經驗告訴我們,對于已知事件可以通過極大似然估計來統計各個事件發生的概率,而對于未知事件一般做法是把剩余概率平均分給這些事件。比如,下面這個簡單的例子:
概率/顏色 | 紅球 | 綠球 | 藍球 |
---|---|---|---|
P(x) | 3/5 | ? |
? |
為什么這樣做?因為我們無法獲得額外的信息來使得熵進一步減小,也可以說我們無法再做進一步的判斷。
平均這個詞生來就和熵有特殊的關系,我們知道當$P(x)$服從均勻分布時,系統的熵最大。
我們的目標剛好就是使得未知事件的概率分布為均勻分布,也就是使這些未知事件的熵最大。通過這個約束得到的模型就不會對未知事件做任何假設,公平的對待它們,這就是最大熵的核心思想。
先簡單窺探一下最大熵模型中熵的引入定義:
\[ H(x) = - \sum_{x,y} P^-(x)P(y|x)log(P(y|x)) \]
注意,這里定義的是條件熵,$P(y|x)$是我們需要估計的目標分布。所以,優化上面的條件熵并使其最大,得到的最優模型就能實現我們公平的理想。當然,這種約束只應該盡量施加在未知樣本上,而對于已知樣本還需要做點什么,后面我們會繼續探討。
可能這里有人會有一些疑問,比如:
-
為什么都是熵, 怎么一下求最大值好,一下又求最小值好?
我們的最終目的都是希望模型最優,熵大熵小只是準則和途徑。最終都是希望估計分布和真實分布趨于一致。
-
拋硬幣是服從均勻分布,如果我們針對該問題學習到的模型也大致服從均勻分布是不是說明該模型不好,因為熵大?
我們只是希望估計分布的熵盡可能和真實分布的熵一致,而不是希望對真實分布做什么改變以求熵小。
舉個栗子,我只是希望我畫蘋果像真實的蘋果,而不是要求蘋果像其它什么水果,比如香蕉(假設蘋果的熵比香蕉的熵大)。
最大熵模型
上一節提到最大熵模型是怎么利用熵來約束未知事件的概率分布服從均勻分布。那已知事件或者說已知樣本怎么處理呢?我們還必須讓我們的模型能夠很好的表示已知樣本啊!好像缺了什么,對吧?
是時候我們來看下最大熵代價損失函數:
\[ H(x) = - \sum_{x,y} P^-(x)P(y|x)log(P(y|x)) \]
\[ \sum_{x,y} P^-(x)P(y|x)f(x,y) = \sum_{x,y} P^-(x,y)f(x,y) \]
\[ \sum_{y} P(y|x) = 1 \]
第二個等式就是用來約束模型訓練盡量表示我們的已知樣本信息。
最大熵模型這里引入了一個特征函數的概念:
f(x,y) = 1, x與y滿足某一事實
f(x,y) = 0, 否則
為什么需要特征函數?比較容易理解的是,特征函數其實是一個用戶接口,我們可以通過定制特征函數來控制模型的訓練。比如,我們可以這樣設計特征函數:
f(x,y) = 1, 客戶擁有一套房產,允許貸款
f(x,y) = 0, 否則
好像還是不太清楚為什么需要特征函數啊!我們換個角度來思考,即怎樣度量兩個分布之間的距離或者相似度呢?
\[ \sum_{x,y} ||p(x,y)-q(x,y)|| \]
\[ \sum_{x,y} p(x,y)f(x,y) = \sum_{x,y} q(x,y)f(x,y) \]
\[ \sum_{x,y} p(x,y)log(p(x,y) / q(x,y)) \]
第一個就是常用的歐式距離;第二個是$f(x,y)$關于兩個分布的期望差值;第三個是KL距離。我們重點關注第二個度量方法,因為最大熵模型用的就是這種。
注意,$f(x,y)$必須是實數函數,而最大熵模型一般要求這個函數是一個二值函數。也就是說通過這個特征函數把$x$和$y$之間千絲萬縷的關系轉化成了一個實數值,這時我們就可以度量$P-(x)P(y|x)$和$P-(x,y)$兩個分布之間的相似度了。
我們再來看個圖,理解一下特征函數$f(x,y)$的實質意義是什么。
從這里看出,特征函數其實就是從分布上采樣,特征函數越多、越好就可以使得采樣越充分,但同時模型也就越復雜,容易過擬合。
所以在這些特征函數的約束下,使得兩個分布在這些采樣點上都能取得一致,進而使得兩個分布盡量相似。
說到這里,特征函數的意義應該明白了。沒錯,最大熵模型就是通過約束上面說的兩個期望相等來使得模型盡量去學習表征我們的觀測數據。
最大熵模型學習
對于最大熵這種有約束的優化問題,一般情況下會通過拉格朗日乘子法把它轉化為無約束優化問題。
\[ min_p max_w L(p,w) = \sum_{x,y} P^-(x)P(y|x)log(P(y|x)) + w_0(1- \sum_y P(y|x)) + \sum_{i=1}^n w_i(\sum_{x,y} P^-(x,y)f_i(x,y) - \sum_{x,y} P^-(x)P(y|x)f_i(x,y)) \]
整個優化目標表達式包含兩個未知項,一個是待求的類后驗分布$P(y|x)$,另一個是權重$w$。
一方面,我們希望$w$越大越好,這等價于要求模型要盡可能擬合或者說表示我們的數據;另一方面,希望最后選擇的$P(y|x)$使得$L(p,w)$越小越好,這又等價于要求選擇的模型使得條件熵$H(x)$越大越好。
到此,只要優化上面的函數,就可以滿足我們兩方面的需求了。
對于簡單的栗子,我們可以直接求上面代價函數的解析解,其實就是二元函數的極值求解問題。比如,先對$P(y|x)$求偏導并令求導公式等于0,然后再對$w$求導并令求導公式等于0,解出$w^*$。
最終,我們求得的$P(y|x)$形式為:
\[ P_w(y|x) = \frac{exp(\sum_{i=1}^n w_if_i(x,y))}{Z_w(x) } \]
\[ Z_w(x) = \sum_y exp(\sum_{i=1}^n w_if_i(x,y)) \]
而實際上,我們遇到的問題大多是樣本多、特征函數也多的情況,這個時候只能采用迭代求解的方法。
最大熵模型目前最采用的迭代優化算法主要是IIS(迭代尺度法),也出現了該算法的很多變體算法。大家有興趣可以關注一下。
基本IIS算法思想:
假設最大熵模型當前的參數是:
\[ w_t = (w_1,w_2,...,w_n)^T \]
找到新的參數:
\[ w_{t+1} = (w_1+δ_1,w_2+δ_2,...,w_n+δ_n)^T \]
使得模型的對數似然值
\[ L(w) = \sum_{x,y} P-(x,y)\sum_{i=1}n w_if_i(x,y) - \sum_x P^-(x)log(Z_w(x)) \]
增大。不斷地使用該方法對$w$進行更新,就可以使得$w$最終收斂到$w^*$。那現在的問題就變成了怎么去迭代尋找$δ = (δ_1,δ_2,...,δ_n)^T$了。
在機器學習領域,有一個非常好的優化策略,就是當原問題難以求解的時候,可以通過優化原問題的下界函數,來間接優化原問題。
比如,現在的優化問題是:
\[ L(w_{t+1}) - L(w_t) = \sum_{x,y} P-(x,y)\sum_{i=1}n δif_i(x,y) - \sum_x P^-(x)log\frac{Z{w+δ}(x)}{Z_w(x)} \]
我們當然希望這個似然值改變量越大越好,可是這問題不好求解怎么辦?那我們就求這個函數的下界函數嘛。于是,通過不停地改寫,就得到了下面的式子:
\[ L(w_{t+1}) - L(w_t) >= \sum_{x,y} P-(x,y)\sum_{i=1}n δi f_i(x,y) + 1 - \sum_x P^-(x) \sum_y P_w(y|x) \sum{i=1}^n \frac{f_i(x,y)}{f^#(x,y)}exp(
δ_i f^#(x,y)) \]
\[ f^#(x,y) = \sum_{i=1}^n f_i(x,y) \]
我們可以對這個下界函數針對$δ_i(i∈[1,n])$進行求導,解出$δ_i$。
\[ \sum_{x,y} P^-(x,y)f_i(x,y) - \sum_{x,y} P^-(x) P_w(y|x) f_i(x,y) exp(δ_i f^#(x,y)) = 0 \]
最大熵的應用
關于最大熵的應用,我自己接觸的就是它在語言模型中的應用。記得Mikolov的RNN的網絡結構中,有集成一個最大熵的模型,有興趣可以去看一下。
另外,最大熵模型可以應用于平常的序列標注任務,比如專有名詞識別NER、語義角色標注SRL,分詞、詞性標注POS以及語義解析SP等任務。
語義解析是搜索、對話等AI技術的基石,所以就拿語義解析來簡單舉例:
打 | 電 | 話 | 給 | 徐 | 文 | 強 |
---|---|---|---|---|---|---|
B_OPT | B_TARGET | E_TARGET | O | B_NAME | I_NAME | E_NAME |
幫 | 我 | 訂 | 明 | 天 | 的 | 飛 | 機 | 票 |
---|---|---|---|---|---|---|---|---|
O | O | B_OPT | B_DATE | E_DATE | O | B_TARGET | I_TARGET | E_TARGET |
類似這樣序列化標注的任務,都可以考慮使用最大熵模型來做。
總結
至此,我們最大熵模型的基本理論和應用都已經講完了,主要內容包括:
邏輯斯特回歸與最大熵模型是怎么和熵聯系起來的;
最大熵模型的代價損失函數中約束項的含義分析;
最大熵模型常用的優化及IIS方法基本原理;
最大熵模型的應用場景簡單介紹。
另外,注意1 2
兩小節內容僅是個人的理解和分析,僅供參考學習。有興趣的童鞋可以重點關注一下最大熵模型學習優化的公式推導,仔細閱讀還是能夠看明白的。
參考資料
統計學習方法 李航著