Appearance
前向传播、反向传播和计算图
神经网络训练过程
神经网络训练过程是:
- 先通过随机参数“猜“一个结果(模型前向传播过程),这里称为预测结果 a;
- 然后计算 a与样本标签值 y的差距(即损失函数的计算过程);
- 随后通过反向传播算法更新神经元参数,使用新的参数再试一次,这一次就不是“猜”了,而是有依据地向正确的方向靠近,毕竟参数的调整是有策略的(基于梯度下降策略)。
以上步骤如此反复多次,一直到预测结果和真实结果之间相差无几,亦即 ∣a−y∣→0,则训练结束
前向传播
前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
为了更深入理解前向传播的计算过程,我们可以根据网络结构绘制网络的前向传播计算图。下图是简单网络与对应的计算图示例:

其中正方形表示变量,圆圈表示操作符。数据流的方向是从左到右依次计算。
反向传播
反向传播(backward propagation,简称 BP)指的是计算神经网络参数梯度的方法。其原理是基于微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络,依次计算每个中间变量和参数的梯度。
梯度的自动计算(自动微分)大大简化了深度学习算法的实现。
注意,反向传播算法会重复利用前向传播中存储的中间值,以避免重复计算,因此,需要保留前向传播的中间结果,这也会导致模型训练比单纯的预测需要更多的内存(显存)。同时这些中间结果占用内存(显存)大小与网络层的数量和批量(batch_size)大小成正比,因此使用大 batch_size 训练更深层次的网络更容易导致内存不足(out of memory)的错误!
前向传播公式推导
我们将一步步研究单隐藏层神经网络的机制, 为了简单起见,我们假设输入样本是 , 并且我们的隐藏层不包括偏置项。 这里的中间变量是:
其中 是隐藏层的权重参数。 将中间变量通过激活函数后, 我们得到长度为的隐藏激活向量:
隐藏变量也是一个中间变量。 假设输出层的参数只有权重, 我们可以得到输出层变量,它是一个长度为的向量:
假设损失函数为,样本标签为,我们可以计算单个数据样本的损失项,
根据正则化的定义,给定超参数,正则化项为
其中矩阵的Frobenius范数是将矩阵展平为向量后应用的范数。 最后,模型在给定数据样本上的正则化损失为:
在下面的讨论中,我们将称为目标函数(objective function)。

反向传播推导
简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。 该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。 假设我们有函数和, 其中输入和输出是任意形状的张量。 利用链式法则,我们可以计算关于的导数
在这里,我们使用运算符在执行必要的操作(如换位和交换输入位置)后将其参数相乘。 对于向量,这很简单,它只是矩阵-矩阵乘法。 对于高维张量,我们使用适当的对应项。 运算符指代了所有的这些符号。
回想一下,在计算图 :numref:fig_forward中的单隐藏层简单网络的参数是 和。 反向传播的目的是计算梯度和 。 为此,我们应用链式法则,依次计算每个中间变量和参数的梯度。 计算的顺序与前向传播中执行的顺序相反,因为我们需要从计算图的结果开始,并朝着参数的方向努力。第一步是计算目标函数相对于损失项和正则项的梯度。
接下来,我们根据链式法则计算目标函数关于输出层变量的梯度:
接下来,我们计算正则化项相对于两个参数的梯度:
现在我们可以计算最接近输出层的模型参数的梯度 。 使用链式法则得出:
为了获得关于的梯度,我们需要继续沿着输出层到隐藏层反向传播。 关于隐藏层输出的梯度由下式给出:
由于激活函数是按元素计算的, 计算中间变量的梯度 需要使用按元素乘法运算符,我们用表示:
最后,我们可以得到最接近输入层的模型参数的梯度 。 根据链式法则,我们得到: