探寻模型泛化性不佳的两大根源 随机过拟合 vs. 认识过拟合

最近写了太多热点的模型和方法,感觉飘在天上一样,还是想脚踏实地写一些基础理论。看了一些大佬的文章,发现一些不错的内容,特此总结分享。感谢阅读,水平有限~

📖阅读时长:15分钟

🕙发布时间:2025-02-05

近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企
公众号【柏企科技说】【柏企阅文

在训练神经网络时,训练损失不断降低,可验证损失从第一个训练周期(epoch)起就持续攀升。该怎么解决呢?那你一定要仔细研读这篇文章,深入了解模型泛化性差的两个主要原因。

随机不确定性

咱们先从多数机器学习从业者都熟悉的过拟合现象说起:由随机不确定性引发的过拟合,简单来讲,就是数据含噪声导致的过拟合。在实际情况中,生成真实数据的过程常常带有内在随机性。举个简单的回归小例子来说明,假设输入$x$(自变量)和输出$y$(因变量)之间的关系由一个三次多项式确定:
$$y = ax^3 + bx^2 + cx + d$$

我们可以给上述数据生成过程加点随机因素,往原始值里添加一个小的随机数就行。噪声值的来源多种多样,它可能符合任意一种概率分布。在真实数据里,产生随机性的机制往往要复杂得多。

接下来,生成训练集的时候考虑一下刚才说的随机不确定性。

一个可能的验证集大概长这样:

为了展示过拟合的影响,接下来拟合一个比生成数据时所用多项式次数更高的多项式。比方说,拟合一个四次多项式:
$$y = a_1x^4 + a_2x^3 + a_3x^2 + a_4x + a_5$$

在这个简单示例里,把损失定义为预测的$y$值和带噪声的真实值之间的平均距离。训练(拟合)模型的目的就是要最小化这个损失,也就是让两者距离最小化。

观察发现,从某个训练周期开始,模型就开始适应噪声了。这并不奇怪,因为要进一步缩小与真实点的距离,这是唯一的办法。但问题也来了,这会让拟合模型

训练结束时,训练损失变成了0,因为红线刚好穿过四个训练点。可别被这低训练损失给骗了,它根本说明不了拟合模型的泛化能力。看看验证集上评估出来的损失,就知道情况有多糟糕了。

(在验证集上评估四次多项式,图片由原作者提供)

可以看到,训练结束时,验证损失比训练损失大得多。这通常是个明显信号,表明模型过拟合了。由此能得出第一个结论:在小数据集上训练神经网络时,网络往往只是记住了训练数据,而没有学到数据的通用结构。所以,模型在训练集上表现不错,但在新数据(比如验证数据集)上就表现欠佳。

一旦意识到模型过拟合了,该怎么应对呢?

解决方案:增加数据量

减少随机过拟合最简单的办法就是扩充训练数据量。

此时,四次多项式已经没办法精确地穿过全部八个训练点了。这样一来,模型就没法像之前那样过度适应噪声,拟合效果也就好多了(对比一下红线和蓝线)。注意,训练结束时,训练损失不再像之前那样为0 。

在验证集上评估模型时,会发现它的泛化效果相当不错。

用足够多的数据训练模型,最终的训练损失和验证损失都应该很低,而且这两个值应该很接近。

要是想让模型尽可能精准地逼近输入$x$和输出$y$之间的内在关系(就像在示例里完美拟合蓝色的真实曲线),那收集足够多的数据可能是唯一的选择。只有这样,模型才能学到数据真正的底层结构。顺便说一句,这也是深度学习的奥秘所在。现实里很多应用场景中,输入$x$和输出$y$之间的关系极其复杂。不过,依靠大量的数据和超复杂(庞大)的神经网络模型,就能很好地掌握这种底层结构。

但获取更多数据往往既费钱又费力,不是短时间内就能完成的。有没有其他办法来缓解过拟合呢?

要是不把追求最佳性能当成首要目标,愿意做出一些妥协,那可以试试下面这些方法。

解决方案:降低模型容量

控制过拟合的常用手段是运用正则化技术。所有正则化技术都有个共同点,就是会对训练出的模型施加某种平滑约束。在刚才的示例里,更平滑的多项式意味着灵活性更差,弯曲程度更小,也就只能逼近更简单的函数。在学术领域,模型逼近复杂函数的能力通常被称为模型容量。

在这个简单示例中,通过降低多项式次数来展示模型容量的降低。比如说,拟合一个一次多项式:
$$y = mx + c$$
这个多项式的复杂程度可比底层真实模型低多了。

可以看到,简化后的模型没有足够的能力去适应训练数据里的噪声。所以,和之前在小训练集上训练的复杂模型相比,它对未知数据的泛化能力要强得多(之前的示例里扩展了训练集)。

不过,也能发现拟合模型(红线)并不能很好地反映真实值(蓝线)。这就是之前提到的妥协。当训练集较小时,可以用正则化来提升模型对未知数据的泛化能力。但这样做无法完美地模拟输入$x$和输出$y$之间的内在关系,模型的性能(无论是准确率还是其他指标)也就没法达到最优。

最后,简单介绍一下不同的正则化技术。L1和L2是最常见的正则化类型。还有一种很实用的正则化方法——随机失活(dropout),效果非常好,也是深度学习领域应用最广泛的正则化技术。

要是上述正则化技术都没办法提升模型的泛化能力,那就试试换个更小的架构,降低模型的复杂度。

解决方案:提前停止训练

训练神经网络时,还能采用一种叫提前停止的正则化技术。这一技术利用了神经网络通过梯度下降法迭代训练的特点。

训练刚开始时,神经网络的权重会用非常小的数值初始化。所以,隐藏层的所有中间输出都处于激活函数的线性区域,整个网络表现得就像个线性系统,容量有限。

在后续的训练周期里,权重的数值通常会增大。这时,中间输出开始进入激活函数的非线性区域,网络容量也会稍有增加。

一旦发现模型在验证集上的性能开始下降,就立刻停止训练。在最初那个在小训练集上训练四次多项式的例子里,如果采用提前停止训练的策略,结果会是这样:

解决方案:数据增强

数据增强指的是通过添加略微修改的已有数据副本,或者生成新的合成实例,人为地扩大训练集规模的各种技术。

在示例里,通过给输入$x$添加噪声,同时复用相应的真实值$y$ ,来合成新的训练样本。

就像文章开头展示过拟合效果的例子一样,对增强后的数据拟合一个四次多项式:
$$y = a_1x^4 + a_2x^3 + a_3x^2 + a_4x + a_5$$

四次多项式没办法精确地穿过全部八个训练点,也就无法过度适应噪声,拟合效果反而更好。

图像分类任务里的数据增强方法有很多,比如颜色调整、翻转、裁剪、旋转、几何变换等等。

解决方案:迁移学习

迁移学习是一种机器学习方法,先在任务A的数据上训练模型,然后将训练好的模型部分应用到与之相关但不同的任务B上。不过,只有当任务A的数据量远远多于任务B时,迁移学习才有效。这里假设任务B是真正想要做好的任务。

迁移学习利用了神经网络的分层结构特点(神经网络是逐层构建的),相关任务早期层的特征往往非常相似,所以可以重复利用。

在示例里,任务B由最初的三次多项式定义,是想做好但数据不足的任务;任务A由一个非常相似的三次多项式定义,有足够的数据,并且希望从这个任务中转移知识:
$$y_A = a_1x^3 + b_1x^2 + c_1x + d_1$$
$$y_B = a_2x^3 + b_2x^2 + c_2x + d_2$$
不过,任务A的偏移量$d$要小得多。

和之前的示例一样,给任务A拟合一个四次多项式,它的次数比生成数据用的多项式次数更高:
$$y = a_1x^4 + a_2x^3 + a_3x^2 + a_4x + a_5$$

现在,把在任务A上获取的知识迁移到任务B上并复用。具体做法是,获取系数$a$、$b$、$c$的值并固定下来,在训练任务B时,只调整偏移量$d$。这就是部分复用预训练模型的含义。

任务A和任务B的相关性越高,迁移学习的效果就越好。不过,也别害怕尝试在看似不相关的任务上预训练的权重。很多时候,早期层的特征具有很强的通用性,比如低通滤波器、高通滤波器、带通滤波器、Gabor滤波器等等。但获取这些早期滤波器需要大量数据,而这往往是没有的。

最后,在训练阶段结束时,还可以取消固定所有系数,用一个极小的学习率对整个系统进行训练。这个过程叫微调,通常能进一步提升模型性能。

认知不确定性

下面来谈谈第二种过拟合,它更隐蔽,但带来的问题和第一种一样棘手:由认知不确定性引发的过拟合,说白了,就是训练数据不足导致的过拟合。

在实际情况中,很多时候给定任务的数据可变性非常高。以图像识别任务里区分雨伞和打火机为例,这两类物品涵盖的范围很广,有各种不同的尺寸、颜色、形状等等,这就是所谓的类内变异。数据可变性高,训练集就容易出现代表性不足的问题,导致模型无法很好地推广到未知数据上,比如验证集或测试集。

再用一个简单示例来说明这种现象。为了体现数据的高可变性,用一个看起来有点复杂的四次多项式来模拟输入$x$和输出$y$之间的内在关系:
$$y = a_1x^4 + a_2x^3 + a_3x^2 + a_4x + a_5$$

假设训练集规模适中,让人感觉还挺安心的。但由于数据太过复杂,训练集其实只覆盖了整个输入空间的一小部分。

在现实世界的数据里,认知不确定性和随机不确定性通常是同时存在的。不过,为了便于讲解,这个示例里先不考虑随机不确定性(噪声)。

一个可能的验证集如下:

注意,验证集里的样本和训练集来自不同的输入域子集。

为了展示认知过拟合的影响,给训练集拟合一个四次多项式:
$$y = a_1x^4 + a_2x^3 + a_3x^2 + a_4x + a_5$$

训练过程中,模型只看到了输入域的左半部分,对右半部分一无所知,自然也就没办法推断未知数据。虽说神经网络在插值任务上表现出色,但在推断未知数据方面确实不太擅长。换句话说,神经网络只能处理见过的数据。

来看看在验证集上的情况:

可以看到,验证损失迅速增加,最后比训练损失大得多。验证损失快速上升(甚至从第一个训练周期就开始),通常就意味着出现了认知过拟合。

有什么办法能应对认知过拟合呢?

解决方案:增加数据量

同样,减少认知过拟合最简单(但也是成本最高)的办法就是扩充训练数据量。而且,扩充时要确保训练数据能覆盖输入数据的整个域。

前面也提到过,获取更多数据既昂贵又困难,不是能轻易实现的。

不是解决方案:降低模型容量

认知过拟合有个很特别的地方,正则化技术对它往往没什么效果,甚至还会让泛化性能变得更差。原因很简单:让模型更平滑并不能帮助它推断未知数据,如下图所示:

不是解决方案:提前停止训练

提前停止训练属于正则化技术的一种,也会降低模型容量,通常对改善泛化性能没什么帮助。而且,遇到认知过拟合时,验证损失常常从第一个训练周期就开始上升,根本找不到合适的时机提前停止训练。

解决方案:迁移学习

为了在未知数据上有好的表现,模型需要具备一种神奇的能力,能从训练数据中推断未知信息。但要是没有先验知识,这根本做不到。

迁移学习就是一种给模型注入先验知识的方法。要实现这一点,需要一个有足够数据量的相关任务A。

给任务A拟合一个四次多项式,然后在任务B上部分复用预训练模型。训练任务B时,固定预训练的系数$a$、$b$、$c$,只微调偏移系数$d$。这样一来,对未知数据的拟合效果比之前好多了:

任务A和任务B越相似,迁移学习的效果就越好。

解决方案:特征工程

要是没办法收集更多数据,也没有相关任务来预训练模型,还可以手动设计特征。特征是将原始数据进行(通常是非线性的)变换,转化为更复杂的数据表示形式。设计特征时,要根据具体的任务和问题仔细选择,目的是提升模型在未知数据上的性能。

和迁移学习类似,设计特征也是在给模型注入先验知识,这可能让模型推断未知数据。不过,这种方法通常需要扎实的领域知识,还得不断尝试和调整。

解决方案:改变网络架构

为了解释改变网络架构为什么能缓解认知过拟合,以图像识别领域的例子来说明。之前假设数据可变性源于类内变异,比如数据集中有多种类型的椅子(办公椅、木椅、扶手椅等等)。但实际上,数据的高可变性很多时候是由几何变换引起的,比如从不同角度看办公椅。这种情况下,改变网络架构可能有助于降低认知不确定性。

再用一个简单示例说明基本思路:假设要搭建一个系统来识别不同的大写字母。训练集中的字母都在左上角,而验证集中的字母都在右下角。

假设是新手,选了一个完全由全连接层(密集层)组成的网络。大家都知道,全连接网络没办法把在某个空间位置学到的知识推广到其他位置。所以,训练好的网络在验证集上大部分情况下都会输出随机值。但要是选择包含卷积层和池化层的网络架构,就能把训练集学到的知识应用到验证集上。

上面这个例子是虚构的,认知不确定性产生的原因很明显。但在现实场景里,尤其是图像处理以外的领域,导致认知不确定性的因素往往隐藏得很深,很难发现。

顺便提一句,传统的卷积神经网络(CNNs)缺乏尺度和旋转不变性,没办法把针对某个尺度或旋转角度学到的知识应用到同一物体的不同尺度和旋转角度上。有一种受生物启发的方法可以实现尺度和旋转不变性,就是应用对数极变换,相关内容在《RetinotopicNet》这篇论文里有介绍。

数据不匹配

为了内容完整,还得介绍一个和认知过拟合密切相关的概念:数据不匹配。数据不匹配指的是训练数据和验证数据(或测试数据)来自不同的真实分布。

如今,很多模型训练时大量使用从互联网获取的数据,而只用代表实际生产任务的自有数据进行评估,这种情况下就经常出现数据不匹配的问题。从网上获取大量训练数据确实很有吸引力,但这些数据往往不能很好地代表实际情况。

数据不匹配和认知不确定性的区别在于:认知不确定性里,训练数据和测试数据假定来自同一分布,但由于底层分布复杂且数据不足,它们看起来像是来自不同分布。解决认知不确定性最有效的办法是收集更多数据。

而在数据不匹配的情况下,训练集和测试集确实来自不同分布。单纯扩充训练集通常无法提升模型的泛化能力,除非把两个分布的数据混合起来。

可以发现,数据不匹配和认知不确定性之间的界限并不是很分明。

引用

本文由mdnice多平台发布


柏企科技圈
15 声望4 粉丝

时间差不多了,快上车!~