卷积神经网络CNN反向传播过程
卷积层与池化层是卷积神经网络的独特结构,它们同时也是CNN求导的难点。一来卷积的输入特征分为不同通道,针对每个通道求导使得求导过程变得困难。第二池化层不是传统的函数,如何求导令人十分费解。However,办法总比困难多儿。啦啦啦,现在我们就来总结一下卷积神经网络独特结构的梯度传播方式吧。
池化层的梯度
一开始我认为池化不是一般的函数形式,它真的可导吗?这时候我在心里默念三遍:
可导一定连续,连续不一定可导
可导一定连续,连续不一定可导
可导一定连续,连续不一定可导
于是问题变得更多了:池化连续吗????let us check.
- 池化函数
池化的输入是一个多通道特征,为了简单起见,以下我们都只考虑1个通道,因为各个通道信息相互独立,所以这不会影响我们分析结果的普适性。 还记得我们在一般神经网络(DNN)反向传播过程中提到过,针对矩阵函数可以视为多元函数嘛?池化这种在矩阵上进行的操作同样可以视为一种多元函数。Only,这种多元函数的定义域范围收到约束,。以 s i z e = 2 × 2 , s t r i d e = 1 size=2\times2,stride=1 size=2×2,stride=1的最大池化为例。设池化层的输入特征为 W ∈ R 3 × 3 \bf{W}\in\bf{R^{3\times 3}} W∈R3×3,那么池化的输出就是由许多多元函数映射结果组成的新矩阵 z \bf{z} z:
z = ( m a x ( W 11 , W 12 , W 21 , W 22 ) m a x ( W 12 , W 13 , W 22 , W 23 ) m a x ( W 21 , W 22 , W 31 , W 32 ) m a x ( W 22 , W 23 , W 32 , W 33 ) ) @ E q . 1 \bf{z}= \left( \begin{array}{ccc} max(W_{11}, W_{12}, W_{21}, W_{22}) & max(W_{12}, W_{13}, W_{22}, W_{23})\\ max(W_{21}, W_{22}, W_{31}, W_{32}) & max(W_{22}, W_{23}, W_{32}, W_{33}) \end{array} \right)\ @Eq.1 z=(max(W11,W12,W21,W22)max(W21,W22,W31,W32)max(W12,W13,W22,W23)max(W22,W23,W32,W33)) @Eq.1
还记得函数连续性的定义吗?
lim x → → x 0 → f ( x → ) = f ( x 0 → ) s o , lim W → → W 0 → max ( W → ) = max ( W 0 → ) \lim\limits_{\overrightarrow{x}\rightarrow\overrightarrow{x_0}}f(\overrightarrow{x})=f(\overrightarrow{x_0})\\ so,\lim\limits_{\overrightarrow{W}\rightarrow\overrightarrow{W_0}}\max(\overrightarrow{W})=\max(\overrightarrow{W_0}) x→x0limf(x)=f(x0)so,W→W0limmax(W)=max(W0)
clearly, E q . 1 Eq.1 Eq.1是个连续函数。这就是说我们值得好好探讨以下池化函数的可导性质了。
- 最大池化(Max Pooling)
最大池化操作可以表示成像 E q . 1 Eq.1 Eq.1这样的函数,this is a 连续函数。However,它可导嘛?首先儿,让我们把 E q . 1 Eq.1 Eq.1展开一下:
max ( x 1 , x 2 , x 3 , x 4 ) = { x 1 x 1 ≥ x 2 , x 3 , x 4 x 2 x 2 ≥ x 1 , x 3 , x 4 x 3 x 3 ≥ x 1 , x 2 , x 4 x 4 x 4 ≥ x 1 , x 2 , x 3 \max(x_{1},x_2,x_3,x_4)= \left\{\begin{aligned} x_1 & & x_1 \geq x_2,x_3,x_4 \\ x_2 & & x_2 \geq x_1,x_3,x_4 \\ x_3 & & x_3 \geq x_1,x_2,x_4 \\ x_4 & & x_4 \geq x_1,x_2,x_3 \end{aligned}\right. max(x1,x2,x3,x4)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x1x2x3x4x1≥x2,x3,x4x2≥x1,x3,x4x3≥x1,x2,x4x4≥x1,x2,x3
不难发现,在 x 1 ≠ x 2 ≠ x 3 ≠ x 4 x_1\neq x_2\neq x_3\neq x_4 x1=x2=x3=x4时,最大池化函数的导数是 ( 1 , 0 , 0 , 0 ) (1,0,0,0) (1,0,0,0)或者 ( 0 , 1 , 0 , 0 ) (0,1,0,0) (0,1,0,0)或者 ( 0 , 0 , 1 , 0 ) (0,0,1,0) (0,0,1,0)或者 ( 0 , 0 , 0 , 1 ) (0,0,0,1) (0,0,0,1)。那四个自变量元有相等的情况呢,那当然是2两个1,3个1,4个1组合导数向量咯。那最大池化层传递梯度的时候到底是什么样子的。假设第H层是池化层,最大池化层的激活函数可以视为 a H = f ( z H ) = z H \bf{a^{H}}=f(\bf{z^{H}})=\bf{z^{H}} aH=f(zH)=zH,then损失函数对池化层非激活输入的导数为:
∂ ϵ ∂ z H − 1 = ∂ ϵ ∂ Z L ⋅ ∂ Z L ∂ Z L − 1 . . . ∂ Z H + 1 ∂ z H ∂ z H ∂ a H − 1 ∂ a H − 1 ∂ z H − 1 @ E q . 2 \begin{aligned} \frac{\partial\epsilon}{\partial \bf{z^{H-1}}}=\frac{\partial\epsilon}{\partial \bf{Z^{L}}}\cdot\frac{\partial\bf{Z^{L}}}{\partial \bf{Z^{L-1}}}...\frac{\partial\bf{Z^{H+1}}}{\partial \bf{z^{H}}}\frac{\partial\bf{z^{H}}}{\partial \bf{a^{H-1}}}\frac{\partial\bf{a^{H-1}}}{\partial \bf{z^{H-1}}}&&@Eq.2 \end{aligned} ∂zH−1∂ϵ=∂ZL∂ϵ⋅∂ZL−1∂ZL...∂zH∂ZH+1∂aH−1∂zH∂zH−1∂aH−1@Eq.2
其中 p a r t ( x ) part(\bf{x}) part(x)表示对向量的特定区域求导。我们发现,要求得最大池化的导数,必须借助前向传播的信息。现在假设前向传播时,最大池化的参数为 s i z e = 2 × 2 , s t r i d e = 1 size=2\times2,stride=1 size=2×2,stride=1,最大池化层的输入输出分别为.
a H − 1 = ( 1 0 0 0 0 ‾ 2 ‾ 3 0 ‾ 4 ‾ ) @ E q . 3 a H = Z H = ( 1 2 3 4 ‾ ) \begin{aligned} \bf{a^{H-1}}=\left( \begin{array}{ccc} 1 & 0 & 0\\ \red0 & \red{\underline{0}} & \underline{2}\\ \red3 & \red{\underline{0}} & \underline{4} \end{array} \right)&&@Eq.3\\ \bf{a^{H}}=\bf{Z^{H}}=\left( \begin{array}{ccc} 1&2\\ \red3&\underline{4} \end{array} \right) \end{aligned} aH−1=⎝⎛103000024⎠⎞aH=ZH=(1324)@Eq.3
then clearly we have啦啦啦. 因为输出值 a H \bf{a^{H}} aH红色部分来源于输入值 a H − 1 \bf{a^{H-1}} aH−1左下角4个值的最大值,所以输出对输出入求导结果就成下面左下角的样子。
∂ z H ∂ a H − 1 = ( 1 0 0 0 0 ‾ 1 ‾ 1 0 ‾ 1 ‾ ) \frac{\partial\bf{z^{H}}}{\partial \bf{a^{H-1}}}= \left( \begin{array}{ccc} 1 & 0 & 0\\ \red0 & \red{\underline{0}} & \underline{1}\\ \red1 & \red{\underline{0}} & \underline{1} \end{array}\right) ∂aH−1∂zH=⎝⎛101000011⎠⎞
however, 有些细心的同学发现,那输出值 a H \bf{a^{H}} aH右下角下划线部分只有4是最大值,那为啥求导结果下划线部分有2个1呐?这是因为池化还有一个滑动的效果。池化后的输出值实际上是各个维度的最大值结果拼合在一起的。让我们从物理中向量的角度来分析来理解这样一个结果把。滑动最大函数可以表示成如此,其中max函数表示输出模值最大的向量。see, this is why求导结果是这样省的。
f ( x 0 → ) = m a x ( 0 ⋅ e x → + 0 ⋅ e y → + 0 ⋅ e z → + 2 ⋅ e s → ) + m a x ( 0 ⋅ e z → + 2 ⋅ e s → + 0 ⋅ e h → + 4 ⋅ e o → ) = 2 ⋅ e s → + 4 ⋅ e o → where f(x) denotes sliding max function x 0 → = 0 ⋅ e x → + 0 ⋅ e y → + 0 ⋅ e z → + 2 ⋅ e s → + 0 ⋅ e h → + 4 ⋅ e o → ∂ f ( x 0 → ) ∂ x 0 → = 0 ⋅ e x → + 0 ⋅ e y → + 0 ⋅ e z → + 1 ⋅ e s → ‾ + 0 ⋅ e z → + 0 ⋅ e s → + 0 ⋅ e h → + 1 ⋅ e o → ‾ = 0 ⋅ e x → + 0 ⋅ e y → + 0 ⋅ e z → + 1 ⋅ e s → + 0 ⋅ e h → + 1 ⋅ e o → \begin{aligned} f(\overrightarrow{x_0})&=max(0\cdot\overrightarrow{e_x}+0\cdot\overrightarrow{e_y}+0\cdot\overrightarrow{e_z}+2\cdot\overrightarrow{e_s})+\\ &max(0\cdot\overrightarrow{e_z}+2\cdot\overrightarrow{e_s}+0\cdot\overrightarrow{e_h}+4\cdot\overrightarrow{e_o})\\ &=2\cdot\overrightarrow{e_s}+4\cdot\overrightarrow{e_o}\\ &\text{where f(x) denotes sliding max function}\\ &\overrightarrow{x_0}=0\cdot\overrightarrow{e_x}+0\cdot\overrightarrow{e_y}+0\cdot\overrightarrow{e_z}+2\cdot\overrightarrow{e_s}+0\cdot\overrightarrow{e_h}+4\cdot\overrightarrow{e_o}\\ \frac{\partial f(\overrightarrow{x_0})}{\partial \overrightarrow{x_0}}&=\underline{0\cdot\overrightarrow{e_x}+0\cdot\overrightarrow{e_y}+0\cdot\overrightarrow{e_z}+1\cdot\overrightarrow{e_s}}+\\&\underline{0\cdot\overrightarrow{e_z}+0\cdot\overrightarrow{e_s}+0\cdot\overrightarrow{e_h}+1\cdot\overrightarrow{e_o}}\\ &=0\cdot\overrightarrow{e_x}+0\cdot\overrightarrow{e_y}+0\cdot\overrightarrow{e_z}+1\cdot\overrightarrow{e_s}+0\cdot\overrightarrow{e_h}+1\cdot\overrightarrow{e_o} \end{aligned} f(x0)∂x0∂f(x0)=max(0⋅ex+0⋅ey+0⋅ez+2⋅es)+max(0⋅ez+2⋅es+0⋅eh+4⋅eo)=2⋅es+4⋅eowhere f(x) denotes sliding max functionx0=0⋅ex+0⋅ey+0⋅ez+2⋅es+0⋅eh+4⋅eo=0⋅ex+0⋅ey+0⋅ez+1⋅es+0⋅ez+0⋅es+0⋅eh+1⋅eo=0⋅ex+0⋅ey+0⋅ez+1⋅es+0⋅eh+1⋅eo
搜噶,原来最大池层的导数就是这么得来的,是不是还挺复杂的哈哈哈哈。没有关系,平均池化就容易理解得多啦。
- 平均池化(Average Pooling)
最大池化看懂以后,平均池化就更容易理解惹。咱们从一个具体的例子开始入手把。设平均池化的参数为 s i z e = 2 × 2 , s t r i d e = 1 size=2\times2,stride=1 size=2×2,stride=1,平均池化的输入仍然采用最大池化中的输入,即 E q . 3 Eq.3 Eq.3。Now, 平均池化的输出可以写成下面这种形式呢:
a H = ( 1 4 ⋅ ( a 11 H − 1 + a 12 H − 1 + a 21 H − 1 + a 22 H − 1 ) 1 4 ⋅ ( a 12 H − 1 + a 13 H − 1 + a 22 H − 1 + a 23 H − 1 ) 1 4 ⋅ ( a 21 H − 1 + a 22 H − 1 + a 31 H − 1 + a 32 H − 1 ) 1 4 ⋅ ( a 22 H − 1 + a 23 H − 1 + a 32 H − 1 + a 33 H − 1 ) ) = ( 0.25 0.5 0.75 1.5 ) \begin{aligned} \bf{a^{H}}&=\left( \begin{array}{ccc} \frac{1}{4}\cdot(a^{H-1}_{11}+a^{H-1}_{12}+a^{H-1}_{21}+a^{H-1}_{22}) & \frac{1}{4}\cdot(a^{H-1}_{12}+a^{H-1}_{13}+a^{H-1}_{22}+a^{H-1}_{23})\\ \frac{1}{4}\cdot(a^{H-1}_{21}+a^{H-1}_{22}+a^{H-1}_{31}+a^{H-1}_{32}) & \frac{1}{4}\cdot(a^{H-1}_{22}+a^{H-1}_{23}+a^{H-1}_{32}+a^{H-1}_{33}) \end{array}\right)\\ &=\left( \begin{array}{ccc} 0.25 & 0.5\\ 0.75 & 1.5 \end{array}\right) \end{aligned} aH=(41⋅(a11H−1+a12H−1+a21H−1+a22H−1)41⋅(a21H−1+a22H−1+a31H−1+a32H−1)41⋅(a12H−1+a13H−1+a22H−1+a23H−1)41⋅(a22H−1+a23H−1+a32H−1+a33H−1))=(0.250.750.51.5)
那么求导结果就变成了:
∂ z H ∂ a H − 1 = ( 0.25 0.5 0.25 0.5 1 0.5 0.25 0.5 0.25 ) \begin{aligned} \frac{\partial\bf{z^{H}}}{\partial \bf{a^{H-1}}}= \left( \begin{array}{ccc} 0.25 & 0.5 & 0.25\\ 0.5 & 1 & 0.5\\ 0.25 & 0.5 & 0.25 \end{array}\right) \end{aligned} ∂aH−1∂zH=⎝⎛0.250.50.250.510.50.250.50.25⎠⎞
TUA!nice。
卷积层的梯度
要计算卷积层的梯度,我们也得先把卷积操作定义成卷积函数。卷积操作相对于池化来说是比较好理解的。毕竟数学里面已经有了关于卷积的函数定义。like this
f
(
δ
)
=
∫
W
(
x
)
⋅
I
(
δ
−
x
)
d
x
\begin{aligned} f(\delta) = \int W(x)\cdot I(\delta-x)dx \end{aligned}
f(δ)=∫W(x)⋅I(δ−x)dx
有了卷积函数的定义,离散化就更加简单了。那么卷积层的非激活输出定义如下(Normally
n
>
>
m
n>>m
n>>m, 不过这里我们不做任何约束):
z
H
(
x
)
=
Σ
i
=
0
m
W
H
(
i
)
⋅
a
H
−
1
(
x
−
i
)
\begin{aligned} z^{H}(x)=\Sigma_{i=0}^{m}W^{H}(i)\cdot a^{H-1}(x-i) \end{aligned}
zH(x)=Σi=0mWH(i)⋅aH−1(x−i)
卷积层梯度
如果咱们需要更新卷积层参数,那么梯度就计算到卷积层这里,那么非激活输出对参数的梯度是多少儿呢?这就来分析分析。
z
H
\bf{z^{H}}
zH中单个元素对参数矩阵
W
H
\bf{W^{H}}
WH单个元素的导数is like this:
∂
z
H
(
x
)
∂
W
H
(
i
)
=
a
H
−
1
(
x
−
i
)
\begin{aligned} \frac{\partial z^{H}(x)}{\partial W^{H}(i)}= a^{H-1}(x-i) \end{aligned}
∂WH(i)∂zH(x)=aH−1(x−i)
所以呢,参数矩阵就应该是这么大的:
∂
z
H
∂
W
H
=
(
a
H
−
1
(
0
)
n
a
n
n
a
n
n
a
n
.
.
.
a
H
−
1
(
1
)
a
H
−
1
(
0
)
n
a
n
n
a
n
.
.
.
a
H
−
1
(
2
)
a
H
−
1
(
1
)
a
H
−
1
(
0
)
n
a
n
.
.
.
.
.
.
)
\begin{aligned} \frac{\partial \bf{z^{H}}}{\partial \bf{W^{H}}}= \left( \begin{array}{ccc} a^{H-1}(0) & nan & nan & nan & ...\\ a^{H-1}(1) & a^{H-1}(0) & nan & nan & ...\\ a^{H-1}(2) & a^{H-1}(1) & a^{H-1}(0) & nan & ...\\ ...\\ \end{array} \right) \end{aligned}
∂WH∂zH=⎝⎜⎜⎛aH−1(0)aH−1(1)aH−1(2)...nanaH−1(0)aH−1(1)nannanaH−1(0)nannannan.........⎠⎟⎟⎞
according to what we have laerned from DNN backpropagation, we would get sth like this:
∂
ϵ
∂
W
H
=
δ
H
⋅
∂
z
H
∂
W
H
\begin{aligned} \frac{\partial \epsilon}{\partial \bf{W^{H}}}=\bf{\delta^{H}}\cdot \frac{\partial \bf{z^{H}}}{\partial \bf{W^{H}}}\\ \end{aligned}
∂WH∂ϵ=δH⋅∂WH∂zH
in which the dimension detail is
(
1
×
N
H
)
×
(
N
H
×
N
W
H
)
(1\times N^{H})\times(N^{H}\times N^{W^{H}})
(1×NH)×(NH×NWH). 不难看出,这个乘积妥妥是一个卷积呀,而且还是一个将
a
H
−
1
\bf{a^{H-1}}
aH−1水平翻转180°以后的卷积儿。你可能会说,卷积神经网络的输出都是多维的呀,一维卷积的结论能够推广到多维张量上吗?let me tell you, sure,当然可以了。在离散空间上,多维张量可以拍扁成1维向量,并且这个1维向量与原来多维张量的index关系是:
y
=
a
n
−
1
×
(
a
n
−
2
×
(
.
.
.
(
a
1
×
x
1
+
x
2
)
.
.
.
)
+
x
n
−
1
)
+
x
n
=
Π
i
=
1
n
−
1
a
i
x
1
+
Π
i
=
2
n
−
1
a
i
x
2
+
.
.
.
+
x
n
\begin{aligned} y &= a_{n-1} \times ( a_{n-2} \times (...(a_1\times x_1 + x_2)...) + x_{n-1}) + x_n\\ &=\Pi_{i=1}^{n-1}a_{i}x_{1}+\Pi_{i=2}^{n-1}a_{i}x_{2}+...+x_n \end{aligned}
y=an−1×(an−2×(...(a1×x1+x2)...)+xn−1)+xn=Πi=1n−1aix1+Πi=2n−1aix2+...+xn
显然这是一个线性变换公式。then如果把
y
y
y旋转180°,那么效果相当于把每一个
x
i
x_i
xi旋转180°。well,那么我们就知道了,卷积层参数的梯度就是这么一个东西:
∂
ϵ
∂
W
H
=
δ
H
∗
r
o
t
180
(
a
H
−
1
)
∂
ϵ
∂
b
H
=
δ
H
\begin{aligned} \frac{\partial \epsilon}{\partial \bf{W^{H}}}&=\bf{\delta^{H}}*rot180(\bf{a^{H-1}})\\ &\frac{\partial \epsilon}{\partial \bf{b^{H}}}=\bf{\delta^{H}} \end{aligned}
∂WH∂ϵ=δH∗rot180(aH−1)∂bH∂ϵ=δH
梯度如何跨越卷积层
卷积对于被卷积的两个函数来说是对称的,i.e.
∫
f
(
t
)
g
(
x
−
t
)
d
t
=
∫
g
(
t
)
f
(
x
−
t
)
d
t
\int f(t)g(x-t)dt = \int g(t)f(x-t)dt
∫f(t)g(x−t)dt=∫g(t)f(x−t)dt
这种直觉告诉我们,针对
W
H
\bf{W^{H}}
WH和
a
H
−
1
\bf{a^{H-1}}
aH−1的求导具有相同的形式,显然:
∂
z
H
∂
a
H
−
1
=
(
W
H
(
0
)
n
a
n
n
a
n
n
a
n
.
.
.
W
H
(
1
)
W
H
(
0
)
n
a
n
n
a
n
.
.
.
W
H
(
2
)
W
H
(
1
)
W
H
(
0
)
n
a
n
.
.
.
.
.
.
)
\begin{aligned} \frac{\partial \bf{z^{H}}}{\partial \bf{a^{H-1}}}= \left( \begin{array}{ccc} W^{H}(0) & nan & nan & nan & ...\\ W^{H}(1) & W^{H}(0) & nan & nan & ...\\ W^{H}(2) & W^{H}(1) & W^{H}(0) & nan & ...\\ ...\\ \end{array} \right) \end{aligned}
∂aH−1∂zH=⎝⎜⎜⎛WH(0)WH(1)WH(2)...nanWH(0)WH(1)nannanWH(0)nannannan.........⎠⎟⎟⎞
TUA!!!那么梯度在跨越卷积层时,也是以翻转180°的卷积形式存在的。哈哈哈哈哈,还挺好玩的呢。乌拉那拉氏