背景
我遵循了这两个视频中关于 CNN 反向传播的解释。
https://www.youtube.com/watch?v=Pn7RK7tofPg&t=703
https://www.youtube.com/watch?v=Lakz2MoHy6o&t=1455s
据我了解,单个内核的梯度将是当前层的输入与下一层误差反向传播的增量卷积。
delta_channel = conv(Xm, ERRORn)
Knm' = Knm - 学习率 * delta_channel
哪里
n 是过滤器索引
m 是滤波器的通道/深度索引
K 是核
Xm 是相应深度处滤波器的输入
ERROR 是从过滤器输出反向传播的错误
问题
然而,这让我感到困惑,因为形状不会对齐。
假设变量具有以下形状
K 为 3x3x32
X 为 128x128x3
错误为 128x128x32(K 个零填充的滤波器的每个输出一个)
现在这意味着根据反向传播方程 delta_channel 将是 128x128
无法从 3x3 内核中减去 delta,因为它们是不同的形状。我的理解错在哪里?
我相信解决方案是使用非填充的“有效”互相关。
在我的架构中,我一直使用填充互相关来确保每个过滤器的输入和输出大小匹配。我认为这会让事情更容易推理。
在尝试理解的过程中,我注意到网上很多例子和信息,它们都使用了有效的卷积。值得注意的是这里的解释:https://datascience.stackexchange.com/questions/27506/back-propagation-in-cnn
我们希望梯度与内核形状相同。 有效的卷积会产生以下输出维度:
output_dim = I(输入) - K(内核) + 1
滤波器的误差将与其输出具有相同的形状,所以让我们看看当我们执行有效的互相关来找到内核的梯度时会发生什么
delta_channel = conv(Xm, ERRORn)
现在在 Xm 和 Errorn 之间进行有效的互相关将会产生
太好了,尺寸一致。再说一次,我目前还没有理由,我希望有人介入并提供更好的解决方案来澄清。更好的是仅使用填充互相关的解决方案。