第18周周报
📅 2026/7/6 2:49:20
👁️ 阅读次数
📝 编程学习
总结:学习了暂退法,前向传播,反向传播和计算图
暂退法
重新审视过拟合
当面对更多的特征而样本不足时,线性模型往往会过拟合。相反,当给出更多样本而不是特征,通常线性模型不会过拟合。不幸的是,线性模型泛化的可靠性是有代价的。简单地说,线性模型没有考虑到特征之间的交互作用。对于每个特征,线性模型必须指定正的或负的权重,而忽略其他特征。泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡(bias‐variance tradeoff)。线性模型有很高的偏差:它们只能表示一小类函数。然而,这些模型的方差很低:它们在不同的随机数据样本上可以得出相似的结果。
深度神经网络位于偏差‐方差谱的另一端。与线性模型不同,神经网络并不局限于单独查看每个特征,而是学习特征之间的交互。例如,神经网络可能推断“尼日利亚”和“西联汇款”一起出现在电子邮件中表示垃圾邮件,但单独出现则不表示垃圾邮件。
即使我们有比特征多得多的样本,深度神经网络也有可能过拟合。2017年,一组研究人员通过在随机标记的图像上训练深度网络。这展示了神经网络的极大灵活性,因为人类很难将输入和随机标记的输出联系起来,
但通过随机梯度下降优化的神经网络可以完美地标记训练集中的每一幅图像。想一想这意味着什么?假设标签是随机均匀分配的,并且有10个类别,那么分类器在测试数据上很难取得高于10%的精度,那么这里的泛化差距就高达90%,如此严重的过拟合。
扰动的稳健性
在探究泛化性之前,我们先来定义一下什么是一个“好”的预测模型?我们期待“好”的预测模型能在未知的数据上有很好的表现:经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。此外,参数的范数也代表了一种有用的简单性度量。
简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感。例如,当我们对图像进行分类时,我们预计向像素添加一些随机噪声应该是基本无影响的。1995年,克里斯托弗·毕晓普证明了具有输入噪声的训练等价于Tikhonov正则化。这项工作用数学证实了“要求函数光滑”和“要求函数对输入的随机噪声具有适应性”之间的联系。
然后在2014年,斯里瓦斯塔瓦等人就如何将毕晓普的想法应用于网络的内部层提出了一个想法:在训练过程中,他们建议在计算后续层之前向网络的每一层注入噪声。因为当训练一个有多层
的深层网络时,注入噪声只会在输入‐输出映射上增强平滑性。
这个想法被称为暂退法。暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃一些神经元。在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。
需要说明的是,暂退法的原始论文提到了一个关于有性繁殖的类比:神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为“共适应性”。作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。
那么关键的挑战就是如何注入这种噪声。一种想法是以一种无偏向(unbiased)的方式注入噪声。这样在固定住其他层时,每一层的期望值等于没有噪音时的值。
实践中的暂退法
当我们将暂退法应用到隐藏层,以p的概率将隐藏单元置为零时,结果可以看作一个只包含原始神经元子集的网络。
这样,输出层的计算不能过度依赖于任何一个元素。
通常,我们在测试时不用暂退法。给定一个训练好的模型和一个新的样本,我们不会丢弃任何节点,因此不需要标准化。然而也有一些例外:一些研究人员在测试时使用暂退法,用于估计神经网络预测的“不确定性”:如果通过许多不同的暂退法遮盖后得到的预测结果都是一致的,那么我们可以说网络发挥更稳定。
前向传播、反向传播和计算图
自动微分大大简化了深度学习算法的实现。在自动微分之前,即使是对复杂模型的微小调整也需要手工重新计算复杂的导数,学术论文也不得不分配大量页面来推导更新规则。通过一些基本的数学和计算图,深入探讨反向传播的细节。首先,我们将重点放在带权重衰减(L2正则化)的单隐藏层多层感知机上。
前向传播
前向传播(forward propagation或forward pass)指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
我们将一步步研究单隐藏层神经网络的机制,为了简单起见,我们假设输入样本是x∈Rd,并且我们的隐藏层不包括偏置项。这里的中间变量是:
z=W(1)x
其中W(1)∈Rh×d是隐藏层的权重参数。将中间变量z∈Rh通过激活函数ϕ后,我们得到长度为h的隐藏激活向量:
h=ϕ(z).
隐藏变量h也是一个中间变量。假设输出层的参数只有权重W(2)∈Rq×h,我们可以得到输出层变量,它是一个长度为q的向量:
o=W(2)h.
假设损失函数为l,样本标签为y,我们可以计算单个数据样本的损失项,
L=l(o, y).
根据L2正则化的定义,给定超参数λ,正则化项为
其中矩阵的Frobenius范数是将矩阵展平为向量后应用的L2范数。最后,模型在给定数据样本上的正则化损失为:
J=L+s.
在下面的讨论中,我们将J称为目标函数。
前向传播计算图
绘制计算图有助于我们可视化计算中操作符和变量的依赖关系。图4.7.1是与上述简单网络相对应的计算图,其中正方形表示变量,圆圈表示操作符。
左下角表示输入,右上角表示输出。注意显示数据流的箭头方向主要是向右和向上的。
反向传播
反向传播(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。假设我们有函数Y=f(X)和Z=g(Y),其中输入和输出X,Y,Z是任意形状的张量。利用链式法则,我们可以计算Z关于X的导数
在这里,我们使用prod运算符在执行必要的操作(如换位和交换输入位置)后将其参数相乘。对于向量,这很简单,它只是矩阵‐矩阵乘法。对于高维张量,我们使用适当的对应项。运算符prod指代了所有的这些符号。
回想一下,在计算图图4.7.1中的单隐藏层简单网络的参数是
和
。反向传播的目的是计算梯度
和
。为此,我们应用链式法则,依次计算每个中间变量和参数的梯度。计算的顺序与前向传播中执行的顺序相反,因为我们需要从计算图的结果开始,并朝着参数的方向努力。第一步是计算目标函数J=L+s相对于损失项L和正则项s的梯度。
接下来,我们根据链式法则计算目标函数关于输出层变量o的梯度:
接下来,我们计算正则化项相对于两个参数的梯度:
现在我们可以计算最接近输出层的模型参数的梯度
。使用链式法则得出:
为了获得关于
的梯度,我们需要继续沿着输出层到隐藏层反向传播。关于隐藏层输出的梯度
由下式给出:
由于激活函数ϕ是按元素计算的,计算中间变量z的梯度
需要使用按元素乘法运算符,我们用⊙表示:
最后,我们可以得到最接近输入层的模型参数的梯度
。根据链式法则,我们得到:
训练神经网络
在训练神经网络时,前向传播和反向传播相互依赖。对于前向传播,我们沿着依赖的方向遍历计算图并计算其路径上的所有变量。然后将这些用于反向传播,其中计算顺序与计算图的相反。
以上述简单网络为例:一方面,在前向传播期间计算正则项(4.7.5)取决于模型参数W(1)和W(2)的当前值。它们是由优化算法根据最近迭代的反向传播给出的。另一方面,反向传播期间参数的梯度计算,取决于由前向传播给出的隐藏变量h的当前值。
因此,在训练神经网络时,在初始化模型参数后,我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。注意,反向传播重复利用前向传播中存储的中间值,以避免重复计算。带来的影响之一是我们需要保留中间值,直到反向传播完成。这也是训练比单纯的预测需要更多的内存(显存)的原因之一。
此外,这些中间值的大小与网络层的数量和批量的大小大致成正比。因此,使用更大的批量来训练更深层次的网络更容易导致内存不足。
编程学习
技术分享
实战经验