反向传播 (backpropagation)本质上是链式法则系统地反向应用于网络层。此过程的最终目的是弄清每个权重 (weight)和偏置 (bias)的微小变化如何影响整体损失函数 (loss function) L。这些由梯度 ∂W∂L 和 ∂b∂L 得到的信息,正是梯度下降 (gradient descent)更新参数 (parameter)并改进模型所需。
我们把视角放在网络中的某个特定层,例如第 l 层。在前向传播过程中,该层接收来自前一层的激活值 a[l−1] (如果 l=1,则是输入特征),并通过两个步骤计算其自身的输出激活值 a[l]:
- 预激活值: z[l]=W[l]a[l−1]+b[l]
- 激活: a[l]=g[l](z[l])
这里,W[l] 和 b[l] 分别是第 l 层的权重矩阵和偏置向量 (vector),g[l] 是其激活函数 (activation function)。
反向传播算法逐层进行,从最后一层开始,向输入层移动。当我们在反向传播中到达第 l 层时,我们假设已经计算出 ∂a[l]∂L,即损失函数对该层输出激活值的梯度。我们目前的任务是使用此信息计算:
- ∂W[l]∂L: 损失函数对第 l 层权重的梯度。
- ∂b[l]∂L: 损失函数对第 l 层偏置的梯度。
- ∂a[l−1]∂L: 损失函数对第 l 层输入激活值的梯度。这用于继续对第 l−1 层进行反向传播。
我们来看看链式法则如何帮助我们计算这些量。
计算对预激活值 (z[l]) 的梯度
首先,我们需要损失函数 (loss function)对预激活值 z[l] 的梯度。由于 L 取决于 a[l],而 a[l] 通过激活函数 (activation function) g[l] 直接取决于 z[l],我们应用链式法则:
∂z[l]∂L=∂a[l]∂L∂z[l]∂a[l]
回想一下,a[l]=g[l](z[l])。因此,第二项仅仅是激活函数的导数,g′[l](z[l])。
∂z[l]∂L=∂a[l]∂Lg′[l](z[l])
这个梯度 ∂z[l]∂L 表示损失函数相对于第 l 层激活函数计算之前的线性组合的变化情况。它是一个重要的中间值,通常表示为 δ[l],或在代码中表示为 dZ[l]。它基本上通过激活函数的导数将误差信号向后传递。
计算权重 (weight) (W[l]) 和偏置 (bias) (b[l]) 的梯度
现在我们有了 ∂z[l]∂L,我们可以计算参数 (parameter) W[l] 和 b[l] 的梯度。请记住 z[l]=W[l]a[l−1]+b[l]。
对于权重 (W[l]): 损失函数 (loss function) L 取决于 z[l],而 z[l] 又取决于 W[l]。应用链式法则:
∂W[l]∂L=∂z[l]∂L∂W[l]∂z[l]
我们需要 z[l] 对 W[l] 的偏导数。从 z[l]=W[l]a[l−1]+b[l] 来看,导数 ∂W[l]∂z[l] 结果是 a[l−1](具体来说,在矩阵表示中是其转置,这是由于矩阵微积分的规则)。直观来说,z[l] 随 W[l] 变化多少,取决于它所乘的输入激活值 a[l−1]。
因此,权重的梯度是:
∂W[l]∂L=∂z[l]∂L(a[l−1])T
在采用向量 (vector)化操作的实现中(处理批次中的多个样本,表示为 m),这通常计算为:
dW[l]=m1dZ[l](A[l−1])T
dZ[l] 表示 ∂Z[l]∂L(∂z[l]∂L 的矩阵形式),A[l−1] 包含批次中所有样本来自前一层的激活值,而 dW[l] 是计算得到的权重梯度矩阵。因子 m1 对批次中的梯度进行平均。
对于偏置 (b[l]): 类似地,L 取决于 z[l],而 z[l] 又取决于 b[l]。
∂b[l]∂L=∂z[l]∂L∂b[l]∂z[l]
导数 ∂b[l]∂z[l] 简单地是 1,因为当 b[l] 变化时,z[l]=W[l]a[l−1]+b[l] 变化量完全相同(保持其他变量不变)。
∂b[l]∂L=∂z[l]∂L⋅1=∂z[l]∂L
所以,偏置的梯度就是对预激活值 z[l] 的梯度。当处理批次数据时,梯度 dZ[l] 通常会具有与(第 l 层神经元数量,样本数量 m)相对应的维度。偏置 b[l] 通常是一个应用于所有样本的向量。因此,梯度 db[l] 是通过在批次维度上对 dZ[l] 求和(或平均)来计算的:
db[l]=m1i=1∑m(dZ[l])(i)
其中 (dZ[l])(i) 表示 dZ[l] 矩阵的第 i 列(样本)。
计算前一层的激活值 (a[l−1]) 的梯度
最后,为了继续反向传播 (backpropagation),我们需要计算 ∂a[l−1]∂L。这说明了第 l−1 层的输出激活值如何影响整体损失。我们再次使用链式法则,注意到 L 取决于 z[l],而 z[l] 又取决于 a[l−1]。
∂a[l−1]∂L=∂z[l]∂L∂a[l−1]∂z[l]
从 z[l]=W[l]a[l−1]+b[l] 来看,导数 ∂a[l−1]∂z[l] 是权重 (weight)矩阵 W[l](具体来说,根据矩阵微积分规则是其转置)。直观来说,a[l−1] 对 z[l] 的影响由它所乘的权重 W[l] 决定。
∂a[l−1]∂L=(W[l])T∂z[l]∂L
向量 (vector)化形式为:
dA[l−1]=(W[l])TdZ[l]
当处理第 l−1 层时,这个 dA[l−1] 成为反向传播下一步的输入梯度 ∂a[l−1]∂L。
第 l 层梯度计算总结
在第 l 层的反向传播 (backpropagation)过程中,假设我们有 dA[l]=∂A[l]∂L,我们计算:
- dZ[l]=dA[l]∗g′[l](Z[l]) (逐元素乘法)
- dW[l]=m1dZ[l](A[l−1])T
- db[l]=m1np.sum(dZ[l],axis=1, keepdims=True) (使用类似 NumPy 的符号表示对样本求和)
- dA[l−1]=(W[l])TdZ[l]
这个计算出的 dA[l−1] 随后向后传递给第 l−1 层,该过程重复进行,直到我们到达输入层。链式法则的这种系统应用使我们能够有效地找到网络中所有权重 (weight)和偏置 (bias)的梯度。下图演示了单个层的这种流程。
第 l 层的梯度计算流程,展示向量 (vector)化操作。反向传播利用传入的梯度 dA[l] 计算 dZ[l],随后可以计算参数 (parameter)梯度 dW[l] 和 db[l](黄色)以及前一层所需的梯度 dA[l−1](红色)。