最大熵模型原理介绍与python实现

1. 引言

    最大熵原理认为,学习概率模型时,在满足约束条件的模型集合中,熵最大的模型是最好的模型,因为在没有更多信息的情况下,我们一般会认为不确定的部分都是等可能的,而在前面决策树的介绍时我们知道,熵最大时刚好是要求概率的分布满足均匀分布,即等可能分布,因此,可以通过熵的最大化来表示等可能分布。

2. 最大熵模型原理介绍

2.1 最大熵模型的定义

    对于分类模型,假设我们要学习的模型是一个条件概率分布 P ( Y ∣ X ) P(Y | X) P(YX) X ∈ X ⊆ R n X \in \mathcal{X} \subseteq \mathbf{R}^{n} XXRn表示输入, Y ∈ Y Y \in \mathcal{Y} YY表示输出。则对于一个训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),,(xN,yN)},我们可以确定联合分布 P ( X , Y ) P(X, Y) P(X,Y)和边缘分布 P ( X ) P(X) P(X)的经验分布,分别记为 P ~ ( X , Y ) \tilde{P}(X, Y) P~(X,Y) P ~ ( X ) \tilde{P}(X) P~(X),其计算公式具体如下:
P ~ ( X = x , Y = y ) = ν ( X = x , Y = y ) N P ~ ( X = x ) = v ( X = x ) N \begin{array}{l}{\tilde{P}(X=x, Y=y)=\frac{\nu(X=x, Y=y)}{N}} \\ \\{\tilde{P}(X=x)=\frac{v(X=x)}{N}}\end{array} P~(X=x,Y=y)=Nν(X=x,Y=y)P~(X=x)=Nv(X=x)其中, v ( X = x , Y = y ) v(X=x, Y=y) v(X=x,Y=y) v ( X = x ) v(X=x) v(X=x)分别表示样本中 ( x , y ) (x, y) (x,y) x x x出现的频数, N N N表示样本数量。

    用特征函数 f ( x , y ) f(x, y) f(x,y)表示输入 x x x与输出 y y y之间的一个事实,用公式表示如下:
f ( x , y ) = { 1 , x 和 y 满 足 某 一 事 实 0 , 否 则 f(x, y)=\left\{\begin{array}{l}{1, x和y满足某一事实} \\ {0, 否则}\end{array}\right. f(x,y)={1,xy0,即当 x x x y y y满足这个事实时,取值为1,否则取值为0。

    特征函数 f ( x , y ) f(x, y) f(x,y)关于经验分布 P ~ ( X , Y ) \tilde{P}(X, Y) P~(X,Y)的期望值为:
E p ~ ( f ) = ∑ x , y P ~ ( x , y ) f ( x , y ) E_{\tilde{p}}(f)=\sum_{x, y} \tilde{P}(x, y) f(x, y) Ep~(f)=x,yP~(x,y)f(x,y)

    特征函数 f ( x , y ) f(x, y) f(x,y)关于模型 P ( Y ∣ X ) P(Y | X) P(YX)和经验分布 P ~ ( X ) \tilde{P}(X) P~(X)的期望值为:
E P ( f ) = ∑ x , y P ~ ( x ) P ( y ∣ x ) f ( x , y ) E_{P}(f)=\sum_{x, y} \tilde{P}(x) P(y | x) f(x, y) EP(f)=x,yP~(x)P(yx)f(x,y)

    如果模型能够获取训练数据中的信息,那么就可以假设这两个期望值相等,即:
E P ( f ) = E P ~ ( f ) E_{P}(f)=E_{\tilde{P}}(f) EP(f)=EP~(f)或者:
∑ x , y P ~ ( x ) P ( y ∣ x ) f ( x , y ) = ∑ x , y P ~ ( x , y ) f ( x , y ) \sum_{x, y} \tilde{P}(x) P(y | x) f(x, y)=\sum_{x, y} \tilde{P}(x, y) f(x, y) x,yP~(x)P(yx)f(x,y)=x,yP~(x,y)f(x,y)将上式作为模型学习的约束条件,假设有 n n n个特征函数 f i ( x , y ) , i = 1 , 2 , ⋯   , n f_{i}(x, y), \quad i=1,2, \cdots, n fi(x,y),i=1,2,,n,那么就有 n n n个约束条件。

    因此,最大熵模型的定义可以表示为:假设满足所有约束条件的模型集合为:
C ≡ { P ∈ P ∣ E P ( f i ) = E P ~ ( f i ) , i = 1 , 2 , ⋯   , n } \mathcal{C} \equiv\left\{P \in \mathcal{P} | E_{P}\left(f_{i}\right)=E_{\tilde{P}}\left(f_{i}\right), \quad i=1,2, \cdots, n\right\} C{PPEP(fi)=EP~(fi),i=1,2,,n}定义在条件概率分布 P ( Y ∣ X ) P(Y | X) P(YX)上的条件熵为:
H ( P ) = − ∑ x , y P ~ ( x ) P ( y ∣ x ) log ⁡ P ( y ∣ x ) H(P)=-\sum_{x, y} \tilde{P}(x) P(y | x) \log P(y | x) H(P)=x,yP~(x)P(yx)logP(yx)则模型集合 C \mathcal{C} C中条件熵 H ( P ) H(P) H(P)最大的模型称为最大熵模型。

2.2 最大熵模型的求解

    最大熵模型其实可以转化为约束最优化问题,具体表示如下:
min ⁡ P ∈ C      − H ( P ) = ∑ x , y P ~ ( x ) P ( y ∣ x ) log ⁡ P ( y ∣ x )  s.t.             E P ( f i ) − E P ~ ( f i ) = 0 , i = 1 , 2 , ⋯   , n ∑ y P ( y ∣ x ) = 1 \begin{array}{c}{\min _{P \in C}\space\space\space\space-H(P)=\sum_{x, y} \tilde{P}(x) P(y | x) \log P(y | x)} \\ \\ {\text { s.t. } \space \space\space\space\space\space\space\space\space\space\space E_{P}\left(f_{i}\right)-E_{\tilde{P}}\left(f_{i}\right)=0, \quad i=1,2, \cdots, n} \\ \\ {\sum_{y} P(y | x)=1}\end{array} minPC    H(P)=x,yP~(x)P(yx)logP(yx) s.t.            EP(fi)EP~(fi)=0,i=1,2,,nyP(yx)=1 利用拉格朗日乘子法可以将该问题转化为无约束的对偶问题,具体如下:
max ⁡ w min ⁡ P ∈ C L ( P , w ) ≡ − H ( P ) + w 0 ( 1 − ∑ y P ( y ∣ x ) ) + ∑ i = 1 n w i ( E p ~ ( f i ) − E P ( f i ) ) = ∑ x , y P ~ ( x ) P ( y ∣ x ) log ⁡ P ( y ∣ x ) + w 0 ( 1 − ∑ y P ( y ∣ x ) ) + ∑ i = 1 n w i ( ∑ x , y P ~ ( x , y ) f i ( x , y ) − ∑ x , y P ~ ( x ) P ( y ∣ x ) f i ( x , y ) ) \begin{aligned} \max _{w} \min _{P \in \mathbf{C}} L(P, w) & \equiv-H(P)+w_{0}\left(1-\sum_{y} P(y | x)\right)+\sum_{i=1}^{n} w_{i}\left(E_{\tilde{p}}\left(f_{i}\right)-E_{P}\left(f_{i}\right)\right) \\=& \sum_{x, y} \tilde{P}(x) P(y | x) \log P(y | x)+w_{0}\left(1-\sum_{y} P(y | x)\right) \\ &+\sum_{i=1}^{n} w_{i}\left(\sum_{x, y} \tilde{P}(x, y) f_{i}(x, y)-\sum_{x, y} \tilde{P}(x) P(y | x) f_{i}(x, y)\right) \end{aligned} wmaxPCminL(P,w)=H(P)+w0(1yP(yx))+i=1nwi(Ep~(fi)EP(fi))x,yP~(x)P(yx)logP(yx)+w0(1yP(yx))+i=1nwi(x,yP~(x,y)fi(x,y)x,yP~(x)P(yx)fi(x,y))其中, w 0 , w 1 , w 2 , ⋯   , w n w_{0}, w_{1}, w_{2}, \cdots, w_{n} w0,w1,w2,,wn为拉格朗日乘子。

    接下来,先将拉格朗日乘子固定,然后求解内部的极小化问题 min ⁡ P ∈ C L ( P , w ) \min _{P \in \mathbf{C}} L(P, w) minPCL(P,w),记为:
Ψ ( w ) = min ⁡ P ∈ C L ( P , w ) = L ( P w , w ) \Psi(w)=\min _{P \in \mathbf{C}} L(P, w)=L\left(P_{w}, w\right) Ψ(w)=PCminL(P,w)=L(Pw,w)该函数也称为对偶函数,记其解为:
P w = arg ⁡ min ⁡ P ∈ C L ( P , w ) = P w ( y ∣ x ) P_{w}=\arg \min _{P \in \mathbf{C}} L(P, w)=P_{w}(y | x) Pw=argPCminL(P,w)=Pw(yx)具体地,对 L ( P , w ) L(P, w) L(P,w)计算 P ( y ∣ x ) P(y | x) P(yx)的偏导数:
∂ L ( P , w ) ∂ P ( y ∣ x ) = ∑ x , y P ~ ( x ) ( log ⁡ P ( y ∣ x ) + 1 ) − ∑ y w 0 − ∑ x , y ( P ~ ( x ) ∑ i = 1 n w i f i ( x , y ) ) = ∑ x , y P ~ ( x ) ( log ⁡ P ( y ∣ x ) + 1 − w 0 − ∑ i = 1 n w i f i ( x , y ) ) \begin{aligned} \frac{\partial L(P, w)}{\partial P(y | x)} &=\sum_{x, y} \tilde{P}(x)(\log P(y | x)+1)-\sum_{y} w_{0}-\sum_{x, y}\left(\tilde{P}(x) \sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) \\ &=\sum_{x, y} \tilde{P}(x)\left(\log P(y | x)+1-w_{0}-\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) \end{aligned} P(yx)L(P,w)=x,yP~(x)(logP(yx)+1)yw0x,y(P~(x)i=1nwifi(x,y))=x,yP~(x)(logP(yx)+1w0i=1nwifi(x,y)) P ~ ( x ) > 0 \tilde{P}(x)>0 P~(x)>0的情况下,令其为0可得:
P ( y ∣ x ) = exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) + w 0 − 1 ) = exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) ) exp ⁡ ( 1 − w 0 ) P(y | x)=\exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)+w_{0}-1\right)=\frac{\exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right)}{\exp \left(1-w_{0}\right)} P(yx)=exp(i=1nwifi(x,y)+w01)=exp(1w0)exp(i=1nwifi(x,y))由于 ∑ y P ( y ∣ x ) = 1 \sum_{y} P(y | x)=1 yP(yx)=1,因此有:
P w ( y ∣ x ) = 1 Z w ( x ) exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) ) P_{w}(y | x)=\frac{1}{Z_{w}(x)} \exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) Pw(yx)=Zw(x)1exp(i=1nwifi(x,y))该函数表达式即为最大熵模型,其中,
Z w ( x ) = ∑ y exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) ) Z_{w}(x)=\sum_{y} \exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) Zw(x)=yexp(i=1nwifi(x,y))

    接着,计算外部的极大化问题,即:
max ⁡ w Ψ ( w ) \max _{w} \Psi(w) wmaxΨ(w)对拉格朗日乘子计算偏导数,并令其为0,可得其解为 w ∗ w^{*} w,即:
w ∗ = arg ⁡ max ⁡ w Ψ ( w ) w^{*}=\arg \max _{w} \Psi(w) w=argwmaxΨ(w)最后,将该解代入 P w ( y ∣ x ) P_{w}(y | x) Pw(yx)公式即可得到最终的最大熵模型 P ∗ = P w ∗ = P w ∗ ( y ∣ x ) P^{*}=P_{w^{*}}=P_{w^{*}}(y | x) P=Pw=Pw(yx),因此,最大熵模型其实就是对对偶函数 Ψ ( w ) \Psi(w) Ψ(w)的极大化问题。

2.3 极大似然估计

    对于给定的训练集,条件概率分布 P ( Y ∣ X ) P(Y | X) P(YX)的对数似然函数可以表示为:
L P ~ ( P w ) = log ⁡ ∏ x , y P ( y ∣ x ) P ~ ( x , y ) = ∑ x , y P ~ ( x , y ) log ⁡ P ( y ∣ x ) L_{\tilde{P}}\left(P_{w}\right)=\log \prod_{x, y} P(y | x)^{\tilde{P}(x, y)}=\sum_{x, y} \tilde{P}(x, y) \log P(y | x) LP~(Pw)=logx,yP(yx)P~(x,y)=x,yP~(x,y)logP(yx)当条件概率分布 P ( y ∣ x ) P(y | x) P(yx)是最大熵模型时,有:
L P ^ ( P w ) = ∑ x , y P ~ ( x , y ) log ⁡ P ( y ∣ x ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) − ∑ x , y P ~ ( x , y ) log ⁡ Z w ( x ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) − ∑ x P ~ ( x ) log ⁡ Z w ( x ) \begin{aligned} L_{\hat{P}}\left(P_{w}\right) &=\sum_{x, y} \tilde{P}(x, y) \log P(y | x) \\ &=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)-\sum_{x, y} \tilde{P}(x, y) \log Z_{w}(x) \\ &=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)-\sum_{x} \tilde{P}(x) \log Z_{w}(x) \end{aligned} LP^(Pw)=x,yP~(x,y)logP(yx)=x,yP~(x,y)i=1nwifi(x,y)x,yP~(x,y)logZw(x)=x,yP~(x,y)i=1nwifi(x,y)xP~(x)logZw(x)而通过上一节我们知道,在最后一步最大化对偶函数$ \Psi(w)$时,有:
Ψ ( w ) = ∑ x , y P ~ ( x ) P w ( y ∣ x ) log ⁡ P w ( y ∣ x ) + ∑ i = 1 n w i ( ∑ x , y P ~ ( x , y ) f i ( x , y ) − ∑ x , y P ~ ( x ) P w ( y ∣ x ) f i ( x , y ) ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) + ∑ x , y P ~ ( x ) P w ( y ∣ x ) ( log ⁡ P w ( y ∣ x ) − ∑ i = 1 n w i f i ( x , y ) ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) − ∑ x , y P ~ ( x ) P w ( y ∣ x ) log ⁡ Z w ( x ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) − ∑ x P ~ ( x ) log ⁡ Z w ( x ) \begin{aligned} \Psi(w)=& \sum_{x, y} \tilde{P}(x) P_{w}(y | x) \log P_{w}(y | x) +\sum_{i=1}^{n} w_{i}\left(\sum_{x, y} \tilde{P}(x, y) f_{i}(x, y)-\sum_{x, y} \tilde{P}(x) P_{w}(y | x) f_{i}(x, y)\right) \\ =& \sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)+\sum_{x, y} \tilde{P}(x) P_{w}(y | x)\left(\log P_{w}(y | x)-\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) \\ =& \sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)-\sum_{x, y} \tilde{P}(x) P_{w}(y | x) \log Z_{w}(x) \\ =&\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)-\sum_{x} \tilde{P}(x) \log Z_{w}(x) \end{aligned} Ψ(w)====x,yP~(x)Pw(yx)logPw(yx)+i=1nwi(x,yP~(x,y)fi(x,y)x,yP~(x)Pw(yx)fi(x,y))x,yP~(x,y)i=1nwifi(x,y)+x,yP~(x)Pw(yx)(logPw(yx)i=1nwifi(x,y))x,yP~(x,y)i=1nwifi(x,y)x,yP~(x)Pw(yx)logZw(x)x,yP~(x,y)i=1nwifi(x,y)xP~(x)logZw(x)因此,可以发现:
Ψ ( w ) = L P ~ ( P w ) \Psi(w)=L_{\tilde{P}}\left(P_{w}\right) Ψ(w)=LP~(Pw)这就说明,最大熵模型中对偶函数的极大化问题其实等价于最大熵模型的极大似然估计。因此,最大熵模型可以写成更一般的形式如下:
P w ( y ∣ x ) = 1 Z w ( x ) exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) ) P_{w}(y | x)=\frac{1}{Z_{w}(x)} \exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) Pw(yx)=Zw(x)1exp(i=1nwifi(x,y))其中,
Z w ( x ) = ∑ y exp ⁡ ( ∑ i = 1 n w i f i ( x , y ) ) Z_{w}(x)=\sum_{y} \exp \left(\sum_{i=1}^{n} w_{i} f_{i}(x, y)\right) Zw(x)=yexp(i=1nwifi(x,y))其中, w ∈ R n w \in \mathbf{R}^{n} wRn为权值向量, f i ( x , y ) , i = 1 , 2 , ⋯   , n f_{i}(x, y), i=1,2, \cdots, n fi(x,y),i=1,2,,n为特征函数,因此,对参数进行极大似然估计即可得到最终的最大熵模型。该模型的表达形式其实有点类似于Logistic回归模型,因此也是对数线性函数中的一种。

2.4 最大熵模型的最优化算法

    在计算机中,一般最大熵模型的求解会通过迭代算法来进行求解,因为目标函数是凸函数,因此,很多种最优化的方法都能找到全局最优解,常用的有改进的迭代尺度法、拟牛顿法等。

2.4.1 改进的迭代尺度法

    改进的迭代尺度法(Improved Iterative Scaling,IIS)是一种最大熵模型学习的最优化算法。由前面我们知道,最大熵模型的对数似然函数为:
L ( w ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n w i f i ( x , y ) − ∑ x P ~ ( x ) log ⁡ Z w ( x ) L(w)=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} w_{i} f_{i}(x, y)-\sum_{x} \tilde{P}(x) \log Z_{w}(x) L(w)=x,yP~(x,y)i=1nwifi(x,y)xP~(x)logZw(x)其目标是通过求似然函数的极大值来估计模型的参数 w ^ \hat{w} w^,因此,IIS的想法是:假设最大熵模型当前的参数向量是 w = ( w 1 , w 2 , ⋯   , w n ) T w=\left(w_{1}, w_{2}, \cdots, w_{n}\right)^{\mathrm{T}} w=(w1,w2,,wn)T,我们希望找到一个新的参数向量 w + δ = ( w 1 + δ 1 , w 2 + δ 2 , ⋯   , w n + δ n ) T w+\delta=\left(w_{1}+\delta_{1}, w_{2}+\delta_{2}, \cdots, w_{n}+\delta_{n}\right)^{\mathrm{T}} w+δ=(w1+δ1,w2+δ2,,wn+δn)T,使得模型的对数似然函数值增大,如果能有这样一种参数向量更新的方法 τ : w → w + δ \tau : w \rightarrow w+\delta τ:ww+δ,那么就可以重复使用这一方法,直至找到对数似然函数的最大值。

    对于给定的经验分布 P ~ ( x , y ) \tilde{P}(x, y) P~(x,y),模型参数从 w w w w + δ w+\delta w+δ,对数似然函数的改变量是:
L ( w + δ ) − L ( w ) = ∑ x , y P ~ ( x , y ) log ⁡ P w + δ ( y ∣ x ) − ∑ x , y P ~ ( x , y ) log ⁡ P w ( y ∣ x ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) − ∑ x P ~ ( x ) log ⁡ Z w + δ ( x ) Z w ( x ) \begin{aligned} L(w+\delta)-L(w) &=\sum_{x, y} \tilde{P}(x, y) \log P_{w+\delta}(y | x)-\sum_{x, y} \tilde{P}(x, y) \log P_{w}(y | x) \\ &=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)-\sum_{x} \tilde{P}(x) \log \frac{Z_{w+\delta}(x)}{Z_{w}(x)} \end{aligned} L(w+δ)L(w)=x,yP~(x,y)logPw+δ(yx)x,yP~(x,y)logPw(yx)=x,yP~(x,y)i=1nδifi(x,y)xP~(x)logZw(x)Zw+δ(x)利用不等式:
− log ⁡ α ⩾ 1 − α , α > 0 -\log \alpha \geqslant 1-\alpha, \quad \alpha>0 logα1α,α>0建立对数似然函数改变量的下界:
L ( w + δ ) − L ( w ) ⩾ ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ~ ( x ) Z w + δ ( x ) Z w ( x ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ~ ( x ) ∑ y P w ( y ∣ x ) exp ⁡ ∑ i = 1 n δ i f i ( x , y ) \begin{aligned} L(w+\delta)-L(w) & \geqslant \sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)+1-\sum_{x} \tilde{P}(x) \frac{Z_{w+\delta}(x)}{Z_{w}(x)} \\ &=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)+1-\sum_{x} \tilde{P}(x) \sum_{y} P_{w}(y | x) \exp \sum_{i=1}^{n} \delta_{i} f_{i}(x, y) \end{aligned} L(w+δ)L(w)x,yP~(x,y)i=1nδifi(x,y)+1xP~(x)Zw(x)Zw+δ(x)=x,yP~(x,y)i=1nδifi(x,y)+1xP~(x)yPw(yx)expi=1nδifi(x,y)将右端记为:
A ( δ ∣ w ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ‾ ( x ) ∑ y P w ( y ∣ x ) exp ⁡ ∑ i = 1 n δ i f i ( x , y ) A(\delta | w)=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{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(δw)=x,yP~(x,y)i=1nδifi(x,y)+1xP(x)yPw(yx)expi=1nδifi(x,y)因此有:
L ( w + δ ) − L ( w ) ⩾ A ( δ ∣ w ) L(w+\delta)-L(w) \geqslant A(\delta | w) L(w+δ)L(w)A(δw) A ( δ ∣ w ) A(\delta | w) A(δw)为对数似然函数改变量的一个下界。如果能找到适当的 δ \delta δ使得下界 A ( δ ∣ w ) A(\delta | w) A(δw)提高,那么对数似然函数也会提高,然而,函数 A ( δ ∣ w ) A(\delta | w) A(δw)中的 δ \delta δ是一个向量,含有多个变量,不易同时优化,因此,IIS试图一次只优化其中一个变量 δ i \delta_i δi,而固定其他变量 δ i , i ≠ j \delta_{i}, i \neq j δi,i̸=j。但是直接对 A ( δ ∣ w ) A(\delta | w) A(δw)求极大值得到 δ i \delta_i δi的估计还是比较麻烦,因此,IIS进一步降低下界 A ( δ ∣ w ) A(\boldsymbol{\delta} | w) A(δw),具体地,IIS引进了一个量 f # ( x , y ) f^{\#}(x, y) f#(x,y)
f # ( x , y ) = ∑ i f i ( x , y ) f^{\#}(x, y)=\sum_{i} f_{i}(x, y) f#(x,y)=ifi(x,y) f # ( x , y ) f^{\#}(x, y) f#(x,y)表示所有特征在 ( x , y ) (x, y) (x,y)出现的次数,因此, A ( δ ∣ w ) A(\boldsymbol{\delta} | w) A(δw)可以进一步改写为:
A ( δ ∣ w ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ~ ( x ) ∑ y P w ( y ∣ x ) exp ⁡ ( f # ( x , y ) ∑ i = 1 n δ i f i ( x , y ) f # ( x , y ) ) A(\boldsymbol{\delta} | w)=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)+1-\sum_{x} \tilde{P}(x) \sum_{y} P_{w}(y | x) \exp \left(f^{\#}(x, y) \sum_{i=1}^{n} \frac{\delta_{i} f_{i}(x, y)}{f^{\#}(x, y)}\right) A(δw)=x,yP~(x,y)i=1nδifi(x,y)+1xP~(x)yPw(yx)exp(f#(x,y)i=1nf#(x,y)δifi(x,y))利用指数函数的凸性以及Jensen不等式,可得:
exp ⁡ ( ∑ i = 1 n f i ( x , y ) f # ( x , y ) δ i f # ( x , y ) ) ⩽ ∑ i = 1 n f i ( x , y ) f # ( x , y ) exp ⁡ ( δ i f # ( x , y ) ) \exp \left(\sum_{i=1}^{n} \frac{f_{i}(x, y)}{f^{\#}(x, y)} \delta_{i} f^{\#}(x, y)\right) \leqslant \sum_{i=1}^{n} \frac{f_{i}(x, y)}{f^{\#}(x, y)} \exp \left(\delta_{i} f^{\#}(x, y)\right) exp(i=1nf#(x,y)fi(x,y)δif#(x,y))i=1nf#(x,y)fi(x,y)exp(δif#(x,y))因此有:
A ( δ ∣ w ) ⩾ ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ~ ( x ) ∑ y P w ( y ∣ x ) ∑ i = 1 n ( f i ( x , y ) f # ( x , y ) ) exp ⁡ ( δ i f # ( x , y ) ) A(\delta | w) \geqslant \sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)+1-\sum_{x} \tilde{P}(x) \sum_{y} P_{w}(y | x) \sum_{i=1}^{n}\left(\frac{f_{i}(x, y)}{f^{\#}(x, y)}\right) \exp \left(\delta_{i} f^{\#}(x, y)\right) A(δw)x,yP~(x,y)i=1nδifi(x,y)+1xP~(x)yPw(yx)i=1n(f#(x,y)fi(x,y))exp(δif#(x,y))记不等式右端为:
B ( δ ∣ w ) = ∑ x , y P ~ ( x , y ) ∑ i = 1 n δ i f i ( x , y ) + 1 − ∑ x P ~ ( x ) ∑ y P w ( y ∣ x ) ∑ i = 1 n ( f i ( x , y ) f # ( x , y ) ) exp ⁡ ( δ i f # ( x , y ) ) B(\delta | w)=\sum_{x, y} \tilde{P}(x, y) \sum_{i=1}^{n} \delta_{i} f_{i}(x, y)+1-\sum_{x} \tilde{P}(x) \sum_{y} P_{w}(y | x) \sum_{i=1}^{n}\left(\frac{f_{i}(x, y)}{f^{\#}(x, y)}\right) \exp \left(\delta_{i} f^{\#}(x, y)\right) B(δw)=x,yP~(x,y)i=1nδifi(x,y)+1xP~(x)yPw(yx)i=1n(f#(x,y)fi(x,y))exp(δif#(x,y))因此有:
L ( w + δ ) − L ( w ) ⩾ B ( δ ∣ w ) L(w+\delta)-L(w) \geqslant B(\delta | w) L(w+δ)L(w)B(δw)这样一来,对 B ( δ ∣ w ) B(\delta | w) B(δw) δ i \delta_{i} δi的偏导数,有:
∂ B ( δ ∣ w ) ∂ δ i = ∑ x , y P ~ ( x , y ) f i ( x , y ) − ∑ x P ~ ( x ) ∑ y P w ( y ∣ x ) f i ( x , y ) exp ⁡ ( δ i f # ( x , y ) ) \frac{\partial B(\delta | w)}{\partial \delta_{i}}=\sum_{x, y} \tilde{P}(x, y) f_{i}(x, y)-\sum_{x} \tilde{P}(x) \sum_{y} P_{w}(y | x) f_{i}(x, y) \exp \left(\delta_{i} f^{\#}(x, y)\right) δiB(δw)=x,yP~(x,y)fi(x,y)xP~(x)yPw(yx)fi(x,y)exp(δif#(x,y))令其为0可得:
∑ x , y P ~ ( x ) P w ( y ∣ x ) f i ( x , y ) exp ⁡ ( δ i f # ( x , y ) ) = E p ~ ( f i ) \sum_{x, y} \tilde{P}(x) P_{w}(y | x) f_{i}(x, y) \exp \left(\delta_{i} f^{\#}(x, y)\right)=E_{\tilde{p}}\left(f_{i}\right) x,yP~(x)Pw(yx)fi(x,y)exp(δif#(x,y))=Ep~(fi)这样一来,依次对 δ i \delta_{i} δi求解方程可以求出 δ \delta δ

    因此,IIS算法可以总结如下:

  1. 输入:特征函数 f 1 , f 2 , ⋯   , f n f_{1}, f_{2}, \cdots, f_{n} f1,f2,,fn,经验分布 P ~ ( X , Y ) \tilde{P}(X, Y) P~(X,Y),模型 P w ( y ∣ x ) P_{w}(y | x) Pw(yx)
  2. 输出:最优参数值 w i ∗ w_{i}^{*} wi,最优模型 P w ∗ P_{w^{*}} Pw
  3. 对所有的 i ∈ { 1 , 2 , ⋯   , n } i \in\{1,2, \cdots, n\} i{1,2,,n},取初值 w i = 0 w_{i}=0 wi=0
  4. 对每一 i ∈ { 1 , 2 , ⋯   , n } i \in\{1,2, \cdots, n\} i{1,2,,n}
    (a)令 δ i \delta_{i} δi是方程:
    ∑ x , y P ~ ( x ) P ( y ∣ x ) f i ( x , y ) exp ⁡ ( δ i f # ( x , y ) ) = E P ~ ( f t ) \sum_{x, y} \tilde{P}(x) P(y | x) f_{i}(x, y) \exp \left(\delta_{i} f^{\#}(x, y)\right)=E_{\tilde{P}}\left(f_{t}\right) x,yP~(x)P(yx)fi(x,y)exp(δif#(x,y))=EP~(ft)的解,其中, f ∗ ( x , y ) = ∑ i = 1 n f i ( x , y ) f^{*}(x, y)=\sum_{i=1}^{n} f_{i}(x, y) f(x,y)=i=1nfi(x,y)
    (b)更新 w i w_i wi值: w i ← w i + δ i w_{i} \leftarrow w_{i}+\delta_{i} wiwi+δi
  5. 如果不是所有 w i w_i wi都收敛,重复步骤4

    这里比较关键的一步是求解 δ i \delta_{i} δi,如果 f # ( x , y ) f^{\#}(x, y) f#(x,y)是常数,即对任何 x , y x, y x,y,有 f # ( x , y ) = M f^{\#}(x, y)=M f#(x,y)=M,则 δ i \delta_{i} δi可以显式表达为:
δ i = 1 M log ⁡ E p ~ ( f i ) E p ( f i ) \delta_{i}=\frac{1}{M} \log \frac{E_{\tilde{p}}\left(f_{i}\right)}{E_{p}\left(f_{i}\right)} δi=M1logEp(fi)Ep~(fi)否则,就得通过牛顿法进行求解,以 g ( δ i ) = 0 g\left(\delta_{i}\right)=0 g(δi)=0表示步骤4中的方程,则牛顿法通过迭代求得 δ i ∗ \delta_{i}^{*} δi
δ i ( k + 1 ) = δ i ( k ) − g ( δ i ( k ) ) g ′ ( δ i ( k ) ) \delta_{i}^{(k+1)}=\delta_{i}^{(k)}-\frac{g\left(\delta_{i}^{(k)}\right)}{g^{\prime}\left(\delta_{i}^{(k)}\right)} δi(k+1)=δi(k)g(δi(k))g(δi(k))

3. 最大熵模型的python实现

  采用python对最大熵模型进行实现,模型的优化算法采用的是IIS算法,具体的代码如下:

import math
import numpy as np


class MaxEntropy(object):
    def __init__(self, eps=0.005, maxiter=1000):
        self._Y = set()  # 标签集合,相当去去重后的y
        self._numXY = {}  # key为(x,y),value为出现次数
        self._N = 0  # 样本数
        self._Ep_ = []  # 样本分布的特征期望值
        self._xyID = {}  # key记录(x,y),value记录id号
        self._n = 0  # 特征键值(x,y)的个数
        self._C = 0  # 最大特征数
        self._IDxy = {}  # key为id号,value为对应的(x,y)
        self._w = []
        self._eps = eps  # 收敛条件
        self._lastw = []  # 上一次w参数值
        self.maxiter = maxiter

    def _Zx(self, X):
        """计算每个Z(x)值"""
        zx = 0
        for y in self._Y:
            ss = 0
            for x in X:
                if (x, y) in self._numXY:
                    ss += self._w[self._xyID[(x, y)]]
            zx += math.exp(ss)
        return zx

    def _model_pyx(self, y, X):
        """计算每个P(y|x)"""
        zx = self._Zx(X)
        ss = 0
        for x in X:
            if (x, y) in self._numXY:
                ss += self._w[self._xyID[(x, y)]]
        pyx = math.exp(ss) / zx
        return pyx

    def _model_ep(self, X, index):
        """计算特征函数fi关于模型的期望"""
        x, y = self._IDxy[index]
        ep = 0
        for sample in X:
            if x not in sample:
                continue
            pyx = self._model_pyx(y, sample)
            ep += pyx / self._N
        return ep

    def _convergence(self):
        """判断是否全部收敛"""
        for last, now in zip(self._lastw, self._w):
            if abs(last - now) >= self._eps:
                return False
        return True

    def predict(self, X):
        """计算预测概率"""
        result = []
        X = np.asarray(X).tolist()
        for x in X:
            Z = self._Zx(x)
            logit = {}
            for y in self._Y:
                ss = 0
                for xi in x:
                    if (xi, y) in self._numXY:
                        ss += self._w[self._xyID[(xi, y)]]
                pyx = math.exp(ss) / Z
                logit[y] = pyx
            logit = sorted(logit.items(), key=lambda x: x[1], reverse=True)
            result.append(logit[0][0])
        return result

    def fit(self, X, Y):
        """训练模型"""
        X = np.asarray(X).tolist()
        Y = np.asarray(Y).tolist()
        for x, y in zip(X, Y):
            # 集合中y若已存在则会自动忽略
            self._Y.add(y)
            for xi in x:
                if (xi, y) in self._numXY:
                    self._numXY[(xi, y)] += 1
                else:
                    self._numXY[(xi, y)] = 1

        self._N = len(X)
        self._n = len(self._numXY)
        self._C = max([len(sample) - 1 for sample in X])
        self._w = [0] * self._n
        self._lastw = self._w[:]

        # 计算特征函数fi关于经验分布的期望
        self._Ep_ = [0] * self._n
        for i, xy in enumerate(self._numXY):
            self._Ep_[i] = self._numXY[xy] / self._N
            self._xyID[xy] = i
            self._IDxy[i] = xy

        # 更新模型的参数
        for loop in range(self.maxiter):
            print("iter:%d" % loop)
            self._lastw = self._w[:]
            for i in range(self._n):
                ep = self._model_ep(X, i)  # 计算第i个特征的模型期望
                self._w[i] += math.log(self._Ep_[i] / ep) / self._C  # 更新参数
            print("w:", self._w)
            if self._convergence():  # 判断是否收敛
                break

    有关整个项目的完整代码参考本人的github链接:

  • github链接:https://github.com/lch123456/machine-learning

4. 总结

    最后总结一下:

  • 最大熵模型因为涉及到联合概率的经验分布计算,因此,比较适用于特征变量和目标变量都是离散的情况。
  • 当特征变量维度比较大,数据量比较多时,此时特征函数可能会非常多,因此,模型的训练速度可能会相对比较慢。

你可能感兴趣的:(机器学习)