当神经网络处理一个批次时,会为每个示例计算每个层的所有激活值(如果库和硬件支持,可能每个示例并行)。存储这些值以供以后使用 - 即批次中每个示例每次激活一个值,它们不会以任何方式聚合
在反向传播期间,这些激活值被用作计算梯度的数值来源之一,以及到目前为止计算的梯度和连接权重。与前向传播一样,每个示例都应用反向传播,它不适用于平均值或求和值。只有在处理完所有示例后,您才能使用批次的总和或平均梯度。
这同样适用于最大池层。您不仅知道批处理中每个示例的池化层的输出是什么,而且您可以查看前一层并确定池中的哪个输入是最大值。
在数学上,避免需要为 NN 层和神经元定义索引,该规则可以这样表示
前向函数是 m=max(a,b)
我们知道 ∂J∂m 对于一些目标函数 J(在神经网络中,这将是我们想要最小化的损失函数,并且我们假设我们已经反向传播到这一点)
我们想知道 ∂J∂a 和 ∂J∂b
如果 a>b
所以 ∂J∂a=∂J∂m 如果 a>b, 别的 ∂J∂a=0
和 ∂J∂b=∂J∂m 如果 b>a, 别的 ∂J∂b=0
当反向传播穿过最大池化层时,梯度会按示例进行处理,并仅分配给前一层的最大输入。其他输入获得零梯度。当它被批处理时,它没有什么不同,它只是按示例处理,可能是并行处理的。在整个批次中,这可能意味着最大池的多个输入激活(可能是全部)获得梯度的一部分——每个来自批次中不同的示例子集。
* 本地 -> 当只对m.
** 从技术上讲,如果a=b正是这样我们就有了不连续性,但在实践中,我们可以在训练神经网络时忽略它而不会出现问题。