作为人类,我们对做出决断已经习以为常。我们经常会依据一些给出的信息来做决断。那你是如何将这些“信息拼凑到一起”来做出最终的决断的呢?
想象一下某个时刻,你不再是一个人类,而是一台电脑。快点!试想一下你会如何回答这个问题:“这是炸鸡还是小狗?”
你也许注意到了图片中的小狗有一些特性,而炸鸡有另外一些特性。
在下文中,我将介绍最大熵(MaxEnt)分类器。
定义
这里是维基百科对于最大熵(或者简称为 MaxEnt )的定义。
“最大熵分类器是一个对于多分类(例如,分类结果超过了两种情况)逻辑回归分类问题的泛化分类方法。”
“[Maximum entropy classification] is a classification method that generalizes logistic regression to multiclass problems, i.e. with more than two possible discrete outcomes.”
这是一个极佳的正式定义,但是我能想象,如果在我对 MaxEnt 一无所知的情况下读到这个定义,我也许会困惑不解。所以这里给出一个更通俗的解释,或许能给你一些启示。
如果我们被要求根据一些给出的数据(比如一幅图片)做出决断(比如,“这是一张小狗的图片还是炸鸡的图片”),我们会想到该数据的一些属性(比如,“图片里有没有一些像皮带一样的东西?”, “有没有2个像眼睛一样的小黑点?”)。
或许是为了显得高大上一点,聪明人喜欢把这些属性成为“特征”(feature)。其中的一些特征要比另一些更加重要。
“最大熵分类器”也是给一个特定方程式取得高大上的名字(那些愚蠢的聪明人啊!),我们将这些“特征”扔进这个数学方程,然后使用这个方程来告诉我们是否应该做出决断。对于数据中发现的每一个特征(比如,“有一个皮带”, “有两个像眼睛的黑点”,等),需要给它们加上一个权值,然后将所有的特征加在一起。最终,加权后的总和是正规化到0与1之间的一个小数。我们可以用这个小数来得到做出一种决断(比如,“这是一个小狗吗?”)的自信程度的“分数”。
“好了博主,炸鸡和小狗你已经说的够多的了。我想看一个NLP的例子!” 没问题,我想象出来的读者!但是在举例子之前,我们还要再深入的了解下背后的数学知识。
举个例子
想象一下,现在是1999年,你是一个电子邮件创业公司的第一批员工。你被要求阅读几封邮件,你的工作是判断该邮件是否是垃圾邮件。
邮件#1:
From:LeChuck@yahoo.com
哈哈!
请允许莪介绍一下我自己,我名字叫Lechuck,我从互联网邮件目录里找到了你的邮件地址。我在目录里点兵点将点到了你的名字。
根据你的名字判断,你猫似是个好人,所以我特此给你写了这份电子邮件。
我住在一个很遥远的岛上,而且我手上有笔钱(具体说,有12.2万美元)需要汇到海外去。你能帮莪个帮,帮我把这些钱转出去吗?
1) 提供给莪一个能让我把钱转进去的银行账号。
2) 发给我一张你的照片,这样当我到美国之后,我就知道去向谁道谢。点击下面的链接到我的Facebook
[www.lechuck.myfacebook.com/fake.link/give_me_money],
然后在里面发一张你的照片。
猴子 香蕉 金钱 富有 (Monkey bananas money rich)
作为报答,我愿意在钱成功的转入你指定的海外账户后,抽出15%作为你精力投入的补偿。
欢迎随时通过邮件地址lechuck@yahoo.com联系我。
邮件#2:
From:GuybrushThreepwood@gmail.com
你好Nade,
我是詹姆斯洛根高中的Guybrush。好久不见啊,你最近过的怎么样啊?
我听Elaine说,你马上要来混乱岛了(译者注:系列游戏“猴岛小英雄”中的一个小岛),所以我想看下你是不是想聚一聚。周五(9月8号)有空出来吃个晚饭吗?
我们可以像以前一样出来玩一玩,叙叙旧。我知道有个酒吧有超难喝的格罗格酒。
聚不聚都给我说一下!如果聚不成也没关系;我祝你旅途愉快!
再见,
Guybrush
很简单,对吧?好的,那怎么才能让电脑分辨出来呢?
让我从确定一些有用的特征开始吧。这是其中一些特征的小列表:
f1(email): 邮件包含了拼写/语法错误
f2(email): 邮件包含了汇款请求
f3(email): 邮件内容中提及了邮箱主人姓名
我们假设其中一些特征要比其他的特征重要。让我们给每个特征一个权值,用于标识一封邮件是垃圾邮件:
w1(spam) (邮件包含了拼写/语法错误): 0.5。 讲真的,你可以去校对一下你的邮件。
w2(spam) (邮件包含了汇款请求): 0.2。 很多垃圾邮件都牵涉到银行汇款。
w3(spam) (邮件内容中提及了邮箱主人姓名): -0.5。 如果邮件发送者提及了我
的名字,那么这有可能就不是一封垃圾邮件。顺便说一句,请注意,对于做决断来说,权值可以为负数。
以下的特征权重用于标识邮件不是垃圾邮件:
w1(not spam) (邮件包含了拼写/语法错误): -0.2
w2(not spam) (邮件包含了汇款请求): 0
w3(not spam) (邮件内容中提及了邮箱主人姓名): 1
(以上的权值的选择比较武断,仅用于讨论需要。我也许会在另一片博客中解释权值是如何使用训练数据习得的。
现在,你些许可以通过查阅梯度下降算法来满足你的好奇心。
也有一些其它更加高大上的算法在更加实际的情况下使用,特别是 L-BFGS 算法。
同时,吴恩达也有一个了不起的Courera 机器的学习课程,在课程中,他通过出色的视频课件讨论了梯度下降算法;这里是其中的一些视频。)
好了,现在我们有了特征,有了权值。我们已经做好了深入数学知识的准备了。
以下数学方程中最可怕的部分可能是牵扯了指数函数,但除此之外就都是些乘法,加法,除法,好了,让我们开始深入下去吧!
数学知识
设特征函数为 fi(x),它接受一个输入,x,并且返回结果为0或者1,这取决于特征是否存在于输入值 x 中:
进一步讲,对于 N 个特征,每个特征函数 fi(x) 关联着一个权值 wi(d),这个数标志着特征函数 fi(x) 相比于其他特征值在进行决断时有多重要,d(在当前例子中表示,“是垃圾邮件”或者“不是垃圾邮件”)。
我们可以通过一下流程来对于一个决断 d 在输入 x 上的分数进行“建模”(以我的看法,这个词可以被理解为“估算”):
对于特征中的每个特征函数 fi(x), 确定 fi(x) 的值为1还是0
将每个特征函数 fi(x) 与其相关的权值 wi(d) 相乘,其中权值的大小是根据被估算的决断d来决定的。
将所有的 权值特征的乘积相加 sumd = \sum_{i=1}^{N} w_i(d)f_i(x)
将总和丢进一个指数函数中: numeratord = exp(d)
将总和除以一个0到1之间的数,如此所有决断的分数和为1。事实证明,这是所有可能的决断 d 的分子的总和:denominator = \sum{d} \sum{i=1}^{N} w_i(d)*f_i(x)
以上过程基本相等以下方程:
让我们来想一想,如何每封邮件是如何评分的。
那么为了参考,让我们再看一下这两封邮件。
邮件#1:
From:LeChuck@yahoo.com
哈哈!
请允许莪介绍一下我自己,我名字叫Lechuck,我从互联网邮件目录里找到了你的邮件地址。我在目录里点兵点将点到了你的名字。
根据你的名字判断,你猫似是个好人,所以我特此给你写了这份电子邮件。
我住在一个很遥远的岛上,而且我手上有笔钱(具体说,有12.2万美元)需要汇到海外去。你能帮莪个帮,帮我把这些钱转出去吗?
1) 提供给莪一个能让我把钱转进去的银行账号。
2) 发给我一张你的照片,这样当我到美国之后,我就知道去向谁道谢。点击下面的链接到我的Facebook [www.lechuck.myfacebook.com/fake.link/giveme_money],
然后在里面发一张你的照片。
猴子 香蕉 钱 富有(Monkey bananas money rich)
作为报答,我愿意在钱成功的转入你指定的海外账户后,抽出15%作为你精力投入的补偿。
欢迎随时通过邮件地址lechuck@yahoo.com联系我。
检查特征的匹配程度如下:
f1:邮件包含有拼写、语法错误:是;
f2:邮件中含有汇款请求:是;
f3:邮件中包含发件人的名字:否。
因此,通过上述的特征描述,我们一定会将这封邮件归类为垃圾邮件,但是,让我们按照这个过程计算一下:
垃圾指数:
非垃圾指数:
LeChuck的邮件的垃圾指数(0.71)大于非垃圾指数(0.29),因此这是一封垃圾邮件。对于这样的结果我们一点儿也不感到吃惊,对不住了,LeChuck.
邮件#2:
下面是Guybrush的邮件,引文如下:
From:GuybrushThreepwood@gmail.com
你好Nade,
我詹姆斯洛根高中的Guybrush。好久不见啊,你最近过的怎么样啊?
我听Elaine说,尔马上要来混乱岛了(译者注:系列游戏“猴岛小英雄”中的一个小岛),所以我想看下你是不是想聚一聚。周五(9月8号)有孔出来吃个晚饭吗?
我们可以像以前一样出来玩一玩,叙叙旧。我知道有个酒吧有超难喝的格罗格酒。
聚不聚都给我说一下!如果聚不成也没关系;我祝你旅途愉快!
再见,
Guybrush
再一次检查特征的匹配程度如下:
f1:邮件包含有拼写、语法错误:是,” 媞”,”尔”,” 有孔”;
f2:邮件中含有汇款请求:否;
f3:邮件中包含发件人的名字:是。
由此看出Guybrush并不是一个好的email写作者,但是让我们看看我们的评估系统会不会将他的邮件分类为垃圾邮件。
垃圾指数:
非垃圾指数:
Guybrush的邮件垃圾指数(0.31)比非垃圾指数(0.69)少,因此该系统不会将Guybrush的邮件分类为垃圾邮件。看看起来我要去去跟他聚一聚,喝超赞的格罗格酒了。
添加更多的决策方式
那你可能已经注意到最大熵分类实际上支持多决策的问题。在这里,添加一个决策并不困难,但是将每一个步骤的细节都一一描述一遍只是会得到一个更长的公式,因此我将总结一下你将要做什么。
如果你要同时判断一封邮件是不是一封新闻邮件,比如:
From:info@ScummBar.com
嗨,朋友们
从9月10号到9月17号,Scumm酒吧所有的格罗格酒和其他超难喝的酒水饮料都享受五折优惠。点击这里【www.scummbar.fake.link.com】来看看所有的饮料和秋季特色食物。
到时见!
来自Scumm酒吧
为了添加这个决策,我们可能需要做如下的事情:
定义可以选出新闻邮件的一些特征——内容的类型(比如,包含图片、提到打折、邮箱地址是一个已知的商业机构等)。
对于每一个决策(垃圾邮件与非来及邮件,是否新闻邮件),如果有需要的话,重新定义特征的权重和偏差。
应用
最大熵分类是更经典的机器学习任务之一,并且可以解决自然语言处理之外的一些问题,一下是一些应用:
情感分析(例如,给定一个产品评价,分析评价者是不是喜欢该产品);
喜好分析(例如,给定一个人的统计资料,那么他会为哪个人投票呢?他会更喜欢超人、蝙蝠侠、还是忍者神龟呢?)
医疗诊断(例如,给定一些医疗图像、病史等特征,那么该病人处于怎样的身体状况呢?)
现实生活中的应用
以python为基础的自然语言处理工具包(NLTK)提供了最大熵分类的库文件。
其中的例程是根据一个大约8000个名字的名单,并且根据少量的基于字母的单个特征,来判断一个名字是男性还是女性。
调用该例程十分简单:
输出如下:
Training classifier…
==> Training (100 iterations)
Iteration … Log Likelihood … Accuracy
—————————————
1 … -0.69315 … 0.374
2 … -0.61426 … 0.626
3 … -0.59970 … 0.626
4 … -0.58597 … 0.627
5 … -0.57305 … 0.633
[…]
96 … -0.33073 … 0.809
97 … -0.33030 … 0.809
98 … -0.32989 … 0.809
99 … -0.32948 … 0.810
Final … -0.32908 … 0.810
Testing classifier…
Accuracy: 0.7980
Avg. log likelihood: -0.6085
Unseen Names P(Male) P(Female)
—————————————-
Octavius 0.9342 0.0658
Thomasina 0.0478 0.9522
Barnett 0.6464 0.3536
Angelina 0.0077 0.9923
Saunders *0.7839 0.2161
(如果想了解更多的话,这个例程恰好采用的是改进的尺度迭代算法来学习权重. NLTK的最大熵分类训练中也支持通用迭代算法、MEGA以及先进的生成模型工具包等。)
尽管我已经沉迷于该算法,但是我可能也不会说80%都能达到非凡的精确度。考虑到在该算法中,特征的设置是异常的简单的,这里罗列了一些用到的特征:
注意到以上的特征都是包含一个偏差项的,(也就是 “always on”),可以非常简单的检测一个名字中的首字母和最后的字母,以及该名字中所包含的子母。
结论
最大熵是基于你的数据中“特征”来帮助计算机产生决策的一个非常简单并且易于理解的工具。这些特征可能会由一定的权重影响后对产生最终的决策分数从而产生决策。最大熵也同时为逻辑回归和分类问题提供了一个很好的介绍,这一原理也经常用于解决一些实际中的问题。
最后,理解最大熵也为理解最大熵马尔科夫模型(MEMMs)和条件随机场(CRFs)打开了一扇大门。