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