如何为 CNN 更新过滤器权重?

人工智能 深度学习 卷积神经网络 反向传播 数学
2021-10-26 12:26:08

我一直在尝试学习 CNN 的反向传播。我读了几篇文章,比如这篇这篇他们都说要计算过滤器的梯度,只需将输入体积作为输入,误差矩阵作为内核进行卷积。之后,您只需用梯度减去过滤器权重(乘以学习率)。我实现了这个过程,但它不起作用。

这是我尝试过的一个简单示例:

输入音量(随机)

 1 -1  0
 0  1  0
 0 -1  1

在这种情况下,我们希望过滤器只选择左上角的 4 个元素。所以目标输出将是:

 1  0(supposed to be -1, but ReLU is applied) 
 0  1

我们知道所需的过滤器是:

 1  0
 0  0

但我们假装不知道。

我们首先随机化一个过滤器:

 1 -1
 1  1

现在的输出是:

 3  0 
-2  1

应用 ReLU:

 3  0
 0  1

错误(目标 - 输出):

-2  0
 0  0

使用错误作为内核来计算梯度:

-2  2
 0 -2

假设学习率为 0.5,那么新的过滤器为:

2 -2
1  2

这仍然是错误的!它根本没有改善。如果重复此过程,它将无法学习所需的过滤器。所以我一定是把数学理解错了。那么这里有什么问题呢?

1个回答

你在这个问题上做了很多错误的假设。首先从理论上讲,

  • 过滤器不能以“拾取元素”的方式工作(它们根据边缘检测原理工作)。
  • 您假设只有一个过滤器权重组合会给出所需的输出(假设连续权重不是二进制)。这在正则化问题中尤为突出,我们希望选择一组权重而不会过度拟合数据。
  • 您使用的错误看起来与感知器更新规则非常相似(平方误差给出相同的导数,但请确保您没有混淆两者)。
  • 无法通过“dead ReLu”进行反向传播(有关更多详细信息,请参阅此答案)。

现在,让我们进行数学检查:

输入音量:

110010011

期望的输出:

1101

请注意,在此步骤中,您需要一个负输出(元素 (0,-1)),但是您正在通过 ReLu 向前传播,该 ReLu 正在切断负部分,因此梯度无法传达或更新所需的消极的。基本上,

wxReLuy正在发生,如果“x”是负数,那么y总是0因此(targety)总是target因此无论价值多少x误差保持不变,如果我们想反向传播(假设平方误差),那么:

ddw(targety)2=2(targety)ddwy=2(targety)0=0(记住 ReLu 输出图的斜率是0在负区域)。

现在,你随机化一个过滤器:

1111

应用 ReLu 并获得以下信息:

3001

你再次选择了你的目标有一个负数,这在 ReLu 激活的情况下是不可能的。

但继续你会得到错误:

2100

使用 error 来计算梯度(通过 ReLu 的 with 反向传播,你又计算错了)值,并且还错过了与输出相关的减号,但你已经通过将它添加到w而惯例是减去):

1212

并获得新的过滤器:

0.500.50

这是所需过滤器的一个很好的近似值(即使前面的步骤有错误的假设,但这并不重要,因为您实际上所做的是使用线性激活函数,如果您经过足够的迭代,它将起作用)。所以基本上你使用的是线性过滤器,细节太复杂了,我无法进入,所以我会建议一些资源给你看看 ReLu 反向传播:

深度神经网络 - 使用 ReLU 进行反向传播