type
Page
status
Invisible
date
Apr 2, 2026
slug
Machine_Learning/deep-learning-study-notes/4_6
summary
动手深度学习v2课程
tags
机器学习
深度学习
category
icon
password
我们前面讲过,正则化就是给那些太大的权重加“罚分”。这样做不是随便拍脑袋定的,而是有理论依据的。因为从概率上看,它相当于我们先假设:模型里的权重大多数都应该比较小,最好接近 0。
从更直观的角度看,我们也不希望模型只盯着少数几个特征死学。因为这样很容易学到一些表面上有用、其实只是碰巧出现的假规律。更好的情况是,模型把信息分散地利用起来,从多个特征里一起提取规律,这样通常更稳、更不容易过拟合。

4.6.1. 重新审视过拟合

当面对更多的特征而样本不足时,线性模型往往会过拟合。相反,当给出更多样本而不是特征,通常线性模型不会过拟合。不幸的是,线性模型泛化的可靠性是有代价的。简单地说,线性模型没有考虑到特征之间的交互作用。对于每个特征,线性模型必须指定正的或负的权重,而忽略其他特征。
泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡(bias-variance tradeoff)。线性模型有很高的偏差:它们只能表示一小类函数。然而,这些模型的方差很低:它们在不同的随机数据样本上可以得出相似的结果。
深度神经网络位于偏差-方差谱的另一端。与线性模型不同,神经网络并不局限于单独查看每个特征,而是学习特征之间的交互。例如,神经网络可能推断“尼日利亚”和“西联汇款”一起出现在电子邮件中表示垃圾邮件,但单独出现则不表示垃圾邮件。
深度神经网络的拟合能力非常强,强到即使数据里的标签本身没有真实规律,它也能把训练集“硬记住”。研究人员曾做过一个实验:把图片配上随机标签,再用深度网络去训练,结果模型居然仍然可以把训练集几乎全部分对。说明神经网络不只是会学习真实模式,也可能单纯记住样本和标签的一一对应关系。由于这些随机标签没有可推广的规律,模型在测试集上就几乎不可能表现好。比如一共10个类别、标签又是随机分配的,那么测试精度通常只有接近10%,但训练精度却能到 100%,这中间大约90%的差距,就是非常典型而且严重的过拟合。

4.6.2. 扰动的稳健性

在探究泛化性之前,我们先来定义一下什么是一个“好”的预测模型?我们期待“好”的预测模型能在未知的数据上有很好的表现:经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。简单性以较小维度的形式展现, 我们4.4节讨论线性模型的单项式函数时探讨了这一点。此外,正如我们在 4.5节中讨论权重衰减(正则化)时看到的那样,参数的范数也代表了一种有用的简单性度量。
简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感。例如,当我们对图像进行分类时,我们预计向像素添加一些随机噪声应该是基本无影响的。1995年,克里斯托弗·毕晓普证明了具有输入噪声的训练等价于Tikhonov正则化。这项工作用数学证实了“要求函数光滑”和“要求函数对输入的随机噪声具有适应性”之间的联系。
然后在2014年,斯里瓦斯塔瓦等人就如何将毕晓普的想法应用于网络的内部层提出了一个想法:在训练过程中,他们建议在计算后续层之前向网络的每一层注入噪声。因为当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。
这个想法被称为暂退法(dropout)。暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。Dropout可以看作噪声注入思想的一种特殊实现。一般的噪声注入,是在网络中间层加入随机扰动,防止模型过度依赖固定特征;而dropout更进一步,直接把部分神经元的输出随机置为0。这样一来,这些神经元在本轮前向传播中就相当于暂时失效了,因此称为“丢弃”。它的作用是迫使网络不要依赖少数几个神经元,而要学会从更分散、更稳健的特征组合中提取规律,从而减轻过拟合。
需要说明的是,暂退法的原始论文提到了一个关于有性繁殖的类比:神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为“共适应性”。作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。
那么关键的挑战就是如何注入这种噪声。一种想法是以一种无偏向(unbiased)的方式注入噪声。这样在固定住其他层时,每一层的期望值等于没有噪音时的值。
在毕晓普的工作中,他将高斯噪声添加到线性模型的输入中。在每次训练迭代中,他将从均值为零的分布采样噪声添加到输入,从而产生扰动点,预期是
在标准暂退法正则化中,通过按保留(未丢弃)的节点的分数进行规范化来消除每一层的偏差。换言之,每个中间活性值暂退概率由随机变量替换,如下所示:
根据此模型的设计,其期望值保持不变,即

4.6.3. 实践中的暂退法

回想一下下图中带有1个隐藏层和5个隐藏单元的多层感知机。当我们将暂退法应用到隐藏层,以 的概率将隐藏单元置为零时,结果可以看作一个只包含原始神经元子集的网络。
notion image
如图,删除了,因此输出的计算不再依赖于,并且它们各自的梯度在执行反向传播时也会消失。从而使得输出层的计算不会过度依赖于的任何一个元素。
通常,我们在测试时不用暂退法。给定一个训练好的模型和一个新的样本,我们不会丢弃任何节点,因此不需要标准化。然而也有一些例外:一些研究人员在测试时使用暂退法,用于估计神经网络预测的“不确定性”:如果通过许多不同的暂退法遮盖后得到的预测结果都是一致的,那么我们可以说网络发挥更稳定。

4.6.4. 从零开始实现

要实现单层的暂退法函数,我们从均匀分布中抽取样本,样本数与这层神经网络的维度一致。然后我们保留那些对应样本大于的节点,把剩下的丢弃。
在下面的代码中,我们实现 dropout_layer 函数,该函数以dropout的概率丢弃张量输入X中的元素, 如上所述重新缩放剩余部分:将剩余部分除以1.0-dropout
可以通过下面几个例子来测试dropout_layer函数。我们将输入X通过暂退法操作,暂退概率分别为0、0.5和1。

4.6.4.1 定义模型参数

同样,我们使用3.5节中引入的Fashion-MNIST数据集。定义具有两个隐藏层的多层感知机,每个隐藏层包含256个单元。

4.6.4.2. 定义模型

我们可以将暂退法应用于每个隐藏层的输出(在激活函数之后),并且可以为每一层分别设置暂退概率:常见的技巧是在靠近输入层的地方设置较低的暂退概率。下面的模型将第一个和第二个隐藏层的暂退概率分别设置为0.2和0.5,并且暂退法只在训练期间有效。

4.6.4.3. 训练和测试

类似于前面描述的多层感知机训练和测试。
notion image

4.6.5. 简洁实现

对于深度学习框架的高级API,我们只需在每个全连接层之后添加一个Dropout层,将暂退概率作为唯一的参数传递给它的构造函数。在训练时,Dropout层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入)。在测试时,Dropout层仅传递数据。
然后对模型进行训练和测试
notion image

4.6.6. 小结

  • 暂退法在前向传播过程中,计算每一内部层的同时丢弃一些神经元。
  • 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。
  • 暂退法将活性值替换为具有期望值的随机变量。
  • 暂退法仅在训练期间使用。
Loading...