在常规神经网络的基础上,CNN的正向传播原理比较容易理解,而反向传播算法的学习比较难以掌握,根据网上的一些教学,以批量梯度下降法为例来描述反向传播算法。对算法的主要公式和解释整理如下:
输入:m个图片样本.
CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。梯度迭代参数迭代步长α,最大迭代次数MAX与停止迭代阈值ϵ.
输出:CNN模型各隐藏层与输出层的 W , b W,b W,b.
1) 初始化各隐藏层与输出层的各 W , b W,b W,b的值为一个随机值;
2)for iter to 1 to MAX:
2_1) for i =1 to m:
a) 将CNN输入a1设置为xi对应的张量
b) for l=2 to L-1,根据下面3种情况进行前向传播算法计算:
b_1) 如果当前是全连接层,则有 a i , l = σ ( z i , l ) = σ ( W l a i , l − 1 + b l ) a^{i,l} = \sigma(z^{i,l}) = \sigma(W^la^{i,l-1} + b^{l}) ai,l=σ(zi,l)=σ(Wlai,l−1+bl)
b_2) 如果当前是卷积层,则有 a i , l = σ ( z i , l ) = σ ( W l ∗ a i , l − 1 + b l ) a^{i,l} = \sigma(z^{i,l}) = \sigma(W^l*a^{i,l-1} + b^{l}) ai,l=σ(zi,l)=σ(Wl∗ai,l−1+bl)
b_3) 如果当前是池化层,则有 a i , l = p o o l ( a i , l − 1 ) a^{i,l}= pool(a^{i,l-1}) ai,l=pool(ai,l−1),
这里的pool指按照池化区域大小k和池化标准将输入张量缩小的过程。
c) 对于输出层第L层: a i , L = s o f t m a x ( z i , L ) = s o f t m a x ( W L a i , L − 1 + b L ) a^{i,L}= softmax(z^{i,L}) = softmax(W^{L}a^{i,L-1} +b^{L}) ai,L=softmax(zi,L)=softmax(WLai,L−1+bL)
c_1) 通过损失函数计算输出层的: δ i , L \delta^{i,L} δi,L
d) for l= L-1 to 2, 根据下面3种情况进行进行反向传播算法计算:
d_1) 如果当前是全连接层: δ i , l = ( W l + 1 ) T δ i , l + 1 ⊙ σ ′ ( z i , l ) \delta^{i,l} = (W^{l+1})^T\delta^{i,l+1}\odot \sigma^{'}(z^{i,l}) δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)
d_2) 如果当前是卷积层: δ i , l = δ i , l + 1 ∗ r o t 180 ( W l + 1 ) ⊙ σ ′ ( z i , l ) \delta^{i,l} = \delta^{i,l+1}*rot180(W^{l+1}) \odot \sigma^{'}(z^{i,l}) δi,l=δi,l+1∗rot180(Wl+1)⊙σ′(zi,l)
d_3) 如果当前是池化层: δ i , l = u p s a m p l e ( δ i , l + 1 ) ⊙ σ ′ ( z i , l ) \delta^{i,l} = upsample(\delta^{i,l+1}) \odot \sigma^{'}(z^{i,l}) δi,l=upsample(δi,l+1)⊙σ′(zi,l)
2_2) for l = 2 to L,根据下面2种情况更新第l层的 W l , b l W^l,b^l Wl,bl:
2_2-1) 如果当前是全连接层: W l = W l − α ∑ i = 1 m δ i , l ( a i , l − 1 ) T W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T Wl=Wl−αi=1∑mδi,l(ai,l−1)T, b l = b l − α ∑ i = 1 m δ i , l b^l = b^l -\alpha \sum\limits_{i=1}^m \delta^{i,l} bl=bl−αi=1∑mδi,l
2_2-2) 如果当前是卷积层,对于每一个卷积核有: W l = W l − α ∑ i = 1 m δ i , l ∗ a i , l − 1 W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}*a^{i, l-1} Wl=Wl−αi=1∑mδi,l∗ai,l−1, b l = b l − α ∑ i = 1 m ∑ u , v ( δ i , l ) u , v b^l = b^l -\alpha \sum\limits_{i=1}^m \sum\limits_{u,v}(\delta^{i,l})_{u,v} bl=bl−αi=1∑mu,v∑(δi,l)u,v
2_3) 如果所有W,b的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3。
3) 输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b。
参考资源:
1.刘建平Pinard
2.Neural Networks and Deep Learning by By Michael Nielsen
3.CS231n Convolutional Neural Networks for Visual Recognition, Stanford