阅读本文之前,请首先阅读之前讲述的全连接层的反向传播算法详细推导过程: 全连接反向传播算法。已经了解反向传播算法请自动忽略。
1. 卷积层的反向传播
直接上图:
假设输入为一张单通道图像
x
x
x,卷积核大小为
2
×
2
2\times 2
2×2,输出为
y
y
y。为了加速计算,首先将
x
x
x按卷积核滑动顺序依次展开,如上图所示。其中,
x
^
\hat{x}
x^中的红色框代表
x
x
x中的红色框展开后的结果,将
x
x
x依次按照此方式展开,可得
x
^
\hat{x}
x^。同理可得
w
^
\hat{w}
w^,然后通过矩阵相乘可得输出
y
^
\hat{y}
y^(
y
^
\hat{y}
y^与
y
y
y等价)。此时,已经将CNN转化为FC,与反向传播算法 完全一致,这里不再做详细介绍。
当有
N
N
N个样本,即batch=N时,前向与反向传播方式如下图所示:
其中,输入图像batch=3,使用2个
2
×
2
×
3
2\times 2\times 3
2×2×3的卷积核,输出两张图像,如图所示。红色框、黄色框代表的是卷积核以及使用该卷积核得到的输出图像
y
y
y。当输入图像为一个batch时,
x
、
w
x、w
x、w的转化方式如上图,首先将输入图像与卷积核分别按单通道图像展开,然后将展开后的矩阵在行方向级联。此时,已经将CNN转化为了FC,与反向传播算法 完全一致,这里不再做详细介绍。
2. Average pooling的反向传播
∂
J
∂
w
\frac{\partial J}{\partial w}
∂w∂J不用求,因为
w
w
w为常数。
∂
J
∂
x
i
j
=
Σ
∂
J
∂
x
^
i
j
\frac{\partial J}{\partial x_{ij}}=\Sigma \frac{\partial J}{\partial \hat{x}_{ij}}
∂xij∂J=Σ∂x^ij∂J
3. Max-pooling的反向传播
遍历
x
^
\hat{x}
x^的每一行,找出此行最大值的索引
(
i
,
j
)
(i,j)
(i,j),然后将
∂
J
∂
x
^
\frac{\partial J}{\partial \hat{x}}
∂x^∂J中索引为
(
i
,
j
)
(i,j)
(i,j)的值设为
∂
J
∂
y
^
\frac{\partial J}{\partial \hat{y}}
∂y^∂J对应行的值,将此行其余列的值设为0,如上图所示红框所示。假设
x
^
\hat{x}
x^中(1,1)处的值是第一行中最大的值,则将
∂
J
∂
y
11
\frac{\partial J}{\partial y_{11}}
∂y11∂J赋值给
∂
J
∂
x
^
\frac{\partial J}{\partial \hat{x}}
∂x^∂J中索引为
(
1
,
1
)
(1,1)
(1,1)的位置。最后计算:
∂
J
∂
x
i
j
=
Σ
∂
J
∂
x
^
i
j
\frac{\partial J}{\partial x_{ij}}=\Sigma \frac{\partial J}{\partial \hat{x}_{ij}}
∂xij∂J=Σ∂x^ij∂J