最大熵模型(Maximum Entropy Model)是一种基于系统能量分析的分类算法。
基于numpy的实现代码传送门
1. 输入输出
训练输入: \[ T=\{(x_1,y_1), \cdots,(x_N,y_N)\} \] 其中,
- \(x\) 为特征域,\(x_i \in \mathbb{R}^{n},i =1,2,...,N\)
- \(y\) 为标签域,\(y_i \in \{c_1,\cdots,c_K\}\) ,\(K\) 为输出标签集合大小。
测试输入 \[ X'=\{x'_1, \cdots ,x'_{N'}\},x'_i \in \mathbb{R}^n \] 测试输出: \[ Y'=\{y'_1,\cdots,y'_{N'}\},y_i' \in \{c_1,\cdots ,c_K\} \]
2. 模型推导
吐槽一下,这一章的公式不是一般的多啊,那是真的离谱,敲公式敲到头晕脑胀,还有编程实现的时候,各种下标,分分钟让人怀疑人生
感觉最大熵模型最适合的场景应该是单特征单标签的标注问题
2.1. 基本方法
在这里,我们尝试从系统能量的角度来进行求解分类模型。
类比热力第二定律,系统中的熵值总是趋向于最大的情况。同理,基于输入状态,可以得到无穷多个不同的模型,在这模型的集合中,我们一般认为熵值最大的模型最接近实际的分类情况。
从上面的假设中,我们推出一个最大熵模型一定符合如下条件:
- 最大熵模型的状态必须和输入状态一致
- 最大熵模型所有可能状态的出现概率之和为1
- 最大熵模型在所有符合上诉条件的模型中,其熵值一定是最大的
于是,基于上述条件,下面对于输入离散型数据进行推导
下面的公式中,\(P\) 表示模型的输出值,\(\overline{P}\) 表示真实的测量值
从输入状态中,可以计算出各种状态出现的概率 \[ \overline{P}(X=x,Y=y) = \frac{ \nu(X=x,Y=y)}{N} \\ \overline{P}(X=x) = \frac{ \nu(X=x)}{N} \] 其中,\(\nu(\cdot) = \sum I(\cdot)\),表示事件出现的频数
定义特征函数 \[ f(x,y)= \left \{ \begin{array}{ll} 1, \text{x与y都满足某一事实} \\ 0, \text{否则} \end{array} \right . \]
这是一个很多人都会提到的坑,首先怎样才算满足某一事实?
特征函数的确定取决于我们的训练目的,相当于人为添加一个先验知识进行再规则化,可以理解为神经网络中的mask,用于屏蔽一些不符合实际的情况。特征函数的复杂程度决定了模型的复杂程度。
例如,当 \(y=c\)时,\(x_i \in \{ a, b\}\) ,很自然地,如果 \(x_i = b\) 时,应该输入 \(y=c\),但当你设置当 \(x_i=a,y=c\)时,\(f_i(x,y) = 1\) ,则当 \(x_i=b\) 时,输出 \(y \neq c\) ,当然,对于连续型输入,也可以设置当 \(a< x_i < b,y=c\) 时,\(f_i(x,y)=1\)
所以说,如果你没有这一先验知识,这一特征函数式可以忽略的,直接令 \[ f(x,y)= \left \{ \begin{array}{ll} 1 \quad or \quad x &, x \in X , y \in Y\\ 0 &, \text{otherwise} \end{array} \right . \]
则系统的望值 \(E_{\overline{P}}(f)\) 定义如下 \[ E_{\overline{P}}(f) = \sum_{x,y} \overline{P}(x,y)f(x,y) \] 亦可得模型的期望值 \(E_P(f)\) 定义如下 \[ E_P(f) = \sum_{x,y} \overline{P} (x) P(y|x) f(x,y) \] 如果模型的状态与实际状态一致,则两者的期望值相等,将其作为约束条件,即可得所有满足约束条件的模型集合 \[ C= \{P|E_{\overline{P}}(f_i) = E_P(f_i), \sum_y P(y|x) = 1,i=1,2,...,n\} \]
最终,模型集合中熵值最大的模型即为最大熵模型,可得模型函数如下 \[ f(x)=\arg \max_{P \in C} \left[H(P) = - \sum_{x,y} \overline{P} (x) P(y|x) \log P(y|x) \right] \]
2.2. 学习策略
模型函数中,只有 \(P(y|x)\) 是未知变量,故下面进行求解该变量的推导
为了方便计算,一般将约束最优化的原始问题转化为无约束最优化的对偶问题,通过求解对偶问题求解原始问题
2.2.1. 对偶问题
首先,引入拉格朗日乘子 \(w_o,w_1,...,w_n\),定义拉格朗日函数 \(L(P,w)\) \[ L(P,w) = -H(P) + w_0(1-\sum_yP(y|x)) + \sum_{i=1}^nw_i(E_{\overline{P}}(f_i) - E_P(f_i)) \] 由于 \(L(P,w)\) 是凸函数,所以其原始问题和对偶问题的解是等价的,故
由求解原始问题 \[ \min_{P\in C} \max_{w} L(P,w) \] 转换为求解其对偶问题 \[ \max_{w} \min_{P\in C} L(P,w) \]
2.2.2. 极小化解
首先求内部的极小化解,即求解 \(L(P,w)\) 对未知变量 \(P(y|x)\) 的偏导为0的情况,即 \[ \frac{\partial L(P,w)}{\partial P(y|x)} = 0 \] 求得 \[ P(y|x) = \frac{\exp(\sum_{i=1}^nw_if_i(x,y))}{\exp(1-w_0)} \] 又 \(\sum P(y|x) = 1\),得 \[ P_{\mathrm{w}}(y|x) = \frac{1}{Z_{\mathrm{w}}(x)} \exp(\sum_{i=1}^n w_if_i(x,y)) \] 其中, \[ P_{\mathrm{w}}(y|x) = \arg \min_{P\in C} L(P,w) \\ Z_{\mathrm{w}}(x) = \sum_y \exp(\sum_{i=1}^n w_if_i(x,y)) \] \(Z_w(x)\) 又被称为规范化因子,而且应该注意到,最终结果 \(w_0\) 已经被忽略掉了,所以 \(L(P,w)\) 中对应项也是可以去掉的。
有没有感觉上面的式子很熟悉,是不是跟softmax回归模型的函数式很像,是不是很神奇?出发点虽然不一样,但兜兜转转,最终还是回到了同一个终点,所以世间万物都是相通的。
2.3. 学习算法
于是,最终问题转化为求解 \(P_w\) 的极大值。一般直接对其求偏导,然后使用梯度上升法求解即可。下面再列举出其他两种求解的算法
2.3.1. 改进的迭代尺度法(IIS)
\(P_w(y|x)\) 的对数似然函数为 \[ L(w) = \sum_{x,y} \overline{P}(x,y)\sum_{i=1}^nw_if_i(x,y) - \sum_x \overline{P}(x) \ln Z_w(x) \] IIS的思想为:不断寻找一个增量 \(\delta\) , 使得更新 \(w \leftarrow w+\delta\) 后,模型的对数似然函数增大,直到其似然函数值最大。基于这一思想有 \[ L(w+\delta) - L(w) = \sum_{x,y} \overline{P} (x,y)\sum_{i=1}^n \delta_if_i(x,y) - \sum_x \overline{P}(x) \ln \frac{Z_{w+\delta}(x)}{Z_w(x)} \] 由于 \(-\ln a \geq 1-a,a>0\),改变上式的下界 \[ L(w+\delta) - L(w) \geq \sum_{x,y} \overline{P} (x,y) \sum_{i=1}^n \delta_if_i(x,y) + 1 - \sum_x \overline{P}(x) \frac{Z_{w+\delta}(x)}{Z_w(x)} \\ = \sum_{x,y} \overline{P} (x,y) \sum_{i=1}^n \delta_if_i(x,y) + 1 - \sum_x \overline{P}(x) \sum_y P_w(y|x) \exp \sum_{i=1}^n \delta_i f_i(x,y) \\ = A(\delta|w) \] 但是直接寻找合适的 \(\delta\) 还是很困难,因为这是一个向量,不易同时优化。于是,IIS试图只优化一个变量 \(\delta_i\),而保持其他的变量 \(\delta_j, j \neq i\) 不变,因此,需要引入一个变量 \[ f' (x,y) = \sum_i f_i(x,y) \] 中间的推导过程太长了,这里就不全都列出来,最终可以推导出 \[ B(\delta|w)= \sum_{x,y} \overline{P} (x,y) \sum_{i=1}^n \delta_if_i(x,y) + 1 - \sum_x \overline{P}(x) \sum_yP_w(y|x) \sum_{i=1}^n \frac{f_i(x,y)}{f'(x,y)} \exp(\delta_if'(x,y)) \] 其偏导为 \[ \frac{\partial B}{\partial \delta_i} = \sum_{x,y} \overline{P} (x,y) \sum_{i=1}^n f_i(x,y) - \sum_x \overline{P}(x) \sum_yP_w(y|x) f_i(x,y) \exp(\delta_if'(x,y)) \] 于是,上式中除 \(\delta_i\) 外不含任何其他变量
使其偏导为0
如果 \(f' (x,y)\) 为常数,则令 \(f' (x,y)=M\) (其实可以将其看做一个学习率,不一定需要求出来,直接设置一个合理的值即可),直接求解 \[
\delta_i = \frac{1}{M} \ln \frac{E_{\overline{P}}(f_i)}{E_{P_w}(f_i)}
\] 如果 \(f' (x,y)\) 不是常数,则令 \(g(\delta_i) = \frac{\partial B}{\partial \delta_i} = 0\),使用牛顿法不断迭代求解,即
\[
\delta_i^{(k+1)} = \delta_i^{(k)} - \frac{g(\delta_i^{(k)} )}{g'(\delta_i^{(k)} )}
\] 最后更新 \(w_i\) 的值即可
2.3.2. 拟牛顿法(BFGS)
求解原拉格朗日函数 \[ L(P_w,w) = -H(P_w) + \sum_{i=1}^nw_i(E_{\overline{P}}(f_i) - \sum_{x,y} \overline{P} (x) P_w(y|x) f_i(x,y)) \\ = \sum_{x,y} \overline{P}(x,y)\sum_{i=1}^nw_if_i(x,y) - \sum_x \overline{P}(x) \ln Z_w(x) \]
最终计算的结果和对数似然函数是一样的,殊途同归
目标函数 \[ f(w) = - L(P_w,w) \] 求解上述函数的极小值
对应的梯度 \[ g(w_i) = \frac{\partial f(w)}{\partial w_i} = \sum_{x,y} \overline{P} (x) P_w(y|x) f_i(x,y)) - E_{\overline{P}}(f_i) \] 进行下面的求解过程
选定初始点 \(w_0\) ,取 \(B_0\) 为正定对称矩阵(例如,n阶单位矩阵),置 \(k=0\)
计算 \(g_k=g(w_k)\),如果 \(||g_k||<\varepsilon\),则停止计算,得 \(w_* = w_k\),否则转步骤3
由 \(B_kp_k=-g_k\),求得 \(p_k\)
一维搜索,求 \(\lambda_k\),使得 \(f(w_{\lambda} + \lambda_kp_k) = \min_{\lambda \geq 0}(f(w_k + \lambda p_k))\)
置 \(w_{k+1} = w_k + \lambda_kp_k\)
计算 \(g_{k+1}\),如果 \(||g_{k+1}|| < \varepsilon\),则停止计算,得 \(w_*=w_{k+1}\),否则,求 \(B_{k+1}\) \[ B_{k+1} = B_k + \frac{y_ky_k^T}{y_k^T\delta_k} - \frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k} \] 其中,\(y_k = g_{k+1} - g_k,\delta_k=w_{k+1}-w_k\)
\(k=k+1\),重复步骤3
3. 连续型数据
对于连续型数据,推导流程与离散型的差别不大,而且推导过程比离散型更加简单
下面列出存在差别的一些式子
3.1. 概率函数
一般假设其符合高斯分布,分别计算均值和方差 \[ P(x) = N(\mu_x, \Sigma_x) \\ P(x,y) = N(\mu_{x,y}, \Sigma_{x,y}) \] 其中 \[ N(\mu, \Sigma) = \frac{1}{(2 \pi) ^ {n/2} |\Sigma| ^ {1/2}} \exp(-\frac{1}{2}(x-\mu) ^ T \Sigma ^ {-1} (x-\mu)) \]
\(\mu\) 为各个维度的均值矩阵,\(\Sigma\) (这个是希腊字母 \(\mu\) 的大写,不是求和符号)为 \(x\) 的协方差矩阵
3.2. 求和转积分
上面推导中只有涉及熵值和系统期望的计算中的求和项转为求积,即 \[ \sum \cdot \rightarrow \int \cdot dx \]
例如 \[ H(P) = - \int \overline{P} (x) P(y|x) \log P(y|x) dx \]
3.3. 最终解
求导过程非常简单,只需要将所有的积分符号去掉即可,最终结果也是相似的,只是要注意 \(Z\) 也要有求和转为积分模型,即 \[ Z = \int \exp(\sum_{i=1}^n w_if_i(x,y)) dx \]
4. 模型优缺点
4.1. 优点
- 最大熵统计模型获得的是所有满足约束条件的模型中信息熵极大的模型,作为经典的分类模型时准确率较高。
- 可以灵活地设置约束条件,通过约束条件的多少可以调节模型对未知数据的适应度和对已知数据的拟合程度。
4.2. 缺点
- 由于约束函数数量和样本数目有关系,导致迭代过程计算量巨大,实际应用比较难。
- 约束函数的数目一般来说会随着样本量的增大而增大,导致样本量很大的时候,对偶函数优化求解的迭代过程非常慢,scikit-learn甚至都没有最大熵模型对应的类库。
- 对连续型输入支持并不友好,虽然连续型输入的求解过程简单,但由于 \(f_i(x,y)\) 不一样,最终解的一般形式也不一样,没有一个通用的解法。
5. references
《统计学习方法》第6章,李航
《数学之美》第6章,吴军
最大熵学习笔记(四)模型求解_peghoty-CSDN博客_最大熵怎么求
最大熵学习笔记(五)最优化算法_peghoty-CSDN博客
“熵”不起:从熵、最大熵原理到最大熵模型(一) - 科学空间|Scientific Spaces
“熵”不起:从熵、最大熵原理到最大熵模型(二) - 科学空间|Scientific Spaces
Nice job!