通过最大池化层反向传播?

数据挖掘 神经网络 反向传播
2021-10-07 19:40:53

这是一个困扰我一段时间的概念性小问题:我们如何通过神经网络中的最大池化层进行反向传播?

在阅读Torch 7 的 nn 库的本教程时,我遇到了最大池化层。该库为深度网络的每一层抽象了梯度计算和前向传递。我不明白如何为最大池化层完成梯度计算。

我知道如果你有意见zil进入神经元i层数l, 然后δil(定义为δil=Ezil) 是(谁)给的:

δil=θ(zil)jδjl+1wi,jl,l+1

因此,最大池化层将接收δjl+1像往常一样的下一层;但是由于最大池化神经元的激活函数将一个值向量(在该向量上最大化)作为输入,δil不再是一个数字,而是一个向量 (θ(zjl)将不得不替换为θ({zjl}))。此外,θ,作为最大函数,就其输入而言不可微分。

那么....它应该如何运作呢?

4个回答

对于非最大值没有梯度,因为稍微改变它们不会影响输出。此外,相对于实际达到最大值的输入,最大值与斜率 1 呈局部线性关系。因此,来自下一层的梯度只传递回达到最大值的神经元。所有其他神经元都获得零梯度。

所以在你的例子中, δil 将是一个全为零的向量,除了 ith 位置将获得一个值 {δjl+1} 在哪里 i=argmaxi(zil)

最大池化

所以假设你有一个 P 层,它位于 PR 层之上。那么前向传递将是这样的:

Pi=f(jWijPRj),

在哪里 Pi是层 P 的第 i 个神经元的激活,f 是激活函数,W 是权重。所以如果你推导出来,通过链式法则你会得到梯度流动如下:

grad(PRj)=igrad(Pi)fWij.

但是现在,如果你有最大池化, f=id 对于最大神经元和 f=0 对于所有其他神经元,所以 f=1 对于前一层的最大神经元和 f=0对于所有其他神经元。所以:

grad(PRmax neuron)=igrad(Pi)Wi max neuron,

grad(PRothers)=0.

@Shinvu 的答案写得很好,我想指出一个视频,它解释了 Max() 操作的梯度,一个快速掌握的计算图中。!

在实现 maxpool 操作(计算图中的计算节点-您的 NN 架构)时,我们需要一个函数创建一个“掩码”矩阵,以跟踪矩阵的最大值在哪里。True (1) 表示最大值在 X 中的位置,其他条目为 False (0)。我们跟踪最大值的位置,因为这是最终影响输出的输入值,因此也影响了成本。反向传播是计算相对于成本的梯度,所以任何影响最终成本的东西都应该有一个非零梯度。因此,反向传播会将梯度“传播”回影响成本的特定输入值。

也许我们写下函数的矩阵格式后,更容易理解池化层的导数max{x}=xW,其中x是张量。让我们看一个具有四个不同值的示例,x = [x1, x2, x3, x4]并且x1是最大值,例如max{x} = x1现在,max{x}可以写成矩阵乘法,这样xW or Wx', where W = [I(x1>x2)*I(x1>x3)*I(x1>x4), I(x2>x1)*I(x2>x3)*I(x2>x4), I(x3>x1)*I(x3>x2)*I(x3>x4), I(x4>x1)*I(x4>x2)*I(x4>x3)]' = [1, 0, 0, 0]', whereI(.)是比较两个值的识别函数。通常,反向传播算法需要两个导数 ---dWx/dx =W' (W transpose)dWx/dW = x'--- 来分别更新前一层和当前层的权重或偏差。但是,在最大池化的情况下,不需要更新W. 因为我们可以并且已经写下了最大池化层函数的封闭形式,即W=[I(x1>x2)*I(x1>x3)*I(x1>x4), I(x2>x1)*I(x2>x3)*I(x2>x4), ...]'. 现在要dWx/dx知道,我们有dWx/dx =W' = [1, 0, 0, 0]W'然后可以作为一个成员适当地插入到派生链中。

通常,max{x}可以写成线性函数,这样Wx (or xW), 其中W是一个矩阵,其条目是一组识别函数的生成,例如I(x1>x2)*I(x1>x3)*I(x1>x4)的一个性质W是,在一列中,只有一个条目是1,其他的都是0。由于这个线性函数的权重已经确定,不需要再使用梯度下降来更新它了。至于max{x}使用链式法则更新前几层的权重和偏差的情况,我们知道dWx/dx =W'