前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最大熵模型与GIS ,IIS算法

最大熵模型与GIS ,IIS算法

作者头像
用户1147447
发布2019-05-26 09:46:54
1.6K0
发布2019-05-26 09:46:54
举报
文章被收录于专栏:机器学习入门机器学习入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434761

最大熵模型与GIS ,IIS算法

前言

在学习最大熵模型时,令我最大的困惑点在于它一些公式的物理含义是什么!但发现,它在概率模型当中,除了一个最宏观的假设【无知信息最大熵】之外,没有发现任何有趣的现象。但更加神奇的一点在于,它的【特征函数】在某些特定的取值情况下,能够回归到逻辑斯蒂回归模型的一般表现形式上,这无形之中让我对最大熵的解产生了无比的好奇,似乎又能联系到一些什么。

学习提醒

本文重点在于自己对公式的理解,是我个人的学习笔记。是在我世界观中所形成的最大熵模型,因此由于知识局限性,如有不当,请指正。知识准备:需了解最大熵的概念、模型最优化方法、基本高等数学。

最大熵进阶一

在《统计学习方法》中第六章第二节中,关于最大熵模型的阐述已经很明确了,此处不在重复,有兴趣的可以参考书本P80页的内容。在这里直接写出最大熵模型的核心公式。

假设随机变量X的概率分布是P(X)P(X),则其熵是:

H(P)=−∑xP(x)logP(x)

H(P) = -\sum_{x} P(x)\log P(x)

熵满足下列不等式:

0≤H(P)≤log|X|

0 \le H(P) \le \log \vert X \vert

式中,|X|\vert X \vert是X的取值个数,当前仅当X的分布是均匀分布时右边的等号成立。这就是说,当X服从均匀分布时,熵最大。

熵最大其实是现实生活中很常见的物理现象,原本是用来描述某一现象的不确定程度,但在此处却被用来作为【无知信息】的假设。对于熵的理解,可以参看【知乎-能否尽量通俗地解释什么叫做熵?】,以及纪录片【宇宙的奇迹:时间之箭

直观地,最大熵原理认为要选择的概率模型首先必须满足已有的事实,即约束条件。在没有更多信息的情况下,那些不确定的部分是“等可能的”。最大熵原理通过熵的最大化来表示等可能性。“等可能”不容易操作,而熵则是一个可优化的数值指标。

这段话告诉我们一个什么道理?我们可以根据【已有信息】来明确某些现象的【和概率】,从而把收集到的数据分成【符合特殊条件的现象】和【不符合特殊条件的现象】,建立了约束条件之后,我们根据【无知信息最大化熵】的假设来分别对分类现象进行【等可能处理】,进一步得到所有现象出现的概率,从而能够用于预测分类。

书中例子:

假设随机变量X有5个取值{A,B,C,D,E},要估计取各个值的概率P(A),P(B),P(C),P(D),P(E).P(A),P(B),P(C),P(D),P(E). 现在满足约束条件: P(A)+P(B)=310 P(A)+P(B) = \frac{3}{10} P(A)+P(B)+P(C)+P(D)+P(E)=1 P(A)+P(B)+P(C)+P(D)+P(E) = 1

满足这两个约束条件的概率分布仍然有无穷多个。在缺少其他信息的情况下,可以认为A与B是等概率的,C,D和E是等概率的,于是,

P(A)=P(B)=320

P(A) = P(B) = \frac{3}{20}

P(C)=P(D)=P(E)=730

P(C)=P(D)=P(E)= \frac{7}{30}

最大熵的原理已经阐述完毕了,A和B的和概率即为我们的已知信息,有了已知信息,自然就有了另外一部分的未知信息,但不管怎么样,我们都让已知信息中和未知信息中各类出现的概率相同,这就是我们的最大熵等可能性原理。

最大熵进阶二

咱们再进一步!上述问题的求解是相当简单的,但有想过这两个约束条件是怎么得来的嘛?或者说如何从数据中抽取出来?这就需要一定的数学基础了。

好了,我们开始机器学习中最大熵模型的特征提取原理和预测分类原理的学习。既然是从【已有数据】中获取【约束信息】,那么我们首先定义我们的数据集样本。

假设分类模型是一个条件概率分布P(Y|X),X∈X⊆RnP(Y | X),X \in \mathcal X \subseteq R^n表示输入,Y∈YY \in \mathcal Y表示输出,X和Y \mathcal X 和 \mathcal Y分别是输入和输出的集合。这个模型表示的是对于给定的输入X,以条件概率P(Y|X)输出YP(Y | X)输出Y。

给定一个训练数据集

T={(x1,y1),(x2,y2),...,(xN,yN)}

T = {(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}

学习的目标是用最大熵原理选择最好的分类模型。

首先考虑模型应该满足的条件。给定训练数据集,可以确定联合分布P(X,Y)P(X,Y)的经验分布和边缘分布P(X)P(X)的经验分布,分别以P^(X,Y)和P^(X)\hat P(X,Y)和\hat P(X)表示。这里,

P^(X=x,Y=y)=v(X=x,Y=y)N

\hat P(X = x, Y = y) = \frac{v(X = x, Y = y)}{N}

P^(X=x)=v(X=x)N

\hat P(X = x) = \frac{v(X = x)}{N}

其中,v(X=x,Y=y)v(X = x, Y = y)表示训练数据中样本(x,y)(x,y)出现的频数,v(X=x)v(X = x)表示训练数据中输入xx出现的频数,NN表示训练样本容量。

从上述数据集中可以看出,如果随机变量x和yx和y分别代表的是某个样例的xn和ynx_n和y_n,那么它实际是没有做任何特征抽取工作的。比如说,在给定的数据样本中,输入集合存在唯一性,那么不存在某两个数据样例中的xi=xjx_i = x_j,由此极端情况下可以推得:

P^(X=x1,Y=y1)=1N

\hat P(X = x_1, Y = y_1) = \frac{1}{N}

∑X≠x1,Y≠y1P^(X≠x1,Y≠y1)=N−1N

\sum_{X \neq x_1,Y \neq y_1}\hat P(X \neq x_1, Y \neq y_1) = \frac{N-1}{N}

那么所导致的结果就是对任何数据,P(X=xj,Y=yj)=1NP(X = x_j,Y = y_j) = \frac{1}{N},所有唯一现象出现的概率是等可能的。这的确是最大熵的等可能性理论中最特殊的情况,那如果在给定数据样例中,有相同特征时,会出现什么情况呢?现在假设存在某两个或几个样例,随机变量X和YX和Y,均为xj和yjx_j和y_j,由此得:

P^(X=xj,Y=yj)=#(xj,yj)N

\hat P(X = x_j, Y = y_j) = \frac{ #(x_j,y_j)}{N}

∑X≠xj,Y≠yjP^(X≠xj,Y≠yj)=N−#(xj,yj)N

\sum_{X \neq x_j,Y \neq y_j}\hat P(X \neq x_j, Y \neq y_j) = \frac{N-# (x_j,y_j)}{N}

对于从数据中抽出的【已知信息】为当样例中出现xj和yjx_j和y_j时,该现象的概率为#(xj,yj)N\frac{ #(x_j,y_j)}{N},其余情况均为1N\frac{1}{N}(最大熵模型等可能性)。所以对数据的预测也很简单,给定输入xix_i,与所有Y=yY = y匹配,找寻到P^(X=xi,Y=yj)=#(xi,yj)N\hat P(X = x_i, Y = y_j) = \frac{ #(x_i,y_j)}{N}中的yjy_j,即为我们的输出预测值。

看到这里我就想了,我去,这不就是求某个输入xx与某个输出yy在给定数据中出现次数最多情况下的yjy_j么,这模型也太简单了吧,预测能力能上去么?显然这种预测模型是相当低级的,所以最大熵模型引入了一个【特征函数】的概念,有了这东西,这泛化能力就上去了。咱们进一步,看书中关于特征函数的介绍。

用特征函数f(x,y)f(x,y)描述输入x和输出y之间的某一个事实。其定义如下:

f(x,y)={1, x与y满足某一事实0, 否则

f(x,y) = \begin{cases} 1,\space x与y满足某一事实\ 0,\space 否则\ \end{cases}

为什么引入了特征函数后,模型就有了很强的泛化能力?它对数据集做了什么样的【特征提取】导致它的预测能力显著上升?或者数学上对最大熵模型做了哪些约束?

这里就需要明确特征函数f(x,y)f(x,y)中(x,y)(x,y)的含义是什么,这点非常关键。可以参看一篇知乎回答【关于最大熵模型的严重困惑:为什么没有解析解?

拿情感分类举个栗子:

x={′I′,′am′,′not′,′happy′},y=−1

x = {'I','am','not','happy'},y = -1

如“关系”仅仅是相等,只能建立这样的特征:

f1(x,y)={1, if x={′I′,′am′,′not′,′happy′} and y=−10, others

f_1(x,y) = \begin{cases} 1, \space if \space x ={'I','am','not','happy'} \space and \space y = -1\ 0,\space others \ \end{cases}

很显然,把一个句子固定死了,特征泛化能力不行啊。

但事实上我们可以:

f2(x,y)={1, if x2=′not′ and x3=′happy′ and y=−10, others

f_2(x,y ) = \begin{cases} 1, \space if \space x2 = 'not' \space and \space x3 = 'happy' \space and \space y = -1\ 0,\space others \ \end{cases}

也可以:

f3(x,y)={1, if x2=′not′ and x3∈positive_words and y=−10, others

f_3(x,y ) = \begin{cases} 1, \space if \space x2 = 'not' \space and \space x3 \in positive\_words \space and \space y = -1\ 0,\space others \ \end{cases}

相比f1(x,y)f_1(x,y),更好的特征应该是f3(x,y)f_3(x,y)。你也可以把上面的特征都用上。让大量特征参与进来,也正是对数线性模型的妙处。这时就需要数值计算了。

所以说,在给定数据集中,可以出现大量样例(xi,yj)(x_i,y_j)符合特征函数f(x,y)f(x,y)的情况。假定只给定了一个特征函数,那么我们可以把数据样例分类成两类【符合特征函数的样例】和【不符合特征函数的样例】,由此得:

∑f(x,y)=1P(X=xi,Y=yj)=#f(x,y)N

\sum_{f(x,y) = 1}P(X = x_i, Y = y_j) = \frac{#f(x,y)}{N}

∑f(x,y)≠1P(X=xk,Y=yl)=N−#f(x,y)N

\sum_{f(x,y) \neq 1}P(X = x_k, Y = y_l) = \frac{N-#f(x,y)}{N}

为了更好地描述经验分布与特征函数的关系,书中用Ep^(f)E_{\hat p}(f)表示:

Ep^(f)=∑x,yP^(x,y)f(x,y)

E_{\hat p}(f) = \sum_{x,y}\hat P(x,y)f(x,y)

特征函数f(x,y)f(x,y)关于模型P(Y|X)P(Y | X)与经验分布P^(X)\hat P(X)的期望值,用Ep(f)E_p(f)表示:

Ep(f)=∑x,yP^(x)P(y|x)f(x,y)

E_{p}(f) = \sum_{x,y}\hat P(x)P(y|x)f(x,y)

如果模型能够获取训练数据中的信息,那么就可以假设这两个期望值相等,即:

Ep(f)=Ep^(f)

E_p(f) = E_{\hat p}(f)

∑x,yP^(x,y)f(x,y)=∑x,yP^(x)P(y|x)f(x,y)

\sum_{x,y}\hat P(x,y)f(x,y) = \sum_{x,y}\hat P(x)P(y|x)f(x,y)

我们将上式作为模型学习的约束条件。假如有nn个特征函数fi(x,y),i=1,2,...,nf_i(x,y),i=1,2,...,n,那么就有nn个约束条件。

说白了,无非是用数据中的【经验信息】去拟合系统所假设的模型,但它并没有拿数据去拟合模型,而是用数据生成约束条件,最大熵模型根据约束条件求似然方程的解,从而估计出模型的参数。

定义:

最大熵模型 假设满足所有约束条件的模型集合为: C≡{P∈P|Ep(fi)=Ep^(fi),i=1,2,...,n} \mathcal C \equiv{P \in \mathcal P | E_{p}(f_i) = E_{\hat p}(f_i),i = 1,2,...,n} 定义在条件概率分布P(Y|X)P(Y | X)上的条件熵为: H(P)=−∑x,yP^(x)P(y|x)logP(y|x) H(P) = - \sum_{x,y}\hat P(x)P(y | x) \log P(y | x) 则模型集合C\mathcal C中条件熵H(P)H(P)最大的模型成为最大熵模型。式中的对数为自然对数。

这是最大熵模型的终极表达式,个人觉得最大的亮点在于对特征函数的使用。它使得最大熵模型有了泛化能力,就好像一个筛子一样,不断地在数据集中划分为【已知信息】和【未知信息】两类,一个特征对应于一个筛子,当筛子足够多时,给定某个输入xx时,所能筛选出的yy将越精准。

最大熵进阶三

最大熵的数学模型已经介绍完毕了,接下来是对其求极大值的推导过程,从理论上来实际操作一把。它的学习过程就是求解最大熵模型的过程,最大熵模型的学习可以形式化为约束最优化问题。

对于给定的训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)}T = {(x_1,y_1),(x_2,y_2),...,(x_n,y_n)}以及特征函数fi(x,y),i=1,2,...,n,f_i(x,y),i = 1,2,...,n,最大熵模型的学习等价于约束最优化问题:

maxP∈C H(P)=−∑x,yP^(x)P(y|x)logP(y|x)

\max_{P \in \mathcal C} \space H(P) = -\sum_{x,y}\hat P(x)P(y | x)\log P(y | x)

s.t.Ep(fi)=Ep^(fi),i=1,2,...,n

s.t. E_p(f_i) = E_{\hat p}(f_i),i = 1,2,...,n

∑yP(y|x)=1

\sum_yP(y | x) = 1

按照最优化的习惯,将求最大值问题改写为等价的求最小值问题:

minP∈C −H(P)=∑x,yP^(x)P(y|x)logP(y|x)

\min_{P \in \mathcal C} \space -H(P) = \sum_{x,y}\hat P(x)P(y | x)\log P(y | x)

s.t.Ep(fi)=Ep^(fi),i=1,2,...,n

s.t. E_p(f_i) = E_{\hat p}(f_i),i = 1,2,...,n

∑yP(y|x)=1

\sum_yP(y | x) = 1

这里,将约束最优化的原始问题转换为无约束最优化的对偶问题。通过求解对偶问题求解原始问题。

首先,引进拉格朗日乘子w0,w1,w2,...,wnw_0,w_1,w_2,...,w_n,定义拉格朗日函数L(P,w)L(P,w):

L(P,w)≡−H(P)+w0(1−∑yP(y|x))+∑i=1nwi(Ep^(fi)−Ep(fi))=∑x,yP^(x)P(y|x)logP(y|x)+w0(1−∑yP(y|x))+∑i=1nwi(∑x,yP^(x,y)fi(x,y)−∑x,yP^(x)P(y|x)fi(x,y))

L(P,w) \equiv -H(P) +w_0(1-\sum_yP(y | x))+ \sum_{i=1}^n w_i(E_{\hat p}(f_i)-E_p(f_i))\ =\sum_{x,y}\hat P(x) P(y | x)\log P(y | x) + w_0(1-\sum_yP(y|x))\ +\sum_{i=1}^nw_i(\sum_{x,y}\hat P(x,y)f_i(x,y)-\sum_{x,y}\hat P(x) P(y|x)f_i(x,y))

最优化的原始问题是

minP∈CmaxwL(P,w)

\min_{P \in \mathcal C}\max_w L(P,w)

对偶问题是

maxwminP∈CL(P,w)

\max_w \min_{P \in \mathcal C}L(P,w)

首先,求解对偶问题内部的极小化问题minP∈CL(P,w).minP∈CL(P,w)\min_{P \in \mathcal C}L(P,w).\min_{P\in\mathcal C}L(P,w)是ww的函数,将其记作:

Ψ(w)=minP∈CL(P,w)=L(Pw,w)

\Psi(w) =\min_{P \in \mathcal C}L(P,w) = L(P_w,w)

Ψ(w)\Psi(w)称为对偶函数。同时,将其解记作

Pw=argminP∈CL(P,w)=Pw(y|x)

P_w =arg \min_{P \in \mathcal C}L(P,w) = P_w(y|x)

具体地,求L(P,w)L(P,w)对P(y|x)P(y | x)的偏导数,再另其片倒数为0时,解得:

P(y|x)=exp(∑ni=1wifi(x,y))exp(1−w0)

P(y | x) = \frac {exp(\sum_{i=1}^nw_if_i(x,y))}{exp(1-w_0)}

由于∑yP(y|x)=1\sum_{y} P(y | x) = 1,得

Pw(y|x)=1Zw(x)exp(∑i=1nwifi(x,y))

P_w(y | x) = \frac{1}{Z_w(x)}exp(\sum_{i=1}^nw_if_i(x,y))

Zw(x)=∑yexp(∑i=1nwifi(x,y))

Z_w(x) = \sum_yexp(\sum_{i=1}^nw_if_i(x,y))

之后,求解对偶问题外部的极大化问题

maxwΨ(w)

\max_{w} \Psi(w)

将其解记为w∗w^*,即

w∗=argmaxwΨ(w)

w^* = arg \max_w \Psi(w)

这就是说,可以应用最优化算法求对偶函数Ψ(w)\Psi(w)的极大化,得到w∗w^*,用来表示P∗∈CP^* \in \mathcal C。这里,P∗=Pw∗=Pw∗(y|x)P^* = P_{w^*} =P_{w^*}(y|x) 是学习到的最优模型(最大熵模型)。也就是说,最大熵模型的学习归结为对偶函数Ψ(w)\Psi(w)的极大化。

Code Time

模型学习的最优算法GIS

以下内容摘自博文【码农场-逻辑斯谛回归与最大熵模型

常用的方法有改进的迭代尺度法、梯度下降法、牛顿法或拟牛顿法,牛顿法或拟牛顿法一般收敛速度更快。

GIS的算法流程如下:

1.初始化所有wiw_i为任意值,一般可以设置为0,即: w(0)i=0,i∈{1,2,3,...,n} w_i^{(0)} = 0, i \in {1,2,3,...,n} 其中ww的上标(t)表示第t轮迭代,下标ii表示第ii个特征,n是特征总数。 2.重复下面的权值更新直至收敛: w(t+1)i=w(t)i+1ClogEp^(fi)Ep(n)(fi),i∈{1,2,...,n} w_i^{(t+1)} = w_i^{(t)} + \frac{1}{C} \log \frac{E_{\hat p}(f_i)}{E_{p^{(n)}}(f_i)},i \in {1,2,...,n} 收敛的判断依据可以是wiw_i前后两次的差足够小。其中C一般取所有样本数据中最大的特征数量。

最原始的最大熵模型的训练方法是一种称为通用迭代算法 GIS(generalized iterative scaling) 的迭代 算法。GIS 的原理并不复杂,大致可以概括为以下几个步骤:

  1. 假定第零次迭代的初始模型为等概率的均匀分布。
  2. 用第 N 次迭代的模型来估算每种信息特征在训练数据中的分布,如果超过了实际的,就把相应的模型参数变小;否则,将它们便大。
  3. 重复步骤 2 直到收敛。

一份简明的Python实现:

代码语言:javascript
复制
import sys
import math
from collections import defaultdict

class MaxEnt:
    def __init__(self):
        self._samples = []
        self._Y = set([]) # 标签集合,相当于去重之后的y
        self._numXY = defaultdict(int) # key是(xi,yi)对,value是count(xi,yi)
        self._N = 0 #样本数量
        self._n = 0 #特征对(xi,yi)总数量
        self._xyID = {} # 对(x,y)对做的顺序编号(ID),key是(xi,yi)对,value是ID
        self._C = 0 # 样本最大的特征数量,用于求参数的迭代,见IIS原理说明
        self._ep_ = [] # 样本分布的特征期望值
        self._ep = [] # 模型分布的特征期望值
        self._w = [] # 对应n个特征的权值
        self._lastw = [] # 上一轮迭代的权值
        self._EPS = 0.01 # 判断是否收敛的阈值

    def load_data(self,filename):
        for line in open(filename,"r"):
            sample = line.strip().split("\t")
            if len(sample) < 2: #至少:标签+一个特征
                continue
            y = sample[0]
            X = sample[1:]
            self._samples.append(sample)
            self._Y.add(y)
            for x in set(X):
                self._numXY[(x,y)] += 1

    def _initparams(self):
        self._N = len(self._samples)
        self._n = len(self._numXY) # 没有做任何特征提取操作,直接操作特征
        self._C = max([len(sample) -1 for sample in self._samples])
        self._w = [0.0] * self._n
        self._lastw = self._w[:]
        self._sample_ep()

    def _convergence(self):
        for w,lw in zip(self._w,self._lastw):
            if math.fabs(w-lw) >= self._EPS:
                return False
        return True

    def _sample_ep(self):
        self._ep_ = [0.0] * self._n
        for i,xy in enumerate(self._numXY):
            self._ep_[i] = self._numXY[xy] * 1.0 / self._N
            self._xyID[xy] = i

    def _zx(self,X):
        # calculate Z(x)
        ZX = 0.0
        for y in self._Y:
            sum = 0.0
            for x in X:
                if(x,y) in self._numXY:
                    sum += self._w[self._xyID[(x,y)]]
            ZX += math.exp(sum)
        return ZX
    def _pyx(self,X):
        ZX = self._zx(X)
        results = []
        for y in self._Y:
            sum = 0.0
            for x in X:
                if(x,y) in self._numXY:
                    sum += self._w[self._xyID[(x,y)]]
            pyx = 1.0 / ZX * math.exp(sum)
            results.append((y,pyx))
        return results
    def _model_ep(self):
        self._ep = [0.0] * self._n
        for sample in self._samples:
            X = sample[1:]
            pyx = self._pyx(X)
            for y,p in pyx:
                for x in X:
                    if(x,y) in self._numXY:
                        self._ep[self._xyID[(x,y)]] += p * 1.0 / self._N
    def train(self,maxiter = 1000):
        self._initparams()
        for i in range(0,maxiter):
            print("Iter:%d...."%i)
            self._lastw = self._w[:]
            self._model_ep()

            for i,w in enumerate(self._w):
                self._w[i] += 1.0 / self._C * math.log(self._ep_[i] / self._ep[i])
            print(self._w)

            if self._convergence():
                break
    def predict(self,inp):
        X = inp.strip().split("\t")
        prob = self._pyx(X)
        return prob

if __name__ == "__main__":
    maxent = MaxEnt()
    maxent.load_data('data.txt')
    maxent.train()
    print (maxent.predict("sunny\thot\thigh\tFALSE"))
    print (maxent.predict("overcast\thot\thigh\tFALSE"))
    print (maxent.predict("sunny\tcool\thigh\tTRUE"))
    sys.exit(0)

其中测试数据为:

代码语言:javascript
复制
no  sunny   hot high    FALSE
no  sunny   hot high    TRUE
yes overcast    hot high    FALSE
yes rainy   mild    high    FALSE
yes rainy   cool    normal  FALSE
no  rainy   cool    normal  TRUE
yes overcast    cool    normal  TRUE
no  sunny   mild    high    FALSE
yes sunny   cool    normal  FALSE
yes rainy   mild    normal  FALSE
yes sunny   mild    normal  TRUE
yes overcast    mild    high    TRUE
yes overcast    hot normal  FALSE
no  rainy   mild    high    TRUE

部分运行结果:

模型学习的最优算法IIS

《统计学习方法》关于IIS的理论推导写了一大堆,在博文【码农场-逻辑斯谛回归与最大熵模型】也全部推导过一遍了,所以具体的细节就不再赘述了。主要阐述下IIS的基本思想,以及重点关注代码的编写。

首先,我们已经明确了最大熵模型的条件概率表达式Pw(y|x)P_w(y | x),由此得整个模型的对数似然函数为:

L(w)=∑x,yP^(x,y)∑i=1nwifi(x,y)−∑xP^(x)logZw(x)

L(w) = \sum_{x,y}\hat P(x,y)\sum_{i=1}^nw_if_i(x,y) - \sum_x \hat P(x)\log Z_w(x)

现在有了对数似然方程,接下来只需要求极值可以了,但你会发现,该似然方程相当复杂,对它各个参数直接求偏导时,每个参数wiw_i中还包含另外的ww参数,这就导致每个参数无法独立的更新,很难求出L(w)L(w)的极大值。

于是IIS的一个想法是:既然我不知道原始参数如何变化,我就给你一个变化量δ\delta,对于每个参数wiw_i对应于一个变化量为δi\delta_i,所以,上述式子就可以表示为:

L(w+δ)−L(w)=A(δ|w)

L(w+\delta)-L(w) = A (\delta | w)

注意ww是相对固定的,而δ\delta是在变化的,有了这样的等式后,我们无非就开始研究函数A(δ|w)A(\delta | w)。什么情况下,L(w)L(w)达到极值?首先A(δ|w)A(\delta | w)的值应该大于0,且为正数情况下,应该令其最大(其实就是求A(δ|w)A(\delta | w)的极值)。这样L(w+δ)L(w+ \delta)将增大,且增大的步长最大。

所以该问题就变成了研究A(δ|w)A(\delta | w)的极值了,所以我们把A(δ|w)A(\delta | w)的表达式写出来吧,分别代入w+δ和ww+ \delta和w得:

L(w+δ)−L(w)≥∑x,yP^(x,y)∑i=1nδifi(x,y)+1−∑xP^(x)∑yPw(y|x)exp(∑i=1nδifi(x,y))

L(w+ \delta ) - L(w) \ge \sum_{x,y}\hat P(x,y)\sum_{i=1}^n\delta_if_i(x,y) +1- \sum_x \hat P(x)\sum_y P_w(y|x)exp(\sum_{i=1}^n\delta_if_i(x,y))

将右端记为:

A(δ|w)=∑x,yP^(x,y)∑i=1nδifi(x,y)+1−∑xP^(x)∑yPw(y|x)exp(∑i=1nδifi(x,y))

A(\delta | w) = \sum_{x,y}\hat P(x,y)\sum_{i=1}^n\delta_if_i(x,y) +1- \sum_x \hat P(x)\sum_y P_w(y|x)exp(\sum_{i=1}^n\delta_if_i(x,y))

为什么是不等式,因为原式无法对它进一步求导分析,所以需要近似的下界,来缓解这种尴尬的情况。但当我们得到A(δ|w)A(\delta | w)时,对它继续求导试试,你会发现同样的问题,参数δi\delta_i关联了其他参数δ\delta,依然无法独立,所以咱们得想办法进一步降低下界,呵呵,书中引进了计数函数f#(x,y)=∑ni=1fi(x,y)f^#(x,y) = \sum_{i=1}^n f_i (x,y),再利用Jensen不等式完美的解决了这个问题。于是,经过层层推导,下界再一次被刷新!即为:

B(δ|w)=∑x,yP^(x,y)∑i=1nδifi(x,y)+1−∑xP^(x)∑yPw(y|x)∑i=1n(fi(x,y)f#(x,y))exp(δif#(x,y))

B(\delta | w) = \sum_{x,y}\hat P(x,y)\sum_{i=1}^n\delta_if_i(x,y) +1\ - \sum_x \hat P(x)\sum_y P_w(y|x)\sum_{i=1}^n (\frac{f_i(x,y)}{f^{#}(x,y)})exp(\delta_if^{#}(x,y))

你会发现一个神奇的现象,原本在expexp中的所有参数累加,在最新的下界中消失不见了,没错,这就是神奇的jessen不等式功效,然后你再对B(δ|w)B(\delta | w)求偏导试试,呵呵,所以的参数能够独立计算了,于是我们得到一个迭代更新公式:

∑x,yP^(x)Pw(y|x)fi(x,y)exp(δi,f#(x,y))=Ep^(f)

\sum_{x,y}\hat P(x)P_w(y|x)f_i(x,y)exp(\delta_i,f^{#}(x,y)) = E_{\hat p}(f)

简单的方程,给出初始值,不断迭代就完事了。最终每个δ\delta将收敛于某个稳定的值。而此时的L(w)L(w)将走到极大值。

IIS迭代尺度算法

最大熵IIS训练算法的Java实现

Fork自https://github.com/tpeng/maxent ,经过实测,hankcs所给的数据训练准确率可达0.7619。

番外篇

文初说到了,逻辑斯蒂回归模型其实是最大熵模型的特殊形式,这是怎么回事呢?我们可以从最大熵模型来推得逻辑斯蒂回归模型,我们只需要改变的是特征函数f(x,y)f(x,y),详细的可以参看知乎回答【如何理解最大熵模型里面的特征?】。

但令我好奇的是,为什么最大熵模型对特征函数进行特殊化后便能够推出逻辑斯蒂回归模型呢?关于逻辑斯蒂回归模型的物理含义挺清楚,可最大熵模型是否对特征有着同样的物理含义呢?个人觉得还是得从特征函数入手,最大熵模型中f(x,y)=1or 0f(x,y) = 1 or \space0,所代表的是yy在xx这样的条件下能否出现,而这种条件并不像逻辑斯蒂回归模型中的随机变量【连续时间】那样属于连续值,所以自然特征函数只能简单的以0和1划分条件成立与否。这点和逻辑斯蒂回归模型又有几分相像。但猜测毕竟是猜测,仅供参考。

参考文献

  1. 李航. 统计学习方法M. 北京:清华大学出版社,2012
  2. 吴军. 数学之美M. 北京:人民邮电出版社,2012
  3. 关于最大熵模型的严重困惑:为什么没有解析解?
  4. 码农场-逻辑斯谛回归与最大熵模型
  5. 如何理解最大熵模型里面的特征?
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最大熵模型与GIS ,IIS算法
    • 前言
      • 学习提醒
        • 最大熵进阶一
          • 最大熵进阶二
            • 最大熵进阶三
              • Code Time
                • 模型学习的最优算法GIS
                • 模型学习的最优算法IIS
              • 番外篇
                • 参考文献
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档