2.4 过拟合与欠拟合
在理解了监督学习的总体框架之后,下面介绍一些其他的相关概念。
训练损失(training loss):Ltrain=L(f,Xtrain,Ytrain)是对于训练数据集的损失函数,其中Xtrain,Ytrain称为训练数据集。
测试损失(test loss):Ltest=L(f,Xtest,Ytest)是测试损失,其中Xtest,Ytest为测试数据集(test set)。
调优损失:Lvalid=L(f,Xvalid,Yvalid)是从测试数据集中拆分出来的调优数据集的损失。
通常来说,我们认为训练数据集、测试数据集和调优数据集都是从同一个总体分布(population distribution)中采样得到的。记这个总体分布为DX,Y,并定义总体分布损失(population loss)
这里(X,Y)~DX,Y表示X,Y是服从DX,Y分布的。
从上面的介绍和定义不难看出,我们真正的目标是使f取得一个比较小的L总,即f在总体分布上有很好的表现。但在绝大部分情况下,由于没有DX,Y的信息,人们会使用Ltest对L总进行估计,并根据Ltest进行训练。在后续的学习中,默认以Ltest为目标进行训练(实际中也是如此),但请记住L总才是最核心的目标。
由于在训练中只看得见Ltrain而不知道Ltest,如何能确保自己训练出的模型能够有比较好的表现呢?在实际中,这一步通过调优来解决。除此之外,关于Ltrain和Ltest的关系,有一个经典的过拟合(overfitting)和欠拟合(underfitting)的说法。下面用图2.5中的分类例子进行介绍。
从图2.5可以直观地看到,图(a)是过拟合,图(b)是最优拟合,图(c)是欠拟合。下面进行具体说明。图(a)为了让函数在训练集中表现得很好,使用了一个非常复杂的曲线,完美地把两种类型的点分割开来。但是,这并不意味着这个曲线真的最好。导致这种情况发生的可能是训练数据中存在噪声,也可能是这些点并不能够代表真正的总体分布。因此,虽然复杂的曲线能够提供最好的Ltrain,它不一定能最小化L总。反之,图(c)用了简单的直线对数据进行拟合。但由于直线过于简单,很难将两类点分得非常好,因此在Ltrain和Ltest上均无法得到优异表现,导致欠拟合。
图2.5 过拟合(a)、最优拟合(b)、欠拟合(c)示意图
中间的函数可以说是恰到好处。它既没有为了迎合所有的训练数据而变得过于复杂,又不像直线那样过于简单。而且除了为数不多的几个点,它几乎能够将所有的点正确分类。直观地说,这种分类器f就是最理想的,因为它在总体分布上应当会表现得非常好。
总的来说,过拟合和欠拟合是一个函数复杂程度与在训练数据集上表现的一个权衡取舍。通常我们不希望使用表达能力过强的复杂函数,因为担心它们无法在测试集上取得非常好的表现。但近年来随着深度学习的不断发展,人们也开始反思这个想法是否真的正确。因为神经网络虽然表达能力很强,但在实际中过拟合的问题其实没有想象的那么大。的确,过拟合可能导致目标函数泛化性能不好,但函数表达能力强只是过拟合的一个必要条件,却不是充分条件。如果过拟合的情况发生,说明我们使用了表达能力非常强的函数;但使用表达能力非常强的函数,却不一定导致训练结果是过拟合的。
不过,在某些情况下,如果确实因为函数的表达能力过强导致过拟合发生,我们需要采取一些措施来降低过拟合的影响。这个过程被称为正则化(regularization)。正则化针对问题的具体特点,采用不同的方法,降低函数的表达能力。这一点会在第3章进行具体介绍。