本文转自《零基础入门深度学习》系列文章,阅读原文请移步这里
一、RuLU激活函数
最近几年卷积神经网络中,激活函数往往不选择sigmoid或tanh函数,而是选择relu函数。Relu函数的定义是:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x)=max(0,x)
f(x)=max(0,x)Relu函数图像如下图所示:
Relu函数作为激活函数,有下面几大优势:
- 速度快:和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个 m a x ( 0 , x ) max(0,x) max(0,x),计算代价小很多。
- 减轻梯度消失问题:回忆一下计算梯度的公式
∇
=
σ
′
δ
x
\nabla=\sigma'\delta x
∇=σ′δx。其中,
σ
′
\sigma'
σ′是sigmoid函数的导数。在使用反向传播算法进行梯度计算时,每经过一层sigmoid神经元,梯度就要乘上一个
σ
′
\sigma'
σ′。从下图可以看出,
σ
′
\sigma'
σ′函数最大值是1/4。因此,乘一个
σ
′
\sigma'
σ′会导致梯度越来越小,这对于深层网络的训练是个很大的问题。而relu函数的导数是1,不会导致梯度变小。当然,激活函数仅仅是导致梯度减小的一个因素,但无论如何在这方面relu的表现强于sigmoid。使用relu激活函数可以让你训练更深的网络。
- 稀疏性:通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。
更多激活函数参见这里
二、全连接网络 VS 卷积网络
全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:
- 参数数量太多:考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
- 没有利用像素之间的位置信息:对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
- 网络层数限制:我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。
那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:
- 局部连接:这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
- 权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
- 下采样:可以使用Pooling来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。
对于图像识别任务来说,卷积神经网络通过尽可能保留重要的参数,去掉大量不重要的参数,来达到更好的学习效果。
接下来,我们将详述卷积神经网络到底是何方神圣。
三、卷积神经网络(CNN)
首先,我们先获取一个感性认识,下图1是一个卷积神经网络的示意图:
图1 卷积神经网络
1、网络架构
如图1所示,一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:
I
N
P
U
T
−
>
[
[
C
O
N
V
]
∗
N
−
>
P
O
O
L
?
]
∗
M
−
>
[
F
C
]
∗
K
INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
INPUT−>[[CONV]∗N−>POOL?]∗M−>[FC]∗K也就是N个卷积层叠加,然后(可选)叠加一个Pooling层,重复这个结构M次,最后叠加K个全连接层。
对于图1展示的卷积神经网络:
I
N
P
U
T
−
>
C
O
N
V
−
>
P
O
O
L
−
>
C
O
N
V
−
>
P
O
O
L
−
>
F
C
−
>
F
C
INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC
INPUT−>CONV−>POOL−>CONV−>POOL−>FC−>FC按照上述模式可以表示为:
I
N
P
U
T
−
>
[
[
C
O
N
V
]
∗
1
−
>
P
O
O
L
]
∗
2
−
>
[
F
C
]
∗
2
INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2
INPUT−>[[CONV]∗1−>POOL]∗2−>[FC]∗2也就是:
N
=
1
,
M
=
2
,
K
=
2
N=1, M=2, K=2
N=1,M=2,K=2。
2、三维的层结构
从图1我们可以发现卷积神经网络的层结构和全连接神经网络的层结构有很大不同。全连接神经网络每层的神经元是按照一维排列的,也就是排成一条线的样子;而卷积神经网络每层的神经元是按照三维排列的,也就是排成一个长方体的样子,有宽度、高度和深度。
对于图1展示的神经网络,我们看到输入层的宽度和高度对应于输入图像的宽度和高度,而它的深度为1。接着,第一个卷积层对这幅图像进行了卷积操作(后面我们会讲如何计算卷积),得到了三个Feature Map。这里的"3"可能是让很多初学者迷惑的地方,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输入图像卷积得到一个Feature Map,三个Filter就可以得到三个Feature Map。至于一个卷积层可以有多少个Filter,那是可以自由设定的。也就是说,卷积层的Filter个数也是一个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。
继续观察图1,在第一个卷积层之后,Pooling层对三个Feature Map做了下采样(后面我们会讲如何计算下采样),得到了三个更小的Feature Map。接着,是第二个卷积层,它有5个Filter。每个Fitler都把前面下采样之后的3个Feature Map卷积在一起,得到一个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第二个Pooling,继续对5个Feature Map进行下采样,得到了5个更小的Feature Map。
图1所示网络的最后两层是全连接层。第一个全连接层的每个神经元,和上一层5个Feature Map中的每个神经元相连,第二个全连接层(也就是输出层)的每个神经元,则和第一个全连接层的每个神经元相连,这样得到了整个网络的输出。
至此,我们对卷积神经网络有了最基本的感性认识。接下来,我们将介绍卷积神经网络中各种层的计算和训练。
四、卷积神经网络输出值的计算
1、卷积层输出值的计算
我们用一个简单的例子来讲述如何计算卷积,然后,我们抽象出卷积层的一些重要概念和计算方法。
假设有一个55的图像,使用一个33的filter进行卷积,想得到一个33的Feature Map,如下所示:
为了清楚的描述卷积计算过程,我们首先对图像的每个像素进行编号,用
x
i
,
j
x_{i,j}
xi,j表示图像的第行第列元素;对filter的每个权重进行编号,用表示第行第列权重,用表示filter的偏置项;对Feature Map的每个元素进行编号,用表示Feature Map的第行第列元素;用表示激活函数(这个例子选择relu函数作为激活函数)。然后,使用下列公式计算卷积:
a
i
,
j
=
f
(
∑
m
=
0
2
∑
n
=
0
2
w
m
,
n
x
i
+
m
,
j
+
n
+
w
b
)
(
式
1
)
a_{i,j}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{i+m,j+n}+w_b) \space\space\space\space\space\space(式1)
ai,j=f(m=0∑2n=0∑2wm,nxi+m,j+n+wb) (式1)例如,对于Feature Map左上角元素
a
0
,
0
a_{0,0}
a0,0来说,其卷积计算方法为:
a
0
,
0
=
f
(
∑
m
=
0
2
∑
n
=
0
2
w
m
,
n
x
0
+
m
,
0
+
n
+
w
b
)
a_{0,0}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{0+m,0+n}+w_b)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
a0,0=f(m=0∑2n=0∑2wm,nx0+m,0+n+wb)
=
r
e
l
u
(
w
0
,
0
x
0
,
0
+
w
0
,
1
x
0
,
1
+
w
0
,
2
x
0
,
2
+
w
1
,
0
x
1
,
0
+
w
1
,
1
x
1
,
1
+
w
1
,
2
x
1
,
2
+
w
2
,
0
x
2
,
0
+
w
2
,
1
x
2
,
1
+
w
2
,
2
x
2
,
2
)
\space\space\space\space\space\space\space\space\space\space=relu(w_{0,0}x_{0,0} + w_{0,1}x_{0,1} + w_{0,2}x_{0,2} + w_{1,0}x_{1,0} + w_{1,1}x_{1,1} + w_{1,2}x_{1,2} + w_{2,0}x_{2,0} + w_{2,1}x_{2,1} + w_{2,2}x_{2,2})
=relu(w0,0x0,0+w0,1x0,1+w0,2x0,2+w1,0x1,0+w1,1x1,1+w1,2x1,2+w2,0x2,0+w2,1x2,1+w2,2x2,2)
=
r
e
l
u
(
1
+
0
+
1
+
0
+
1
+
0
+
0
+
0
+
1
+
0
)
=relu(1+0+1+0+1+0+0+0+1+0)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=relu(1+0+1+0+1+0+0+0+1+0)
=
r
e
l
u
(
4
)
=
4
=relu(4)=4\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=relu(4)=4 计算结果如下图所示:
接下来,Feature Map的元素
a
0
,
1
a_{0,1}
a0,1的卷积计算方法为:
a
0
,
1
=
f
(
∑
m
=
0
2
∑
n
=
0
2
w
m
,
n
x
0
+
m
,
1
+
n
+
w
b
)
a_{0,1}=f(\sum_{m=0}^2\sum_{n=0}^2w_{m,n}x_{0+m,1+n}+w_b)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
a0,1=f(m=0∑2n=0∑2wm,nx0+m,1+n+wb)
=
r
e
l
u
(
w
0
,
0
x
0
,
1
+
w
0
,
1
x
0
,
2
+
w
0
,
2
x
0
,
3
+
w
1
,
0
x
1
,
1
+
w
1
,
1
x
1
,
2
+
w
1
,
2
x
1
,
3
+
w
2
,
0
x
2
,
1
+
w
2
,
1
x
2
,
2
+
w
2
,
2
x
2
,
3
)
\space\space\space\space\space\space\space\space\space\space=relu(w_{0,0}x_{0,1} + w_{0,1}x_{0,2} + w_{0,2}x_{0,3} + w_{1,0}x_{1,1} + w_{1,1}x_{1,2} + w_{1,2}x_{1,3} + w_{2,0}x_{2,1} + w_{2,1}x_{2,2} + w_{2,2}x_{2,3})
=relu(w0,0x0,1+w0,1x0,2+w0,2x0,3+w1,0x1,1+w1,1x1,2+w1,2x1,3+w2,0x2,1+w2,1x2,2+w2,2x2,3)
=
r
e
l
u
(
1
+
0
+
0
+
0
+
1
+
0
+
0
+
0
+
1
+
0
)
=relu(1+0+0+0+1+0+0+0+1+0)\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=relu(1+0+0+0+1+0+0+0+1+0)
=
r
e
l
u
(
3
)
=
3
=relu(3)=3\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=relu(3)=3 计算结果如下图所示:
可以依次计算出Feature Map中所有元素的值。下面的动画显示了整个Feature Map的计算过程:
上面的计算过程中,步幅(stride)为1。步幅可以设为大于1的数。例如,当步幅为2时,Feature Map计算如下:
我们注意到,当步幅设置为2的时候,Feature Map就变成22了。这说明图像大小、步幅和卷积后的Feature Map大小是有关系的。事实上,它们满足下面的关系:
W
o
u
t
p
u
t
=
(
W
i
n
p
u
t
−
F
+
2
P
)
/
S
+
1
(
式
2
)
W_{output}=(W_{input}-F+2P)/S+1\space\space\space\space\space\space(式2)
Woutput=(Winput−F+2P)/S+1 (式2)
H
o
u
t
p
u
t
=
(
H
i
n
p
u
t
−
F
+
2
P
)
/
S
+
1
(
式
3
)
H_{output}=(H_{input}-F+2P)/S+1\space\space\space\space\space\space(式3)
Houtput=(Hinput−F+2P)/S+1 (式3)在上面两个公式中,
W
o
u
t
p
u
t
W_{output}
Woutput是卷积后Feature Map的宽度;
W
i
n
p
u
t
W_{input}
Winput是卷积前图像的宽度;
F
F
F是filter的宽度;
P
P
P是Zero Padding数量,Zero Padding是指在原始图像周围补几圈0,如果的值是1,那么就补1圈0;
S
S
S是步幅;
H
o
u
t
p
u
t
H_{output}
Houtput是卷积后Feature Map的高度;
H
i
n
t
p
u
t
H_{intput}
Hintput是卷积前图像的宽度。式2和式3本质上是一样的。
以前面的例子来说,图像宽度
W
i
n
p
u
t
=
5
W_{input}=5
Winput=5,filter宽度
F
=
3
F=3
F=3,Zero Padding
P
=
0
P=0
P=0,步幅
S
=
2
S=2
S=2,则
W
o
u
t
p
u
t
=
(
W
i
n
p
u
t
−
F
+
2
P
)
/
S
+
1
W_{output}=(W_{input}-F+2P)/S+1
Woutput=(Winput−F+2P)/S+1
=
(
5
−
3
+
2
∗
0
)
/
2
+
1
\space\space\space\space\space=(5-3+2*0)/2+1
=(5−3+2∗0)/2+1
=
2
=2\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=2 说明Feature Map宽度是2。同样,我们也可以计算出Feature Map高度也是2。
前面我们已经讲了深度为1的卷积层的计算方法,如果深度大于1怎么计算呢?其实也是类似的。如果卷积前的图像深度为D,那么相应的filter的深度也必须为D。我们扩展一下式1,得到了深度大于1的卷积计算公式: a i , j = f ( ∑ d = 0 D − 1 ∑ m = 0 F − 1 ∑ n = 0 F − 1 w d , m , n x d , i + m , j + n + w b ) ( 式 4 ) a_{i,j}=f(\sum_{d=0}^{D-1}\sum_{m=0}^{F-1}\sum_{n=0}^{F-1}w_{d,m,n}x_{d,i+m,j+n}+w_b)\space\space\space\space\space\space(式4) ai,j=f(d=0∑D−1m=0∑F−1n=0∑F−1wd,m,nxd,i+m,j+n+wb) (式4)在式4中,D是深度;F是filter的大小(宽度或高度,两者相同); w d , m , n w_{d,m,n} wd,m,n表示filter的第 d d d层第 m m m行第 n n n列权重; a d , i , j a_{d,i,j} ad,i,j表示图像的第 d d d层第 i i i行第 j j j列像素;其它的符号含义和式1是相同的,不再赘述。
我们前面还曾提到,每个卷积层可以有多个filter。每个filter和原始图像进行卷积后,都可以得到一个Feature Map。因此,卷积后Feature Map的深度(个数)和卷积层的filter个数是相同的。
下面的动画显示了包含两个filter的卷积层的计算。我们可以看到773输入,经过两个333filter的卷积(步幅为2),得到了332的输出。另外我们也会看到下图的Zero padding是1,也就是在输入元素的周围补了一圈0。Zero padding对于图像边缘部分的特征提取是很有帮助的。
以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且filter的权值对于上一层所有神经元都是一样的。对于包含两个333的fitler的卷积层来说,其参数数量仅有(333+1)*2=56个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。
2、用卷积公式来表达卷积层计算
不想了解太多数学细节的读者可以跳过这一节,不影响对全文的理解。
下面我们介绍二维卷积公式。
设矩阵
A
A
A,
B
B
B,其行、列数分别为
m
a
m_a
ma、
n
a
n_a
na、
m
b
m_b
mb、
n
b
n_b
nb,则二维卷积公式如下:
C
s
,
t
=
∑
0
m
a
−
1
∑
0
n
a
−
1
A
m
,
n
B
s
−
m
,
t
−
n
C_{s,t}=\sum_{0}^{m_a-1}\sum_{0}^{n_a-1}A_{m,n}B_{s-m,t-n}
Cs,t=0∑ma−10∑na−1Am,nBs−m,t−n且
s
,
t
s,t
s,t满足条件
0
⪕
s
<
m
a
+
m
b
−
1
,
0
⪕
t
<
n
a
+
n
b
−
1
0\eqslantless s \lt m_a + m_b-1,0\eqslantless t \lt n_a + n_b-1
0⪕s<ma+mb−1,0⪕t<na+nb−1。
我们可以把上式写成
C
=
A
∗
B
(
式
5
)
C=A*B\space\space\space\space\space\space(式5)
C=A∗B (式5)如果我们按照式5来计算卷积,我们可以发现矩阵A实际上是filter,而矩阵B是待卷积的输入,位置关系也有所不同:
从上图可以看到,A左上角的值
a
0
,
0
a_{0,0}
a0,0与B对应区块中右下角的值
b
1
,
1
b_{1,1}
b1,1相乘,而不是与左上角的
b
0
,
0
b_{0,0}
b0,0相乘。因此,数学中的卷积和卷积神经网络中的『卷积』还是有区别的,为了避免混淆,我们把卷积神经网络中的『卷积』操作叫做互相关(cross-correlation)操作。
卷积和互相关操作是可以转化的。首先,我们把矩阵A翻转180度,然后再交换A和B的位置(即把B放在左边而把A放在右边。卷积满足交换率,这个操作不会导致结果变化),那么卷积就变成了互相关。
如果我们不去考虑两者这么一点点的区别,我们可以把式5代入到式4: A = f ( ∑ d = 0 D − 1 X d ∗ W d + w b ) ( 式 6 ) A=f(\sum_{d=0}^{D-1}X_d*W_d+w_b)\space\space\space\space\space\space(式6) A=f(d=0∑D−1Xd∗Wd+wb) (式6)其中, A A A是卷积层输出的feature map。同式4相比,式6就简单多了。然而,这种简洁写法只适合步长为1的情况。
3、Pooling层输出值的计算
Pooling层主要的作用是下采样,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。Max Pooling实际上就是在nn的样本中取最大值,作为采样后的样本值。下图是22 max pooling:
除了Max Pooing之外,常用的还有Mean Pooling——取各样本的平均值。
对于深度为D的Feature Map,各层独立做Pooling,因此Pooling后的深度仍然为D。
4、全连接层
全连接层输出值的计算和《深度学习之神经网络和反向传播算法》讲过的全连接神经网络是一样的,这里就不再赘述了。
五、卷积神经网络的训练
和全连接神经网络相比,卷积神经网络的训练要复杂一些。但训练的原理是一样的:利用链式求导计算损失函数对每个权重的偏导数(梯度),然后根据梯度下降公式更新权重。训练算法依然是反向传播算法。
我们先回忆一下《深度学习之神经网络和反向传播算法》介绍的反向传播算法,整个算法分为三个步骤:
- 前向计算每个神经元的输出值 a j a_j aj( j j j表示网络的第 j j j个神经元,以下同);
- 反向计算每个神经元的误差项 δ j \delta_j δj, δ j \delta_j δj在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数 E d E_d Ed对神经元加权输入 n e t j net_j netj的偏导数,即 δ j = ∂ E d ∂ n e t j \delta_j=\frac{\partial E_d}{\partial net_j} δj=∂netj∂Ed;
- 计算每个神经元连接权重 w j i w_{ji} wji的梯度( w j i w_{ji} wji表示从神经元 i i i连接到神经元 j j j的权重),公式为 ∂ E d ∂ w j i = a i δ j \frac{\partial E_d}{\partial w_{ji}}=a_i\delta_j ∂wji∂Ed=aiδj,其中, a i a_i ai表示神经元 i i i的输出。
最后,根据梯度下降法则更新每个权重即可。
对于卷积神经网络,由于涉及到局部连接、下采样的等操作,影响到了第二步误差项 δ \delta δ的具体计算方法,而权值共享影响了第三步权重 w w w的梯度的计算方法。接下来,我们分别介绍卷积层和Pooling层的训练算法。
1、卷积层的训练
对于卷积层,我们先来看看上面的第二步,即如何将误差项 δ \delta δ传递到上一层;然后再来看看第三步,即如何计算filter每个权值 w w w的梯度。
卷积层误差项的传递
我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
假设输入的大小为3*3,filter大小为2*2,按步长为1卷积,我们将得到2*2的feature map。如下图所示:
在上图中,为了描述方便,我们为每个元素都进行了编号。用
δ
i
,
j
l
−
1
\delta_{i,j}^{l-1}
δi,jl−1表示第
l
−
1
l-1
l−1层第
i
i
i行第
j
j
j列的误差项;用
w
m
,
n
w_{m,n}
wm,n表示filter第
m
m
m行第
n
n
n列权重,用
w
b
w_b
wb表示filter的偏置项;用
a
i
,
j
l
−
1
a_{i,j}^{l-1}
ai,jl−1表示第
l
−
1
l-1
l−1层第
i
i
i行第
j
j
j列神经元的输出;用
n
e
t
i
,
j
l
−
1
net_{i,j}^{l-1}
neti,jl−1表示第
l
−
1
l-1
l−1行神经元的加权输入;用
δ
i
,
j
l
\delta_{i,j}^{l}
δi,jl表示第
l
l
l层第
i
i
i行第
j
j
j列的误差项;用
f
l
−
1
f^{l-1}
fl−1表示第
l
−
1
l-1
l−1层的激活函数。它们之间的关系如下:
n
e
t
l
=
c
o
n
v
(
W
l
,
a
l
−
1
)
+
w
b
net^l=conv(W^l,a^{l-1}) + w_b
netl=conv(Wl,al−1)+wb
a
i
,
j
l
−
1
=
f
l
−
1
(
n
e
t
i
,
j
l
−
1
)
a_{i,j}^{l-1}=f^{l-1}(net_{i,j}^{l-1})\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
ai,jl−1=fl−1(neti,jl−1) 上式中,
n
e
t
l
net^l
netl、
W
l
W^l
Wl、
a
l
−
1
a^{l-1}
al−1都是数组,
W
l
W^l
Wl是由
w
m
,
n
w_{m,n}
wm,n组成的数组,
c
o
n
v
conv
conv表示卷积操作。
在这里,我们假设第
l
l
l中的每个
δ
l
\delta^l
δl值都已经算好,我们要做的是计算第
l
−
1
l-1
l−1层每个神经元的误差项
δ
l
−
1
\delta^{l-1}
δl−1。
根据链式求导法则:
δ
i
,
j
l
−
1
=
∂
E
d
∂
n
e
t
i
,
j
l
−
1
\delta_{i,j}^{l-1}=\frac{\partial E_d}{\partial net_{i,j}^{l-1}}
δi,jl−1=∂neti,jl−1∂Ed
=
∂
E
d
∂
a
i
,
j
l
−
1
∂
a
i
,
j
l
−
1
∂
n
e
t
i
,
j
l
−
1
\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial a_{i,j}^{l-1}}\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}}
=∂ai,jl−1∂Ed∂neti,jl−1∂ai,jl−1我们先求第一项
∂
E
d
∂
a
i
,
j
l
−
1
\frac{\partial E_d}{\partial a_{i,j}^{l-1}}
∂ai,jl−1∂Ed。我们先来看几个特例,然后从中总结出一般性的规律。
例1,计算
∂
E
d
∂
a
1
,
1
l
−
1
\frac{\partial E_d}{\partial a_{1,1}^{l-1}}
∂a1,1l−1∂Ed,
a
1
,
1
l
−
1
a_{1,1}^{l-1}
a1,1l−1仅与
n
e
t
1
,
1
l
net_{1,1}^{l}
net1,1l的计算有关:
n
e
t
1
,
1
j
=
w
1
,
1
a
1
,
1
l
−
1
+
w
1
,
2
a
1
,
2
l
−
1
+
w
2
,
1
a
2
,
1
l
−
1
+
w
2
,
2
a
2
,
2
l
−
1
+
w
b
net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b
net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb因此:
∂
E
d
∂
a
1
,
1
l
−
1
=
∂
E
d
∂
n
e
t
1
,
1
l
∂
n
e
t
1
,
1
l
∂
a
1
,
1
l
−
1
\frac{\partial E_d}{\partial a_{1,1}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{1,1}^{l-1}}
∂a1,1l−1∂Ed=∂net1,1l∂Ed∂a1,1l−1∂net1,1l
=
δ
1
,
1
l
w
1
,
1
=\delta_{1,1}^lw_{1,1}\space
=δ1,1lw1,1 例2,计算
∂
E
d
∂
a
1
,
2
l
−
1
\frac{\partial E_d}{\partial a_{1,2}^{l-1}}
∂a1,2l−1∂Ed,
a
1
,
2
l
−
1
a_{1,2}^{l-1}
a1,2l−1与
n
e
t
1
,
1
l
net_{1,1}^{l}
net1,1l和
n
e
t
1
,
2
l
net_{1,2}^{l}
net1,2l的计算都有关:
n
e
t
1
,
1
j
=
w
1
,
1
a
1
,
1
l
−
1
+
w
1
,
2
a
1
,
2
l
−
1
+
w
2
,
1
a
2
,
1
l
−
1
+
w
2
,
2
a
2
,
2
l
−
1
+
w
b
net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b
net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb
n
e
t
1
,
2
j
=
w
1
,
1
a
1
,
2
l
−
1
+
w
1
,
2
a
1
,
3
l
−
1
+
w
2
,
1
a
2
,
2
l
−
1
+
w
2
,
2
a
2
,
3
l
−
1
+
w
b
net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b
net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb因此:
∂
E
d
∂
a
1
,
2
l
−
1
=
∂
E
d
∂
n
e
t
1
,
1
l
∂
n
e
t
1
,
1
l
∂
a
1
,
2
l
−
1
+
∂
E
d
∂
n
e
t
1
,
2
l
∂
n
e
t
1
,
2
l
∂
a
1
,
2
l
−
1
\frac{\partial E_d}{\partial a_{1,2}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{1,2}^{l-1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial a_{1,2}^{l-1}}
∂a1,2l−1∂Ed=∂net1,1l∂Ed∂a1,2l−1∂net1,1l+∂net1,2l∂Ed∂a1,2l−1∂net1,2l
=
δ
1
,
1
l
w
1
,
2
+
δ
1
,
2
l
w
1
,
1
=\delta_{1,1}^lw_{1,2}+\delta_{1,2}^lw_{1,1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=δ1,1lw1,2+δ1,2lw1,1 例3,计算
∂
E
d
∂
a
2
,
2
l
−
1
\frac{\partial E_d}{\partial a_{2,2}^{l-1}}
∂a2,2l−1∂Ed,
a
2
,
2
l
−
1
a_{2,2}^{l-1}
a2,2l−1与
n
e
t
1
,
1
l
net_{1,1}^{l}
net1,1l、
n
e
t
1
,
2
l
net_{1,2}^{l}
net1,2l、
n
e
t
2
,
1
l
net_{2,1}^{l}
net2,1l和
n
e
t
2
,
2
l
net_{2,2}^{l}
net2,2l的计算都有关:
n
e
t
1
,
1
j
=
w
1
,
1
a
1
,
1
l
−
1
+
w
1
,
2
a
1
,
2
l
−
1
+
w
2
,
1
a
2
,
1
l
−
1
+
w
2
,
2
a
2
,
2
l
−
1
+
w
b
net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b
net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb
n
e
t
1
,
2
j
=
w
1
,
1
a
1
,
2
l
−
1
+
w
1
,
2
a
1
,
3
l
−
1
+
w
2
,
1
a
2
,
2
l
−
1
+
w
2
,
2
a
2
,
3
l
−
1
+
w
b
net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b
net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb
n
e
t
2
,
1
j
=
w
1
,
1
a
2
,
1
l
−
1
+
w
1
,
2
a
2
,
2
l
−
1
+
w
2
,
1
a
3
,
1
l
−
1
+
w
2
,
2
a
3
,
2
l
−
1
+
w
b
net_{2,1}^j=w_{1,1}a_{2,1}^{l-1}+w_{1,2}a_{2,2}^{l-1}+w_{2,1}a_{3,1}^{l-1}+w_{2,2}a_{3,2}^{l-1}+w_b
net2,1j=w1,1a2,1l−1+w1,2a2,2l−1+w2,1a3,1l−1+w2,2a3,2l−1+wb
n
e
t
2
,
2
j
=
w
1
,
1
a
2
,
2
l
−
1
+
w
1
,
2
a
2
,
3
l
−
1
+
w
2
,
1
a
3
,
2
l
−
1
+
w
2
,
2
a
3
,
3
l
−
1
+
w
b
net_{2,2}^j=w_{1,1}a_{2,2}^{l-1}+w_{1,2}a_{2,3}^{l-1}+w_{2,1}a_{3,2}^{l-1}+w_{2,2}a_{3,3}^{l-1}+w_b
net2,2j=w1,1a2,2l−1+w1,2a2,3l−1+w2,1a3,2l−1+w2,2a3,3l−1+wb因此:
∂
E
d
∂
a
2
,
2
l
−
1
=
∂
E
d
∂
n
e
t
1
,
1
l
∂
n
e
t
1
,
1
l
∂
a
2
,
2
l
−
1
+
∂
E
d
∂
n
e
t
1
,
2
l
∂
n
e
t
1
,
2
l
∂
a
2
,
2
l
−
1
+
∂
E
d
∂
n
e
t
2
,
1
l
∂
n
e
t
2
,
1
l
∂
a
2
,
2
l
−
1
+
∂
E
d
∂
n
e
t
2
,
2
l
∂
n
e
t
2
,
2
l
∂
a
2
,
2
l
−
1
\frac{\partial E_d}{\partial a_{2,2}^{l-1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial a_{2,2}^{l-1}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial a_{2,2}^{l-1}}
∂a2,2l−1∂Ed=∂net1,1l∂Ed∂a2,2l−1∂net1,1l+∂net1,2l∂Ed∂a2,2l−1∂net1,2l+∂net2,1l∂Ed∂a2,2l−1∂net2,1l+∂net2,2l∂Ed∂a2,2l−1∂net2,2l
=
δ
1
,
1
l
w
2
,
2
+
δ
1
,
2
l
w
2
,
1
+
δ
2
,
1
l
w
1
,
2
+
δ
2
,
2
l
w
1
,
1
=\delta_{1,1}^lw_{2,2}+\delta_{1,2}^lw_{2,1}+\delta_{2,1}^lw_{1,2}+\delta_{2,2}^lw_{1,1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=δ1,1lw2,2+δ1,2lw2,1+δ2,1lw1,2+δ2,2lw1,1 从上面三个例子,我们发挥一下想象力,不难发现,计算
∂
E
d
∂
a
l
−
1
\frac{\partial E_d}{\partial a^{l-1}}
∂al−1∂Ed,相当于把第
l
l
l层的sensitive map周围补一圈0,在与180度翻转后的filter进行cross-correlation,就能得到想要结果,如下图所示:
因为卷积相当于将filter旋转180度的cross-correlation,因此上图的计算可以用卷积公式完美的表达:
∂
E
d
∂
a
l
=
δ
l
∗
W
l
\frac{\partial E_d}{\partial a^l}=\delta^l*W^l
∂al∂Ed=δl∗Wl上式中的
W
l
W^l
Wl表示第
l
l
l层的filter的权重数组。也可以把上式的卷积展开,写成求和的形式:
∂
E
d
∂
a
i
,
j
l
=
∑
m
∑
n
w
m
,
n
l
δ
i
+
m
,
j
+
n
l
\frac{\partial E_d}{\partial a^l_{i,j}}=\sum_m\sum_nw^l_{m,n}\delta^l_{i+m,j+n}
∂ai,jl∂Ed=m∑n∑wm,nlδi+m,j+nl现在,我们再求第二项
∂
a
i
,
j
l
−
1
∂
n
e
t
i
,
j
l
−
1
\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}}
∂neti,jl−1∂ai,jl−1。因为
a
i
,
j
l
−
1
=
f
(
n
e
t
i
,
j
l
−
1
)
a_{i,j}^{l-1}=f(net_{i,j}^{l-1})
ai,jl−1=f(neti,jl−1)所以这一项极其简单,仅求激活函数
f
f
f的导数就行了。
∂
a
i
,
j
l
−
1
∂
n
e
t
i
,
j
l
−
1
=
f
′
(
n
e
t
i
,
j
l
−
1
)
\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}}=f'(net_{i,j}^{l-1})
∂neti,jl−1∂ai,jl−1=f′(neti,jl−1)将第一项和第二项组合起来,我们得到最终的公式:
δ
i
,
j
l
−
1
=
∂
E
d
∂
n
e
t
i
,
j
l
−
1
\delta_{i,j}^{l-1}=\frac{\partial E_d}{\partial net_{i,j}^{l-1}}
δi,jl−1=∂neti,jl−1∂Ed
=
∂
E
d
∂
a
i
,
j
l
−
1
∂
a
i
,
j
l
−
1
∂
n
e
t
i
,
j
l
−
1
=\frac{\partial E_d}{\partial a_{i,j}^{l-1}}\frac{\partial a_{i,j}^{l-1}}{\partial net_{i,j}^{l-1}}
=∂ai,jl−1∂Ed∂neti,jl−1∂ai,jl−1
=
∑
m
∑
n
w
m
,
n
l
δ
i
+
m
,
j
+
n
l
f
′
(
n
e
t
i
,
j
l
−
1
)
(
式
7
)
=\sum_m\sum_nw_{m,n}^l\delta^l_{i+m,j+n}f'(net_{i,j}^{l-1})\space\space\space\space\space\space(式7)
=m∑n∑wm,nlδi+m,j+nlf′(neti,jl−1) (式7)也可以将式7写成卷积的形式:
δ
l
−
1
=
δ
l
∗
W
l
∘
f
′
(
n
e
t
l
−
1
)
(
式
8
)
\delta^{l-1}=\delta^l*W^l\circ f'(net^{l-1})\space\space\space\space\space\space(式8)
δl−1=δl∗Wl∘f′(netl−1) (式8)其中,符号
∘
\circ
∘表示element-wise product,即将矩阵中每个对应元素相乘。注意式8中的
δ
l
−
1
\delta^{l-1}
δl−1、
δ
l
\delta^{l}
δl、
n
e
t
l
−
1
net^{l-1}
netl−1都是矩阵。
以上就是步长为1、输入的深度为1、filter个数为1的最简单的情况,卷积层误差项传递的算法。下面我们来推导一下步长为S的情况。
现在我们考虑步长、深度、filter不是1的情况:
-
当卷积步长为S时
如上图,上面是步长为1时的卷积结果,下面是步长为2时的卷积结果。我们可以看出,因为步长为2,得到的feature map跳过了步长为1时相应的部分。因此,当我们反向计算误差项时,我们可以对步长为S的sensitivity map相应的位置进行补0,将其『还原』成步长为1时的sensitivity map,再用式8进行求解。 -
当输入深度为D时
此时filter的深度也必须为D, l − 1 l-1 l−1层的 d i d_i di通道只与filter的 d i d_i di通道的权重进行计算。因此,反向计算误差项时,我们可以使用式8,用filter的第 d i d_i di通道权重对第 l l l层sensitivity map进行卷积,得到第 l − 1 l-1 l−1层 d i d_i di通道的sensitivity map。如下图所示: -
当filter数量为N时
filter数量为N时,输出层的深度也为N,第 i i i个filter卷积产生输出层的第 i i i个feature map。由于第 l − 1 l-1 l−1层每个加权输入 n e t d , i , j l − 1 net_{d,i,j}^{l-1} netd,i,jl−1都同时影响了第 l l l层所有feature map的输出值,因此,反向计算误差项时,需要使用全导数公式。也就是,我们先使用第 d d d个filter对第 l l l层相应的第 d d d个sensitivity map进行卷积,得到一组N个 l − 1 l-1 l−1层的偏sensitivity map。依次用每个filter做这种卷积,就得到D组偏sensitivity map。最后在各组之间将N个偏sensitivity map按元素相加,得到最终的N个 l − 1 l-1 l−1层的sensitivity map: δ l − 1 = ∑ d = 0 D δ d l ∗ W d l ∘ f ′ ( n e t l − 1 ) ( 式 9 ) \delta^{l-1}=\sum_{d=0}^D\delta_d^l*W_d^l\circ f'(net^{l-1})\space\space\space\space\space\space(式9) δl−1=d=0∑Dδdl∗Wdl∘f′(netl−1) (式9)以上就是卷积层误差项传递的算法,如果读者还有所困惑,可以参考后面的代码实现来理解。
卷积层filter权重梯度的计算
我们要在得到第
l
l
l层sensitivity map的情况下,计算filter的权重的梯度,由于卷积层是权重共享的,因此梯度的计算稍有不同。
如上图所示,
a
i
,
j
l
a_{i,j}^l
ai,jl是第
l
−
1
l-1
l−1层的输出,
w
i
,
j
w_{i,j}
wi,j是第
l
l
l层filter的权重,
δ
i
,
j
l
\delta_{i,j}^l
δi,jl是第
l
l
l层的sensitivity map。我们的任务是计算
w
i
,
j
w_{i,j}
wi,j的梯度,即
∂
E
d
∂
w
i
,
j
\frac{\partial E_d}{\partial w_{i,j}}
∂wi,j∂Ed。
为了计算偏导数,我们需要考察权重
w
i
,
j
w_{i,j}
wi,j对
E
d
E_d
Ed的影响。权重项
w
i
,
j
w_{i,j}
wi,j通过影响
n
e
t
i
,
j
l
net_{i,j}^l
neti,jl的值,进而影响
E
d
E_d
Ed。我们仍然通过几个具体的例子来看权重项
w
i
,
j
w_{i,j}
wi,j对
n
e
t
i
,
j
l
net_{i,j}^l
neti,jl的影响,然后再从中总结出规律。
例1,计算 ∂ E d ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}} ∂w1,1∂Ed: n e t 1 , 1 j = w 1 , 1 a 1 , 1 l − 1 + w 1 , 2 a 1 , 2 l − 1 + w 2 , 1 a 2 , 1 l − 1 + w 2 , 2 a 2 , 2 l − 1 + w b net_{1,1}^j=w_{1,1}a_{1,1}^{l-1}+w_{1,2}a_{1,2}^{l-1}+w_{2,1}a_{2,1}^{l-1}+w_{2,2}a_{2,2}^{l-1}+w_b net1,1j=w1,1a1,1l−1+w1,2a1,2l−1+w2,1a2,1l−1+w2,2a2,2l−1+wb n e t 1 , 2 j = w 1 , 1 a 1 , 2 l − 1 + w 1 , 2 a 1 , 3 l − 1 + w 2 , 1 a 2 , 2 l − 1 + w 2 , 2 a 2 , 3 l − 1 + w b net_{1,2}^j=w_{1,1}a_{1,2}^{l-1}+w_{1,2}a_{1,3}^{l-1}+w_{2,1}a_{2,2}^{l-1}+w_{2,2}a_{2,3}^{l-1}+w_b net1,2j=w1,1a1,2l−1+w1,2a1,3l−1+w2,1a2,2l−1+w2,2a2,3l−1+wb n e t 2 , 1 j = w 1 , 1 a 2 , 1 l − 1 + w 1 , 2 a 2 , 2 l − 1 + w 2 , 1 a 3 , 1 l − 1 + w 2 , 2 a 3 , 2 l − 1 + w b net_{2,1}^j=w_{1,1}a_{2,1}^{l-1}+w_{1,2}a_{2,2}^{l-1}+w_{2,1}a_{3,1}^{l-1}+w_{2,2}a_{3,2}^{l-1}+w_b net2,1j=w1,1a2,1l−1+w1,2a2,2l−1+w2,1a3,1l−1+w2,2a3,2l−1+wb n e t 2 , 2 j = w 1 , 1 a 2 , 2 l − 1 + w 1 , 2 a 2 , 3 l − 1 + w 2 , 1 a 3 , 2 l − 1 + w 2 , 2 a 3 , 3 l − 1 + w b net_{2,2}^j=w_{1,1}a_{2,2}^{l-1}+w_{1,2}a_{2,3}^{l-1}+w_{2,1}a_{3,2}^{l-1}+w_{2,2}a_{3,3}^{l-1}+w_b net2,2j=w1,1a2,2l−1+w1,2a2,3l−1+w2,1a3,2l−1+w2,2a3,3l−1+wb从上面的公式看出,由于权值共享,权值 w i , j w_{i,j} wi,j对所有的 n e t i , j l net_{i,j}^l neti,jl都有影响。 E d E_d Ed是 n e t 1 , 1 l net_{1,1}^{l} net1,1l、 n e t 1 , 2 l net_{1,2}^{l} net1,2l、 n e t 2 , 1 l net_{2,1}^{l} net2,1l…的函数,而 n e t 1 , 1 l net_{1,1}^{l} net1,1l、 n e t 1 , 2 l net_{1,2}^{l} net1,2l、 n e t 2 , 1 l net_{2,1}^{l} net2,1l…又是 w 1 , 1 w_{1,1} w1,1的函数,根据全导数公式,计算 ∂ E d ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}} ∂w1,1∂Ed就是要把每个偏导数都加起来: ∂ E d ∂ w 1 , 1 = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ w 1 , 1 + ∂ E d ∂ n e t 1 , 2 l ∂ n e t 1 , 2 l ∂ w 1 , 1 + ∂ E d ∂ n e t 2 , 1 l ∂ n e t 2 , 1 l ∂ w 1 , 1 + ∂ E d ∂ n e t 2 , 2 l ∂ n e t 2 , 2 l ∂ w 1 , 1 \frac{\partial E_d}{\partial w_{1,1}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial w_{1,1}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial w_{1,1}} ∂w1,1∂Ed=∂net1,1l∂Ed∂w1,1∂net1,1l+∂net1,2l∂Ed∂w1,1∂net1,2l+∂net2,1l∂Ed∂w1,1∂net2,1l+∂net2,2l∂Ed∂w1,1∂net2,2l = δ 1 , 1 l a 1 , 1 l − 1 + δ 1 , 2 l a 1 , 2 l − 1 + δ 2 , 1 l a 2 , 1 l − 1 + δ 2 , 2 l a 2 , 2 l − 1 =\delta_{1,1}^la_{1,1}^{l-1}+\delta_{1,2}^la_{1,2}^{l-1}+\delta_{2,1}^la_{2,1}^{l-1}+\delta_{2,2}^la_{2,2}^{l-1}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space =δ1,1la1,1l−1+δ1,2la1,2l−1+δ2,1la2,1l−1+δ2,2la2,2l−1 例2,计算 ∂ E d ∂ w 1 , 2 \frac{\partial E_d}{\partial w_{1,2}} ∂w1,2∂Ed:
通过查看
w
1
,
2
w_{1,2}
w1,2与
n
e
t
i
,
j
l
net_{i,j}^l
neti,jl的关系,我们很容易得到:
∂
E
d
∂
w
1
,
2
=
δ
1
,
1
l
a
1
,
2
l
−
1
+
δ
1
,
2
l
a
1
,
3
l
−
1
+
δ
2
,
1
l
a
2
,
2
l
−
1
+
δ
2
,
2
l
a
2
,
3
l
−
1
\frac{\partial E_d}{\partial w_{1,2}}=\delta_{1,1}^la_{1,2}^{l-1}+\delta_{1,2}^la_{1,3}^{l-1}+\delta_{2,1}^la_{2,2}^{l-1}+\delta_{2,2}^la_{2,3}^{l-1}
∂w1,2∂Ed=δ1,1la1,2l−1+δ1,2la1,3l−1+δ2,1la2,2l−1+δ2,2la2,3l−1实际上,每个权重项都是类似的,我们不一一举例了。现在,是我们再次发挥想象力的时候,我们发现计算
∂
E
d
∂
w
i
,
j
\frac{\partial E_d}{\partial w_{i,j}}
∂wi,j∂Ed规律是:
∂
E
d
∂
w
i
,
j
=
∑
m
∑
n
δ
m
,
n
a
i
+
m
,
j
+
n
l
−
1
\frac{\partial E_d}{\partial w_{i,j}}=\sum_m\sum_n\delta_{m,n}a_{i+m,j+n}^{l-1}
∂wi,j∂Ed=m∑n∑δm,nai+m,j+nl−1也就是用sensitivity map作为卷积核,在input上进行cross-correlation,如下图所示:
最后,我们来看一看偏置项的梯度
∂
E
d
∂
w
b
\frac{\partial E_d}{\partial w_{b}}
∂wb∂Ed。通过查看前面的公式,我们很容易发现:
∂
E
d
∂
w
b
=
∂
E
d
∂
n
e
t
1
,
1
l
∂
n
e
t
1
,
1
l
∂
w
b
+
∂
E
d
∂
n
e
t
1
,
2
l
∂
n
e
t
1
,
2
l
∂
w
b
+
∂
E
d
∂
n
e
t
2
,
1
l
∂
n
e
t
2
,
1
l
∂
w
b
+
∂
E
d
∂
n
e
t
2
,
2
l
∂
n
e
t
2
,
2
l
∂
w
b
\frac{\partial E_d}{\partial w_{b}}=\frac{\partial E_d}{\partial net_{1,1}^l}\frac{\partial net_{1,1}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{1,2}^l}\frac{\partial net_{1,2}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{2,1}^l}\frac{\partial net_{2,1}^l}{\partial w_{b}}+\frac{\partial E_d}{\partial net_{2,2}^l}\frac{\partial net_{2,2}^l}{\partial w_{b}}
∂wb∂Ed=∂net1,1l∂Ed∂wb∂net1,1l+∂net1,2l∂Ed∂wb∂net1,2l+∂net2,1l∂Ed∂wb∂net2,1l+∂net2,2l∂Ed∂wb∂net2,2l
=
δ
1
,
1
l
+
δ
1
,
2
l
+
δ
2
,
1
l
+
δ
2
,
2
l
=\delta_{1,1}^l+\delta_{1,2}^l+\delta_{2,1}^l+\delta_{2,2}^l\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=δ1,1l+δ1,2l+δ2,1l+δ2,2l
=
∑
i
∑
j
δ
i
,
j
=\sum_i\sum_j\delta_{i,j}\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
=i∑j∑δi,j 也就是偏置项的梯度就是sensitivity map所有误差项之和。
对于步长为S的卷积层,处理方法与传递误差项是一样的,首先将sensitivity map『还原』成步长为1时的sensitivity map,再用上面的方法进行计算。
获得了所有的梯度之后,就是根据梯度下降算法来更新每个权重。这在前面的文章中已经反复写过,这里就不再重复了。
至此,我们已经解决了卷积层的训练问题,接下来我们看一看Pooling层的训练。
2、Pooling层的训练
无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。
-
Max Pooling误差项的传递
如下图,假设第 l − 1 l-1 l−1层大小为4*4,pooling filter大小为2*2,步长为2,这样,max pooling之后,第 l l l层大小为2*2。假设第 l l l层的 δ \delta δ值都已经计算完毕,我们现在的任务是计算第 l − 1 l-1 l−1层的 δ \delta δ值。
我们用 n e t i , j l − 1 net_{i,j}^{l-1} neti,jl−1表示第 l − 1 l-1 l−1层的加权输入;用 n e t i , j l net_{i,j}^{l} neti,jl表示第 l l l层的加权输入。我们先来考察一个具体的例子,然后再总结一般性的规律。对于max pooling: n e t 1 , 1 l = m a x ( n e t 1 , 1 l − 1 , n e t 1 , 2 l − 1 , n e t 2 , 1 l − 1 , n e t 2 , 2 l − 1 ) net_{1,1}^l=max(net_{1,1}^{l-1},net_{1,2}^{l-1},net_{2,1}^{l-1},net_{2,2}^{l-1}) net1,1l=max(net1,1l−1,net1,2l−1,net2,1l−1,net2,2l−1)也就是说,只有区块中最大的 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1才会对 n e t 1 , 1 l net_{1,1}^{l} net1,1l的值产生影响。我们假设最大的值是 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1,则上式相当于: n e t 1 , 1 l = n e t 1 , 1 l − 1 net_{1,1}^l=net_{1,1}^{l-1} net1,1l=net1,1l−1那么,我们不难求得下面几个偏导数: ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 = 1 \frac{\partial net_{1,1}^l}{\partial net_{1,1}^{l-1}}=1 ∂net1,1l−1∂net1,1l=1 ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{1,2}^{l-1}}=0 ∂net1,2l−1∂net1,1l=0 ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{2,1}^{l-1}}=0 ∂net2,1l−1∂net1,1l=0 ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 = 0 \frac{\partial net_{1,1}^l}{\partial net_{2,2}^{l-1}}=0 ∂net2,2l−1∂net1,1l=0因此: δ 1 , 1 l − 1 = ∂ E d ∂ n e t 1 , 1 l − 1 \delta_{1,1}^{l-1}=\frac{\partial E_d}{\partial net_{1,1}^{l-1}} δ1,1l−1=∂net1,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,1}^{l-1}} =∂net1,1l∂Ed∂net1,1l−1∂net1,1l = δ 1 , 1 l =\delta_{1,1}^l =δ1,1l而: δ 1 , 2 l − 1 = ∂ E d ∂ n e t 1 , 2 l − 1 \delta_{1,2}^{l-1}=\frac{\partial E_d}{\partial net_{1,2}^{l-1}} δ1,2l−1=∂net1,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,2}^{l-1}} =∂net1,1l∂Ed∂net1,2l−1∂net1,1l = 0 =0\space\space\space\space\space =0 δ 2 , 1 l − 1 = ∂ E d ∂ n e t 2 , 1 l − 1 \delta_{2,1}^{l-1}=\frac{\partial E_d}{\partial net_{2,1}^{l-1}} δ2,1l−1=∂net2,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,1}^{l-1}} =∂net1,1l∂Ed∂net2,1l−1∂net1,1l = 0 =0\space\space\space =0 δ 2 , 2 l − 1 = ∂ E d ∂ n e t 2 , 2 l − 1 \delta_{2,2}^{l-1}=\frac{\partial E_d}{\partial net_{2,2}^{l-1}} δ2,2l−1=∂net2,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,2}^{l-1}} =∂net1,1l∂Ed∂net2,2l−1∂net1,1l = 0 =0\space\space\space =0 现在,我们发现了规律:对于max pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0。如下图所示(假设 a 1 , 1 l − 1 、 a 1 , 4 l − 1 、 a 4 , 1 l − 1 、 a 4 , 4 l − 1 a_{1,1}^{l-1}、a_{1,4}^{l-1}、a_{4,1}^{l-1}、a_{4,4}^{l-1} a1,1l−1、a1,4l−1、a4,1l−1、a4,4l−1为所在区块中的最大输出值):
-
Mean Pooling误差项的传递
我们还是用前面屡试不爽的套路,先研究一个特殊的情形,再扩展为一般规律。
如上图,我们先来考虑计算 δ 1 , 1 l − 1 \delta_{1,1}^{l-1} δ1,1l−1。我们先来看看 n e t 1 , 1 l − 1 net_{1,1}^{l-1} net1,1l−1如何影响 n e t 1 , 1 l net_{1,1}^{l} net1,1l。 n e t 1 , 1 l = 1 4 ( n e t 1 , 1 l − 1 + n e t 1 , 2 l − 1 + n e t 2 , 1 l − 1 + n e t 2 , 2 l − 1 ) net_{1,1}^l=\frac{1}{4}(net_{1,1}^{l-1}+net_{1,2}^{l-1}+net_{2,1}^{l-1}+net_{2,2}^{l-1}) net1,1l=41(net1,1l−1+net1,2l−1+net2,1l−1+net2,2l−1)根据上式,我们一眼就能看出来: ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{1,1}^{l-1}}=\frac{1}{4} ∂net1,1l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{1,2}^{l-1}}=\frac{1}{4} ∂net1,2l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{2,1}^{l-1}}=\frac{1}{4} ∂net2,1l−1∂net1,1l=41 ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 = 1 4 \frac{\partial net_{1,1}^l}{\partial net_{2,2}^{l-1}}=\frac{1}{4} ∂net2,2l−1∂net1,1l=41所以,根据链式求导法则,我们不难算出: δ 1 , 1 l − 1 = ∂ E d ∂ n e t 1 , 1 l − 1 \delta_{1,1}^{l-1}=\frac{\partial E_d}{\partial net_{1,1}^{l-1}} δ1,1l−1=∂net1,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,1}^{l-1}} =∂net1,1l∂Ed∂net1,1l−1∂net1,1l = 1 4 δ 1 , 1 l \space\space=\frac{1}{4}\delta_{1,1}^l =41δ1,1l同样,我们可以算出 δ 1 , 2 l − 1 、 δ 2 , 1 l − 1 、 δ 2 , 2 l − 1 \delta_{1,2}^{l-1}、\delta_{2,1}^{l-1}、\delta_{2,2}^{l-1} δ1,2l−1、δ2,1l−1、δ2,2l−1: δ 1 , 2 l − 1 = ∂ E d ∂ n e t 1 , 2 l − 1 \delta_{1,2}^{l-1}=\frac{\partial E_d}{\partial net_{1,2}^{l-1}} δ1,2l−1=∂net1,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 1 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{1,2}^{l-1}} =∂net1,1l∂Ed∂net1,2l−1∂net1,1l = 1 4 δ 1 , 1 l \space\space\space=\frac{1}{4}\delta_{1,1}^l =41δ1,1l δ 2 , 1 l − 1 = ∂ E d ∂ n e t 2 , 1 l − 1 \delta_{2,1}^{l-1}=\frac{\partial E_d}{\partial net_{2,1}^{l-1}} δ2,1l−1=∂net2,1l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 1 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,1}^{l-1}} =∂net1,1l∂Ed∂net2,1l−1∂net1,1l = 1 4 δ 1 , 1 l \space=\frac{1}{4}\delta_{1,1}^l =41δ1,1l δ 2 , 2 l − 1 = ∂ E d ∂ n e t 2 , 2 l − 1 \delta_{2,2}^{l-1}=\frac{\partial E_d}{\partial net_{2,2}^{l-1}} δ2,2l−1=∂net2,2l−1∂Ed = ∂ E d ∂ n e t 1 , 1 l ∂ n e t 1 , 1 l ∂ n e t 2 , 2 l − 1 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=\frac{\partial E_d}{\partial net_{1,1}^{l}}\frac{\partial net_{1,1}^{l}}{\partial net_{2,2}^{l-1}} =∂net1,1l∂Ed∂net2,2l−1∂net1,1l = 1 4 δ 1 , 1 l \space\space=\frac{1}{4}\delta_{1,1}^l =41δ1,1l现在,我们发现了规律:对于mean pooling,下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。如下图所示:
上面这个算法可以表达为高大上的克罗内克积(Kronecker product)的形式,有兴趣的读者可以研究一下。 δ l − 1 = δ l ⊗ ( 1 n 2 ) n × n \delta^{l-1}=\delta^l\otimes(\frac{1}{n^2})_{n\times n} δl−1=δl⊗(n21)n×n其中, n n n是pooling层filter的大小, δ l − 1 、 δ l \delta^{l-1}、\delta^l δl−1、δl都是矩阵。
至此,我们已经把卷积层、Pooling层的训练算法介绍完毕,加上上一篇文章讲的全连接层训练算法,您应该已经具备了编写卷积神经网络代码所需要的知识。