CNN的反向传播过程,从原理上讲,与普通的反向传播相同(都使用了链式法则),从具体形式上讲,CNN的反向传播公式又比较特殊,这是因为CNN独有的4个特点:
- 局部感知:卷积核和图像卷积时,每次卷积核所覆盖的像素只是一小部分。这一小部分也叫做感受野。
- 权值共享:同一层的每个感受野被卷积时,卷积参数都是相同的。
- 多卷积核:同一层的每个感受野可能被多个不同的卷积核分别进行卷积,输出多个通道(每个卷积核的结果是一个通道)。
- 池化:下采样过程,图像经过池化后,大小会缩小一定倍数。
一般的反向传播
一般的反向传播(即全连接网络)的公式如下:
δ(l)i∂J(θ)∂w(l)ij∂J(θ)∂b(l)i=g′(z(l)i)∑j=1Sl+1δ(l+1)jw(l)ji=δ(l+1)ia(l)j=δ(l+1)i
向量形式的表达如下:
δ(l)∂J(θ)∂W(l)∂J(θ)∂b(l)=(W(l))Tδ(l+1)∘g′(z(l))=δ(l+1)(a(l))T=δ(l+1)
详细推导过程见
反向传播算法的公式推导
反向传播公式的分析
1、对于敏感度的传播:
δ(l)i=g′(z(l)i)∑Sl+1j=1δ(l+1)jw(l)ji
,可以直接根据链式法则去解释它:
(1)根据前向传播规则,
δ(l)i
的改变,先影响了此节点的输出值,然后影响了下一层所有的
δ(l+1)j
。
(2)根据链式法则,此节点由输入到输出,其梯度需要乘以
g′(z(l)i)
。
(3)然后根据多元函数的链式法则,由节点输出到下一层所有节点的输入,其梯度等于所有下一层节点的敏感度的加权和,权值即为对应的
w(l)ji
。
总结:
要求一个点的敏感度,只需要看这个点如果变化了,会影响到下一层的哪些点,然后累加上这些点的敏感度*权值。权值越大,下一个点的变化量就会越大,最后传播到最后一层的变化量就会越大,如同蝴蝶效应,因此对于此点的导数就越大,因此需要乘以权值,而不是除以。如果从这一层的输入到下一层的输入需要串联一个激活函数,则需要乘以这个激活函数的导数。
2、同理,可以分析W的求导公式
∂J(θ)∂w(l)ij=δ(l+1)ia(l)j
:
w(l)ij
的变化只会影响到下一层的第 i 个节点的输入值,且变化值会被放大
a(l)j
倍,因此为
δ(l+1)ia(l)j
。
3、同理,可以分析W的求导公式
∂J(θ)∂b(l)i=δ(l+1)i
:
b(l)i
的变化只会影响到下一层的第 i 个节点的输入值,且没有放大倍数,因为偏置的输入永远是1。
CNN的反向传播
由于CNN一般包含了多个(卷积层
−
> 池化层)的组合,我们将分别对两种层的反向传播进行分析。
1、卷积层
在一个卷积层,前一层的特征图被多个卷积核所卷积,然后通过一个激活函数,最后组成了输出的特征图。每一个输出特征图可能是多个输入特征图的组合的卷积结果。因此,如果第
l−1
层经过卷积后到达第
l
层,则前向传播过程为
xlj=f(∑i∈Mjxl−1i∗klij+blj)
其中,
(1)
f
为激活函数。
(2)
Mj
为第
j
个卷积核所作用的第
l−1
层的特征图的集合,集合大小即为第
l
层第
j
个卷积核的卷积层数。
(3)
xlj
为第
l
层第
j
通道的输出特征图(是一个矩阵)。
(4)
klij
为第
l−1
层到第
l
层的第
j
个卷积核、且只取与第
l−1
层第
i
个通道相连接的卷积层(也是一个矩阵)。
(5)
blj
为第
l−1
层到第
l
层的第
j
个卷积核的偏置。
(6)
∗
表示卷积作用。
注意,
∑i∈Mjxl−1i∗klij
的结果是一个矩阵,后面的加法表示矩阵上的每一个元素都加上
blj
,然后每一个元素被激活函数作用,最后仍然是一个矩阵。
对于卷积层的反向传播,根据上述反向传播公式的分析,很容易理解公式:
δl−1j(uv)=f′(ul−1j(uv))∑i∈AjB(δli)∗rot180(klji)
解释:
(1)
δl−1j(uv)
为第
l−1
层第
j
个通道第
u
行第
v
列的输入的梯度。
(2)
ul−1j(uv)
为第
l−1
层第
j
个通道第
u
行第
v
列的输入。
(3)
Aj
为卷积范围包括第
l−1
层第
j
个通道的卷积核的集合,集合大小不定。
(4)
δli
为第
l
层第
i
个通道的输入的梯度。
(5)
B(δli)
为
δli
的局部块,这个局部块里的每个位置的输入都是卷积得到的,卷积过程都与
ul−1j(uv)
有关。
(6)
rot180(.)
表示将矩阵旋转180度,即既进行列翻转又进行行翻转。
∂J∂klij(uv)=δlj(uv)∗P(xl−1i)
解释:
(1)
klij(uv)
为第
l−1
层到第
l
层的第
j
个卷积核中与第
l−1
层第
i
个通道相连接的卷积层上的第
u
行第
v
列的值。
(2)
δlj(uv)
为第
l
层第
j
个通道第
u
行第
v
列的输入的梯度。
(3)
xl−1i
为第
l−1
层第
i
通道的输出特征图。
(4)
P(xl−1i)
为
xl−1i
的局部块,这个局部块中的每个元素都会在卷积过程中直接与
klij(uv)
相乘。
∂J∂blj=∑u,v(δlj)uv
解释:
(1)
blj
为第
l−1
层到第
l
层的第
j
个卷积核的偏置。
(2)
δlj
为第
l
层第
j
个通道的输入的梯度。
2、池化层
如果对第
l
层进行池化得到第
l+1
层,则前向传播过程为:
xl+1j=f(βl+1jdown(xlj)+bl+1j)
其中:
(1)
down(.)
是一个下采样方法。典型地,此方法会将每一个独立的 n*n 块中的元素进行相加,这样输出图像的长和宽都比原图小了 n 倍。
(2)每一个下采样之后的特征图都乘以了
β
并加上偏置
b
,且不同的特征层的乘子和偏置不同,用下标 j 区分。
反向传播公式为:
δlj=βl+1j(f′(ulj)∘up(δl+1j))
解释:
(1)
δlj
为第
l
层第
j
个通道的输入的梯度,是一个矩阵。
(2)
up(δl+1j)
为上采样操作,将每个元素在两个维度上都展开 n 次,n 为
down(.)
下采样时缩小的倍数。其中一种方法是所有展开的元素都与原元素相同,即
up(x)=x⊗1n×n
。
∂J∂bl+1j=∑u,v(δl+1j)uv
解释:
(1)
bl+1j
为下采样结果传递到第
l+1
层后第
j
个特征层需要乘以的因子。
(2)
bl+1j
影响了
δl+1j
上的所有点,因此需要累加。
∂J∂βl+1j=∑u,v(δl+1j∘dl+1j)uv
解释:
(1)
dl+1j=down(xlj)
,为下采样结果。
(2)
βl+1j
影响了
δl+1j
上的所有点,因此需要累加,且被下采样后的结果放大了,因此需要乘以下采样结果。
参考
[1] Bouvrie J. Notes on convolutional neural networks[J]. 2006.