卷积神经网络反向传播算法与训练过程
卷积神经网络(CNN)因其接近人类视觉运作的特征提取方法、以及通过权值共享从而减轻计算任务的特点从而制霸计算机视觉领域,详细地大家可以通过这篇文章( 主要神经网络结构图解)品一品不同网络结构的特点。
我相信大家尤其是新手入门都看过不少“5min入门CNN”、“一张图搞定CNN”…等等之类的文章,虽然这种文章确实能够帮助我们快速理解CNN的特点,但是这种“过于轻松”的方式也可能会让我们丢掉许多卷积神经网络实现的细节问题,很难对CNN有更加深入的理解。
作为一个鉴定信仰“Math goes first”的人,写这篇文章的目的就在于帮助大家怎样用公式表达/推导,这样一种更加严谨老派的方式解释CNN训练过程,目的就在于:1)通过这种“辛苦”的脑力劳动,帮助大家更加深刻具体的理解数据、结构、参数、损失、函数训练这些要素怎样在一起工作运转起来的;2)而来也是为了帮助大家以后能够更好地阅读前沿文献,不至于看到公式就皱眉头。好了,接下来就让我们一起愉快地学习吧!
1、前向传播
1.1卷积层前向传播
前向传播公式
z
j
l
=
∑
i
=
1
M
a
i
l
−
1
∗
w
i
j
l
+
b
j
l
,
a
j
l
=
σ
(
z
j
l
)
z_j^{l}=\sum_{i=1}^{M}a_{i}^{l-1} * w_{i j}^{l}+b_j^{l},a_j^{l}=\sigma\left(z_j^{l}\right)
zjl=i=1∑Mail−1∗wijl+bjl,ajl=σ(zjl)
其中,
z
j
l
z_j^l
zjl表示总输入通道数为
M
M
M的节点
a
i
a_i
ai 经第
l
l
l层神经网络处理后产生的第
j
j
j个输出节点,然后经激活函数
σ
\sigma
σ激活后,也就变成下一层网络的第
j
j
j个输入通道的特征节点
a
j
l
a_j^l
ajl。
注意要点:
- 假设输入节点 i i i的总个数为M,输出节点 j j j的总个数为N,那么总的卷积核 w i j w_{ij} wij个数就为 M ⋅ N M\cdot N M⋅N;
- 在结构确定的情况下,反向传播算法需要更新的就是卷积核的值和偏置;
1.2池化层前向传播
前向传播公式
z
j
l
=
d
o
w
n
(
a
j
l
−
1
)
,
a
j
l
=
σ
(
z
j
l
)
z_j^{l} = down(a_j^{l-1}),a_j^l = \sigma(z_j^l)
zjl=down(ajl−1),ajl=σ(zjl)
其中,
z
j
l
z_j^l
zjl表示输入节点
a
j
a_j
aj 经第
l
l
l层池化层后就变成输出节点
z
j
l
z_j^l
zjl,注意要点:
3. 池化操作并改变输出节点或者说特征图个数,即输入多少张特征图,经池化后输出多少张特征图;
4. 池化一般并没有激活函数,所以此处可以把激活函数的输出等于输入。
1.3全连接层前向传播
前向传播公式
z
j
l
=
∑
i
=
1
M
a
i
l
−
1
∗
w
i
j
l
+
b
j
l
,
a
j
l
=
σ
(
z
j
l
)
z_j^{l}=\sum_{i=1}^{M} a_{i}^{l-1} * w_{i j}^{l}+b_j^{l},a_j^{l}=\sigma\left(z_j^{l}\right)
zjl=i=1∑Mail−1∗wijl+bjl,ajl=σ(zjl)
全连接层的公式基本和卷积层一样,因为形式上可以把全连接层看成一种卷积核尺寸和输入节点或者特征图尺寸一样的卷积,
5. 所以如果输入节点或者特征图的总个数为
M
M
M,输出节点的总个数为
N
N
N,那么总的卷积核个数就为
M
∗
N
M*N
M∗N;
6. 在结构确定的情况下,反向传播算法需要更新的就是卷积核的值和偏置。
2、损失函数
假设我们总共有
P
P
P组数据,
{
x
0
,
y
0
}
,
{
x
1
,
y
1
}
,
.
.
.
,
{
x
P
,
y
P
}
\{x^0,y^0\},\{x^1,y^1\},...,\{x^P,y^P\}
{x0,y0},{x1,y1},...,{xP,yP},其中
p
p
p表示第
p
p
p组数据;假设卷积神经网络的最后一层
L
L
L层的输出节点为
a
L
a^L
aL,我们处理的是一个多元分类问题,比如说判断一张图片中的数字是0~9中哪一个数字,那么任意一组训练输出节点就是一个
1
∗
10
1*10
1∗10的行向量,那么误差函数也就为:
J
=
1
2
∣
∣
a
L
−
y
∣
∣
2
=
∑
k
=
1
1
0
(
x
k
−
y
k
)
2
J = \frac{1}{2}||a^L-y||^2 = \sum_{k=1}^10\left({x_k-y_k}\right)^2
J=21∣∣aL−y∣∣2=k=1∑10(xk−yk)2而总的误差也就应为
∑
p
=
0
P
J
p
\sum_{p=0}^PJ_p
∑p=0PJp,为了方便描述,总的误差后面我们仍然用
J
J
J表示总的误差,当然了,物产函数有很多种,大家根据需要灵活挑选就行啦,至此数据变经过层层处理最总形成了我们的目标函数
J
J
J。
因为我们构造神经网络的目的就是为了找到一种网络结构,能够在给定输入的情况下,能够让输出和目标想匹配,也就是说让
J
J
J最小,想要让
J
J
J最小,那就是说需要找到一组参数使得:
(
W
,
b
)
=
a
r
g
m
i
n
(
J
(
w
,
b
,
x
,
y
)
)
(W,b) = argmin(J(w,b,x,y))
(W,b)=argmin(J(w,b,x,y))这里就需要引入梯度下降法来不断更新卷积核权值和偏置:
(
W
,
b
)
n
+
1
=
(
W
,
b
)
n
−
r
⋅
g
r
a
d
(
J
(
W
,
b
)
n
)
(W,b)^{n+1} = (W,b)^{n}-r\cdot grad(J(W,b)^n)
(W,b)n+1=(W,b)n−r⋅grad(J(W,b)n)这里,r就是学习速率的意思,通过不断调整权重和偏置的权值,从而使得
J
J
J不断减小达到或者符合我们的预期误差值。
3、反向传播
既然我们要求误差对(W,b)的偏导值,那么我们首先要明确一下几点内容:
- 我们要首先明白在整个神经网络结构确定的情况下,,我们需要动态调整的参数主要有:1)卷积层的权重w和偏置;2)因为池化层只有一个反向池化操作,不存在偏置和激活函数的问题,所以我们基本可以说不存在调整参数的问题;3)因为从形式上看,全连接层可以看成一种特俗结构的卷积神经网络(即卷积核大小和输入的特征节点或者特征图尺寸相同),所以即使假设存在多层的全连接层,具体的处理过程参照卷积层推导即可;
- 为了确定 ∂ J ( W , b ) ∂ W , ∂ J ( W , b ) ∂ b \frac{\partial J(W,b)}{\partial W},\frac{\partial J(W,b)}{\partial b} ∂W∂J(W,b),∂b∂J(W,b),我们需要引入一个间接量 δ z = ∂ J ( W , b ) ∂ z \delta _z = \frac{\partial J(W,b)}{\partial z} δz=∂z∂J(W,b), δ z \delta _z δz则表示未经激活的加权输出和变化对目标激活函数的影响;
那么,我们基本就可以明白接下来的任务就主要分为三类:1)已知池化层 δ l \delta^l δl,如何推导上一层的 δ l − 1 \delta^{l-1} δl−1;2)已知卷积层 δ l \delta^l δl,如何推导上一层的 δ l − 1 \delta^{l-1} δl−1;3)已知卷积层 δ l \delta ^l δl,如何 ∂ J ( W , b ) ∂ W l , ∂ J ( W , b ) ∂ b l \frac{\partial J(W,b)}{\partial W^l}, \frac{\partial J(W,b)}{\partial b^l} ∂Wl∂J(W,b),∂bl∂J(W,b)。
3.1 已知池化层 δ l \delta^l δl,推导上一层的 δ l − 1 \delta^{l-1} δl−1
推导公式:
δ
j
l
−
1
=
u
p
s
a
m
p
l
e
(
δ
j
l
)
\delta_j^{l-1} = upsample(\delta_j^l)
δjl−1=upsample(δjl)
因为池化层不存在激活函数这一说,而常见的池化操作有两种:maxpooling和average pooling,所以根据下图就可以很容易理解推导出上一层
δ
l
−
1
\delta ^{l-1}
δl−1的过程,假设已知:
δ
j
l
=
(
2
8
4
6
)
\delta_j^l = \left( \begin{array}{ccc} 2& 8 \\ 4& 6 \end{array} \right)
δjl=(2486)那么,如果池化操作为average pooling,则
δ
j
l
−
1
\delta_j^{l-1}
δjl−1就为:
(
0.5
0.5
2
2
0.5
0.5
2
2
1
1
1.5
1.5
1
1
1.5
1.5
)
\left( \begin{array}{ccc} 0.5&0.5&2&2 \\ 0.5&0.5&2&2 \\ 1&1&1.5&1.5 \\ 1&1&1.5&1.5 \end{array} \right)
⎝⎜⎜⎛0.50.5110.50.511221.51.5221.51.5⎠⎟⎟⎞,如果池化操作为max pooling,则
δ
j
l
−
1
\delta_j^{l-1}
δjl−1就为:
(
2
0
0
0
0
0
0
8
0
4
0
0
0
0
6
0
)
\left( \begin{array}{ccc} 2&0&0&0 \\ 0&0& 0&8 \\ 0&4&0&0 \\ 0&0&6&0 \end{array} \right)
⎝⎜⎜⎛2000004000060800⎠⎟⎟⎞
3.2 已知卷积层 δ l \delta^l δl,推导上一层的 δ l − 1 \delta ^{l-1} δl−1
推导公式: δ i l − 1 = ∂ J ( W , b ) ∂ z l − 1 = δ j l ( ∂ z j l ∂ z i l − 1 ) = δ j l ∗ r o t 180 ( W i j l ) ⊙ σ ′ ( z i l − 1 ) \delta_i^{l-1}= \frac{\partial J(W,b)}{\partial z^{l-1}} = \delta_j^{l}(\frac{\partial z_j^{l}}{\partial z_i^{l-1}}) = \delta_j ^{l}*rot180(W_{ij}^{l}) \odot \sigma^{'}(z_i^{l-1}) δil−1=∂zl−1∂J(W,b)=δjl(∂zil−1∂zjl)=δjl∗rot180(Wijl)⊙σ′(zil−1)这一步的推导很难也很抽象,尤其是像 r o t 180 rot180 rot180这种操作,不过大家不要慌,怎么推导的我会给大家解释的清清楚楚,在次之前首先要明确几点概念和问题:
- 上式中的 ∗ * ∗代表卷积, ⊙ \odot ⊙代表的是矩阵的点积的意思;
- 接下来的描述很重要!很重要!很重要!希望大家认真品一品,我们的任务是什么?就是已知误差函数J对卷积层输出z的偏导(或者说J对卷积层输出矩阵 z l z^{l} zl中任一元素)的情况下,怎样获得函数J对上一层未激活输出 z l z^{l} zl的偏导;
- J J J是标量,而 z , z l − 1 z,z^{l-1} z,zl−1是矩阵,标量对矩阵求偏导很好表示,无非就是标量对矩阵每一个元素求导,那矩阵对矩阵求导呢,就比如上式中 ∂ z j l ∂ z i l − 1 \frac{\partial z_j^{l}}{\partial z_i^{l-1}} ∂zil−1∂zjl是一个矩阵对矩阵求导的过程,该怎么处理呢?答案是 ∂ z j l ∂ z i l − 1 \frac{\partial z_j^{l}}{\partial z_i^{l-1}} ∂zil−1∂zjl只是一个表示方法,严格来讲这种写法是不准确的,并不能直接用来使用推导公式,那上面公式最右端的式子是怎么推导出来的?
- 在上式中,注意 δ i l − 1 \delta_i^{l-1} δil−1的下标和 δ j l \delta_j^{l} δjl的下标是不一样的,这个该怎么处理?
好的,接下来我会慢慢分析,来帮助大家理解上面内容或问题,首先先回顾一下链式求导法则对于函数 h ( x ) = f ( g ( x ) ) , 则 h ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) h(x)=f(g(x)),则h'(x)=f'(g(x))g'(x) h(x)=f(g(x)),则h′(x)=f′(g(x))g′(x),那么假设第 l − 1 l-1 l−1层的输出 a l − 1 a^{l-1} al−1是一个3x3矩阵,第 l l l层的卷积核是一个一个2x2矩阵,那么偏置为 b l b^l bl,则有 a l − 1 ∗ W l + b l = z l a^{l-1}*W^l +b^l = z^{l} al−1∗Wl+bl=zl,如下 ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) ∗ ( W 11 W 12 W 21 W 22 ) + ( b 11 b 12 b 21 b 22 ) = ( Z 11 Z 12 2 21 Z 22 ) \left(\begin{array}{lll} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array}\right) *\left(\begin{array}{cc} W_{11} & W_{12} \\ W_{21} & W_{22} \end{array}\right)+\left(\begin{array}{ll} b_{11} & b_{12} \\ b_{21} & b_{22} \end{array}\right)=\left(\begin{array}{cc} Z_{11} & Z_{12} \\ 2_{21} & Z_{22} \end{array}\right) ⎝⎛a11a21a31a12a22a32a13a23a33⎠⎞∗(W11W21W12W22)+(b11b21b12b22)=(Z11221Z12Z22)而且 z 11 = a 11 w 11 + a 12 w 12 + a 21 w 21 + a 22 w 22 + b 11 z_{11} = a_{11}w_{11} + a_{12}w_{12} + a_{21}w_{21} + a_{22}w_{22} + b_{11} z11=a11w11+a12w12+a21w21+a22w22+b11 z 12 = a 12 w 11 + a 13 w 12 + a 22 w 21 + a 23 w 22 + b 12 z_{12} = a_{12}w_{11} + a_{13}w_{12} + a_{22}w_{21} + a_{23}w_{22} +b_{12} z12=a12w11+a13w12+a22w21+a23w22+b12 z 21 = a 21 w 11 + a 22 w 12 + a 31 w 21 + a 32 w 22 + b 21 z_{21} = a_{21}w_{11} + a_{22}w_{12} + a_{31}w_{21} + a_{32}w_{22} + b_{21} z21=a21w11+a22w12+a31w21+a32w22+b21 z 22 = a 22 w 11 + a 23 w 12 + a 32 w 21 + a 33 w 22 + b 22 z_{22} = a_{22}w_{11} + a_{23}w_{12} + a_{32}w_{21} + a_{33}w_{22} + b_{22} z22=a22w11+a23w12+a32w21+a33w22+b22,那我们现在已经都知道 δ l \delta_l δl,即 ∂ J ∂ z 11 l , ∂ J ∂ z 12 l , ∂ J ∂ z 21 l , ∂ J ∂ z 22 l \frac{\partial J}{\partial z_{11}^{l}},\frac{\partial J}{\partial z_{12}^{l}},\frac{\partial J}{\partial z_{21}^{l}},\frac{\partial J}{\partial z_{22}^{l}} ∂z11l∂J,∂z12l∂J,∂z21l∂J,∂z22l∂J也已知,那要求 ∂ J ∂ a 11 l , ∂ J ∂ a 12 l , ∂ J ∂ a 13 l . . . . . \frac{\partial J}{\partial a_{11}^{l}},\frac{\partial J}{\partial a_{12}^{l}},\frac{\partial J}{\partial a_{13}^{l}}..... ∂a11l∂J,∂a12l∂J,∂a13l∂J.....,那根据链式求导法则,就需要看 a 11 , a 12 , a 13 . . . a_{11},a_{12},a_{13}... a11,a12,a13...和 z 11 , z 12 , z 21 . . . z_{11},z_{12},z_{21}... z11,z12,z21...之间的关系了,首先根据上面的一列式子,我们发现和 a 11 a_{11} a11相关的只有 z 11 z_{11} z11一项,和 a 12 a_{12} a12相关的却有 z 11 , z 12 z_{11},z_{12} z11,z12两项,和 a 13 a_{13} a13相关的有 z 12 z_{12} z12一项,因此推导下来,我们可以得到以下式子: ∂ J ( w , b ) ∂ a 11 1 − 1 = ∂ J ( w , b ) ∂ z 11 2 w 11 = δ 11 w 11 ∂ J ( w , b ) ∂ a 12 = ∂ J ( w , b ) ∂ z 11 w 12 + ∂ J ( w , b ) ∂ z 12 w 11 = δ 11 w 12 + δ 12 w 11 ∂ J ( W , b ) ∂ a 13 = ∂ J ( w , b ) ∂ z 12 w 12 = δ 12 w 12 ∂ J ( W , b ) ∂ a 21 = ∂ J ( w ⋅ b ) ∂ z 11 w 21 + ∂ J ( w 1 b ) d z 21 w 11 = δ 11 w 21 + δ 21 w 11 ∂ J ( w , b ) d a 22 = ∂ J ( w , b ) ∂ z 11 w 22 + ∂ J ( w , b ) ∂ z 12 w 21 + ∂ J ( w , b ) ∂ z 21 w 12 + ∂ J ( w , b ) ∂ z 22 w 11 ∂ J ( w , b ) ∂ a 23 = ∂ J ( w , b ) ∂ z 12 w 22 + ∂ J ( w , b ) ∂ z 22 w 12 = δ 12 w 22 + δ 22 w 12 ∂ J ( w , b ) ∂ a 31 = ∂ J ( w , b ) ∂ z 21 w 21 = δ 21 w 21 ∂ J ( w 1 b ) ∂ a 32 = ∂ J ( w , b ) ∂ z 21 w 22 + ∂ J ( w , b ) ∂ z 22 W 21 = δ 21 w 22 + δ 22 w 21 ∂ J ( w , b ) ∂ a 33 = ∂ J ( w , b ) ∂ z 22 W 22 = δ 22 ⋅ w 22 \begin{aligned} &\frac{\partial J(w, b)}{\partial a_{11}^{1-1}}=\frac{\partial J(w, b)}{\partial z_{11}^{2}} w_{11}=\delta_{11} w_{11}\\ &\frac{\partial J(w, b)}{\partial a_{12}}=\frac{\partial J(w, b)}{\partial z_{11}} w_{12}+\frac{\partial J(w, b)}{\partial z_{12}} w_{11}=\delta_{11} w_{12}+\delta_{12} w_{11}\\ &\frac{\partial J(W, b)}{\partial a_{13}}=\frac{\partial J(w, b)}{\partial z_{12}} w_{12}=\delta_{12} w_{12}\\ &\frac{\partial J(W, b)}{\partial a_{21}}=\frac{\partial J(w \cdot b)}{\partial z_{11}} w_{21}+\frac{\partial J\left(w_{1} b\right)}{d z_{21}} w_{11}=\delta_{11} w_{21}+\delta_{21} w_{11}\\ &\frac{\partial J(w, b)}{d a_{22}}=\frac{\partial J(w, b)}{\partial z_{11}} w_{22}+\frac{\partial J(w, b)}{\partial z_{12}} w_{21}+\frac{\partial J(w, b)}{\partial z_{21}} w_{12}+\frac{\partial J(w, b)}{\partial z_{22}} w_{11}\\ &\frac{\partial J(w, b)}{\partial a_{23} }=\frac{\partial J(w, b)}{\partial z_{12}} w_{22}+\frac{\partial J(w, b)}{\partial z_{22}} w_{12} = \delta_{12} w_{22} + \delta_{22} w_{12}\\ &\frac{\partial J(w, b)}{\partial a_{31}}=\frac{\partial J(w, b)}{\partial z_{21}} w_{21} = \delta_{21} w_{21}\\ &\frac{\partial J\left(w_{1} b\right)}{\partial a_{32}}=\frac{\partial J(w, b)}{\partial z_{21}} w_{22}+\frac{\partial J(w, b)}{\partial z_{22}} W_{21}=\delta_{21} w_{22} + \delta_{22} w_{21} \\ &\frac{\partial J(w, b)}{\partial a_{33}}=\frac{\partial J(w, b)}{\partial z_{22}} W_{22}=\delta_{22} \cdot w_{22} \end{aligned} ∂a111−1∂J(w,b)=∂z112∂J(w,b)w11=δ11w11∂a12∂J(w,b)=∂z11∂J(w,b)w12+∂z12∂J(w,b)w11=δ11w12+δ12w11∂a13∂J(W,b)=∂z12∂J(w,b)w12=δ12w12∂a21∂J(W,b)=∂z11∂J(w⋅b)w21+dz21∂J(w1b)w11=δ11w21+δ21w11da22∂J(w,b)=∂z11∂J(w,b)w22+∂z12∂J(w,b)w21+∂z21∂J(w,b)w12+∂z22∂J(w,b)w11∂a23∂J(w,b)=∂z12∂J(w,b)w22+∂z22∂J(w,b)w12=δ12w22+δ22w12∂a31∂J(w,b)=∂z21∂J(w,b)w21=δ21w21∂a32∂J(w1b)=∂z21∂J(w,b)w22+∂z22∂J(w,b)W21=δ21w22+δ22w21∂a33∂J(w,b)=∂z22∂J(w,b)W22=δ22⋅w22 将上面九个式子整理以后,我们可以用下面这个卷积的形式表达: ( ∂ J ∂ a 11 ∂ J ∂ a 12 ∂ J ∂ a 13 ∂ J ∂ a 21 ∂ J ∂ a 22 ∂ J ∂ a 23 ∂ J ∂ a 31 ∂ J ∂ a 32 ∂ J ∂ a 33 ) = ( 0 0 0 0 0 δ 11 δ 12 0 0 δ 21 δ 22 0 0 0 0 0 ) ∗ ( w 22 w 21 w 12 w 11 ) \begin{array}{c} \left(\begin{array}{ccc} \frac{\partial J}{\partial a_{11}} & \frac{\partial J}{\partial a_{12}} & \frac{\partial J}{\partial a_{13}} \\ \frac{\partial J}{\partial a_{21}} & \frac{\partial J}{\partial a_{22}} & \frac{\partial J}{\partial a_{23}} \\ \frac{\partial J}{\partial a_{31}} & \frac{\partial J}{\partial a_{32}} & \frac{\partial J}{\partial a_{33}} \end{array}\right)=\left(\begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & \delta_{11} & \delta_{12} & 0 \\ 0 & \delta_{21} & \delta_{22} & 0 \\ 0 & 0 & 0 & 0 \end{array}\right) *\left(\begin{array}{cc} w_{22} & w_{21} \\ w_{12} & w_{11} \end{array}\right) \end{array} ⎝⎛∂a11∂J∂a21∂J∂a31∂J∂a12∂J∂a22∂J∂a32∂J∂a13∂J∂a23∂J∂a33∂J⎠⎞=⎝⎜⎜⎛00000δ11δ2100δ12δ2200000⎠⎟⎟⎞∗(w22w12w21w11)这也就解释了卷积核反转180的原因,除此之外,对于任意的 l l l层卷积层输出节点或者说特征图 z j z_{j} zj,其对应的 l − 1 l-1 l−1层输出 a l − 1 a^{l-1} al−1肯定有不止有一个节点,但是对于任一节点 a i l − 1 a_i^{l-1} ail−1,都可以用如下公式表示: ∂ J ( W , b ) ∂ a i l − 1 = ∂ J ( W , b ) ∂ z j l ∗ r o t 180 ( W i j l ) \frac{\partial J(W,b)}{\partial a_i^{l-1}} = \frac{\partial J(W,b)}{\partial z_j^{l}}*rot180(W_{ij}^{l}) ∂ail−1∂J(W,b)=∂zjl∂J(W,b)∗rot180(Wijl)进一步推导: ∂ J ( W , b ) ∂ z i l − 1 = ∂ J ( W , b ) ∂ a i l − 1 ⊙ σ ′ ( z i l − 1 ) = ∂ J ( W , b ) ∂ z j l ∗ r o t 180 ( W i j l ) ⊙ σ ′ ( z i l − 1 ) \frac{\partial J(W,b)}{\partial z_i^{l-1}} = \frac{\partial J(W,b)}{\partial a_i^{l-1}} \odot \sigma^{'}(z_i^{l-1}) = \frac{\partial J(W,b)}{\partial z_j^{l}}*rot180(W_{ij}^{l}) \odot \sigma^{'}(z_i^{l-1}) ∂zil−1∂J(W,b)=∂ail−1∂J(W,b)⊙σ′(zil−1)=∂zjl∂J(W,b)∗rot180(Wijl)⊙σ′(zil−1)
3.3 已知卷积层 δ l \delta^l δl,推导该层的 W , b W,b W,b参数
因为池化层并不存在参数问题,而形式上全连接层可以理解成一种结构较为特殊的卷积层,或者参照深度神经网络反向传播算法的推导过程DNN反向传播算法,所以我们比较关系但也是最重要的参数求导过程就是卷积层权重和偏置的求导过程。推导公式如下:
∂
J
(
W
,
b
)
∂
W
l
=
a
l
−
1
∗
δ
l
\frac{\partial J(W,b)}{\partial W^{l}}=a^{l-1} *\delta^l
∂Wl∂J(W,b)=al−1∗δl
∂
J
(
W
,
b
)
∂
b
l
=
∑
u
,
v
(
δ
l
)
u
,
v
\frac{\partial J(W,b)}{\partial b^{l}} = \sum\limits_{u,v}(\delta^l)_{u,v}
∂bl∂J(W,b)=u,v∑(δl)u,v同样,参照链式求导法则,假设第
l
−
1
l-1
l−1层的输出
a
l
−
1
a^{l-1}
al−1是一个3x3矩阵,第
l
l
l层的卷积核是一个一个2x2矩阵,那么偏置为
b
l
b^l
bl,则有
a
l
−
1
∗
W
l
+
b
l
=
z
l
a^{l-1}*W^l +b^l = z^{l}
al−1∗Wl+bl=zl,同样用矩阵表达的话,
(
a
11
a
12
a
13
a
21
a
22
a
23
a
31
a
32
a
33
)
∗
(
W
11
W
12
W
21
W
22
)
+
(
b
11
b
12
b
21
b
22
)
=
(
Z
11
Z
12
2
21
Z
22
)
\left(\begin{array}{lll} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array}\right) *\left(\begin{array}{cc} W_{11} & W_{12} \\ W_{21} & W_{22} \end{array}\right)+\left(\begin{array}{ll} b_{11} & b_{12} \\ b_{21} & b_{22} \end{array}\right)=\left(\begin{array}{cc} Z_{11} & Z_{12} \\ 2_{21} & Z_{22} \end{array}\right)
⎝⎛a11a21a31a12a22a32a13a23a33⎠⎞∗(W11W21W12W22)+(b11b21b12b22)=(Z11221Z12Z22)
z
11
=
a
11
w
11
+
a
12
w
12
+
a
21
w
21
+
a
22
w
22
+
b
11
z_{11} = a_{11}w_{11} + a_{12}w_{12} + a_{21}w_{21} + a_{22}w_{22} + b_{11}
z11=a11w11+a12w12+a21w21+a22w22+b11
z
12
=
a
12
w
11
+
a
13
w
12
+
a
22
w
21
+
a
23
w
22
+
b
12
z_{12} = a_{12}w_{11} + a_{13}w_{12} + a_{22}w_{21} + a_{23}w_{22} +b_{12}
z12=a12w11+a13w12+a22w21+a23w22+b12
z
21
=
a
21
w
11
+
a
22
w
12
+
a
31
w
21
+
a
32
w
22
+
b
21
z_{21} = a_{21}w_{11} + a_{22}w_{12} + a_{31}w_{21} + a_{32}w_{22} + b_{21}
z21=a21w11+a22w12+a31w21+a32w22+b21
z
22
=
a
22
w
11
+
a
23
w
12
+
a
32
w
21
+
a
33
w
22
+
b
22
z_{22} = a_{22}w_{11} + a_{23}w_{12} + a_{32}w_{21} + a_{33}w_{22} + b_{22}
z22=a22w11+a23w12+a32w21+a33w22+b22,
那我们根据链式求导法则,很容易得出以下的式子
∂
J
(
W
,
b
)
∂
W
11
=
∂
J
(
W
,
b
)
∂
z
11
⋅
∂
z
11
∂
W
11
+
∂
J
(
W
,
b
)
∂
z
12
⋅
∂
z
12
∂
W
11
+
∂
J
(
W
,
b
)
∂
z
21
⋅
∂
z
21
∂
W
11
+
∂
J
(
W
,
b
)
∂
z
22
⋅
∂
z
22
∂
W
11
=
a
11
δ
11
+
a
12
δ
12
+
a
21
δ
21
+
a
22
δ
22
\frac{\partial J(W,b)}{\partial W_{11}}=\frac{\partial J(W,b)}{\partial z_{11}} \cdot \frac{\partial z_{11}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{12}} \cdot \frac{\partial z_{12}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{21}} \cdot \frac{\partial z_{21}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{22}} \cdot \frac{\partial z_{22}}{\partial W_{11}} \\\ = a_{11}\delta_{11} + a_{12}\delta_{12} + a_{21}\delta_{21} + a_{22}\delta_{22}
∂W11∂J(W,b)=∂z11∂J(W,b)⋅∂W11∂z11+∂z12∂J(W,b)⋅∂W11∂z12+∂z21∂J(W,b)⋅∂W11∂z21+∂z22∂J(W,b)⋅∂W11∂z22 =a11δ11+a12δ12+a21δ21+a22δ22同理可得;
∂ J ( W , b ) ∂ W 12 l = a 12 δ 11 + a 13 δ 12 + a 22 δ 21 + a 23 δ 22 ∂ J ( W , b ) ∂ W 13 l = a 13 δ 11 + a 14 δ 12 + a 23 δ 21 + a 24 δ 22 ∂ J ( W , b ) ∂ W 21 l = a 21 δ 11 + a 22 δ 12 + a 31 δ 21 + a 32 δ 22 \\\frac{\partial J(W,b)}{\partial W_{12}^{l}} = a_{12}\delta_{11} + a_{13}\delta_{12} + a_{22}\delta_{21} + a_{23}\delta_{22} \\\frac{\partial J(W,b)}{\partial W_{13}^{l}} = a_{13}\delta_{11} + a_{14}\delta_{12} + a_{23}\delta_{21} + a_{24}\delta_{22} \\\frac{\partial J(W,b)}{\partial W_{21}^{l}} = a_{21}\delta_{11} + a_{22}\delta_{12} + a_{31}\delta_{21} + a_{32}\delta_{22} ∂W12l∂J(W,b)=a12δ11+a13δ12+a22δ21+a23δ22∂W13l∂J(W,b)=a13δ11+a14δ12+a23δ21+a24δ22∂W21l∂J(W,b)=a21δ11+a22δ12+a31δ21+a32δ22,进一步整理: ∂ J ( W , b ) ∂ W l = ( a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ) ∗ ( δ 11 δ 12 δ 21 δ 22 ) = a l − 1 ∗ δ l \frac{\partial J(W,b)}{\partial W^{l}} =\left( \begin{array}{ccc} a_{11}&a_{12}&a_{13}&a_{14} \\ a_{21}&a_{22}&a_{23}&a_{24} \\ a_{31}&a_{32}&a_{33}&a_{34} \\ a_{41}&a_{42}&a_{43}&a_{44} \end{array} \right) * \left( \begin{array}{ccc} \delta_{11}& \delta_{12} \\ \delta_{21}&\delta_{22} \end{array} \right) = a^{l-1} * \delta ^l ∂Wl∂J(W,b)=⎝⎜⎜⎛a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎠⎟⎟⎞∗(δ11δ21δ12δ22)=al−1∗δl 相对而言, ∂ J ( W , b ) ∂ b l \frac {\partial J(W,b)}{\partial b^l} ∂bl∂J(W,b)就比较好处理了, ∂ J ( W , b ) ∂ b l = δ l \frac {\partial J(W,b)}{\partial b^l} = \delta^l ∂bl∂J(W,b)=δl至此,有关反向传播的所有环节就已经结束了。
4、卷积神经网络训练过程总结
在整个神经网络架构已经清晰明确且训练数据确定的情况下,我们就可以编写代码来训练我们的神经网络了,步骤如下:
- 初始化网络中所有权值 W W W和偏置参数 b b b;
- 利用前向传播算法计算最后一层输出 a L a^L aL;
- 使用softmax对输出处理,并计算损失函数 J J J;
- 根据反向传播算法,计算损失函数 J J J对各项权重或者偏置的偏导 ∂ J ∂ ( W , b ) \frac{\partial J}{\partial {(W,b)}} ∂(W,b)∂J;
- 利用梯度下降流,更新权重和偏置, ( W , b ) i + 1 = ( W , b ) i − r ⋅ ∂ J ∂ ( W , b ) {(W,b)} ^{i+1} = {(W,b)}^i - r \cdot {\frac{\partial J}{\partial {(W,b)}}} (W,b)i+1=(W,b)i−r⋅∂(W,b)∂J,返回至步骤2直至损失函数小于我们的预设值;