Skip to content

前向传播、反向传播和计算图

神经网络训练过程

神经网络训练过程是:

    1. 先通过随机参数“猜“一个结果(模型前向传播过程),这里称为预测结果 a;
    1. 然后计算 a与样本标签值 y的差距(即损失函数的计算过程);
    1. 随后通过反向传播算法更新神经元参数,使用新的参数再试一次,这一次就不是“猜”了,而是有依据地向正确的方向靠近,毕竟参数的调整是有策略的(基于梯度下降策略)。

以上步骤如此反复多次,一直到预测结果和真实结果之间相差无几,亦即 ∣a−y∣→0,则训练结束

前向传播

前向传播(forward propagation或forward pass) 指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。

为了更深入理解前向传播的计算过程,我们可以根据网络结构绘制网络的前向传播计算图。下图是简单网络与对应的计算图示例:

图片

其中正方形表示变量,圆圈表示操作符。数据流的方向是从左到右依次计算。

反向传播

反向传播(backward propagation,简称 BP)指的是计算神经网络参数梯度的方法。其原理是基于微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络,依次计算每个中间变量和参数的梯度。

梯度的自动计算(自动微分)大大简化了深度学习算法的实现。

注意,反向传播算法会重复利用前向传播中存储的中间值,以避免重复计算,因此,需要保留前向传播的中间结果,这也会导致模型训练比单纯的预测需要更多的内存(显存)。同时这些中间结果占用内存(显存)大小与网络层的数量和批量(batch_size)大小成正比,因此使用大 batch_size 训练更深层次的网络更容易导致内存不足(out of memory)的错误!

前向传播公式推导

我们将一步步研究单隐藏层神经网络的机制, 为了简单起见,我们假设输入样本是 , 并且我们的隐藏层不包括偏置项。 这里的中间变量是:

其中 是隐藏层的权重参数。 将中间变量通过激活函数后, 我们得到长度为的隐藏激活向量:

隐藏变量也是一个中间变量。 假设输出层的参数只有权重, 我们可以得到输出层变量,它是一个长度为的向量:

假设损失函数为,样本标签为,我们可以计算单个数据样本的损失项,

根据正则化的定义,给定超参数,正则化项为

其中矩阵的Frobenius范数是将矩阵展平为向量后应用的范数。 最后,模型在给定数据样本上的正则化损失为:

在下面的讨论中,我们将称为目标函数(objective function)。

图片

反向传播推导

简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。 该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。 假设我们有函数, 其中输入和输出是任意形状的张量。 利用链式法则,我们可以计算关于的导数

在这里,我们使用运算符在执行必要的操作(如换位和交换输入位置)后将其参数相乘。 对于向量,这很简单,它只是矩阵-矩阵乘法。 对于高维张量,我们使用适当的对应项。 运算符指代了所有的这些符号。

回想一下,在计算图 :numref:fig_forward中的单隐藏层简单网络的参数是 。 反向传播的目的是计算梯度。 为此,我们应用链式法则,依次计算每个中间变量和参数的梯度。 计算的顺序与前向传播中执行的顺序相反,因为我们需要从计算图的结果开始,并朝着参数的方向努力。第一步是计算目标函数相对于损失项和正则项的梯度。

接下来,我们根据链式法则计算目标函数关于输出层变量的梯度:

接下来,我们计算正则化项相对于两个参数的梯度:

现在我们可以计算最接近输出层的模型参数的梯度 。 使用链式法则得出:

为了获得关于的梯度,我们需要继续沿着输出层到隐藏层反向传播。 关于隐藏层输出的梯度由下式给出:

由于激活函数是按元素计算的, 计算中间变量的梯度 需要使用按元素乘法运算符,我们用表示:

最后,我们可以得到最接近输入层的模型参数的梯度 。 根据链式法则,我们得到:

京ICP备2024093538号-1