本文只包含CNN的前向传播和反向传播,主要是卷积层和pool层的前向传播和反向传播,一些卷积网络的基础知识不涉及
符号表示
如果l层是卷积层:
p[l]: padding
s[l]: stride
n[l]c : number of filters
fliter size:k[l]1×k[l]2×n[l−1]c
==Weight: W[l] size is k[l]1×k[l]2×nl−1c×nlc
==bais==: b[l] size is n[l]c
==liner==: z[l],size is n[l]h×n[l]w×n[l]c
==Activations==: a[l] size is n[l]h×n[l]w×n[l]c
==input==: a[l−1] size is n[l−1]h×n[l−1]w×n[l−1]c
==output==: a[l] size is n[l]h×n[l]w×n[l]c
n[l]h和n[l−1]h两者满足:
n[l]h(s[l]−1)+f[l]1⩽n[l−1]h+2p
n[l]h=⌊n[l−1]h+2p−k[l]1s+1⌋
符号
⌊x⌋表示向下取整,
n[l]w和
n[l−1]w两者关系同上
Cross-correlation与Convolution
很多文章或者博客中把Cross-correlation(互相关)和Convolution(卷积)都叫卷积,把互相关叫做翻转的卷积,在我个人的理解里面两者是有区别的,本文将其用==两种表达式分开表示==,不引入翻转180度。
Cross-correlation
对于大小为h×w图像I和 大小为(k1×k2)kernel K,定义其Cross-correlation:
(I⊗K)ij=∑m=0k1−1∑n=0k2I(i+m,j+n)K(m,n)
其中
0⩽i⩽h−k1+1
0⩽j⩽w−k2+1
注意这里的使用的符号和i的范围,不考虑padding的话Cross-correlation会产生一个较小的矩阵
Convolution
首先回顾一下连续函数的卷积和一维数列的卷积分别如下,卷积满足交换律:
h(t)=∫∞−∞f(τ)g(t−τ)dτ
c(i)=∑i=−∞∞a(i)b(n−i)di
对于大小为h×w图像I和大小为(k1×k2)kernel K,convolution为 :
(I∗K)ij=(K∗I)ij=∑m=0k1−1∑n=0k2−1I(i−m,j−n)k(m,n)
0⩽i⩽h+k1−10⩽j⩽w+k2−1
注意:这里的Convolution和前面的cross-correlation是不同的:
1. i,j范围变大了,卷积产生的矩阵size变大了
2. 这里出现了很多I(−x,−y),这些负数索引可以理解成padding
3. 这里的卷积核会翻转180度
具体过程如下图所示
如果把卷积的padding项扔掉那么就变成下图这样,此时Convolution和Cross-correlation相隔的就是一个180度的翻转,如下图所示
卷积核旋转180度
参考自卷积核翻转方法
翻转卷积核有三种方法,具体步骤移步卷积核翻转方法
1. 围绕卷积核中心旋转180度 (奇数行列好使)
沿着两条对角线翻转两次
同时翻转行和列 (偶数行列好使)
前向传播
卷积层
前向传播:计算z[l]和a[l]
输入:a[l−1] size is n[l−1]h×n[l−1]w×n[l−1]c
输出:a[l]
为了方便后续的反向传播的方便,只讨论l层的参数,把部分上标[l]去掉,同时另n[l]c=n[l−1]c=1,前向传播公式如下:
zl(i,j)=al=∑m=0k1−1∑n=0k2−1al−1i+m,j+n×wm,n+bg(zl)
虑通道和padding的前向传播
pooling层
pooling层进行下采样,maxpool可以表示为:
al(i,j)=max0⩽m⩽k1−1,0⩽n⩽k2−1(al−1(i*k1+m,j*k2+n))
avepool可以表示为:
al(i,j)=1k1×k2∑m=0k1−1∑n=0k2−1al−1(i*k1+m,j*k2+n)
反向传播
卷积层的反向传播
1. 已知∂E∂zl求∂E∂wl
由上图可知W对每一个元素都有贡献,(偷来的图,用的符号不一致),使用链式法则有:
∂E∂wlm′,n′=∑i=0nlh−1∑j=0nlw−1∂E∂zli,j∂zli,j∂wlm′,n′
∂zli,j∂wlm′,n′=∂(∑m=0k1−1∑n=0k2−1al−1i+m,j+n×wm,n+b)∂wlm′,n′=al−1i+m′,j+n′
记δli,j=∂E∂zli,j,有:
∂E∂wlm′,n′=∂E∂wl=∑i=0nlh−1∑j=0nlw−1al−1i+m′,j+n′δli,jal⊗δl
2. 根据∂E∂zl求∂E∂zl−1
上图是偷来的图,把那边的Xl,当成zl理解,与zl−1i′,j′
有关的al−1i,j,索引是从(i′−k1+1,j′−k2+1)到(i′,j′)(出现负值或者是越界当成是padding),根据链式法则:
∂E∂zl−1i′,j′=∑m=0k1−1∑n=0k2+1∂E∂zli′−m,j′−n∂zli′−m,j′−n∂zl−1i′,j′
将∂zli′−m,j′−n∂zl−1i′,j′展开有:
∂zli′−m,j′−n∂zl−1i′,j′=∂∑s=0k1−1∑t=0k2+1zl−1i′−m+s,j′−n+twls,t∂zl−1i′,j′=wlm,n
从而可以得到:
∂E∂zl−1i′,j′===∑m=0k1−1∑n=0k2+1∂E∂zli′−m,j′−nwlm,n∑m=0k1−1∑n=0k2+1δli′−m,j′−nwlm,nδl∗Wl
这里的∗代表是卷积操作
pooling层的反向传播
pooling层的反向传播比较简,没有要训练的参数
maxpool,最大的那个为1其他的均为0:
∂E∂al−1i′,j′=1if(i′,j′)=arg⎛⎝⎜max⌊ik1⌋k1⩽i⩽⌊ik1⌋−1,⌊jk2⌋k2⩽j⩽⌊jk2⌋−1(al−1i,j)⎞⎠⎟∂E∂al−1i′,j′=0else
avepool,每个都是
∂E∂al−1i′,j′=1k1×k2
附
考虑多个通道
用z[l]c[l]表示z[l]的第c[l]个channel:
z[l]c[l](i,j)=∑c[l−1]=0nl−1c−1(a[l−1]c[l−1]⊗W[l]c[l−1],c[l])+b[l]c[l]=∑c[l−1]=0nl−1c−1(∑m=0f[l]−1∑n=0f[l]−1a[l−1]c[l−1](i+m,j+n)×W[l]c[l−1],c[l](m,n))+b[l]cl
其中,W[l]c[l−1],c[l]为f[l]×f[l]的卷积核W[l]c[l−1],c[l]=W[l](:,:,c[l−1],c[l])
a[l]c[l]=g(z[l]c[l])
g(x)为**函数
考虑padding和stride情况下:
z[l]c[l](i,j)=∑c[l−1]=0nl−1c−1(∑m=0f[l]−1∑n=0f[l]−1a[l−1](i∗s+m−p,j∗s+n−p,c[l−1])×W[l](m,n,c[l−1],c[l]))+b[l]cl
a[l]c[l]=g(z[l]c[l])
a[l]索引越界部分表示padding,其值为0