numpy实现神经网络系列
工程地址:https://github.com/yizt/numpy_neuron_network
基础知识
0_1-全连接层、损失函数的反向传播
0_2_1-卷积层的反向传播-单通道、无padding、步长1
0_2_2-卷积层的反向传播-多通道、无padding、步长1
0_2_3-卷积层的反向传播-多通道、无padding、步长不为1
0_2_4-卷积层的反向传播-多通道、有padding、步长不为1
0_2_5-池化层的反向传播-MaxPooling、AveragePooling、GlobalAveragePooling、GlobalMaxPooling
0_3-**函数的反向传播-ReLU、LeakyReLU、PReLU、ELU、SELU
0_4-优化方法-SGD、AdaGrad、RMSProp、Adadelta、Adam
DNN练习
1_1_1-全连接神经网络做线性回归
1_1_2-全连接神经网络做mnist手写数字识别
CNN练习
2_1-numpy卷积层实现
2_2-numpy池化层实现
2_3-numpy-cnn-mnist手写数字识别
本文目录
本文下载地址:0_2_3-卷积层的反向传播-多通道、无padding、步长不为1
依赖知识
a) 熟悉全连接层、损失函数的反向传播
b) 熟悉卷积层的反向传播-单通道、无padding、步长1
c) 熟悉卷积层的反向传播-多通道、无padding、步长1
d) 熟悉以上三点的依赖知识
约定说明
a) l 代表网络的第l 层, zl 代表第l 层卷积,zld,i,j 代表第l 层卷积第d 通道(i,j) 位置的值; zl 的通道数为Cl, 高度和宽度分别为Hl,W^l (避免与权重相同)
b) Wl−1,bl−1 代表连接第l−1 层和第l 层的卷积核权重和偏置; 卷积核的维度为(kl−11,kl−12) ; 卷积核的步长为(sl−11,sl−12)。
c) 记损失函数L关于第l 层卷积的输出zl 的偏导为δl=∂L∂zl (3)
前向传播
根据以上约定,卷积核权重Wl−1∈Rkl−11×kl−12×Cl−1×Cl ,偏置bl−1∈RCl ,每个输出通道一个偏置。 则有第l 层卷积层,第d个通道输出为:
zld,i,j=∑c=1Cl−1∑m=0kl−11−1∑n=0kl−12−1Wl−1m,n,c,dzl−1c,i⋅sl−11+m,j⋅sl−12+n+bl−1di∈[0,Hl−1],j∈[0,W^l−1](4)
其中:Hl=(Hl−1−kl−11)/sl−11+1; W^l=(W^l−1−kl−12)/sl−12+1 ;
反向传播
权重梯度
a) 首先来看损失函数L关于第l−1层权重Wl−1和偏置bl−1的梯度:
∂L∂Wl−1m,n,c,d=∑i∑j∂L∂zld,i,j∗∂zld,i,j∂Wl−1m,n,c,d=∑i∑jδld,i,j∗∂(∑Cl−1c=1∑kl−11−1m=0∑kl−12−1n=0Wl−1m,n,c,dzl−1c,i⋅sl−11+m,j⋅sl−12+n+bl−1d)∂Wl−1m,n,c,d=∑i∑jδld,i,j∗zl−1c,i⋅sl−11+m,j⋅sl−12+n//l层的d通道每个神经元都有梯度传给权重Wl−1m,n,c,d(1)(2)(5)
对比公式(5)和单通道中公式(4),可以发现,损失函数L关于第l−1层权重Wl−1:,:c,d梯度就是以δlpadding (后面会说明它的含义) 为卷积核在zl−1c上做卷积的结果(这里没有偏置项),单通道对单通道的卷积。
b) 损失函数L关于第l−1层偏置bl−1的梯度同
∂L∂bl−1d=∑i∑jδld,i,j(6)
l-1层梯度
直接从公式推导损失函数关于第l−1层输出的偏导比较难,我们参考转置卷积论文A guide to convolution arithmetic for deep learning 知识,我们以另外一种方式证明; 对于如下的图,上一层为输入的卷积层(5×5) ,用(3×3) 的卷积核以步长为2,做卷积得到下一层卷积大小为2×2 (图中蓝色的点)。如果我们将输出卷积的每行和每列之间填充步长减一的行列,行列的元素全为0。记卷积层zl 使用这种零填充后的卷积层为 zlpadding 。那么前向过程其实就相当于卷积核,在输入卷积上以不为1的步长卷积后的结果就是zlpadding。

那么反向过程也是一样,相当于翻转后的卷积在相同零填充的δl 上左卷积的结果,设δlpadding 为δl 的行列分别填充(sl−11−1,sl−12−1) 行列零元素后的梯度矩阵。则根据多通道 中的公式(8) 有
δl−1c,i,j=∑d=1Cl∑m=0kl−11−1∑n=0kl−12−1rot180∘Wl−1m,n,c,dpδlpaddingd,i+m,j+n(8)
其中pδlpaddingd,i,j 是δl 在行列直接插入(sl−11−1,sl−12−1) 行列零元素后(即δlpadding),再在元素外围填充高度和宽度为 (kl−11−1,kl−12−1) 的零元素后的梯度矩阵。
参考
a) A guide to convolution arithmetic for deep learning