卷积BP 计算中的核翻转

author:张一极

date:2025年05月05日18:00:45

正文

先考虑前向传播

考虑二维输入特征图 X∈RH×W 和卷积核 K∈RkH×kW,输出特征图 Y 由如下卷积操作定义:

Y(i,j)=∑m=0kH−1∑n=0kW−1X(i+m,j+n)⋅K(m,n)

假设没有 padding,stride 为 1。

损失函数与目标

定义一个损失函数 L(Y),我们的目标是计算关于输入 X 和卷积核 K 的梯度,其中输入 X的梯度用来计算上一层梯度(输入 X就是上一层的输出 Y,这一层的∂L∂X实际上是上一层的∂L∂Y):

∂L∂X,∂L∂K

记 ∂L∂Y(i,j)=δ(i,j) 为从上层网络反传下来的梯度。

对卷积核 K 的梯度

∂Y(i,j)∂K(m,n)=X(i+m,j+n)
δ(i,j)=∂L∂Y(i,j)
∂L∂K(m,n)=∑i,j∂L∂Y(i,j)⋅∂Y(i,j)∂K(m,n)=∑i,jδ(i,j)⋅X(i+m,j+n)

这实际上就是用 δ 在 X 上滑动,只不过:

即:

∂L∂K=X⋆δ

其中 ⋆ 表示 有效卷积(valid convolution),即对 δ 进行卷积操作以求导。

对输入 X 的梯度

每个 X(i,j) 影响多个 Y(i′,j′),即所有的 i 和 j 都满足:

i′+u=i,j′+v=j⇒i′=i−u,j′=j−v

所以:

∂L∂X(i,j)=∑u=0k−1∑v=0k−1δ(i−u,j−v)⋅K(u,v)

 

可以理解为将 δ 与卷积核 K 做 full convolution,并且需要对 K 做旋转(翻转 180°)(关于翻转,见附录 1):

∂L∂X=δ⋆Kflip

其中 Kflip(u,v)=K(kH−1−u,kW−1−v)。

总结

对卷积核的梯度:∂L∂K(m,n)=∑i,jδ(i,j)⋅X(i+m,j+n),这里的卷积为无翻转卷积。 对输入(上层输出)的梯度:∂L∂X(i,j)=∑m,nδ(i−m,j−n)⋅K(m,n),即 δ 与 K 旋转后做全卷积(包含卷积翻转)。

 

 

 

附录 1:关于翻转的理解

我们希望推导输入 X(i,j) 的梯度:

∂L∂X(i,j)=∑u=0k−1∑v=0k−1δ(i−u,j−v)⋅K(u,v)

其中: δ(i,j)=∂L∂Y(i,j) 是输出特征图对损失的梯度。 K(u,v) 是卷积核的参数。 k×k 是卷积核大小。

回忆标准的二维卷积定义(无翻转):

Z(i,j)=∑u=0k−1∑v=0k−1A(i+u,j+v)⋅B(u,v)

也就是 A 和 B 做

cross-correlation(互相关)

而在反向传播中,我们看到:

∂L∂X(i,j)=∑u,vδ(i−u,j−v)⋅K(u,v)

在这个求和过程中,可以看成从最后一个元素开始,往上往左的滑动窗口,此时等同于从第一个元素开始同于往下往右滑动窗口,比如:δ(3,3)与K(0,0)计算得到最后的梯度,δ(2,3)与K(1,0)计算得到最后的梯度,以此类推,如果是正向滑动,那就是δ(3,3)与K(3,3)计算得到最后的梯度,所以要翻转卷积核,这个式子实际上相当于:

∂L∂X=δ⋆K~

其中 ⋆ 表示 有效卷积(valid convolution),K~ 是 K 翻转 180° 后的版本,即:

K~(u,v)=K(k−1−u,k−1−v)

也就是说,虽然看上去我们在用 (i−u,j−v) 做索引,但实际上这和用翻转的 K 卷积 δ 是等价的。 在前向传播中:我们是将 K 滑动到输入 X 上做点积。 在反向传播中:我们希望知道每个输入 X(i,j) 对损失 L 的影响是多少,所以我们将误差项 δ 卷积上翻转的 K。

因此,我们可以将输入梯度的计算写成卷积的形式:

∂L∂X=δ∗K~

其中: δ 是来自上一层的梯度。 K~ 是卷积核 K 翻转 180°。 ∗ 表示标准二维卷积。


以上