这是一个概念上的小问题,已经使我陷入困境了:我们如何通过神经网络中的最大流动层进行后退?

我遇到了Max-pooling层 本教程 对于火炬7的NN库。该库抽象了深网的每一层的梯度计算和向前传递。我不明白如何为最大流动层完成梯度计算。

我知道,如果您有一个输入$ {z_i}^l $进入lay $ l $的Neuron $ i $,则$ { delta_i}^l $(定义为$ { delta_i}^l = frac { partial e} { partial {z_i}^l} $)由:$$ { delta_i}^l = theta^{'}({z_i}^l) sum_} ^{l+1} w_ {i,j}^{l,l+1} $$

因此,最大池层将接收到下一层的$ { delta_j}^{l+1} $,照常;但是,由于最大化神经元的激活函数将一个值(最大值)作为输入,因此$ { delta_i}^{l} $不再是单个数字,而是一个向量($ theta^{'}({z_j}^l)$必须由$ nabla theta( left {z_j}^l right })$代替。此外,作为最大功能,$ theta $相对于其输入并不能差异。

那么....应该如何奏效?

有帮助吗?

解决方案

关于非最大值没有梯度,因为更改它们不会影响输出。此外,相对于实际达到最大值的输入,最大值是局部线性的。因此,下一层的梯度仅传递回到达到最大值的神经元。所有其他神经元的梯度为零。

因此,在您的示例中,$ delta_i^l $将是所有零的向量,除了$ i^*$ th位置将获得一个值$ left weft { delta_j^{l+1} right } $ where $ i^* = argmax_ {i}(z_i^l)$

其他提示

最大池

因此,假设您有一个层P层,该层位于PR层的顶部。然后,向前传球将是这样的:

$ p_i = f( sum_j w_ {ij} pr_j)$,

其中$ p_i $是P层P层神经元的激活,F是激活函数,W是权重。因此,如果您得出了这一点,则通过链条规则,您可以获得梯度流如下:

$ grad(pr_j)= sum_i grad(p_i)f^ prime w_ {ij} $。

但是现在,如果您有最大池,则最大神经元的$ f = id $,所有其他神经元的$ f = 0 $,因此上一层中最大神经元的$ f^ prime = 1 $和$ f^ prime = 0 $用于所有其他神经元。所以:

$ grad(pr_ {max neuron})= sum_i grad(p_i)w_ {i {max neuron}} $,

$ grad(pr_ {ershers})= 0。$

@shinvu的答案写得很好,我想指出 解释Max()操作梯度的视频这个 在一个快速掌握的计算图内。

在实现MaxPool操作(计算图中的计算节点)时,我们需要一个函数创建一个“掩码”矩阵,该矩阵可以跟踪矩阵的最大值。 true(1)指示最大值在x中的位置,其他条目为false(0)。我们跟踪最大的位置,因为这是最终影响输出的输入值,因此是成本。 Backprop是计算成本的计算梯度,因此影响最终成本的任何东西都应具有非零梯度。因此,Backprop将“传播”梯度回到影响成本的特定输入值。

许可以下: CC-BY-SA归因
scroll top