CNN的反向传播过程

上一篇文章介绍了DNN的反向传播,对DNN不清楚的可以去看看,CNN在DNN的基础上进行解释。

一、回顾DNN的反向传播

上一篇DNN反向传播过程得出结论:

1、计算每一层的W、b的梯度,需要计算出\frac{\partial J}{\partial z^l}

2、然后每一层的W的梯度和b的梯度

                                                       \frac{\partial J}{\partial W^l}=\frac{\partial J}{\partial z^l}(a^{l-1})^T

                                                      \frac{\partial J}{\partial W^l}=\frac{\partial J}{\partial z^l}

3、第l层的\frac{\partial J}{\partial z^l}和网络后一层的\frac{\partial J}{\partial z^{l+1}}存在下面的递推关系

                                                     \frac{\partial J}{\partial z^l}=(W^{L+1})^T\frac{\partial J}{\partial z^{l+1}}\sigma^{'}(z^l)

4、有了W、b梯度表达式,就可以用梯度下降法来优化W、b,知道求出最终的W、b的值。

二、CNN的反向传播过程

CNN直接使用DNN的反向传播过程,有几个问题需要解决:

1、池化层没有激活函数,相当于激活函数为线性激活函数\sigma(z)=z 。这样激活函数的导数为1;

2、池化层在前向传播的过程中,对输入进行了压缩,那我们向前反向传播推导\frac{\partial J}{\partial z^{l-1}},这个推导过程和DNN完全不同;

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

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

问题1是比较容易解决的,问题2、3、4是解决CNN反向传播的关键。下面的研究过程中,由于卷积层存在多个卷积核,各个卷积核的处理方式是完全相同且独立的。为了简化算法公式的复杂度,我们下面提到的卷积核都是卷积层中若干卷积核中的一个。

三、已知池化层的\frac{\partial J}{\partial z^{l}},求出上一隐藏层的\frac{\partial J}{\partial z^{l-1}}

在前向传播过程中,池化层一般会使用Max或Average对输入进行池化,池化的区域大小给定。现在我们要从缩小区域后的\frac{\partial J}{\partial z^{l}}还原之前较大区域对应的误差\frac{\partial J}{\partial z^{l-1}}

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

用一个例子可以很方便的表示:假设我们的池化区域大小是2x2。\frac{\partial J}{\partial z^{l}}的第k个子矩阵为:

                                                                               \frac{\partial J}{\partial z^{l,k}}=\begin{pmatrix} 4 & 8\\ 6 & 2 \end{pmatrix}

如果池化区域大小为2*2,我们先将\frac{\partial J}{\partial z^{l}}还原,即变成:

1)如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:

                                                                          \begin{pmatrix} 4 & 0 &0 &0 \\ 0 & 0 & 0& 8\\ 0& 6 &0 &0 \\ 0& 0& 2 & 0 \end{pmatrix}

2) 如果是Average,则进行平均:转换后的矩阵为:

                                                                       \begin{pmatrix} 1 & 1 &2 & 2\\ 1 &1 & 2& 2\\ 1.5& 1.5 &0.5 &0.5 \\ 1.5& 1.5& 0.5 & 0.5 \end{pmatrix}

3)这样我们就得到了卷积层后一层upsample后的\frac{\partial J}{\partial z^{l}},由于池化层没有W、b参数需要学习,是一个分辨率变化过程,使用的是线性激活函数。所以

                                                                \frac{\partial J}{\partial z^{l-1}}=upsample(\frac{\partial J}{\partial z^{l}}).\sigma^{'}(z^{l-1})

结论:由池化层的结果向前一层传播的话,由于池化层没有参数需要学习,但是由于池化操作造成了数据维度的变化,所以需要有一个数据的上采样过程,上采样过程跟池化的方法有关。上采样之后,由于池化是个线性函数的过程,所以要求针对上一层的z的梯度,中间只有一个上一层的z到a的激活函数,因此得出上面的结论。

四、已知卷积层的\frac{\partial J}{\partial z^{l}},求出上一隐藏层的\frac{\partial J}{\partial z^{l-1}}

猜你喜欢

转载自blog.csdn.net/legend_hua/article/details/81590979