CNN中一些特殊环节的反向传播(面试要点)
作者头像
  • 德庆央珍
  • 2020-02-04 12:58:54 11

传统的神经网络无论是隐层还是激活函数的导数都是可导的,可以直接计算出导数函数。但在卷积神经网络(CNN)中,存在一些不可导的特殊环节,如ReLU等不可导的激活函数、池化操作以及参数共享的卷积环节。反向传播的本质是梯度传递,因此我们需要了解这些特殊环节的导数计算,从而掌握CNN的反向传播机制。

ReLU函数的导数计算

ReLU激活函数在高等数学上定义为部分不可微的函数,其公式为: [ text{ReLU}(x) = begin{cases} x & text{if } x > 0 0 & text{if } x leq 0 end{cases} ]

在 ( x = 0 ) 处,ReLU函数是不可微的。但在深度学习框架中,通常将ReLU在 ( x = 0 ) 处的导数设为1,因此其导数变为: [ delta text{ReLU}(x) = begin{cases} 1 & text{if } x > 0 0 & text{if } x leq 0 end{cases} ]

这可以通过一个简单的if-else语句实现。关于ReLU的优势,可以参考深度学习笔记(4)——Sigmoid和ReLU激活函数的对比。

池化操作的反向传播

CNN中的另一个不可导环节是池化操作。由于池化操作会导致特征图尺寸的变化,例如2×2的池化操作会使得第 ( l+1 ) 层的特征图有16个梯度,而第 ( l ) 层会有64个梯度。这使得梯度无法一一对应地传递下去。解决这个问题的方法是将一个像素的梯度传递给四个像素,但要确保传递的损失(或梯度)总和不变。根据这一原则,平均池化(mean pooling)和最大池化(max pooling)的反向传播有所不同。

平均池化

平均池化的前向传播是将一个patch中的值求平均作为池化结果。反向传播则是将某个元素的梯度等分为若干份,分别分配给前一层的相应位置,从而保持池化前后梯度的总和不变。需要注意的是,简单地将梯度复制多份直接反向传播回去会导致损失总和增加,从而可能引起梯度爆炸。

最大池化

最大池化也需要满足梯度总和不变的原则。前向传播时,只传递patch中最大值到下一层,其他值则被忽略。反向传播时,梯度直接传递给前一层中那个最大值所在的像素,其余像素的梯度为零。因此,最大池化操作需要记录最大值的位置,即“最大索引”(max id)。这可以在Caffe框架的源码中找到具体实现。

例如,在Caffe框架中,最大池化部分的源码中有一个 max_idx_ 的变量,用于记录最大值的位置。在反向传播过程中,这个变量会被用来确定哪些位置接收梯度。具体过程如下:

[图示]

通过以上方法,我们可以更好地理解和实现CNN中的反向传播机制。

    本文来源:图灵汇
责任编辑: : 德庆央珍
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
反向要点环节面试特殊传播一些CNN
    下一篇