踩坑系列 | 机器学习老手不会轻易告诉你的12件事儿
编译 | AI科技大本营(微信搜索rgznai100,获取更多干货内容)
参与 | 彭硕 刘畅
编辑 | 明明
机器学习是人工智能的核心,而机器学习的算法是其最重要的武器。机器学习算法可以从例子中归纳出执行重要任务的重要方法,这种方法不仅可行还可节约成本,随着可用的数据越来越多,我们就可以利用其解决更多的问题,因此,机器学习在计算机科学和其他领域中都得到了广泛的运用。
尽管如此,开发出成功的机器学习应用程序还需要大量的“黑科技”,而这些是在课本中找不到的。华盛顿大学的Pedro Domingos教授发表的一篇题为《关于机器学习你需要知道的一些事儿》的科技论文,总结了机器学习研究人员和实践者所学习到的12个重要的经验教训,包括要避免的陷阱、要关注的重要问题以及常见问题的答案等等。营长找到了对这篇科技论文的一个解读文章,并将主要内容翻译如下。
▌1. 学习=表示+评价+优化
所有的机器学习的算法通常包括三个组成部分:
表示:一个分类器必须用计算机能够处理的一些正式语言来表示。相反,为学习者选择一种表示方式就等同于选择一组可以学习的分类器。这个集合被称为学习者的假设空间。如果一个分类器不在假设空间中,它就不能被学习。一个相关的问题是:如何表示输入,比如使用哪种特征。
评价:要区分好的分类器和坏的分类器,需要一个评价函数。算法内部使用的评估函数与分类器外部使用的评价函数可能不同,其主要是为了便于优化,以及下一节中我们要讨论的问题。
优化:最后,我们需要在语言的分类器中找到得分最高的一种方法。优化技术的选择是提高学习者效率的关键,同时也有助于确定分类器的评价函数是否具有多个最优值。初学者开始的时候使用现成的优化器是很常见的,不过这些优化器会被专门设计的优化器取代。
▌2 . 泛化起着举足轻重的作用
机器学习的基本目标是泛化训练集中的例子。这是因为,无论我们有多少数据,我们都不太可能在测试时再次遇到一模一样的例子。在训练集上做得很好很容易,机器学习初学者最常见的错误是,对训练数据进行测试之后以为自己成功了。之后把选择的分类器放在新数据上测试,发现还没有随机猜测的准确。所以,如果你雇了一个人来构建一个分类器,一定要保留一些数据用来测试他们给你的分类器。相反,如果你已经被雇佣来构建一个分类器,那么在开始的时候将一些数据放在一边,最后用它来测试你选择的分类器,也就是最后在全部数据的基础上学习你的最终分类器。
▌3. 只有数据是不够的
把泛化当成目标还有另一个重要的后果:不管你有多少数据,只有数据本身是不够的。
这似乎是一个令人沮丧的消息。那么我们怎么能学到东西呢?幸运的是,我们想要在现实世界中学习的函数并不是由所有数学上可能的函数集合而来。事实上,一般的假设(比如平滑、具有相似的类(class)的相似例子、有限的依赖关系,或者有限的复杂性)通常都能很好地完成,这也是为什么机器学习如此成功的一个重要原因。像演绎法一样,归纳法(学习者所做的)是一个知识杠杆:它将少量的输入知识转化为大量的输出知识。归纳是一种比演绎更强大的杠杆,用较少的输入知识来产生有用的结果,但它仍然需要输入知识大于零才能工作。和任何杠杆一样,我们投入的越多,我们就能得到更多。
现在回想起来,学习知识的必要性并不令人惊讶。机器学习并不是魔法,它不能无中生有。它所做的是从很少的东西中学到更多。和所有的工程一样,编程也有很多工作要做:我们必须从头开始构建一切。学习更像是一种耕作,它可以让大自然完成大部分的工作。农民把种子和营养结合起来种植作物。学习者将知识与数据结合起来,以发展项目。
▌4 . 过拟合有多样性
如果我们所拥有的知识和数据不足以完全确定正确的分类器,那该怎么办?那样我们就会冒着产生幻觉的风险(或者一部分),这不是基于现实的,只是在数据中随机编码。这个问题被称为“过拟合”,是机器学习的难题。当学习者输出的分类器在训练数据上能达到100%准确度,但在测试数据上却只有50%的准确率,而实际上它在两个数据集上的输出结果都能达到75%的准确率,这就是我们所说的过拟合。
机器学习中的每个人都知道过拟合,但它的形式多种多样,而且也不会立即变得明显。理解过拟合的一种方法是将泛化误差分解为偏差和方差。偏差是一种学习者倾向于不断地学习同样的错误;方差是不管实际信号是什么,学习随机事物的倾向。线性学习者有很高的偏差,因为当两个类之间的边界不是一个超平面的时候,学习者就无法归纳它。决策树不存在这个问题,因为它们可以表示任何布尔函数,但另一方面,它们可能会受到高方差的影响:由相同现象产生的不同训练集的决策树通常是非常不同的,实际上它们应该是一样的。
交叉验证可以帮助对抗过拟合,例如通过使用它来选择决策树的最佳大小来学习。它不是万金油,因为如果我们用它来做太多的参数选择,它本身就会开始过拟合。
除了交叉验证,还有很多方法可以对抗过度拟合。最受欢迎的是在评价函数中添加一个正则化项。例如,它可以对具有更大结构的分类器进行惩罚,从而倾向于较小的结构,进而避免过拟合。另一种选择是,在添加新结构之前执行像卡方这样的统计显著性测试,以确定这个类的分布是否真的不同于这种结构。当数据非常稀缺时,这些技术尤其有用。虽然如此,你应该对某种技术能解决所有过度拟合问题的说法表示怀疑。想要避免过拟合(方差)很简单,我们可能会掉入另一个极端也就是欠拟合(偏差)。想要同时躲开这个两个错误需要我们学习一个完美的分类器,并且在事先不知道它的情况下没有任何一种方法总是能做到最好(世上没有免费的午餐)。
▌5 . 高维度中直觉不再好用
说完过拟合的问题,接下来要谈的是机器学习中的最大的问题——维度的诅咒。这一表达是1961年Bellman提出的,指的是许多在低维度上工作正常的算法在输入是高维度的时候变得难用。但在机器学习中,这里包含的更多。随着示例的维度数(特征数量)的增长,泛化变得更加困难,因为固定大小的训练集覆盖了输入空间的一小部分。
高维的普遍问题是,我们的直觉是来自于三维世界,通常并不适用于高维的情况。在高维的情况下,一个多变量高斯分布的质量并不在平均值附近,而是在一个越来越远的“壳”周围。高维度的橙色的体积大部分是在皮肤上,而不是在果肉上。如果一个常数的例子在高维超级立方体里均匀地分布,在多维度的情况下,大多数例子更接近于超立方体的一个面而不是它们最近的邻居。如果我们用一个超立方体来近似一个超球体,在高维度中几乎所有的超立方体的体积都在超球面之外。这对机器学习来说是个坏消息,其中一种类型的形状通常被另一种类型的形状所近似。
在二维或三维空间中构建一个分类器很容易:通过视觉检查我们可以找到一个不同类别的例子之间的合理的界限。但在高维度中,很难理解发生了什么。这就使得设计一个好的分类器变得困难。有些人们可能会天真的认为收集更多的特性并没有坏处,他们认为即使是最坏的情况,他们没有提供关于这个类的新信息而已。但事实上,它们的好处可能被维度的诅咒所抵消。
▌6 . 理论保证通常与实际情况不一样
机器学习的论文充满了理论保证。最常见的类型是为了确保良好的泛化所需要的示例数量。如何去看待这些理论保证呢?首先,要注意的是这些都是可能的。归纳法传统上与演绎法形成鲜明对比,在演绎法中你可以保证结论是正确的。在归纳法中所有的赌注都被取消了,这其实是许多世纪以来的传统智慧。近几十年来最重要的发展之一是我们认识到事实上我们可以保证归纳结果,特别是如果我们愿意接受概率担保。
我们要小心这个界限意味着什么。例如,它并没有说,如果你的学习者返回了一个与特定训练集一致的假设,那么这个假设很可能泛化的很好。它所说的是,如果有足够大的训练集,那么你的学习者可能会返回一个泛化很好的假设或者无法找到一个与训练集一致的假设。这个界限也没有说明如何选择一个好的假设空间。它只告诉我们,如果假设空间包含真正的分类器,那么学习者输出坏分类器的概率就会随着训练集的大小而减少。如果我们缩小假设空间,约束就会得到改善,但它包含真正的分类器的可能性也会减小。
另一种常见的理论保证是渐近的:有了无限的数据,学习者就可以输出正确的分类器。这是让人安心的,但由于它的渐近保证,在选择学习者的时候就会显得轻率。在实践中,我们很少处于渐近状态(也被称为“不对称”)。由于前面讨论过的偏差-方差权衡,如果给了无限的数据之后,学习者A比B更好,那么在给了有限数据的情况下,通常学习者B比A要更好。
在机器学习中,理论保证的主要作用不是作为实际决策的标准,而是作为算法设计的理解和驱动力的来源。在这种能力下,它们非常有用,事实上,理论与实践的密切互动是机器学习多年来取得长足进步的主要原因之一。不过需要注意的是:学习是一种复杂的现象,仅仅因为学习者既有理论上的依据又在实践中工作并不意味着前者是后者的原因。
▌7. 特征工程是关键
最终来看,有些机器学习项目能成功,而有些却失败了。那是什么造成了这样的差异?显而易见,最重要的原因应该是使用特征的方式。如果你有许多独立的特征,而其中每一个都和这一类相关联,这种情况下学习起来很容易。相反,如果这个类是一个关于特征非常复杂的函数,那就可能无法学习它。通常情况下,原始数据不是可以直接用于学习的形式,但是可以从中构建特征。这通常是机器学习项目中需要花费大部分时间的地方。它往往也是最有趣的部分之一,因为可以发现数据直觉、创造力和“黑科技”与纯技术性东西是同等重要。
常常令初学者感到惊讶的是,在机器学习项目中,研究机器学习算法花费的时间是非常少的。但是,如果你考虑了收集,整合,清理和预处理数据的时间,以及在设计特征上很多次尝试和失败的时间,那你就不会对之前的现象感到惊讶。
另外,机器学习中建立数据集和训练模型的过程不是一次性的,而是包含训练模型,分析结果,修改数据和(或)模型并重复迭代的过程。训练通常是花费时间最少的部分,但那是因为我们已经很好掌握了其中的技巧!而特征工程就显得更加困难,因为它具有很强的针对性,而模型在很大程度上是可以通用的。但是,两者之间没有明显的界限,这也是为什么能促进知识整合的模型才是最有用的模型。
▌8. 数据比算法更重要
在大多数计算机科学中,两种主要的有限资源是时间和内存。在机器学习中,还有第三种:训练数据。哪一种资源会成为计算机科学发展的瓶颈,年复一年,一直在变化。在20世纪80年代,这种瓶颈往往是数据。而在今天,却是时间。我们有大量可用的数据,却没有足够的时间来处理它,所以这些成为了没用的数据。这产生了一个悖论:即使原则上有更多的数据意味着可以训练更复杂的分类器,而实际上更简单的分类器才能被广泛使用,因为训练复杂的分类器需要很长的时间。这个悖论的部分答案是想出一种快速训练复杂分类器的方法,事实上在这个方向的确已经出现了显著的进展。
使用那些比期望回报更小的智能算法的部分原因是为了更加拟合数据,而所有的智能算法都做同样的事情。当你认为表征规则集和神经网络不同时,会令人感到惊讶。但事实上,规则项很容易被编码为神经网络,而在其他表征之间也存在类似的关系。所有的模型算法本质上的工作都是通过将近似的样例分组到同一个类,他们之间关键的区别在于如何定义“近似”。在数据是非均匀分布的状态下,模型会产生大量不同的边界,同时在重要的区域(即具有大量训练样例的那些区域,也是大多数测试样例可能会出现的区域)中也做出相同的预测。这也有助于解释为什么强有力的训练可能是不稳定的,但结果仍然准确。
通常,首先尝试最简单的学习模型(例如,朴素贝叶斯,k-最近邻)是值得的。虽然更复杂的模型更具诱惑力,但他们通常难以使用,因为如果你想获得好的结果,你需要踩更多的坑,而且这类模型的算法细节通常是不透明的。
模型可以分为两大类:具有固定大小的表征,如线性分类器;以及可以随数据一起增长的表征,如决策树。固定大小的学习器只能利用一定的数据。原则上可变大小的学习器可以在给定足够数据的情况下拟合任何函数,但实际上由于算法或计算成本的限制,他们可能达不到这一效果。而且,由于数据维度带来的灾难,现有的数据量根本还不够。出于这些原因,如果你愿意付出努力的话,那些能充分利用数据和计算资源的智能算法,往往会得到相应的回报。设计学习器和学习分类器之间没有明显的界限,相反,任何给定的知识都可以编码在学习器中或从数据中学到。所以在机器学习项目中,设计学习器往往会成为其中重要的部分,而从业者需要具备一定的专业知识。
▌9. 训练不止一个模型
在机器学习发展的早期阶段,每个研究者都有自己最喜欢的学习模型,并有一些先验的理由去相信它的优越性。在尝试很多不同方法上做了大量的努力,并选择了结果最好的一个。然而系统的经验比较表明,应用对象不同,最好的学习模型也是有所不同,而且包含许多不同学习器的系统开始出现。现在努力尝试许多学习器的许多变体,选择结果最好的一个。但随后研究人员注意到,如果不是选择去找到最佳变体,而是融合许多变体,结果通常是要好得多。而且对研究人员来说没有额外的工作量。
现在,创建这样的模型融合是机器学习标准化流程。最简单的融合技术,称为套袋(bagging),我们通过重新采样简单地生成训练集的随机变化,分别学习一个分类器,并通过投票策略来融合结果。这种方法是有效的,因为它大大降低了模型的方差,而只是稍微增加了偏差。在Boosting算法中,训练样例有权重,而且这些都是不同的,所以每个新的分类器都集中于前面那些往往会出错的样例上。在stacking算法中,单个分类器的输出是“更高级”学习器的输入,这个学习器需要计算出如何最好地组合它们。
也存在许多其他的技术,而总体趋势是越来越大的模型融合。在Netflix prize比赛中,来自世界各地的团队争相构建最佳视频推荐系统。随着比赛的进行,参数团队发现把他们自己的学习器和其他小组的结合起来,并且再与其他组合并为更大的模型,能取得最好的成绩。冠军和亚军都是融合了100多个学习器,而将两只队伍的学习模型再一融合,能进一步提高成绩。毫无疑问,将来我们会看到更大的学习模型。
▌10 . 简单并不意味着准确
奥卡姆剃刀定律阐明,如无必要,无增实体。在机器学习中,这通常意味着,给定两个具有相同训练错误的分类器,两者中较简单的可能具有最低的测试错误。有关这一说法的证据在文献中经常出现,但事实上有很多反例,“天底下没有免费的午餐”定理也暗示它不可能是真的。
我们在前一节看到一个反例:模型融合。即使在训练误差已经达到零之后,通过添加分类器,增强融合模型的泛化误差仍然在不断提高。因此,与直觉相反,一个模型的参数数量与其过度拟合倾向之间没有必然的联系。
其实,更复杂的观点是将复杂性等同于假设空间的大小,因为较小的空间允许假设由较短的符号表示。像上面有理论保证的那部分界限就可以被认为是在暗示更短的假设能更好地概括。这可以通过给空间中的假设分配更短的符号来进一步论证,这些空间我们是有先验偏好的。但是,把这看作准确性和简单性之间权衡的“证据”,就会是循环推理:我们做出假设,人们喜欢更简单的设计,如果它们是准确的,那就是因为我们的偏好是准确的,而不是因为在我们选择的表征方式上假设是“简单的”。
▌11. 可表征不意味着可学习
本质上,所有用于可变规模学习器的表征都与“每个函数都可以用这样的表征方式来表示或近似”的定理相关。基于此的理论保证,热衷于表征方式的研究者经常忽视所有其他的部分。但是,仅仅因为一个函数可以表征并不意味着它可以被学习。例如,标准的决策树学习器不能比具有训练样例的决策树学习更多。在连续的空间中,使用一组固定的原语来表示简单的函数通常需要无限数量的内容。
另外,如果假设空间具有许多评价函数的局部最优值,那么往往是这样,即使学习器具有表征能力,也可能找不到真正的函数。对于有限的数据,时间和内存,标准的学习模型只能学习所有可能函数的一小部分,而这些子集对于具有不同表征能力的学习器是不同的。因此,关键的问题不是“能否表现出来”,这个问题的答案往往是无关紧要的,而是“能否学习它?”,也值得去尝试不同的学习器(并可能是把它们结合起来)。
▌12. 相关性并不意味着因果关系
研究人员经常指出一点,相关性并不意味着因果关系,因此这也许是不值得的。但是,尽管我们所讨论的那种学习器只能学习相关性,但他们的结果往往被视为可以表示因果关系。这不是错的吗?如果是的话,那么为什么人们要这样做呢?
而事实往往是,学习预测模型的目标是用它们作为策略的指南。如果发现啤酒和尿布经常在超市同时被购买,那么也许把啤酒放在尿布部分旁边就会增加其销量。但是实际上很难说清楚相关实验。与实验数据不同的是,机器学习通常应用于预测变量不受学习器控制的观测数据。虽然一些学习算法可能会潜在地从观测数据中提取因果信息,但是它们的适用性会受到限制。另一方面,相关性是潜在的因果关系的一个标志,我们可以将它作为进一步研究的指导。
作者 | James Le