A few useful things to know about machine learning
有关机器学习的一些有用的知识
以分类器为例,但是讨论的问题可以广泛应用于其他机器学习方法。
Learning = Representation+Evaluation+Optimization
-
Representation
所谓 Representation,就是假设空间,即该模型可能学习的分类器集。相类似的说法比如如何表示我的输入,或者说使用什么特征?
-
Evaluation
评估函数,或者说目标函数,用于区分分类器的好坏。为了便于优化和讨论的问题的不同,算法内部使用的评估函数可能与我们希望的分类函数不同。
-
Optimization
一种在分类器中搜寻最佳分类器的方法。
以上三个部分中,每个部分都有很多的选择,很多文章按照 Representation 进行组织,但是这个三个部分同样重要。
It’s Generalization that Counts
基本目标是泛化训练集之外的内容。最基本的划分数据集的方法是 hold out 和 cross-validation。
cross-validation 有助于减轻数据量不足的影响。
使用测试数据调整模型超参数同样可能引发数据污染。
我们只能使用训练误差来代替测试误差(泛化误差),因为我们无法使用泛化数据。
Data Alone Is Not Enough
no free lunch,如果考虑所有的可能,那么所有的算法在平均意义的性能上都是相同的。即没有一个算法能够在所有的问题上都表现得最好。因此任何有效的学习器都需要先验知识或者假设。
因此,选择哪一种 Representation 的标准之一就是那种哪一种知识可以在其中表达。
Overfitting Has Many Faces
一种理解过拟合的方法是将泛化误差分解为偏差和方差,偏差是指学习器持续学习相同的错误的倾向,方差是指无论真实数据如何,学习器学习随机事物的倾向。
通常偏差对应着欠拟合,因为模型无法从数据中学习到规律,这是一种系统性错误。
方差对应着过拟合,因为模型对于数据集中的小波动过于敏感,学习到了其中的随机噪声。
偏差和方差就像杠杆的两端,降低其中一个总是代表着另一个的上升。
一些防止过拟合的方法:
-
Cross-Validation:可以帮助选取超参数,但如果过度使用,其本身也可能导致过拟合。
-
Regularization term:为损失函数添加正则项,可以对模型的复杂度进行惩罚,从而训练出更加简单的模型,有助于提高模型的泛化能力。
一种常见的误解是:过拟合来自于噪声,例如训练样本被错误的分类。这种错误确实会加剧过拟合,但是没有噪声同样也会发生过拟合。
Intuition Falls In High Dimensions
维数诅咒,随着数据维度(特征数量)的增长,泛化正确性的难度指数级增大,这是因为对于一个固定大小的训练集,只能覆盖输入空间中的一部分,随着维度的增加,输入空间变得无比巨大,导致训练集只能覆盖整个输入空间的一小部分,这意味着算法必须从有限的数据中泛化出整个输入空间的规则,这对模型的要求非常高,极容易发生过拟合。
如果多个维度的特征是相关的,即非独立的特征虽然不会让输入空间变得很大,但是在这样的高维中,会有更多的示例变得相似,即他们分别在某几个特征上呈现相似性,此时如果我们选择的 Representation 存在缺陷,例如对于有一百个相关的特征输入的样本,每次使用两个特征考察其相似性,就可能出现在很多个相似样本中随机选取的形式,进而导致模型呈现出一随机行为。
因此我们基于三维世界的直觉或先验假设,可能并不适用于高维空间。
有人可能会觉得提供更多的特征不会有什么坏处,最多这些特征不提供任何信息,但实际上更多的特征带来的好处可能会被唯独诅咒抵消。
样本的不均匀性可以在一定程度上抵消维数诅咒,样本并不是均匀的分布在整个输入空间中,而是集中在低维流形附近,学习器可以隐式的利用这个较低的有效维度,或者使用显式降低维度的算法。
Theoretical Guarantees Are Not What They Seem
对于演绎的结论我们通常可以给出确切的保证,但是对于归纳的结果,我们只能给出概率的保证。
这一节说的是些什么东西?
Feature Engineering Is The Key
如果你有很多独立的并且和类别关联的很好的特征,学习就会很容易。
通常原始数据不适合学习,但是可以从其中构建特征,这通常是大部分的工作所在。
机器学习不是构建数据集和运行学习器的一次性过程,而是运行学习器、分析结果、修改数据和(或)学习器并重复的迭代过程。
特征工程通常是特定于某个领域的。
某些看起来不相关的特征可能组合起来就会变得相关,但是使用大量的特征会让学习变得困难并且具有过拟合的风险,因此人在特征工程中的作用是不可替代的。
More Data Beats a Clever Algorithm
根据经验,具有大量数据的愚蠢算法会击败具有少量数据的聪明算法。
机器学习的三个瓶颈:数据、内存和时间。现在普遍认为时间,即学习速度是最大的瓶颈。
使用更聪明的算法得到的回报总是小于预期,因为从初步近似来看他们在做相同的事情。
学习器可以分为两个主要类型:
-
具有固定大小的 Representation,如线性模型
-
Representation 随数据增长,如决策树
后者被称为非参数学习器,但是通常他需要学习更多的参数。
聪明的算法可以充分利用可用数据和计算资源。
Learn Many Models, Not Just One
不同的应用场景有不同的学习者,一些包含多种不同学习者的系统也开始出现,实际上结合多种变体的系统往往会有更好的结果,而且不必付出过多的努力。
模型聚合的基本方法有三种:
-
bagging:Bootstrap Aggregating,通过有放回的抽样从原始训练集中生成多个不同的训练集,对每个新的训练集训练一个学习器,分类结果进行投票,回归结果取平均了。这种方法在轻微增加偏差的基础上有效的减少了方差。
-
boosting:按顺序训练分类器,每个分类器都尝试纠正前一个分类器的错误。:
-
初始时,所有训练样本赋予同样的权重。
-
每次训练一个分类器,根据前一个分类器的表现调整训练样本的权重,错误分类的样本将获得更高的权重。
-
根据分类器准确率的不同给与不同的权重,最终的预测是基于加权多数投票或加权平均。
该方法可以减少模型的偏差,但会增加方差。
-
-
stacking:训练多层模型,在第一层中训练多个不同的基模型,第二层使用第一层每一个模型的输出,训练一个更高级别的模型,以更好地结合第一层模型的输出。
需要注意的是,不应该将模型的集成单纯的等价于贝叶斯平均(bayesian model averaging, BMA),贝叶斯平均是对假设空间中的所有模型独立预测的结果进行平均,并根据学习器对训练集的解释程度或我们的先验知识对其进行加权。而模型集成改变了学习器的假设空间。
对于加权的形式,贝叶斯平均往往遵循固定的形式,这可能导致其加权结果分布极端。
Simplicity Does Not Imply Accuracy
很多文章中指出,在同样的训练误差下,更见的模型具有更小的泛化误差,但实际上存在很多反例,例如一个 boosting 集成的模型,在训练误差到达零之后仍然可以通过增加学习器数量来降低泛化误差。
与直觉不同的是,模型的参数的数量和过拟合趋势之间并没有必然联系。
另一种更加复杂的观点认为,复杂性和假设空间的大小是等同的,具有更小的假设空间的模型可使用更短的代码实现,这种模型更加的简单,从而具有更强的泛化能力。
这里存在一个循环论证:我们根据先验知识设计了我们偏好的假设,使其变得简单,基于简单的假设建立了简单的模型,简单的模型在这个任务上表现良好,我们得出结论,“简单的模型泛化的更好”。然而,这可能是因为我们选择的简单模型刚好与我们设计的简单假设相匹配,从而得到了较好的模型表现。而不是因为模型简单而得到较好的表现。
简单的模型模型表现的更好这个论证结果可能是由于我们的设计的简单假设,而不是因为简单的模型,只是模型刚好匹配了简单的假设。
之所以应该优先考虑简单的假设,是因为简单本身就是一种美德,而不是因为简单的假设与准确性相关。
Representable Does Not Imply Learnable
通常我们认为,一种函数是可以被表示的,或者可以被一种表示精确近似。
但是可表示不等于可学习,例如当决策树的叶子数量多于训练样本时,它是无法训练的。在一个线性空间中,表示一个简单的函数也可能需要无限多的原语组件,甚至可能评估函数在假设空间中有多个局部最优值,导致我们学习到的不是目标函数的真实表示。
Correlation Does Not Imply Causation
相关并不代表因果,这是一个老生常谈的问题。
一方面,预测模型的目标是将其作为行动指南,另一方面,相关是潜在因果关系的标志。