深度学习--前向传播,反向传播和计算图
我们已经学习了如何用小批量随机梯度下降训练模型。然而当实现该算法时,我们只考虑了通过前向传播,所涉及的计算。在计算梯度时,我们只调用了深度学习框架提供的反向传播函数。而不知其所以然。
梯度的自动计算大大简化了深度学习算法的实现。在自动微分之前,即使是对复杂模型的微小调整也需要手动重新计算复杂的导数(特征),学术论文也不得不分配大量页面来推导更新规则。本节将铜鼓一些基本的数学和计算图,深入探讨反向传播的细节。首先,我们重点放在带权重衰减的单隐藏曾多层感知机上。
4.7.1 前向传播
前向传播指的是,按顺序计算和存储神经网络中每层的结果
。我们将一步步研究单隐藏层神经网络的机制,假设输入样本是X 属于R^2 并且隐藏层不包括偏置项,这里的中间变量是
z = W x
其中,W 属于R^hxd 是隐藏层的权重参数,将中间便利z属于R^2通过激活函数后,得到长度为h的隐藏层激活向量。
隐藏层激活向量h也是一个中间变量,假设输出层的参数只有权重W 属于R^hxd 我们可以得到输出层变量,是一个长度为q的向量。
o = Wh
假设损失函数为l,样本标签为y,我们可以计算单个数据样本的损失项。
L = l(o, y)
根据L2 正则化的定义,给定超参数lambda,正则化项为
其中,矩阵的弗罗贝尼乌斯范数将是居住展平胃向量后应用的L2范数。最后,模型在给定数据样本的正则化损失为。
J = L + s
在下面的讨论中,我们将J称为目标函数。
4.7.2 向前传播计算图
绘制计算有助于我们可视化计算中运算符和变量的依赖关系,图4-4时与上述简单网络相对应的计算图,其中正方形表示变量,圆圈表示运算符,左下角表示输入,右上角表示输出,注意,展示数据流的箭头方向主药时向右和向上的。
4.7.3 反向传播
反向传播指的是计算神经网络参数梯度的方法,简而言之,该方法根据微积分中的链式法则,按相反的顺序输出层到输入层遍历网络。该算法存储了计算某些参数梯度时所需要的任何中间变量(偏导数)。假设我们有函数Y=f(X)和Z=g(Y),其中输入和输出X,Y,Z是任意形状的张量,应用链式法则,我们可以计算Z关于X的导数。
在这里,我们使用prod运算符在执行必要的操作(如专职和交换输入位置)后将其参数相承。对于向量,这很简单,只是矩阵-矩阵乘法,对于高维张量,我们使用适当的对应项,运算符prod 指代所有的这些符号。
4.7.4 训练神经网络
在训练神经网络时,前向传播和反向传播相互依赖,对于前向传播,我们沿着依赖的方向遍历计算图并计算路径上的所有变量,然后将这些用于反向传播,其中的计算顺序与计算图的相反。
以上述简单网络为例,一方面,在前向传播期间计算的正则化项,取决于模型参数W和W的当前值,是由优化算法根据最近迭代的方向传播给出的。另一方面,反向传播期间参数的梯度计算,取决于由前向后传播给出的隐藏变量h的当前值。
因此,在训练神经网络时,初始化模型参数后,我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数,反向传播重复利用前向传播中存储的中间值,
避免重复计算。