首页 > 人工智能(Artificial Intelligence) > 卷积神经网络

卷积神经网络(CNN)反向传播算法

传统的神经网络是全连接形式的,如果进行反向传播,只需要由下一层对前一层不断的求偏导,即求链式偏导就可以求出每一层的误差敏感项,然后求出权重和偏置项的梯度,即可更新权重。

而卷积神经网络有两个特殊的层:卷积层和池化层。池化层输出时不需要经过激活函数,是一个滑动窗口的最大值,一个常数,那么它的偏导是1。池化层相当于对上层图片做了一个压缩,这个反向求误差敏感项时与传统的反向传播方式不同。从卷积后的feature_map反向传播到前一层时,由于前向传播时是通过卷积核做卷积运算得到的feature_map,所以反向传播与传统的也不一样,需要更新卷积核的参数。

CNN反向传播算法思想

池化层没有激活函数,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1.

池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导 $\delta^{l-1}$,这个推导方法和DNN完全不同。

卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的 $\delta^{l-1}$ 递推计算方法肯定有所不同。

对于卷积层,由于W 使用的运算是卷积,那么从 $\delta^{l}$ 推导出该层的所有卷积核的W,b的方式也不同。

卷积层的反向传播

卷积层的前向传播公式:$  a^l= \sigma(z^l) = \sigma(a^{l-1}*W^l +b^l) $

其中n_in为上一隐藏层的输入子矩阵个数。

在DNN中,$\delta^{l-1}$ 和 $\delta^{l}$ 的递推关系为:

$\delta^{l} = \frac{\partial J(W,b)}{\partial z^l} =(\frac{\partial z^{l+1}}{\partial z^{l}})^T \frac{\partial J(W,b)}{\partial z^{l+1}} =(\frac{\partial z^{l+1}}{\partial z^{l}})^T\delta^{l+1}$

因此要推导出 $\delta^{l-1}$ 和 $\delta^{l}$ 的递推关系,必须计算 $\frac{\partial z^{l}}{\partial z^{l-1}}$ 的梯度表达式。

$z^{l}$ 和 $z^{l-1}$ 的关系为:$z^l = a^{l-1}*W^l +b^l =\sigma(z^{l-1})*W^l +b^l$

因此我们有:

$\delta^{l-1} =  (\frac{\partial z^{l}}{\partial z^{l-1}})^T\delta^{l} = \delta^{l}*rot180(W^{l}) \odot  \sigma^{'}(z^{l-1}) $

这里的式子其实和DNN的类似,区别在于对于含有卷积的式子求导时,卷积核被旋转了180度。即式子中的rot180(),翻转180度的意思是上下翻转一次,接着左右翻转一次。

权重的梯度

卷积核矩阵W的导数表示如下:$\frac{\partial J(W,b)}{\partial W_{pq}^{l}} = \sum\limits_i\sum\limits_j(\delta_{ij}^la_{i+p-1,j+q-1}^{l-1})$

偏置项的梯度

因为 $\delta^l$ 是高维张量,而b是一个向量,不能像DNN那样直接和 $\delta^l$ 相等。通常的做法是将 $\delta^l$ 的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:

$\frac{\partial J(W,b)}{\partial b^{l}} = \sum\limits_{u,v}(\delta^l)_{u,v}$

池化层的反向传播

已知池化层的 $\delta^{l}$ ,推导出上一隐藏层的 $\delta^{l-1}$ 。

在前向传播算法时,池化层一般我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后的误差 $\delta^{l}$ ,还原前一次较大区域对应的误差。

在反向传播时,我们首先会把 $\delta^{l}$ 的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把 $\delta^{l}$ 的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把 $\delta^{l}$ 的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。

例子:假设我们的池化区域大小是2x2。 $\delta^{l}$ 的第k个子矩阵为:$\delta_k^l = \left( \begin{array}{ccc} 2& 8 \\ 4& 6 \end{array} \right)$

由于池化区域为2x2,我们先将 $\delta_k^l$ 做还原,即变成:$ \left( \begin{array}{ccc} 0&0&0&0 \\ 0&2& 8&0 \\ 0&4&6&0 \\ 0&0&0&0 \end{array} \right)$

如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:$ \left( \begin{array}{ccc} 2&0&0&0 \\ 0&0& 0&8 \\ 0&4&0&0 \\ 0&0&6&0 \end{array} \right)$

如果是Average,则进行平均转换后的矩阵为:$ \left( \begin{array}{ccc} 0.5&0.5&2&2 \\ 0.5&0.5&2&2 \\ 1&1&1.5&1.5 \\ 1&1&1.5&1.5 \end{array} \right)$

这样我们就得到了上一层 $\frac{\partial J(W,b)}{\partial a_k^{l-1}} $ 的值,要得到 $\delta_k^{l-1}$:

$\delta_k^{l-1} = (\frac{\partial  a_k^{l-1}}{\partial z_k^{l-1}})^T\frac{\partial J(W,b)}{\partial a_k^{l-1}}  = upsample(\delta_k^l) \odot \sigma^{'}(z_k^{l-1})$

其中,upsample函数完成了池化误差矩阵放大与误差重新分配的逻辑。

对于张量 $\delta^{l-1}$,我们有:$\delta^{l-1} =  upsample(\delta^l) \odot \sigma^{'}(z^{l-1})$

CNN反向传播算法总结

输入:m个图片样本,CNN模型的层数L和所有隐藏层的类型,对于卷积层,要定义卷积核的大小K,卷积核子矩阵的维度F,填充大小P,步幅S。对于池化层,要定义池化区域大小k和池化标准(MAX或Average),对于全连接层,要定义全连接层的激活函数(输出层除外)和各层的神经元个数。梯度迭代参数迭代步长α,最大迭代次数MAX与停止迭代阈值ϵ

输出:CNN模型各隐藏层与输出层的W,b

1)初始化各隐藏层与输出层的各W,b的值为一个随机值。

2)for iter to 1 to MAX:

   2-1) for i =1 to m:

      a) 将CNN输入$a^1$ 设置为 $x_i$ 对应的张量

      b) for l=2 to L-1,根据下面3种情况进行前向传播算法计算:

          b-1) 如果当前是全连接层:则有 $a^{i,l} = \sigma(z^{i,l}) = \sigma(W^la^{i,l-1} + b^{l})$

          b-2) 如果当前是卷积层:则有 $a^{i,l} = \sigma(z^{i,l}) = \sigma(W^l*a^{i,l-1} + b^{l})$

          b-3) 如果当前是池化层:则有 $ a^{i,l}= pool(a^{i,l-1})$, 这里的pool指按照池化区域大小k和池化标准将输入张量缩小的过程。

      c) 对于输出层第L层:  $ a^{i,L}= softmax(z^{i,L}) = softmax(W^{L}a^{i,L-1} +b^{L})$

      c) 通过损失函数计算输出层的 $\delta^{i,L}$

      d) for l= L-1 to 2, 根据下面3种情况进行进行反向传播算法计算:

          d-1)  如果当前是全连接层:$\delta^{i,l} =  (W^{l+1})^T\delta^{i,l+1}\odot \sigma^{'}(z^{i,l})$

          d-2) 如果当前是卷积层:$\delta^{i,l} = \delta^{i,l+1}*rot180(W^{l+1}) \odot  \sigma^{'}(z^{i,l}) $

          d-3) 如果当前是池化层:$\delta^{i,l} =  upsample(\delta^{i,l+1}) \odot \sigma^{'}(z^{i,l})$

   2-2) for l = 2 to L,根据下面2种情况更新第l层的 $W^l,b^l$ :

      2-2-1) 如果当前是全连接层:$W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T $

      2-2-2) 如果当前是卷积层,对于每一个卷积核有:$W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}*a^{i, l-1} $, $b^l = b^l -\alpha \sum\limits_{i=1}^m \sum\limits_{u,v}(\delta^{i,l})_{u,v}$

   2-3) 如果所有W,b的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3。

3) 输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b。

 

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。