作者:华校专
作者信息:
华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。
编者按:
算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!
模型选择
一、泛化能力
为了评估机器学习算法的能力,必须给定其性能的衡量指标。
- 如:翻译任务中,应该衡量整个翻译结果的准确率,还是衡量每个单词翻译的准确率?
- 如:密度估计任务中,很多模型都是隐式地表示概率分布。此时计算样本空间某个点的真实概率是不可行的,因此也就无法判断该点的概率估计的准确率。
通常利用最小化训练误差来训练模型,但是真正关心的是测试误差。因此通过测试误差来评估模型的泛化能力。
- 训练误差是模型在训练集的平均损失,其大小虽然有意义,但是本质上不重要。
- 测试误差是模型在测试集上的平均损失,反应了模型对未知测试数据集的预测能力。
模型对未知数据的预测能力称作模型的泛化能力,它是模型最重要的性质。
泛化误差可以反映模型的泛化能力:泛化误差越小,该模型越有效。
假设训练集和测试集共同的、潜在的样本分布称作数据生成分布,记作 。则泛化误差定义为模型的期望风险,即:
- 通常泛化误差是不可知的,因为无法获取联合概率分布 以及无限的采样点。
- 现实中通常利用测试误差评估模型的泛化能力。由于测试数据集是有限的,因此这种评估结果不完全准确。
统计理论表明:如果训练集和测试集中的样本都是独立同分布产生的,则有 模型的训练误差的期望等于模型的测试误差的期望 。
机器学习的“没有免费的午餐定理”表明:在所有可能的数据生成分布上,没有一个机器学习算法总是比其他的要好。
- 现实中特定任务的数据分布往往满足某类假设,从而可以设计在这类分布上效果更好的学习算法。
- 这意味着机器学习并不需要寻找一个通用的学习算法,而是寻找一个在关心的数据分布上效果最好的算法。
正则化是对学习算法做的一个修改,这种修改趋向于降低泛化误差(而不是降低训练误差)。
- 没有免费的午餐定理说明了没有最优的学习算法,因此也没有最优的正则化形式。
二、过拟合、欠拟合
当使用机器学习算法时,决定机器学习算法效果的两个因素:降低训练误差、缩小训练误差和测试误差的差距。
这两个因素对应着机器学习中的两个主要挑战:欠拟合和过拟合。
过拟合overfitting
:选择的模型包含的参数过多,以至于该模型对于已知数据预测得很好,但是对于未知数据预测的很差,使得训练误差和测试误差之间的差距太大。
- 过拟合的原因是:将训练样本本身的一些特点当作了所有潜在样本都具有的一般性质,这会造成泛化能力下降。
- 过拟合无法避免,只能缓解。因为机器学习的问题通常是
NP
难甚至更难的,而有效的学习算法必然是在多项式时间内运行完成。如果可以避免过拟合,这就意味着构造性的证明了P=NP
。
欠拟合underfitting
:选择的模型包含的参数太少,以至于该模型对已知数据都预测的很差,使得训练误差较大。
欠拟合的原因一般是学习能力低下造成的。
通过调整模型的容量capacity
可以缓解欠拟合和过拟合。
2.1 模型容量
通过选择不同的假设空间可以改变模型的容量。
模型的假设空间指的是:代表模型的函数集合。这也称作模型的表示容量representational capacity
。
由于额外的限制因素(比如优化算法的不完善),模型的有效容量effective capacity
一般会小于模型的表示容量。
通常在模型的假设空间中出最佳的函数是非常困难的优化问题,实际应用中只是挑选一个使得训练误差足够低的函数即可。
统计学习理论提供了量化模型容量的方法,其中最出名的是VC
维理论:训练误差与泛化误差之间差异的上界随着模型容量增长而增长,随着训练样本增多而下降 。
虽然VC
维理论对于机器学习算法有很好的指导作用,但是它在深度学习很难应用。原因有二:
- 难以确定深度学习的容量。由于深度学习模型的有效容量受限于优化算法,因此确定深度学习模型的容量特别困难。
通常泛化误差是关于模型容量的 U
形函数。随着模型容量增大:
2.2 缓解过拟合
缓解过拟合的策略:
具体内容参考深度学习《正则化》章节。
- 数据集增强:通过人工规则产生虚假数据来创造更多的训练数据。
- 噪声注入:包括输入噪声注入、输出噪声注入、权重噪声注入。将噪声分别注入到输入/输出/权重参数中。
- 早停:当验证集上的误差没有进一步改善时,算法提前终止。
正则化 :基于结构化风险最小化(SRM
)策略的实现,其中 为正则化项。
在不同的问题中,正则化项可以有不同的形式:
- 回归问题中,损失函数是平方损失,正则化项是参数向量的 范数。
2.3 缓解欠拟合
三、偏差方差分解
3.1 点估计
点估计:对参数 的一个预测,记作。
假设 为独立同分布的数据点,该分布由参数 决定。则参数 的点估计为某个函数:
注意:点估计的定义并不要求 返回一个接近真实值 。
3.2 偏差
一组服从均值为,方差为 的高斯分布的独立同分布样本。
3.3 一致性
通常希望当数据集的大小 m 增加时,点估计会收敛到对应参数的真实值。即:
表示依概率收敛。即对于任意的,当 时,有:
上述条件也称做一致性。它保证了估计偏差会随着样本数量的增加而减少。
渐近无偏不一定意味着一致性。
如:在正态分布产生的数据集中,可以用 作为 的一个估计。
- 它是无偏的,因为 ,所以不论观测到多少个数据点,该估计都是无偏的
3.4 方差
估计量的方差记作,标准差记作 。
它们刻画的是:从潜在的数据分布中独立的获取样本集时,估计量的变化程度。
估计量的方差随着样本数量的增加而下降,这是所有估计量的共性。
例:均值估计 ,其标准差为:
其中是样本 的真实标准差,但是这个量难以估计。实际上
和 都不是真实标准差 的无偏估计,这两种方法都倾向于低估真实的标准差。
实际应用中, 是一种比较合理的近似估计,尤其是当较大的时候。
3.5 误差诊断
高偏差对应于模型的欠拟合:模型过于简单,以至于未能很好的学习训练集,从而使得训练误差过高。
此时模型预测的方差较小,表示预测较稳定。但是模型预测的偏差会较大,表示预测不准确。
高方差对应于模型的过拟合:模型过于复杂,以至于将训练集的细节都学到,将训练集的一些细节当做普遍的规律,从而使得测试集误差与训练集误差相距甚远。
此时模型预测的偏差较小,表示预测较准确。但是模型预测的方差较大,表示预测较不稳定。
误差诊断:通过训练误差和测试误差来分析模型是否存在高方差、高偏差。
如果训练误差较高:说明模型的方差较大,模型出现了欠拟合。
如果训练误差较低,而训练误差较高:说明模型的偏差较大,出现了过拟合。
如果训练误差较低,测试误差也较低:说明模型的方差和偏差都适中,是一个比较理想的模型。
如果训练误差较高,且测试误差更高:说明模型的方差和偏差都较大。
上述分析的前提是:训练集、测试集的数据来自于同一个分布,且最优误差较小。否则讨论更复杂。
3.6 误差缓解
高方差和高偏差是两种不同的情况。如果算法存在高偏差的问题,则准备更多训练数据其实没什么卵用。
所以首先要清楚:问题是高偏差还是高方差还是二者兼有。
- 使用更先进的最优化算法。该策略通常在神经网络中使用。
增加更多的训练数据。它通过更多的训练样本来对模型参数增加约束,会降低模型容量。
如果有更多的训练数据,则一定会降低方差。
使用正则化。它通过正则化项来对模型参数增加约束,也会降低模型容量。
有时候更多的训练数据难以获取,只能使用正则化策略。
通常优先解决高偏差的问题。这是最低标准,要反复尝试,直到训练误差降低到足够小。然后试图降低方差。
总之就是不断重复尝试,直到找到一个低偏差、低方差的模型。
四、参数估计准则
4.1 最大似然估计
假设数据集
样本独立同分布地由 产生,但是该分布是未知的。
是一族由 参数控制的概率分布函数族,希望通过 来估计真实的概率分布函数 ,也就是要估计 参数。
在某些条件下,最大似然估计具有一致性。这意味着当训练样本数量趋向于无穷时,参数的最大似然估计依概率收敛到参数的真实值。这些条件为:
a. 真实分布 必须位于分布函数族 中;否则没有估计量可以表示 。
b. 真实分布 必须对应一个 值;否则从最大似然估计恢复出真实分布 之后,也不能解出参数 。
最大似然估计具有很好的统计效率statistic efficiency
。即只需要较少的样本就能达到一个良好的泛化误差。
当样本数量太少导致过拟合时,正则化技巧是最大似然的有偏估计版本。
4.2 贝叶斯估计
在最大似然估计中,频率学派的观点是:真实参数 是未知的固定的值,而点估计 是随机变量。因为数据是随机生成的,所以数据集是随机的。
在贝叶斯估计中,贝叶斯学派认为:数据集是能够直接观测到的,因此不是随机的。而真实参数 是未知的、不确定的,因此 是随机变量。
对 的已知的知识表示成先验概率分布 :表示在观测到任何数据之前,对于参数 的可能取值的一个分布。
在机器学习中,一般会选取一个相当宽泛的(熵比较高)的先验分布,如均匀分布。
贝叶斯估计会使得概率密度函数向着先验概率分布的区域偏移。
当训练数据有限时,贝叶斯估计通常比最大似然估计泛化性能更好。
当训练样本数量很大时,贝叶斯估计往往比最大似然估计计算代价较高。
五、泛化能力评估
模型泛化能力的评估:用测试集对模型进行评估。通常有下列方法:
K
折交叉验证法cross validation
。
5.1 留出法
留出法:直接将数据切分为三个互斥的部分(也可以切分成两部分,此时训练集也是验证集),然后在训练集上训练模型,在验证集上选择模型,最后用测试集上的误差作为泛化误差的估计。
数据集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。若训练集、验证集、测试集中类别比例差别很大,则误差估计将由于训练/验证/测试数据分布的差异而产生偏差。
如:在分类任务中至少要保持样本的类别比例相似。如果从采样的角度来看到数据集的划分过程,则保留类别比例的采样方式称作“分层采样“(strafified sampling
)。
即使进行了分层采样,仍然存在多种划分方式对数据集进行划分(比如排序后再划分、随机划分...)。这些不同的划分将导致不同的训练集/验证集/测试集。因此单次留出法得出的估计结果往往不够稳定可靠。
在使用留出法时,往往采用若干次随机划分、重复进行实验评估后,取平均值作为留出法的评估结果。
5.2 K 折交叉验证
K
折交叉验证法:数据随机划分为K
个互不相交且大小相同的子集,利用 K-1
个子集数据训练模型,利用余下的一个子集测试模型(一共有 种组合)。
对 K
种组合依次重复进行,获取测试误差的均值,将这个均值作为泛化误差的估计。
与留出法相似,将数据集划分为 K
个子集同样存在多种划分方式。为了减少因为样本划分不同而引入的差别, K
折交叉验证通常需要随机使用不同划分重复p
次,这 p
次 K
折交叉验证的测试误差均值作为最终的泛化误差的估计。
5.3 留一法
留一法:假设数据集中存在 N 个样本,令 K=N 则得到了 K
折交叉验证的一个特例。
优点:由于训练集与初始数据集相比仅仅少一个样本,因此留一法的训练数据最多。
缺点:在数据集比较大时,训练 N 个模型的计算量太大。
六、训练集、验证集、测试集
6.1 训练集
6.2 验证集
- 大多数机器学习算法具有超参数,超参数的值无法通过学习算法拟合出来(比如正则化项的系数、控制模型容量的参数 )。
- 为了解决这个问题,可以引入验证集。将训练数据分成两个不相交的子集:训练集用于学习模型,验证集用于更新超参数。
- 通常要求验证集足够大。如果验证集很小,那么模型的超参数可能就记住了一个小验证集里的样本,模型将对验证集严重过拟合。
- 验证集通常会低估泛化误差。因此当超参数优化完成后,需要通过测试集来估计泛化误差。
6.3 测试集
测试集用于评估模型的泛化误差。理论上测试集越大,则模型的泛化误差评估的越准确。
测试集中的样本一定不能是训练样本。如果将训练样本放入测试集中,则会低估泛化误差。
测试集通常用于对模型的预测能力进行评估,它提供了模型预测能力的无偏估计。
如果你不需要对模型预测能力的无偏估计,则不需要测试集。
验证集用于超参数的选择,它无法提供模型预测能力的有偏估计。
因为模型依赖于超参数,而超参数依赖于验证集。因此验证集参与了模型的构建,这意味着模型已经考虑了验证集的信息。
6.4 拆分
- 如果未设置验证集,则将数据三七分:70% 的数据用作训练集、30% 的数据用作测试集。
- 如果设置验证集,则将数据划分为:60% 的数据用作训练集、20%的数据用过验证集、20% 的数据用作测试集。
对于大批量数据,验证集和测试集占总数据的比例会更小。
对于百万级别的数据,其中1万条作为验证集、1万条作为测试集即可。
验证集的目的就是验证不同的超参数;测试集的目的就是比较不同的模型。
a. 一方面它们要足够大,才足够评估超参数、模型。
b. 另一方面,如果它们太大,则会浪费数据(验证集和训练集的数据无法用于训练)。
在k
折交叉验证中:先将所有数据拆分成 k
份,然后其中1
份作为测试集,其他k-1
份作为训练集。
这里并没有验证集来做超参数的选择。所有测试集的测试误差的均值作为模型的预测能力的一个估计。
使用k
折交叉的原因是:样本集太小。如果选择一部分数据来训练,则有两个问题:
a. 训练数据的分布可能与真实的分布有偏离。k
折交叉让所有的数据参与训练,会使得这种偏离得到一定程度的修正。
b. 训练数据太少,容易陷入过拟合。k
折交叉让所有数据参与训练,会一定程度上缓解过拟合。
6.5 分布不匹配
深度学习时代,经常会发生:训练集和验证集、测试集的数据分布不同。
如:训练集的数据可能是从网上下载的高清图片,测试集的数据可能是用户上传的、低像素的手机照片。
- 必须保证验证集、测试集的分布一致,它们都要很好的代表你的真实应用场景中的数据分布。
- 训练数据可以与真实应用场景中的数据分布不一致,因为最终关心的是在模型真实应用场景中的表现。
如果发生了数据不匹配问题,则可以想办法让训练集的分布更接近验证集。
一种做法是:收集更多的、分布接近验证集的数据作为训练集合。
另一种做法是:人工合成训练数据,使得它更接近验证集。
该策略有一个潜在问题:你可能只是模拟了全部数据空间中的一小部分。导致你的模型对这一小部分过拟合。
当训练集和验证集、测试集的数据分布不同时,有以下经验原则:
确保验证集和测试集的数据来自同一分布。
因为需要使用验证集来优化超参数,而优化的最终目标是希望模型在测试集上表现更好。
确保验证集和测试集能够反映未来得到的数据,或者最关注的数据。
当训练集和验证集、测试集的数据分布不同时,分析偏差和方差的方式有所不同。
如果训练集和验证集的分布一致,那么当训练误差和验证误差相差较大时,我们认为存在很大的方差问题。
如果训练集和验证集的分布不一致,那么当训练误差和验证误差相差较大时,有两种原因:
a. 第一个原因:模型只见过训练集数据,没有见过验证集的数据导致的,是数据不匹配的问题。
b. 第二个原因:模型本来就存在较大的方差。
为了弄清楚原因,需要将训练集再随机划分为:训练-训练集
、训练-验证集
。这时候,训练-训练集
、训练-验证集
是同一分布的。
a. 模型在训练-训练集
和 训练-验证集
上的误差的差距代表了模型的方差。
b. 模型在训练-验证集
和 验证集上的误差的差距代表了数据不匹配问题的程度。
可以在 本公众号后台 回复关键词:“ DS ”获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!
—— 完 ——
文章须知
文章作者:华校专
责任编辑:周岩 Logic 征帆
审核编辑:阿春
微信编辑:Logic
本文由『运筹OR帷幄』原创发布
如需转载请在公众号后台获取转载须知