第九章
解开迷惑

阅读 ‧ 电子书库

机器学习既是科学,也是技术,两者的特点提示我们如何将其统一起来。在科学方面,理论的统一往往从看似简单的观察开始。两个看似不相关的现象原来只是同一枚硬币的两面,就像第一张倒下的多米诺骨牌,会引起其他许多牌倒下。苹果落到地上,月亮悬挂在夜空,这两者都是由重力引起的,而且(无论是否杜撰)一旦牛顿弄明白这些现象的原因,重力最后也可以用来解释潮汐、分点岁差、彗星轨道等其他很多现象。在日常体验中,电和磁绝不会同时出现:这边有闪电的火花,那边有吸住铁制品的岩石,两种现象都很少见。可是一旦麦克斯韦弄清楚电场的改变会产生磁性,反之亦然,显然闪电是两者亲密的媒介。现在我们知道,电磁并不罕见,遍及所有物质。门捷列夫的元素周期表不仅将所有已知物质仅分成两个维度,也预示哪里会有新元素。达尔文在贝格尔号上的观察突然得到理解,因为马尔萨斯的《人口论》表明了自然选择这一组织原理。

广告:个人专属 VPN,独立 IP,流量大,速度快,连接稳定,多机房切换,每月最低仅 5 美元

当克里克和沃森偶然发现双螺旋结构可用于解释DNA令人迷惑的属性时,他们马上就看到DNA可能会如何复制自身,而生物学由“集邮”(卢瑟福用的贬义词)到“统一科学”的过渡开始了。在这些例子中,各种各样令人眼花缭乱的观察结果原来都有同一个相同的起因,而一旦科学家们明确了这个起因,就可以反过来利用它来预测许多新的现象。同样的道理,虽然我们在本书中见到的学习算法似乎差别很大——有些以大脑为基础,有些以进化为基础,有些则以抽象的数学原理为基础,但实际上,它们有很多相似之处,而由学习产生的理论会有许多新的观点。

虽然知道这一点的人比较少,但世界上许多最重要的技术都是创造统一物的结果,该统一物是单一机制,能完成之前需要很多机制完成的事情。互联网,正如它的名字一样,是连接相互网络的一种网络。没有它,每种类型的网络就得需要一个不同的协议来与其他每个网络进行对话,这就很像对于世界上每种不一样的语言都需要一本不一样的字典。互联网协议就是一种世界语言,会给每台计算机能与其他所有计算机直接对话的错觉,世界语言还允许电子邮件和网页忽视那些它们无法起到影响作用的基础设施建设的细节。关系数据库也会对企业应用做类似的事情,允许开发商和用户依据抽象关联模型进行思考,并忽略关于回应搜寻计算机所尝试的方式。微处理器是一种数据电子元件装配,可以对所有其他装配进行模仿。虚拟机允许同一台计算机同时在100个人面前伪装成100台不同的计算机,并使云成为可能。图形用户界面让我们编辑文件、数据表、幻灯片以及别的很多东西,利用Windows操作系统、菜单、鼠标单击的通用语言。计算机本身就是统一物:单个设备可解决任何逻辑或者数学问题,只要我们知道如何对它进行编程。甚至电也是一种统一物:你可以通过许多不同的来源来获取它——煤、天然气、核能、水力、风力、太阳,然后以无限多种的方式来消耗它。一座发电站不会知道或者关心它生产的电会如何被消耗掉,而你的门廊灯、洗碗机或者全新的特斯拉也不会在意电力供应来自哪里。电力就是能源的世界语言。终极算法是机器学习的统一物:它让任意应用利用任意学习算法,方法是将学习算法概括成通用形式——所有应用都需要知道该形式。

我们迈向终极算法的第一步会简单得令人意外。事实证明,要将许多不同的学习算法结合成一个并不难,利用的就是元学习。网飞公司、沃森、Kinect以及其他无数公司都会利用它,而它在机器学习算法的箭袋中也是最有力量的一支。它还是接下来要进入的深层次统一的垫脚石。

万里挑一

这里有一个挑战:你有15分钟用来联合决策树、多层感知器、分类器系统、朴素贝叶斯,以及支持向量机,使其变成拥有每个部分最佳属性的单一算法。快!你能做什么?显然,这不能涉及单个算法的细节。没有时间了,但接下来怎么办?把每种学习算法当成委员会上的一位专家,每个人都仔细观察待分类的实例——这个患者的诊断是什么,然后有把握地做出预测。你不是一位专家,却是委员会主席,你的工作就是把他们的意见结合成一个最终决定。你手上的问题其实就是一个新的分类问题,这种情况下,输入不是患者的症状,而是专家的观点。但你可以将机器学习以同样的方式运用到解决这个问题上,专家也会这样将其运用到最初的问题上。我们可以称其为元学习,因为它就是要了解学习算法。元学习算法本身可以是任意学习算法,从决策树到简单的权值投票。为了掌握权值或者决策树,我们利用学习算法的预测来代替每个最初例子的属性。经常能够准确预测类别的学习算法会取得较高的权值,而不准确的那些则容易被忽略。有了决策树,是否要利用学习算法可能会依照其他学习算法的预测来定。不管怎样,为了给既定训练例子获取学习算法的预测,我们首先必须将其运用到原始训练集“排除该样本”中,然后利用最终的分类器,否则委员会就有被拟合学习算法控制的风险,因为它们可以通过记忆类别来预测准确的类别。网飞奖获得者利用元学习来结合数百个不同的学习算法;沃森利用它来从备选项中选择最终的答案;内特·希尔也以相似的方式将投票与预测选举结果结合起来。

这种类型的元学习被称为“堆叠”,是大卫·沃尔珀特的创见,在第三章中我们提到过他,他是“天下没有免费的午餐”定理的创造者。还有一个更简单的元学习算法是“装袋”算法,由统计学家里奥·布雷曼发明。“装袋”算法通过重新取样的方法来产生训练集的随机变量,将同样的学习算法应用到每个训练集中,然后通过投票将结果结合起来。做这件事的原因是它可以减少变量:组合模型和任何单一模型相比,对于变幻莫测的数据的敏感度要低得多,这样提高准确度就变得很容易了。如果模型是决策树,且我们通过保留属性(这些属性因考虑每个节点而得来)的任意子集来进一步改变这些决策树,那么所得结果就是所谓的随机森林。随机森林到处是一些准确的分类器。微软公司的Kinect利用它们来弄清楚你在做什么,而且它们会经常在机器学习比赛中获胜。

最聪明的元学习算法之一就是推进,由两位学习领域的理论家约阿夫·弗罗因德和罗伯·夏皮尔创造。推进算法不是通过结合不同的学习算法,而是将相同的分类器不断应用到数据中,利用每个新的模型来纠正前面模型的错误。它通过将权值分布给训练实例的方式来完成这件事。每个被误分类的权值,在每轮学习过后都会增长,使得后面的几轮会更向它集中。推进算法的名字源于这样的想法:该过程可以推进只比随机猜测好一点的分类器,但如果持续如此,就会接近完美。

元学习非常成功,但它却不是深入组合模型的方法。另外,它也昂贵、苛刻,因为会做很多轮学习,而且组合模型可能会很难懂(“我认为你有前列腺癌,因为决策树、遗传算法、朴素贝叶斯算法都这么判断,虽然多层感知器和支持向量机反对”)。此外,所有的组合模型确实只是一个巨大而凌乱的模型。难道我们不能找到完成同样任务的单一学习算法吗?当然可以。

终极算法之城

我们的统一学习算法也许通过延伸寓言可以得到最好的介绍。如果机器学习是一块大陆,被分成5个区域,那么终极算法就是首都城市,矗立在5个区域会合的特殊地带。如果从远处接近它,你会看到这个城市由3个同心圆组成,每个圆被一堵墙围着。外围的圆,也是最宽的圆是“优化城”。这里的每个房间就是一种算法,而且它们有不同的形状和面积。有些房子在建设中,当地人忙着围着它团团转;有些房子非常崭新;有些房子则看起来老旧荒废。山的更高处是“评价城堡”,命令不断从它的大厦和宫殿向下面的算法发出。最重要的是,在天空的映衬下,“代表法之塔”矗然而立,这里住着城市的统治者。他们的城市有不可改变的法律,不仅规定在城市范围内,而且规定了在整个大陆什么能做、什么不能做。在中央,最高的塔尖飘扬着终极算法的旗帜,颜色是红和黑,上面的五角星围着我们无法理解的文字。

这座城市被分成5个区域,一个区域属于一个学派。每个区域从“代表法之塔”一直延伸至城市的外墙,包围了塔、“评价城堡”里的一群宫殿,以及它们俯瞰的“优化城”的街道和房屋。这5个区域和3个圆圈将城市划分成15个区域、5种形状,以及你需要解决的那15块拼图(见图9–1)。

阅读 ‧ 电子书库

图9–1

你专注地盯着地图,试图解开它的谜底。15块拼图都很完美地拼在一起,但你得弄清楚它们是如何结合起来的,且只分成3个区域:终极算法的代表方法、评价、优化部分。每种学习算法都有这3个部分,但不同学派也会有不同的组成部分。

代表法是一种形式语言,利用这种语言,学习算法会表达它的模型。符号学派的形式语言是逻辑,其中规则和决策树是特殊例子。联结学派的是网络神经。进化学派的是遗传程序,包括分类器系统。贝叶斯学派的是图解模型,这是贝叶斯网络和马尔可夫网络的涵盖性术语。类推学派的是特例,可能会有权值,就像在支持向量机中那样。

进化学派的主要部分是评分函数,判断一个模型的优劣程度。符号学派用的是准确度或者信息增益。联结学派利用的是连续误差测量,例如,平方误差,这是预期值与真实值之间差异的平方的总和。贝叶斯学派利用的是后验概率。类推学派(至少是支持向量机这种类型)利用的是边界。除了模型与数据的匹配度,所有的学派都会考虑其他合意的属性,例如模型的简洁度。

优化是一种算法,即寻找最高得分的模型,并回归它。符号学派的特色搜索算法是逆向演绎。联结学派的是梯度下降。进化学派的是遗传搜索,包括交叉和突变。贝叶斯学派在这方面不同寻常:他们不只是寻找最好的模型,而是寻找所有模型的平均值,由它们的可能程度来权衡。为了有效进行加权,他们利用诸如MCMC之类的推理算法。类推学派(或者更准确地说是支持向量机)利用约束优化来找到最佳模型。

经过一天的跋涉之后,太阳快速接近地平线,而你要在天黑前加快速度。城市的外围墙有5个大门,每个门由一个学派掌控,并通往每个学派在“优化城”里的区域。对着防护装置念出“深度学习”的口令之后,我们进入“梯度下降大门”,并旋转进入“代表法之塔”。大街从门口处突然沿着山坡上升,一直延伸到城堡的“平方误差大门”,但你却要向左转向进化区域。梯度下降区域的房子都是平滑曲线以及密切交织在一起的模式,看起来几乎更像一个丛林,而不是一座城市。但当梯度下降屈服于遗传搜索时,情况就会急剧变化。到这里时,房屋会升得更高,一层结构堆在另一层之上,但这些结构稀少,几乎没有,似乎等着由梯度下降的曲线来填满。就是这样:结合两者的方法就是利用遗传搜索来找到模型的结构,然后让梯度下降来填满它的参数。这就是自然所做的事:进化创造大脑结构,而个人经历则对这些结构进行调整。

第一步完成了,你急忙赶往贝叶斯区域。即使在远处,你也可以看到它如何簇拥着“贝叶斯定理大教堂”,“MCMC小巷”一路蜿蜒曲折。这个过程需要一段时间。你抄近道走上“置信传播街道”,但似乎它永远在绕圈循环,然后你看到它了——“最可能大道”向着“后验概率大门”傲然屹立。不用对所有模型求均值,你可以直接奔向最适合的那个,并相信最终的预测会几乎一样。而你可以让基因搜索选择模型的结构和梯度下降作为其参数。轻轻松了一口气,你意识到这就是你需要的所有概率推理,至少持续到开始利用模型回答问题的时候。

你不断向前走。约束优化区域是窄巷和死胡同组成的迷宫,各种各样的例子到处紧挨,偶尔会对支持向量的周围进行清理。显然,为了避免遇到错误类别的例子,你要做的就是将限制条件添加到已经聚合的优化控制器中。但回头想想,这并不一定有必要。现在想起来了,甚至这也没必要。当我们学习支持向量机时,为了避免过拟合,已经让边际受到侵犯,只要每次违反就会受到惩罚。在这种情况下,优化例子权值可以再次通过梯度降低的形式来确定。这很容易,你觉得自己开始对它有所了解了。

实例稠密的排名突然中断,你发现自己在逆向演绎区域,这里有宽阔的大街和古代的石头建筑。这里的建筑是几何学的、朴素的,由直线和直角组成。即使经过很大程度修剪的树有矩形的树干,但它们的叶子被细致地贴上预测的类别。该区域的居民似乎用特殊的方式在建造他们的房子:他们从屋顶开始,将屋顶标识为“结果”,并渐渐地将天花板与地板之间的空隙填补,他们将地板标识为“前提”。一个接一个地,他们找到一块恰好与某个空隙吻合的石头,然后将其移到合适的位置。但你注意到,许多空隙有同样的形状,而在这些石头形成该形状之前,切割并整合石头也许会更快,然后尽可能多地盯住客人。换句话说,你可以利用遗传搜索来进行逆向演绎。巧妙!你似乎已经将那5个优化程序总结为一个简单的方法:遗传搜索用于结构,而梯度下降用于参数。即使那样也可能过分了。对于很多问题,如果你做3件事,可以将遗传搜索简化为爬山法——省去交叉,在每一代中尝试所有可能的点突变,并一直选择单个最优假设来为下一代播种。

头顶的雕像是什么?亚里士多德。他不以为然地看着那1/4梯度下降混乱地纠缠在一起。你已经充分进行循环,拥有了为得到终极算法而需要的统一优化器,但来不及庆祝一下,夜幕降临了,你要做的还有很多。通过壮观但相当狭窄的“准确度之门”,你进入“评价城堡”。门上的铭文写着:“汝等进入此地,须弃绝过拟合之希望。”随着你循环经过5个学派鉴别器的宫殿,在心理上将每个部分归位。为了连续性预测,你利用准确度来评价“是”或“否”预测以及平方误差。适应度只是进化学派用来指代评分函数的名字,你可以将它当作你想到的一切,包括准确度和平方误差。如果你忽略先验概率,而且误差遵循正态分布,那么后验概率会简化为平方误差。如果你允许它因为价格而受到违反,边际就会变成准确度更加柔软的版本——对于准确的预测不是不进行惩罚,对于不准确的预测则基于惩罚,惩罚一直等于零,直到你进入边际,这时它开始平稳增长。哟!结合鉴别器比结合优化器要简单得多,但“代表法之塔”落停在你上空,给你一种不祥的预感。

你进入搜寻的最后阶段,打开“支持向量之塔”的门,一位看起来面目狰狞的警卫打开它,你突然意识到自己看不到密码。“核心。”你脱口而出,努力使声音不显得丝毫慌张。警卫鞠躬然后避开。重新获得士气后,你走进去了,并会因为自己的粗心而踢自己一脚。塔的第一层是装修豪华的环形室,还有似乎为支持向量机的大理石表达法占据中心的重要位置。当你在它周围走时,注意到远的那边有一个门,它一定能够通过中心塔——“终极算法之塔”。门口似乎没有警卫,你打算抄近道,悄悄溜过门廊,走到一条不长的走廊,发现自己置身在一间更大的五角房屋中,每堵墙上都有一扇门。在中心,一个螺旋状的楼梯上升至你可以看到的位置。你听到上面的声音,然后躲进对面的门里。这个门通往“神经网络之塔”。你再一次进入环形的房间,这个房间的中心有一个多层感知器作为装饰品,它的组成部分和支持向量机不一样,但布局十分相似。你突然发现,支持向量机只是一个这样的多层感知器:有一个由内核而不是S曲线组成的隐藏层,还有一条输出信息,是一个线性组合,而不是另外一条S形曲线。

难道说别的表示方法也有相似的形式?越来越觉得刺激。你穿过五角星房屋,跑回“逻辑之塔”。看着中心一组规则的描述,你试着辨别一个模式。是的!每条规则只是一个高度程式化的神经元。例如,如果规则是“一只巨大的爬行动物,然后会喷火,那么它就是一条龙”,对于“它是一只巨大的爬行动物”和“喷火”以及门槛值1.5来说,仅仅是权值为1的感知器。一组规则集就是一个有隐藏层的多层感知器,包含每条规则的每个神经元,以及形成规则的稀缺的输出神经元。在脑海深处有一个疑问,但你现在没有时间解决它。当你穿过五角房屋走到“遗传程序之塔”时,就已经可以看到如何对它们进行合并。遗传程序也只是程序,而程序只是逻辑构造。房屋中遗传程序的雕塑是树的形状,子程序会分成更多的子程序,当你仔细看叶子时,会发现它们只是简单的规则。因此程序归结为规则,而且如果规则可以简化为神经元,那么程序也可以。

不幸的是,在“图解模型之塔”的顶部,环形房屋内的雕像与其他的看起来大不一样。图解模型是各种因素的一个产物:条件概率(在贝叶斯网络条件下)以及状态的非负函数(在马尔科夫网络条件下)。尽管很努力,你就是看不到神经网络或者规则集之间的连接,失望向你侵袭而来。不过你又戴上“护目镜”,其算法可以代替每个函数。有了!此时各种因素的产物就是术语的总和,就像一个支持向量机、一个投票规则集或者一个多层支持向量机,没有输出S形曲线。例如,你可以将一个朴素贝叶斯龙分类器解释成一个感知器,对于“喷火”,它的权值等于P(喷火∣龙)的log值减去P(喷火∣不是龙)的log值。当然,图解模型比这个还要概括,因为它们可以代表许多变量的概率分布,而不仅仅是给定其他变量(属性)情况下的一个变量(类别)分布。

你做到了!还有疑问?吸收支持向量机变成神经网络,吸收神经网络变成图解模型:起作用了。那么一定要吸收遗传程序变成逻辑。但将逻辑和图解模型结合在一起?此处有一点差错。你终于看到问题所在:逻辑有一个维度,而图解模型没有,反过来也一样。五个房屋中的雕塑匹配是因为它们是简单的寓言,但事实并非如此。图解模型不会让我们表示规则时涉及的对象超过一项,就像“朋友的朋友是朋友”,它们所有的变量必须是来自同一对象的属性。它们也不能代表任意程序,因为这些程序会通过一组组通过来自这个和那个子集的变量。逻辑可以轻易做到这些事,但它无法代表不确定、模糊或者相似度。而且如果没有一种能做所有这些事的表示方法,就无法获得通用学习算法。

你绞尽脑汁想办法,但你越努力,问题就变得越棘手。也许将逻辑和概率统一起来超出了人类的能力。筋疲力尽的你渐渐入睡。突然,一声低沉的吼叫把你吵醒了。一只多头复杂怪物扑向你,张牙舞爪,你在最后一刻躲开了。你用学习这把剑猛击怪物,这是唯一能杀死怪物的武器,最后你赢了,把它所有的头砍了下来。趁它还没长出新的头,你跑上了楼。

艰难地攀爬之后,你到达楼顶。此时有一场婚礼正在进行。珀莱尔迪卡特斯(Praedicatus,逻辑领域的大臣、象征界的统治者以及程序的保护神)对马尔科维雅(Markovia,概率领域的公主、网络界的女皇)说:“让我们把所有领域都统一起来,你应当往我的规则添加权值,以产生新的代表方法,可以进行广泛传播。”王子说:“我们把我们的一个个后代称作马尔科夫逻辑网络。”

你的头有些晕。你走到阳台外,太阳已经在城市上空升起。你的目光从屋顶投向广阔的乡村。服务器之林向各个方向延伸,发出很低的嗡嗡声,等待终极算法的到来。护卫沿着道路移动,从数据宝藏中取出金子。西边很远的地方,土地被信息之海占据,散布着船只。你抬头看终极算法的旗帜,现在可以清晰地看到在五角星中的铭文:

P=ew·nZ

你想知道这到底有什么含义。

马尔科夫逻辑网络

2003年,我开始思考如何将逻辑和概率统一起来,我的学生马特·理查森也加入进来。一开始我们进展甚微,因为我们正试图利用贝叶斯网络来完成这件事,而它们的固定形式——变量的严格顺序、依据父母对孩子进行的有条件分布——与逻辑的灵活性不相容。但在平安夜的前一天,我意识到有一个好很多的办法。如果我们切换到马尔科夫网络,可以利用任何逻辑公式作为马尔科夫网络特征的模板,这样就可以把逻辑和图解模型统一起来了。看看我们怎么做到的。

回想一下,马尔科夫网络是由特征的加权和来定义的,这一点很像感知器。假设我们有一些人类的图片,随机拿起一张,然后依据它的特征来算出概率,例如,“这个人有白头发”、“这个人年纪大了”、“这个人是一个妇女”等。在感知器中,我们利用一个门槛值来使这些特征的加权和通过,以决定比如,这个人是不是你的祖母。在马尔科夫网络中,我们会做一点不一样的事(至少乍一看是这样的):我们对加权和进行指数化,将其变成因素的一个产物,而且该产物是从这批图片中选定某张指定照片的概率,不管你的祖母在不在这张照片里。如果你有许多老年人的照片,那么特征的权值就会上升;如果他们中的多数人都是男人,那么“这个人是一个妇女”的权值就会下降。特征可以是我们想要的任何东西,使马尔科夫网络变成一种很灵活的代表概率分布的方法。

实际上,我撒谎了:因素的产物还不是概率,因为所有图片出现的概率加起来一定等于1,而且不能保证所有图片的因素产物都会这样。我们需要使它们正常化,这就意味着通过它们所有的总和来划分每个产物。那么所有正规化产物的总和就可以保证是1,因为它仅仅是一个由自己划分的数字。那么一张照片的概率就是它的特点的权值和,经过了指数化和正规化。如果你回头看五角星中的等式,你可能会微微懂得它的含义。P是一个概率,w是权值的一个向量,n是数字的向量,而它们的点积“·”被Z指数化和划分,Z是所有产物的总和。如果我们让第一个组成部分n为1,如果图片的第一特征不是真就是零等,那么w·n也仅仅是我们一直以来谈论的、特征权值总和的速记方法。

因此根据马尔科夫网络,等式会给出图片(或者随便别的东西)的概率。但它比那更概括,因为它不仅仅是马尔科夫网络的等式,而是马尔科夫逻辑网络的等式,正如我们称呼它的那样。在马尔科夫逻辑网络(MLN)中,数字n不一定只是0或者1,而且它们不指代特征——它们指代逻辑公式。在第八章的结尾部分,我们看到自己如何超越马尔可夫网络到达关联模型,这些模型依据特征模型而不只是模型来定义。“爱丽丝和鲍勃都患有流感”是特定于爱丽丝和鲍勃的特点。“X和Y都有流感”是一个特征模型,可以和爱丽丝和鲍勃、爱丽丝和克里斯等其他任意两人实例化。特征模型很有力量,因为它可以利用单个短表达式来概括几十亿甚至更多的特征。但我们需要正式的语言来定义特征模型,而我们有一个可轻易得到的语言——逻辑。

一个MLN只是一组逻辑公式及其权值。当应用到特定组的实体时,在这些实体可能状态的基础上,它定义了马尔可夫网络。例如,如果实体是爱丽丝和鲍勃,可能的状态就是爱丽丝和鲍勃是朋友,爱丽丝患有流感,鲍勃也一样。让我们假设MLN有两种公式:“每个人都患有流感”和“如果某些人患有流感,那么他们的朋友也患有流感”。在标准逻辑中,这就是一对毫无用处的陈述:第一个陈述会排除所有陈述,即使是包含一个健康人的陈述也会被排除;而第二个就会变得多余。但在MLN中,第一个公式仅仅意味着有一个特征对于每个人X来说“X患有流感”,和公式一样有相同的权值。如果人们可能有流感,公式就会有较高的权值,相应的特征也会有。有很多健康人的陈述的可能性,会比有少量健康人的陈述要小,但也不是不可能。第二个公式,“某些人患有流感,而他们的朋友没有”,这个陈述的可能性要比健康人和受感染人群朋友群不一样的陈述的可能性要小。

这时可能你已经猜到n在终极算法中代表什么:它的第一个组成部分是陈述中第一个公式真实实例的数量,第二个是第二个真实实例的数量,以此类推。如果我们在观察一个有10个朋友的小组,而他们当中有7个人患有流感,那么n的第一个组成部分就是7,以此类推(如果7/20,而不是7/10的朋友有流感,难道概率不应该不一样吗?是的,不一样,因为有Z)。在极限情况下,如果我们让所有权值趋于无穷大,马尔可夫逻辑就会简化为标准逻辑,因为违背公式的单个实例,会引起概率暴跌至0,使陈述变得不可能。在概率方面,当所有公式讨论单个话题时,MLN会简化为马尔可夫网络。因此马尔可夫逻辑包含逻辑和马尔可夫网络两个特殊案例,而这是我们过去寻找的统一效果。

掌握MLN意味着发现世界上真实存在的公式要比随机因素预测出的频率要高,并且需要弄明白那些公式的权值:公式使它们的预测概率与它们的观察频数相匹配。一旦我们掌握了MLN,就可以利用它来回答诸如“如果鲍勃和爱丽丝是朋友,而且爱丽丝患有流感,那么鲍勃患有流感的概率是多少”此类问题。你猜怎么着?原来概率是由S形曲线提供的,该曲线应用于特征的加权和,这和多层感知器很相似。而包含长串规则的MLN可以表示深度神经网络,在规则串中,每层会有一个链接。

当然,不要因为上文提到的简单MLN预测了流感而被其欺骗。想象一下用MLN诊断和治愈癌症。MLN代表细胞状态下的概率分布。细胞的每个部分、每个细胞器、每条代谢途径、每个基因及白细胞,在MLN中都是一个实体,而MLN的公式会对它们之间的差别进行编码。我们可以询问MLN:“这个细胞癌变了吗?”然后利用不同的药物对它进行调查,看看会发生什么。我们还没有这样一个MLN,但在本章后面我会设想它会产生。

总的来说,我们到达的统一学习算法利用MLN作为表示方法,利用后验概率作为评估函数,利用与梯度下降结合的基因搜索作为优化器。如果我们愿意,可以轻易地利用其他准确度测量方法来代替后验概率,或者利用爬山法来代替遗传搜索。我们上升到一座高峰,现在我们可以享受风景了。但是,我不会那么轻率地将这个学习算法称作终极算法。一方面,布丁的味道好不好,吃了才知道,而且虽然过去10年这种算法(或者它的变化版本)已经成功应用于许多领域,但还是有许多领域没有应用到它,因此还不清楚它的一般用途。另一方面,它还有一些重要的问题没有解决。在看这些问题前,让我们先看看它能做什么。

从休谟到你的家用机器人

你可以从alchemy.cs.washington.edu这个网站下载我刚才描述的学习算法。用“炼金术”来为它命名是为了提醒我们,虽然它取得了成功,但机器学习仍然处于科学的炼金术阶段。如果把它下载下来,你会看到它包含的东西要比我描述过的基础算法多得多,但是它也缺少几个我之前说的通用学习算法该有的东西,比如交叉。虽然如此,为了简单,让我们利用“炼金术”来指代我们的备用通用学习算法。

炼金术解决了休谟的原始问题,方法就是除了数据,要拥有其他的输入东西:你的原始知识,依据一组逻辑公式,有还是没有权值。公式可能不一致、不完整甚至完全错误,学习以及概率推理行为会关照那件事。关键点在于炼金术不必从零开始学习。实际上,我们甚至可以用炼金术来让公式保持不变,然后只对权值进行学习。在这种情况下,给予炼金术恰当的公式可以将其变成玻尔兹曼机、贝叶斯网络、实例学习算法以及许多别的模型。这解释了为什么虽然存在“天下没有免费的午餐”的定理,但可以有通用学习算法。更确切地说,炼金术就像一台归纳图灵机,我们可以对图灵机进行编程,使其行动起来像非常有力量的或者受到极大限制的学习算法,这取决于我们。炼金术为机器学习提供统一物,就像互联网为计算机网络、关联模型为数据库,或者图形用户界面为日常应用提供统一物那样。

当然,虽然你使用的炼金术没有原始工具(而且你可以),这并不会让它不包含知识。形式语言、评分函数、优化器会暗自对关于世界的猜想进行编码。因此可以自然地问我们是否有比炼金术更通用的学习算法。当进化从第一个细胞开始它的长途之旅,一直到当今所有的生命形式时,进化会做出什么假设?我认为有一个简单的假设,所有其他的假设都会遵循这个假设:学习算法是世界的组成部分。这就意味着,学习算法作为一种实体系统,和它的环境一样会遵循相同的规律,无论这个规律是什么,我们都已经暗暗“知道”它,并做好准备去发现它。在接下来的部分中,我们会看到这个规律具体意味着什么,以及如何在炼金术中体现它。就目前而言,我们注意到,它可能是我们能回答的休谟问题中最好的答案:一方面,假设学习算法是世界的组成部分是一种猜想——原则上是这么说,因此它满足休谟的宣言,认为学习仅适用于先验知识;另一方面,这是一个多么基础而且难以反驳的猜想,也许这就是我们对于世界所需要的所有东西。

在另一个极端,知识工程师——机器学习最坚定的批评者——有好的理由来喜欢炼金术。不用基本模型结构或者几次大概的猜想,炼金术可以导入一个大型、细致的装配知识基地(如果它可用)。因为概率规则与确定性规则相比,互动的方式更为丰富,所以手工编码的知识在马尔科夫逻辑中会更深入。马尔科夫逻辑中的知识基地不一定要首尾一致,它们可以变得很大并容纳许多不同的主要因素而不会崩溃——这是一个目前为止让知识工程师迷惑的目标。

虽然如此,很多时候炼金术会解决机器学习中每个学派钻研了很久的问题。让我们反过来看看它们是什么。

符号学家结合运算中不同碎片的知识,这和数学家结合公理来证明定理是一个道理。这和神经网络和其他有固定结构的模型迥然不同。炼金术利用逻辑来完成这件事,正如符号学派所做的那样,却是一个迂回曲折的过程。为了证明逻辑中的定理,你需要发现产生该定理的公理应用的唯一顺序。因为炼金术从可能性的角度谈到其实它要做得更多:找到公式的多重序列,引出定理或者它的否定面,然后对它们进行权衡,以计算出定理真实的概率。这样它能推理的不仅与数学共性有关,还可以推理在一则新闻报道中的“总统”指的是不是“巴拉克·奥巴马”,或者一封邮件该在哪个文件夹之下。符号学派的主算法——逆向演绎,假定新的逻辑规则,用于作为数据与预期结论之间的步骤。炼金术通过爬山法来介绍新的规则,以原始规则作为开始,与原始规则和数据相结合,构建使结果概率更大的规则。

关联学派模型的灵感来源于大脑,S形曲线的网络与神经元相对应,它们之间的加权关联对应的是突触。利用炼金术,如果两个变量在某个公式中一起出现,那么它们就被联结在一起,考虑到近邻,一个变量的概率就是一条S形曲线(我不会解释为什么,这是我们在前面部分看到的主算法的直接结果)。联结学派的主算法是反向传播,他们利用它来弄清楚哪个神经元负责哪些误差,并根据它们的权值来进行调整。反向传播是梯度下降的一种形式,炼金术用它来优化马尔科夫逻辑网络权值。

进化学派利用遗传算法来模仿自然选择。遗传算法包含假设的“人口”,在每一代中,适应能力最强的会进行交叉和变异,以生产下一代。炼金术以加权公式的形式来维持假设的“人口”,在每一步中以不同的方法对它们进行改变,然后把那些最能提高数据(或者一些其他的评分函数)后验概率的变量留下。如果人口是一个单一假设,这就简化为爬山法了。当前炼金术的开源实施并不包含交叉,但这就是一个简单的加法。进化学派的主算法是遗传编程,应用交叉和突变于计算机程序上,以子集树的形式表示出来。子集树可以用一组逻辑规则来表示,Prolog编程语言就是这么做的。在Prolog中,每个规则与一个子集对应,而它前面的规则是它称呼的子集。因此我们可以将带有交叉的炼金术当作利用Prolog相似编程语言的遗传编程,这样会有一个额外的优势——规则可以是概率性的。

贝叶斯学派相信模拟不确定性是学习的关键,并利用形式表示方法如贝叶斯网络和马尔科夫网络来工作。正如我们已经看到的那样,马尔科夫网络是MLN的特殊类型。贝叶斯网络利用MLN主算法也可以轻易表示出来,一个特征对应一个变量及其起源的每个可能状态,而相应条件概率的算法则作为它的权值(然后归一化常数Z就便利地简化为1,意味着我们可以忽略它)。贝叶斯的主算法是贝叶斯定理,执行的方法是利用概率推理算法,比如置信传播和MCMC。正如你已经注意到的那样,贝叶斯定理是主算法的特例,包含P=PAB),Z=P(B),而特征和权值对应PA)和PBA)。炼金术系统包含置信传播和MCMC用于推理,推广至处理加权逻辑公式。将概率推理用于对逻辑提供的证明路线上,炼金术为支持或者反对结局来权衡证据,并输出结局的可能概率。这与符号学派利用的“单纯功能”逻辑相反,该逻辑不是全有就是全无,因此当给定矛盾证据时,该逻辑就会崩溃。

类推学派的学习方法是假设有已知相似属性的实体,也会有相似的未知属性:拥有相似症状的病人也会有相似的诊断,过去喜欢买某类书的读者可能未来还会买同样的书,等等。MLN可以代表具有像“拥有相同品位的读者会买相同的书”公式的实体之间的相似性。爱丽丝和鲍勃买到的相同的书越多,他们越可能有相同的品位;(将相同的公式应用于相反方向中)如果鲍勃买一本书,爱丽丝也买这本书的概率就比较大。他们的相似性由他们有相同品位的概率来表示。为了使这一方法真正起作用,对于相同规则的不同实例,我们可以有不同的权值:如果爱丽丝和鲍勃都买了某本罕见的书,这包含的信息量也许会比他们购买畅销书的信息量大,因此应该有更高的权值。在这种情况下,相似度由我们计算的属性是离散的(买或者不买),但我们也可以在连续属性之间表示相似度,就像两座城市之间的距离一样,方法就是让MLN把这些相似性当作特点。如果评估函数是一个边际风格评分函数,而不是后验概率,结果就是支持向量机的概括版,也就是类推学派的主算法。我们的主学习算法面临的更大挑战是复制结构地图,这是类比更强大的类型,可以从这个域(比如太阳系)推断到另外一个域(原子)。我们可以通过学习公式来做到这一点,这些公式不会指代源域中的任何特定关系。例如,“抽烟的人的朋友也抽烟”讲的是友谊和抽烟,但“相关的实体有相似的属性”适用于任何关系和属性。我们可以通过概括“朋友的朋友也抽烟,专家的同事也是专家”来掌握它,还有在社交网络中其他这样的模式,然后将其应用到诸如网页之类的地方,包含像“有趣的网页会链接到有趣的网页”这样的实例,或者应用于分子生物学中,包含像“与蛋白质调控互动的蛋白质也会调控基因”这样的实例。我的小组的研究人员和其他人已经完成所有这些事,接着还会做更多。

炼金术也可以启动我们在第八章提到的5种无监督学习。显然,它会进行关系学习,实际上,这就是它很多已应用的地方。炼金术利用逻辑来代表实体之间的关系,以及用马尔科夫网络来使它们自己变得不确定。我们可以将炼金术变成强化学习算法,方法就是利用奖励环绕它,并利用它来掌握每种状态的值,这和传统强化学习算法利用的方法一样,比如神经网络。我们可以在炼金术内部进行组块,方法就是添加一种新的运算,这种运算会将一串串的规则变成单个规则(例如,“如果A那么B,如果B那么C,如果A那么C”)。一个带有单个未观察到变量(且该变量与所有可观察变量相联结)的MLN会进行聚类(未观察到变量是这样一个变量:我们从未在数据中见过它的值,是“隐藏的”,可以这么说,只能通过推断得出)。包含一个以上未观察到变量的MLN,通过由可观察变量(数量更多)推断那些变量(数量更少)的值的方法,来进行离散降维。炼金术也可以利用连续未观察到变量来处理MLN,这些变量会在诸如主要成分分析、等距映射的过程中用到。因此,原则上说,炼金术可以做所有我们让机器人罗比做的事,或者至少所有我们在本书中讨论过的事。的确,我们已经利用炼金术来让机器人掌握其所在环境的地图,通过它的传感器弄明白哪里是墙、哪里是门,以及它们的角度和距离等,这是制造称职家用机器人的第一步。

最终,我们可以将炼金术变成一种元学习算法,比如通过将个体分类器编码成MLN来进行堆叠,添加公式或者学习公式以将它们结合起来。这就是DAPRA在其个性化学习助手(PAL)项目中所做的。PAL是DARPA历史上最大型的人工智能工程,也是Siri的祖先。PAL的目标是构建自动化秘书。它利用马尔科夫逻辑来作为其支配一切的表示方法,将来自不同模块的输出融合到该做什么的最终决定中。这也允许PAL的模块通过追求统一意见来彼此互相学习。

目前炼金术最大的应用在于从网络中学习语义网络(或者谷歌所谓的知识图谱)。一个语义网络就是一组概念(就像行星与恒星)以及这些概念中的关系(行星环绕恒星)。炼金术会通过从网页中提取的事实(例如,地球绕着太阳转)来掌握100万个以上这样的模式。它会独自发现诸如行星之类的概念。我们之前使用过的版本,比我在此已经描述过的基本版要先进,但基本思想是一样的。各式各样的研究已经利用炼金术或者他们自己的MLN执行工具来解决自然语言处理、计算机视觉、动作识别、社会网络分析、分子生物学及其他许多领域中的问题。

尽管成功了,炼金术还是有一些明显的不足之处:它还没有真正扩展到大数据,而一些在机器学习领域没有博士学位的人会发现它很难使用。因为这些问题,它还没有准备就绪,让我们看看能对它们做些什么。

行星尺度机器学习

在计算机科学中,如果一个问题没能得到有效解决,它就没有真的得到解决。如果你不能在可用时间和记忆内完成一件事,那么知道这件事怎么做并没有多大用处,因为在你处理MLN时,这些时间和记忆会消耗得很快。通常我们利用数百万的变量和数十亿的特征来对MLN进行学习,但这并不像表面看起来的那么大规模,因为变量的数量会随着MLN中实体的数量迅速增长——如果你有一个包含1000人的社交网络,你就已经拥有100万对可能的朋友,以及10亿个“朋友的朋友是朋友”公式的实例。

炼金术中的推理是逻辑与概率推理的结合。前者通过证明定理来完成,后者则通过置信传播、MCMC以及我们在第六章中见过的其他方法来完成。我们将两者结合至概率定理证明中,统一推理算法可以计算任意逻辑公式的概率,是当前炼金术系统的关键部分。但在计算法方面,它需要的很多。如果你的大脑利用概率定理证明,那么一只老虎会在你没来得及想明白如何逃离时就把你吃掉,这就是马尔科夫逻辑一般性的高昂代价。你的大脑在真实世界中已经进化,必须对额外的猜想进行编码,这样有利于它进行有效推理。在过去几年中,我们已经开始弄清楚它们可能是什么,并将其编码入炼金术。

这个世界并不是由随意杂乱的相互关系组成的,它有等级结构:星系、行星、大陆、国家、城市、社区、你的家、你、你的头、你的鼻子、其顶部的细胞、它里面的细胞器、分子、原子、亚原子粒子。那么模拟世界的方法会用到MLN,也有等级结构。这是一个猜想的例子,学习算法和环境都相似。MLN不需要知道,基于假定,世界由哪些部分组成。炼金术要做的,就是假设世界有若干个组成部分,然后将这些部分找出来。这很像一个刚做好的书架,假设有若干书,但还不知道哪些书会放在书架上。等级结构有助于使推理更易于处理,因为世界的子部分更多的是会与同部分的子部分互动,比如,邻居彼此之间的交流会多于与其他国家人民的交流,由同一个细胞产生的分子也会更多地与那个细胞的其他分子进行反应。

另外一个使学习和推理变得更容易的属性,就是存在于世界的实体不会以任意形式出现。它们会分成不同的类别和子类别,来自同一等级的成员之间的相似性会大于来自不同等级成员之间的相似性。有生命的或者无生命的,动物或者植物,鸟类或者哺乳类,人类或者非人类,如果我们知道与当前问题相关的所有特质,就可以将所有这些特质以及可以节省很多时间的实体合在一起。像以前那样,MLN不用知道基于假定的世界上的类别是什么,它可以通过分级聚类来从数据中掌握这些类别。

世界包含各个部分,而每个部分又属于不同类别,将这些部分和类别结合起来,这样使炼金术中的推理变得易于处理所需要的东西就已经基本齐全。我们可以掌握世界的MLN,方法就是将其分解成若干部分和子部分(这样多数互动关系就存在于同一部分的子部分之间),然后将各个部分集合成类别和子类别。如果世界是一个乐高玩具,那么我们将其分解为一块块“砖”,记住哪块和哪块相连,然后通过形状和颜色来将“砖块”集合起来。如果这个世界是维基百科,我们可以将它谈论的实体抽取出来,将它们集合成类别,然后学习类别之间如何相互关联。如果某人问我们:“阿诺德·施瓦辛格是动作明星吗?”我们可以回答:“是的,因为他是明星,而且他在动作片里。”渐渐地,我们能够学习越来越大规模的MLN,直到去做我的一位谷歌朋友称作“世界范围的机器学习”的事:同时模拟世界上的每个人,数据会不断流入,答案则不断流出。

当然,如此规模的学习需要的不仅是直接执行我们见过的算法。例如,除这一点之外,单个处理器还不足够,我们得在许多服务器上分配学习。工业和学术界的研究人员已经深入调查,例如,如何并行使用多台计算机来进行梯度下降,其中一个选择就是在处理器之间划分数据,另外一个就是划分模型的参数。在每个步骤之后,我们将结果整合起来,然后重新分配工作。不管怎样,在不让交流成本压倒你,或者不让结果的质量受困扰的情况下完成这件事,做到这一点绝非易事。另外一个问题就是,如果你有无数数据串要输入,那么你在实现某些决定之前,不能等着看数据。一个解决办法就是利用采样原理:如果你想预测谁会赢得下一届总统选举,就不必问每个选民会投给谁,几千个人的样本已经足够(如果你愿意接受一点不确定)。诀窍就是把这个推广到拥有几百万个参数的复杂模型中。但我们只能通过这样的方法做到一点,即在每一步中尽量从数据流中举例子,因为我们要十分肯定自己做了正确的决定,并且所有决定的不确定性保持在允许范围内。利用这种方法,我们就可以在有限的时间内从无限数据中学到东西,就像我在一篇提议这种方法的论文中提及的那样。

大数据流系统是塞西尔·德米尔机器学习的产品,拥有数千个服务器,而不是数千个附加设备。在最大型的项目中,只要把所有数据汇集起来、验证数据、清除数据、将数据处理成学习算法能消化的形式,这样做,建造金字塔就简单得像在公园散步一样。

欧洲的“未来信息和通信技术”项目旨在建造整个世界(真正含义即是字面意思)的模型。社会、政府、文化、技术、农业、疾病、全球经济等不能落下一样。这当然还不成熟,但它却预示着未来要发生的事。同时,像这样的项目可以帮助我们找到可扩展性的极限在哪里,以及如何克服这些极限。

计算复杂性是一件事,人类复杂性是另外一件事。如果计算机就像白痴专家,那么学习算法有时会遇到少年天才乱发脾气的情况,这也是那些能征服他们的人类会收获颇丰的原因之一。如果你知道以专业的手法调整控制旋钮,直到到达恰当的位置,那么魔法就会随之而来,以一连串超越学习算法年份见解的形式出现。

而且,和德尔斐神谕并无两样的是,解释学习算法的宣言本身需要大量的技能。虽然如此,如果转错手柄,学习算法可能会涌出一系列胡言乱语,或者在反抗中保持沉默。不幸的是,就这一点而言,炼金术并不比多数算法好。把你知道的用逻辑的形式写下来、输入数据、按下按钮才是好玩的部分。当炼金术返回准确而有效的MLN时,你会去酒吧庆祝;当它不返回时——很多时候会出现的状况——战争就开始了。问题存在于知识、学习、推理中吗?一方面,因为学习和概率推理,简单的MLN可以做复杂程序能做的事。另一方面,当它不起作用时,调试起来就困难很多。解决办法就是让它更加交互,有能力进行反省,并解释它的推理。这就会让我们向终极算法更加靠近一步。

医生马上来看你

治愈癌症的方法是一种能够输入癌症基因组,并输出杀死癌细胞药物的程序。我们现在可以想象,这样的程序(就叫它“CanceRx”)会长什么样。尽管外表上看起来简单,CanceRx是编出的程序中规模最大也是最复杂的程序,的确太大了,所以它只能在机器学习的辅助下建立。它的基础是一个关于活细胞如何运转的详细模型,人体内的每种细胞都会有一个子类别,还有关于细胞如何互动、支配一切的模型。该模型以MLN或者与其相似的形式,将分子生物学的知识与来自DNA测序仪、微阵列,以及其他许多来源的大量数据结合起来。有些数据通过手动进行编程,但大部分是从生物医学文献中提取出来的。模型会不断进化,并将新实验的结果、数据来源、患者病历合并起来。最后,它就掌握每种类型人体细胞中的每条路线、调节机制、化学反应,这就是人体分子生物学的总和。

CanceRx会将其大部分时间用于搜索包含备选药物的模型。考虑到新药,该模型会预测药物对癌细胞和正常细胞的效果。当爱丽丝被诊断为癌症时,CanceRx会利用她的正常细胞和肿瘤来将它的模型实例化,并尝试所有可能的药物,直到它找到一种能杀死癌细胞而又不伤害健康细胞的药物。如果它找不到有效药物或者有效药物组合,那么它就会着手研发一种会治愈癌症的药,也许会利用爬山法或者交叉法来让它从现有的药物中发展起来。它会在研究中的每一步中,在模型上尝试备选药物。如果药物抑制了癌症,但仍然有一些有害的副作用,CanceRx会尝试调整它以摆脱副作用。在癌症变异前,模型就能预测可能的变异,CanceRx就会开出那些能在中途扼杀癌变异细胞的药物。在人性与癌症这场象棋游戏中,CanceRx将是将军。

请注意机器学习不会独自把CanceRx给我们。这不像我们有一个巨大的分子生物学数据库整装待发,将这个数据库输入终极算法,弹出来的是活细胞的完美模型。在多次交互作用下,CanceRx可能是无数生物学家、肿瘤医生、数据科学家进行世界范围内合作的最终结果。然而,最重要的是,CanceRx会在医生和医院的协助下,从几百万个癌症病人中整合数据。没有数据,我们就无法治愈癌症;有了它,就能治愈癌症。为整个不断壮大的数据库做贡献,这不仅是每个病人的利益,还是它的伦理责任。在CanceRx的世界中,离散的临床实验是过去的事情。CanceRx提出的新治疗方法也正在继续被推出,如果这些治疗方法起作用,则会用到更广范围的病人身上。在经过改善的良性循环中,成功和失败的经历都会为CanceRx的学习提供宝贵的数据。如果你以某种方式看待它,机器学习可能只是CanceRx工程的一小部分,仅次于数据收集和人类贡献。但如果以别的方式看待它,机器学习就是整个企业的关键。没有它,我们只能掌握癌症生物学的零碎知识,散落在数千个数据库和数百万篇科学文章中,每个医生只会注意一小部分。将所有这些知识集中成一个连贯整体,这超出了不受协助的人类的能力,无论人类多么聪明,只有机器学习才能做到这件事。因为每种癌症都不一样,它让机器学习找到通用模式。而且因为单个组织会产生几十亿个数据点,这就需要机器学习来弄明白能为每个新病人做点什么。

现在人们已经在努力建造最终会成为CanceRx的东西。在系统生物学的新领域中的研究员会模拟整个代谢网络,而非个体基因和蛋白质。位于斯坦福的一个团队已经构建了整个细胞的模型。全球基因组学与健康联盟推动数据在研究员和肿瘤学家之间的分享,着眼于大规模分析。癌症联盟会(Cancer Commons.org)收集癌症模型,让病人集中他们的病历,然后从相似例子中学习。基础医学(Foundation Medicine)查明病人肿瘤细胞中的变异,然后开出最合适的药物。10年前,人们不知道癌症是否可以或者如何被治愈,现在我们就能看到如何做到这一点。路还很长,但我们已经找到路了。