# 背景介绍
由于物理硬件算力的提升,基于较大规模神经网络的深度学习方式,因其令人满意的结果产出,成为这个时代的爆点研究方向。模型训练的好坏,除了正相关于模型本身隐藏层的构建,训练配置也至关重要
朴素的思想是希望在可行的条件下,训练结果能在测试数据集中得到一个尽量趋近于完美的结果,并且这个结果可以有效的继承到测试数据集中
然后,在为人熟知的传统结论里,模型的偏差和方差是一个权衡问题 (trade-off)
- 偏差是我们模型的平均预测值和我们试图预测的正确值之间的差异。高偏差模型很少关注训练数据,过度简化模型。从而导致训练和测试数据的高误差,这意味着模型在训练数据上的拟合度不够。
- 方差是对给定数据点的模型预测的可变性,或是数据分布的评估值。具有高方差的模型非常关注训练数据,但对训练集中没有涵盖的新数据的概括能力差。因此,此类模型在训练数据上表现良好,但在测试数据上错误率很高,这意味着模型在训练数据上出现了过度拟合。
由此,衍生出了模型训练的两个阶段:欠拟合阶段和过拟合阶段,常呈现 U 形图像,如下图所示
然而,现代机器学习表明,测试误差不一定一直保持 U 形。当参数个数达到一定值时,测试误差依旧会减小。在整个测试过程中,误差曲线包含 2 条下降曲线。这种现象被称为 “双下降”(Double Descent)
这个项目就将研究,误差风险曲线的形状随模型大小、训练次数、数据集以及其他训练操作变化而产生的影响。包含实验与分析,往下看吧
# 为什么双下降会发生
# 泛化误差的分解
在接下来的过程中,测试误差被分解为偏差和方差,并设置在线性模型中实现
我们假设数据是在同一数据空间中独立生成的,因此所有数据都是独立同分布(i.i.d)的,这可以表示为 。 我们希望使用以下等式计算输出 y
然而,现实环境中不可避免地会包含一些噪声,因此真正的模型是干净数据和独立高斯噪声 的组合,其中
检验误差也称为泛化误差,可以通过最小二乘误差的期望值来计算。 如下式所示,其中 表示预测结果
上式让我们知道测试误差与偏差和方差之和有关。 风险曲线由偏差和方差权衡决定。这里,偏差是指数据分布与机器学习模型结果之间的差距,而方差是训练数据和测试数据之间模型性能的差异
# 偏差 - 方差曲线
经典机器学习理论认为测试误差曲线应呈 U 形。一开始,偏差的下降幅度大于方差的上升幅度,从而导致风险曲线整体下降。继而,方差增加的速度快于偏差减少的速度,导致风险曲线增加。如图 1 所示
然而,现代机器学习理论认为,随着模型复杂度的增加,方差曲线会先增大,然后减小。在第一阶段,偏差减小的速度快于方差增加的速度,从而导致泛化误差的下降。在下一阶段,偏差的减少速度慢于方差的增加速度。导致泛化误差曲线增加。最后,在第三阶段,偏差和方差都下降,从而触发测试误差的下降。如图 2 所示
# 实验
# 实验设置
# 损失函数
传统的损失函数计算方法采取均方误差 (MSE)。然而在深度神经网络中,sigmoid 函数作为激活函数可能会导致梯度消失。交叉熵用于弥补 MSE 的不足。常与 softmax 函数一起使用。获得数据被预测为每个类别的概率
其中 表示数据的标签,其中正样本的标签为 1,负样本的标签为 0。 表示数据被预测为正样本的概率
上述为二分类时的情况,在多分类问题中,交叉熵的计算如下等式所示
其中 表示数据集的标签数量。 表示如果数据的类别为,则 ,否则 。 表示数据被预测为标签 的概率。
# 模型
Pytorch 被用于实现以下系列架构。
在 Fashion MNIST 数据集中,我们使用 2 层 CNN 结构,每个卷积层中的滤波器数量为 和 ,其中 表示模型的宽度。 滤波器的内核大小和步幅选择为 3 和 1
并利用 padding 保持尺寸相同。在每个卷积层之后,我们使用 BatchNormalization、ReLu 和 2x2 的 MaxPooling 将每个维度的大小下采样 2 个单位。在这 2 个卷积层之后,我们使用线性层将输出转换为大小 10
在 Cifar10 实验中,我们分别选择 3 层、5 层和 7 层的 CNN 模型结构。 对于每个卷积层,我们应用内核大小 = 3、步长 = 1 和填充 = 1 的滤波器。在每个卷积层之后,经过 BatchNormzliation、ReLU 和 MaxPooling。 卷积层宽度设计为 。 是作为一个可变参数引入的,用于在训练时控制模型的宽度和复杂性,这就是我们所有实验中所谓的 “宽度”。 MaxPooling 的池化大小和步长为 2。最后添加一个大小为 4 的线性层和 ReLU。
# 训练细节和超参数
数据增强
在使用数据增强的实验中,除了 RandomCrop 和 RandomHorizontalFlip 这样的常见变换之外。 我们还将噪声引入到标签和特征数据中
更具体地说,对于标签噪声,我们随机选择一定比例的数据(代表标签噪声所占的比例为 )。 将正确的标签更改为错误的结果。 例如,在 Cifar10 中,所有目标标签都设置在 0-9 的范围内。 如果某个数据的正确标签为 5,我们可以将其修改为 0-9 中的任何其他随机数。 从而模拟标签噪声的场景
对于特征噪声,在图像分类情况下,我们对原始图像的每个 0-255 像素值引入高斯噪声
然后将数据特征标准化到 0-1 的范围
在添加标签噪声和特征噪声的实验中,给定训练样本的所有被增强的标签都被赋予相同的数值。 不同 epochs 添加的高斯噪声保持一致。
优化器:
SGD:
对于 Cifar10 数据集,使用 Inverse Square Root Scheduler,初始学习率 。 我们每 512 个梯度步更新一次学习率。 没有使用 Momentum。 对于 Fashion MNIST 数据集,一开始引入的学习率为 0.01。 随着 epoch 的增加,学习率下降为 。 设置动量为 0.95。Stochastic Gradient Langevin Dynamics(SGLD):
SGLD 是一种优化方法,其基本思想是在梯度下降过程中注入噪声。
它与随机梯度下降(SGD)类似,只不过它在梯度下降更新参数时结合了噪声
其中 表示梯度下降的学习率。 表示目标函数, 称为温度,通常取值 0.1 或 0.01。 表示高斯噪声
初始化和正则化:
方差初始化为 Pytorch 的默认设置。除了某些明确的情况外,不存在例如 weight decay 和 dropout 这样的正则化
Batch Size:
Cifar10 的 Batch Size 为 128。Fashion MNIST 的 Batch Size 为 100
训练误差和测试误差:
前者等于 (每个 epoch 之后基于训练集测试模型的性能)。 后者等于 1-\textit
# 实验结果
# Model-wise Double Descent
我们在自己的实验中重现了宽度方向的双下降现象。 与前文提到的在 Cifar10、Cifar100 和 MNIST 数据集上进行的实验不同,我们尝试在 Fashion MNIST 数据集上重现宽度方向双下降图。如下图
# Epoch-wise Double Descent
我们将这些不同大小的模型,根据宽度 不同,分别训练 1000 个 epoch。 根据结果,将这些模型分为四个不同的区域,在 1000 个 epoch 训练中具有不同的测试误差
每个区域的模型大小的具体图如图所示
首先,当模型宽度很小时,不会发生过拟合。当模型宽度变大时,过拟合问题会随之出现,并且在某个区域变得越来越严重。在该区域之后,过拟合开始减弱,并在训练结束时,测试误差趋于稳定。 当模型规模确实较大时,过拟合的程度比过拟合峰值前后要小得多,测试误差甚至趋于缓慢下降。
因此,当用于训练的模型足够大时,随着 epoch 数量的增加,会出现双下降现象。 在我们的实验中,我们使用 的 2 层 CNN 在 Fashion MNIST 数据集上训练。 CNN 更具体的设置在实验部分展示。 结果如图 \ref {fig:epochdd} 所示。
epoch 的数量也会影响模型双下降现象的明显程度,如图 \ref {fig:subepochdd} 所示。 此外,这里进行的另一个观察是,当我们增加训练数据的 epoch 数时,双下降图的峰值逐渐向左移动。
# Noise-wise Double Descent
向数据中添加几种类型的噪声,观察双下降现象。一种类型是标签噪声,它试图将图像的某个部分随机地标记为错误的标签。 当我们去除标签噪声后,双下降现象就不再明显了。 我们再次在 Fashion MNIST 数据集上进行了尝试,如图 \ref {fig:noishedd} 所示。
# Learning-rate-wise Double Descent
在之前的实验中,我们使用 SGD 优化器采取了衰减的学习率。 我们还感兴趣这个设置对于我们的双下降现象有多重要。 因此,我们还在所有训练过程中尝试使用固定的学习率值 0.01。结果如图 \ref {fig:lrdd} 所示,这表明如果我们使用固定学习率,双下降在峰值方面会更加明显。 然而,对于第二个下降部分,如果我们使用固定学习率,测试误差不会像学习率衰减一样下降。
# 讨论分析
我们在这里试图提出了一个想法来总结上述实验。
我们的想法是,我们可以使用上述四个不同区域的测试误差曲线的不同行为来解释所有双下降现象及其变化
回顾一下这四个不同的区域是:
- 小模型区域,模型尺寸极小,不会发生过拟合
- 过拟合恶化区域,模型比第一区域的模型更大,但随着模型尺寸的增大,过拟合越来越严重;
- 过拟合缓解区域,模型尺寸变得更大,但训练足够的 epoch 后过拟合停止;
- 双下降区域,该区域模型尺寸极大,过拟合幅度小得多,甚至在达到过拟合峰值后测试误差开始下降
对于小模型区域的模型,不存在过拟合问题,因此较长 epoch 的训练不会显着影响其预测 tetsing 数据的性能。
类似地,对于双下降区域的模型,过度拟合会很快减少,因此如果训练 epoch 足够大(例如我们图中的 250 个 epoch),则 epoch 对测试误差没有显着影响
对于过拟合恶化区域的模型,训练的 epoch 越多,过拟合就越严重,宽度方向双下降曲线的峰值往往会变得更高。
对于处于过拟合缓解区域的模型,随着模型规模的增大,过拟合的停止点会变早,因此减少训练 epoch 对模型的影响很小。 然而,对于不够大的模型,过拟合在特定数量的 epoch 后不会停止(例如,模型大小 50 时的 250 个 epoch),因此,如果我们训练更长的时间,测试误差仍然会增加
此外,我们之所以认为去除标签噪声后双下降会减少,是因为双下降现象中最重要的问题是随着模型大小的增加,模型可能会过拟合。 然而,对于 Fashion MNIST 数据集,测试数据集和训练数据集之间不存在显着偏差。 这样即使我们使用过多的参数也不容易发生过拟合。 因此,添加 20% 的标签噪声是引入足够偏差的好方法,在这种情况下更有可能发生过拟合。 当出现过拟合问题时,上述四个区域可以很好地解释双下降现象。
对于不同学习率方案下双下降曲线略有不同的原因,我们认为这是因为固定的学习率可能会导致更严重的过拟合问题。 因为,双下降曲线的峰值更高,而衰减学习率的测试误差曲线,在平坦且平滑的区域中有更多波动
# 其他有趣的探索发现
在这里,演示了几个适合实际应用场景的潜在元素,这些元素可能会影响双下降曲线
# 数据集的数量
在某些特定情况下,如果我们只是想验证或探索某些现象或模型。 一般会使用简单的模型和小规模数据集建立一个 demo。 这样可以在项目的早期阶段节省时间和资源。 另一方面,如果模型训练的输入样本不是太多,我们就必须尝试用有限的数据完成训练。 因此,此类场景中是否存在双重下降以及其如何变化将是一个值得探索的事情
与上面的实验类似,通过减少 Cifar10 数据集的数量(训练集从 50,000 到 10,000,测试集从 10,000 到 2,000),我们绘制了不同样本数量下的误差性能曲线
我们从两个方面进行了实验,如图 \ref {fig:flowchar1} 和图 \ref {fig:flowchar2} 所示。 比较在不同模型复杂度和不同标签噪声的场景下,较少的数据集是否会影响曲线的形状。结论是类似的
一方面,随着数据集样本的减少,过拟合的峰值 “向左移动”,这符合预期。 甚至,在 7 层 CNN 的情况下,过拟合峰值提前得很远,以至于 U 形曲线的前部完全消失。 曲线整体上移,曲线下面积增大。 训练误差下降得更快,训练误差下降到接近 0 的阈值基本上对应于测试误差过拟合达到峰值的阈值。
另一方面,当网络宽度足够大(模型足够复杂)时,不同样本数量的差异不会太大。 特别是当曲线刚刚通过拟合点时,如图 \ref {fig:flowchar2} 的橙色阴影区域所示,存在一定范围的模型宽度,对于大规模和小规模数据集,结果的测试误差几乎没有差别
# 提前停止 Early Stopping
在机器学习中,早期停止是一种正则化形式,用于避免过度拟合。 这种方法会更新学习器,以便在每次迭代时更好地适应训练数据。 在某种程度上,这提高了模型在训练集之外的数据上的表现。
在许多机器学习库中,它是一种可调用的回调方法,通过监视某些指标(例如验证集的 error 或 accuracy)来提前保存训练结果权重。
由于这是避免过度拟合的绝佳策略,因此在实施提前停止时不会出现双下降曲线。 与实际实践不同,模型需要等待几个 “patient” 的 epoch 来决定是否停止;我们直接输出每个宽度训练过程中的最小误差值。 曲线如图 \ref {fig:early} 所示。上方的虚线代表采取早停政策的结果。 最下面是双下降曲线和最优早停曲线的减值。
我们比较了具有不同复杂度和不同标签噪声的几种模型,这极大地影响了峰的位置和相对高度。 事实上,提前停止可以平滑过度拟合曲线,从而返回最佳结果。 这符合提前停止可以避免过度拟合的常识。
# 特征噪声
我们添加高斯噪声作为 mask 来观察双下降曲线的变化。 以 CIFAR-10 的图像为例,每个样本都是一个 32x32x3 的矩阵(宽 x 高 x 通道),像素值在 0-255 之间
在图 \ref {fig:Gaussian}(a) 中,我们实现了幅度为 的 噪声。 每个渠道的变化都不同。 将格式更改为 PIL (uint8) 后,我们将样本归一化为值在 0-1 范围内的矩阵。 右图是原图,左图是变换后的图。
如图 \ref {fig:Gaussian}(b) 所示,我们在实验中实现了相同的 噪声。 虽然在没有标签噪声的情况下,双下降的曲线并不明显。 我们仍然可以观察到,添加高斯噪声的操作在一定程度上平滑了双下降峰,尽管虽然整体误差略有上升
我们可以考虑添加特征噪声作为一种数据增强。 曲线变化的原因可能是因为数据增强增加了模型的泛化能力。 换句话说,它避免了模型的过度拟合。 这样的结果也符合常识
# SGLD
我们还尝试将之前使用的 SGD 优化器更改为另一个优化器 SGLD,看看在梯度下降步骤中添加一些不确定性后,它是否仍然会导致双下降现象。 该图如图 \ref {fig:SGLDdd} 所示。
我们仍然可以在 SGLD 优化器下观察到双下降现象,但它看起来与我们从 SGD 优化器获得的双下降图有点不同。 为了更清楚地比较它们,我们将它们放在图 \ref {fig:optdd} 的同一图中
在此图中,我们可以观察到,将优化器更改为 SGLD 后,图中的第二次下降向右移动了一点。 然而,足够大的模型的测试误差往往会变得相同。 所以总的来说,SGD 更适合用于 Fashion MNIST 数据集,因为测试误差的第二次下降比 SGLD 更早。
我们尝试使用 SGD 和 SGLD 来分析曲线之间的差异。 从图中我们可以看到,在蓝色上升曲线所示的过拟合状态下,SGLD 的测试误差比 SGD 的测试误差要低一些,尽管并不明显
我们假设这是因为 SGLD 引入了额外的随机性。 此时模型与测试数据不太吻合,SGLD 引入的额外噪声可以帮助分散全局最小值,从而改变目标函数的格局。 这种行为可以增加找到全局最小值的机会,从而稍微减少测试误差
当遇到第二次下降时,更复杂的模型变得更适合数据。 随机性变得没那么必要,并且可能会损害模型的性能,因为此时输入的噪声可能覆盖全局最小值。 SGD 和 SGLD 之间的微小差异可能是因为我们在更新参数时在 SGLD 中引入了很少的噪声
# 结论
在这个项目中,我们从理论和实践两个方面讨论了双重下降现象。 分析了为什么会出现双下降现象,研究了哪些参数影响双下降现象,分析了结果,得出了一些有趣的结论
我们的模型复杂度是基于神经网络的宽度,并且我们知道随着模型复杂度的增加,会出现双下降现象,基于这个条件 ,我们将测试不同参数对这种现象的不同影响
Epoch-wise:随着 epoch 的增加,双下降现象逐渐变得明显,双下降图的峰值也会向左移动。 造成这种现象的原因是 epoch 越大,过拟合越严重。 较大的模型被放大到一定程度,并在 epoch 增加时停止过拟合。 因此峰值将向左移动
Label Noise-wise:双下降现象可以被噪声增强,但是当我们去除噪声后,双下降现象不再明显,最坏的情况下,双下降现象甚至没有出现
Learning Rate-wise:本节中,我们尝试固定学习率,看看对双下降现象是否有影响。结果很明显,当我们在所有 epoch 中将学习率固定为 0.01 时,我们可以看到两次下降的峰值比之前高得多,但是对于第二次下降,它不能像以前一样下降
数据集规模:在本节中,我们测试了不同数据集规模对这种双下降现象的影响。 实验基于不同层数的 CNN,分别为 3 层、5 层和 7 层,在不同设置下的结果趋于相似。 我们观察到两个主要现象:首先,当我们减小数据集规模时,峰值向左移动,同时,我们可以看到训练误差下降得更快。 其次,测试误差曲线和训练误差曲线均向上移动,并且曲线下面积增大。 原因是更多的数据会增加模型的复杂性,也会损害模型的性能
Early Stopping:在本节中,我们保存了每个 epoch 的准确率得分,并直接输出过程中的最小误差值。 我们发现,采用 Early Stopping 方法,双下降曲线趋于平滑,因为 Early Stopping 是一种优化器,避免了过拟合,但没有过拟合,双下降现象就不会出现
我们还试图找出高斯噪声和 SGLD 对双下降现象的影响。 核心思想是在原始数据和梯度下降过程中注入噪声。我们发现,在原始数据中注入高斯噪声可以稍微平滑双下降。对于 SGLD,我们发现它在过拟合状态下比 SGD 实现了更低的测试误差,并且在过参数化区域时具有更高的测试误差
Dataset | Arch. | Opt. | %Noise | Double-Descent | Experiment in | Figure(s) | |
---|---|---|---|---|---|---|---|
in Model | in Epoch | ||||||
F. MNIST | 2L-CNN | 20% | √ | Width | 5, 6, 7(a) | ||
F. MNIST | 2L-CNN | 20% | √ | Epoch | 7(a), 7(b) | ||
F. MNIST | 2L-CNN | 0% | Noise | 8(a) | |||
F. MNIST | 5L-CNN | 0% | √ | Noise | 11 | ||
Early Stopping | |||||||
F. MNIST | 5L-CNN | 10% | √ | Noise | 11 | ||
Early Stopping | |||||||
F. MNIST | 5L-CNN | 20% | √ | Noise | 11 | ||
Early Stopping | |||||||
CIFAR-10 | 3L-CNN | 20% | √ | Sample Scale | 10 | ||
CIFAR-10 | 5L-CNN | 20% | √ | Sample Scale | 10 | ||
CIFAR-10 | 7L-CNN | 20% | √ | Sample Scale | 10 | ||
CIFAR-10 | 5L-CNN | Gaussian | Feature Noise | 12 | |||
F.MNIST | 2L-CNN | Fixed SGD LR | 20% | √ | Learning rate | 8(b) | |
F.MNIST | 2L-CNN | Decay SGD LR | 20% | √ | Learning rate | 8(b) | |
F.MNIST | 2L-CNN | SGLD | 20% | √ | Optimizer | 13(a), 13(b) | |
F.MNIST | 2L-CNN | SGD | 20% | √ | Optimizer | 13(a), 13(b) |