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