ramy  2017-12-10 18:45:05  机器学习 |   查看评论   

      刚才我们看了前向传播,下面我们看看反向传播的计算。反向传播中的偏置项bias这里就不说了,和全连接的反向算法一样,相对简单些。另外我们需要计算两个数值:

  1. 给下一层传导的loss
  2. 本层卷积核参数的导数。

 

      首先是下一层参数的loss,也可以理解为Loss对输入数据的梯度。从卷积的过程中直接观察是比较困难的,我们需要讲观看的视角做一下转换。想要求出每个输入的导数,就需要列出每个输入元素参与的计算,这样我们用前面得到的Loss和与这个元素相乘的参数进行相乘再相加就可以得到想要的结果了。这个思路和全连接求导的思路是一致的,只是变换的过程需要费点脑筋:

\frac{\partial Loss}{\partial X_i}=[\frac{\partial Loss}{\partial Z_j}, ...]^T * [\frac{\partial Z_j}{\partial K_l},...]

      为了更加清晰地展示算法,我画了下面这张图:

卷积下层loss

      从这张图可以清楚地看出输入数据和输出loss的关系。右边的图主体上是由5*5的小图组成,每一个小图就相当于输入所在位置的数据参与卷积计算的过程。可以看出,每个输入数据在卷积过程的参与度是不同的。对于我们这个问题,最终的输出是9个数字,每个数字由大小为9的卷积计算得到,也就是说我们一共进行了81次乘加操作,我们用矩阵的形式把这个参与次数再写出来:

      1 2 3 2 1

      2 4 6 4 2

      3 6 9 6 3

 

      2 4 6 4 2

      1 2 3 2 1

      相加后发现确实是81。数字的数量是相符的。

      然后我们还可以从延展的虚线中看出,如果将上面小图中的两部分标出的位置进行乘加操作后就可以得出输入所在点的梯度了,而且另外一个发现就是——把所有输入点的计算组合起来,是输出数据的梯度和卷积参数核的卷积操作,但是其中有2处不同:

  1. 卷积核需要旋转180度
  2. 输出数据的梯度所在的矩阵需要在周围做padding,padding的数量等于卷积核的维度减1

 

      所以这一步的求解最终可以转化成这个伪代码:

residual_x=conv2(padding(residual_z,kernel.shape()-1), rot180(kernel)) 

      通过比较复杂的分析,我们最终得到了一个十分简洁的计算方法。

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自卷积层(2)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]