首先,这份讲义的核心目的,是回答所有机器学习新手最困惑的三件事:第一,为什么有的模型在训练数据上表现极好,一用就崩;第二,我们到底该选简单模型还是复杂模型;第三,我们到底需要多少数据才能保证模型学出来是可靠的。
讲义最开头讲的是偏差和方差的权衡,这是整个机器学习最核心的矛盾。当我们用模型去拟合一组数据时,比如用特征去预测房价,会出现三种完全不同的情况。第一种情况,我们用的模型太简单,比如强行用一条直线去拟合本来弯曲的数据,这时候模型根本抓不住数据真正的趋势,它的预测从根上就是错的,就算给再多数据,它也学不对,这种错误来自模型本身太简单、太僵硬,无法表达真实规律,我们把这种错误叫做偏差大,对应的现象就是欠拟合,欠拟合的问题不是没学好,而是模型根本没有能力学好。第二种情况,我们用的模型太复杂,比如用一条弯来弯去的曲线强行穿过每一个训练点,看起来训练误差几乎为零,好像完美极了,但这其实是模型把训练数据里的随机波动、噪音、偶然情况全部记下来了,而不是学到了普遍规律,这样的模型遇到新数据就会完全不准,因为它记住的是这一组特定数据的巧合,而不是真实规律,这种错误来自模型太灵活、太容易被数据带偏,我们把它叫做方差大,对应的现象就是过拟合。第三种情况,模型复杂度刚刚好,既能抓住整体趋势,又不会被个别点带偏,这时候偏差不大,方差也不大,泛化能力最强。所以我们永远要在偏差和方差之间找平衡,模型太简单偏差大,模型太复杂方差大,这就是为什么我们不能一味追求模型复杂,也不能一味用最简单的模型。
接下来讲义进入学习理论的正式内容。讲义先做了两个基础铺垫,这两个铺垫虽然简单,但后面所有结论都靠它们。第一个铺垫是,从概率上我们知道,如果我们重复做某件事很多次,那么观察到的平均结果会越来越接近真实结果,比如抛硬币,抛得越多,正面出现的比例就越接近真实概率,样本越多,估计越准。第二个铺垫是,只要样本数量足够大,我们在训练集上观察到的错误率,就可以信任,用来代表模型在真实世界里的错误率,这是后面所有推理的基础。
也就是说,样本越多,模型在训练集上的错误率就与真实世界里的错误率越接近,也就是我们更有把握根据模型在训练集上的表现来选出在真实世界表现最好的模型
然后讲义明确了两个最关键的定义,我给你讲得非常清楚。第一个叫训练误差,就是模型在你给它的训练数据上犯了多少错,比例是多少,这个值是我们能直接算出来的。第二个叫泛化误差,这是我们真正关心但看不见的东西,它代表模型在未来遇到的、从来没见过的新数据上会犯多少错,机器学习的目标不是训练误差小,而是泛化误差小。在这里特别强调一个核心前提:这个假设类最多能完美分开多少个数据点,不管这些点怎么贴标签,它都能分对,否则所有理论都不成立,这也是为什么我们在实际项目里必须保证训练数据和真实场景一致。
接下来讲义讲经验风险最小化,这是几乎所有机器学习算法的底层逻辑。所谓经验风险最小化,意思就是:我们把所有可能的模型放在一起,组成一个集合,这个集合叫假设类,然后我们在这个集合里找那个训练误差最小的模型,把它当作我们最终选出来的模型。比如线性分类,假设类就是所有可能的直线;神经网络,假设类就是所有可能的网络结构和参数组合。我们平时训练模型、调参、跑梯度下降,本质上都是在做经验风险最小化。
一个假设类就是一个模型所有不同参数的所有组合,也就是说当我们改变模型的参数时,这个模型也就变成了另一个模型,这无限个参数组合就构成了无限个模型,而这个无限个模型的集合就是“假设类”
讲义接下来先讲有限假设类的情况,也就是假设类里只有有限个模型可选,这种情况最简单:首先,对假设类里任意一个固定模型来说,只要训练数据足够多,它的训练误差就会非常接近泛化误差。但我们不只关心一个模型,我们关心假设类里所有模型,因为我们要从中选一个最好的,所以我们需要保证所有模型的训练误差都同时接近泛化误差,这件事在学习理论里叫一致收敛。一致收敛的意思是,只要数据够多,没有任何一个模型会出现 “训练误差很好,泛化误差很差” 的欺骗性情况。一旦一致收敛成立,我们就可以放心大胆地用经验风险最小化选模型,因为选出来的模型,泛化误差最多也就比假设类里最好的模型差一点点,不会差太多。讲义在这里还给出了一个非常重要的结论:假设类越大,也就是可选模型越多,我们需要的训练数据就越多,因为模型越多,就越有可能出现某个模型碰巧在训练集上表现好但泛化很差,所以需要更多数据来 “压住” 这种可能性。
也就是说,本来训练误差和泛化误差是两个不同的指标,我们没法知道泛化误差,但我们真正关心的又是泛化误差。当训练数据足够多时,训练误差≈泛化误差,那么我们就可以直接选择训练误差最小的模型来代替泛化误差最小的模型,二者的差距也不会太大。而参数越多,假设类越多,需要的训练样本就越多,但每个模型的参数组合都是无限多的(就算是最简单的线性回归都是无限多的参数组合),怎么办,下面给出答案。
因为现实中我们用的线性模型、逻辑回归、神经网络,都有无限多组参数,也就是无限多个模型。这时候不能直接用有限个模型的结论,于是讲义引入了整个学习理论里最重要的一个概念,叫做VC 维。VC 维是用来衡量一个假设类有多强、有多复杂的指标,它的定义是:这个假设类最多能完美分开多少个数据点,不管这些点怎么贴标签,它都能分对。比如二维平面上的直线,最多能完美分开三个点的任何标签组合,但分不了四个点,所以它的 VC 维是 3。
VC 维的意义在于,它不看模型有多少参数,只看模型的实际表达能力,这就避免了参数个数不同但能力一样的模型被误判。如果一个假设类的 VC 维是有限的,那么只要训练数据量和 VC 维成正比,也就是模型能力越强需要的数据越多,一致收敛就一定会成立,训练误差就会可靠地接近泛化误差,我们选出来的模型就一定是可信的。换句话说,VC 维告诉我们,模型复杂度不是看参数多少,而是看它能打散多少点,而需要多少数据,也由 VC 维决定。
简而言之,模型的复杂度取决于VC维的大小,VC维越大,模型越复杂,假设类越大,所需要的样本量越多
VC维的大小是取决于超参数,而不是参数,超参数是人为调节的,是决定模型复杂度的
最后,讲义把所有内容收束到偏差方差权衡上,形成完整闭环。当我们扩大假设类,选用更复杂的模型时,假设类里最好的模型会更好,也就是偏差会降低,因为更复杂的模型能表达更复杂的规律;但同时,VC 维会变大,需要更多数据,一致收敛的保证会变弱,也就是方差会变大,更容易过拟合。反过来,缩小假设类,用简单模型,方差变小,不容易过拟合,但偏差会变大,可能欠拟合。所以我们所有的模型选择、超参数调节、正则化使用,本质上都是在控制假设类的大小,在偏差和方差之间找最优平衡点。
复杂的模型VC维大,能够拟合更复杂的规律,但是要想通过训练集来选择最优模型就需要更多的样本量;简单的模型VC维小,用少量的样本就可以选出最优模型,但对规律的拟合能力差。如果你用简单的模型去拟合训练集发现最好的模型的表现都不尽人意,说明这个模型没法去拟合现实规律。而如果你用复杂的模型在训练集上效果特好,一换到测试集就不行,说明你没能选出泛化误差最小的模型,这时候就需要简化模型(超参数调整、增加数据量、减少特征数量等)
如何指导实践呢?
当我们发现模型在训练集表现差劲时,也就是说在假设类中选出的最好的模型都没法在训练集达到很好的效果,那么这说明这个假设类VC维太小,复杂度太小,需要增加复杂度(增加特征、调节超参数、换模型);
当我们发现模型在训练集表现很好,但在测试集表现很差时,说明利用训练集选出来的最佳假设类与真实世界的最佳模型不是同一个,也就是数据量太少了,这时候应该增加训练集数据量;当没法增加数据量时,就需要减少VC维以使假设类大小符合当前样本量,比如减少特征、调节超参数、换更简单的模型等。
