熵的相关概念,第一次在决策树那章做了简单介绍,但是要想正确理解熵的确实需要下一番功夫。这次,我们在最大熵模型这章继续来学习熵,理解熵在该模型中所扮演的角色。
以一个问题开始我们的学习:机器学习的目的或者意义是什么?
对于监督学习来说,我们希望通过现有获得的观测数据训练一个数据模型,然后来对未知类别样本和数据进行回归和分类预测。
那么问题来了,什么样的模型才是比较好的模型呢?也许熵可以给我们提供了另一种特别的视角。
好,让我们重新看一下熵的定义:
\[ 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
两小节内容仅是个人的理解和分析,仅供参考学习。有兴趣的童鞋可以重点关注一下最大熵模型学习优化的公式推导,仔细阅读还是能够看明白的。
参考资料
统计学习方法 李航著