深度学习之CNN反向传播



  大多数人了解推导的都是全连接层的反向传播公式,全连接层的每一层都可以看作是一个一维向量,其中的元素即代表权重,而CNN中的卷积操作以及池化操作的反向传播,你又了解多少呢?虽然二者思想一致,却又有着诸多不同之处,理解CNN的反向传播之前,先了解下互相关以及卷积的概念。

互相关

  给定一个输入图像I以及一个滤波器为k1Xk2的(即卷积核)K,则互相关定义为:
                         ( I K ) i j = m = 0 k 1 1 n = 0 k 2 1 I ( i + m , j + n ) K ( m , n )             (1)

卷积

  给定一个输入图像I和一个滤波器为k1Xk2的(卷积核)K,则卷积操作为:
                         ( I K ) i j = m = 0 k 1 1 n = 0 k 2 1 I ( i m , j n ) K ( m , n )             (2)
                                     = m = 0 k 1 1 n = 0 k 2 1 I ( i + m , j + n ) K ( m , n )         (3)

反向传播

卷积层

  对于CNN反向传播来说,权值W和误差敏感项 δ 需要更新。
  首先是权值的更新,即计算损失函数对权重的导数 E w m n l ,这可以用来解释卷积核中的一个像素权重 w m n 的改变如何影响损失函数E。

  在前向传播期间,卷积操作确保了卷积核中的黄色像素 w m n 参与对卷积核与其覆盖的输入特征图之间的乘加运算,这就意味着 w m n 会最终影响到输出特征图中的所有元素。
  输入为HxW,卷积核为k1xk2,那么产生的卷积图大小为(H-k1+1)x(W-k2+1),某一权重的梯度可由计算链式法则得到:
                         E w m n l = i = 0 H k 1 j = 0 W k 2 E x i , j l x i , j l w m n l
                                  = i = 0 H k 1 j = 0 W k 2 δ i , j l x i , j l w m n l         (4)
  在(4)中, x i , j l 即等价于 m n w m , n l o i + m , j + n l 1 + b l ,其中 o i , j l = f ( x i , j l ) ,f()表示**函数。所以有:
                         x i , j l w m n l = w m n l ( m n w m , n l o i + m , j + n l 1 + b l )         (5)
  由求偏导数的性质有下列结论:
                         x i , j l w m n l = w m n l ( w 0 , 0 l o i + 0 , j + 0 l 1 + . . . + w m n l o i + m j + n l 1 + . . . + b l )
                                 = w m n l ( w m n l o i + m j + n l 1 )
                                 = o i + m j + n l 1         (6)
  将(6)代入(4)有:
                        E w m n l = i = 0 H k 1 j = 0 W k 2 δ i , j l o i + m j + n l 1         (7)
                                 = r o t 180 { δ i , j l } o m n l 1         (8)
  上述(7)的求和公式是权值共享的结果,表示误差敏感项 δ i , j l 来源于所有下一层l的输出。
  通过将误差敏感项 δ i , j l 进行旋转180度操作即将一个相关操作变成了卷积操作。

  下图则表示为( δ 11 , δ 12 , δ 21 , δ 22 )在反向传播中如何产生的。

  卷积操作用来更新权重,请注意下图中误差敏感项的180度旋转操作:

  既然得到了对权值求梯度的公式,而其中的位置项即误差敏感项 δ i , j l ,而误差敏感项来源于:
                        δ i , j l = E x i , j l         (9)
  在这点计算误差敏感项 E x i , j l ,能更好理解在特征图中的一个像素 x i j 对损失函数E的影响。

  使用求导链式法则有:
                        E x i j l = i , j Q E x Q l + 1 x Q l + 1 x i j l
                               = i , j Q δ Q l + 1 x Q l + 1 x i j l         (10)
  Q表示上述虚线为边界的输出区域的累加,由输出的像素组成并受输入特征图中的一个像素 x i j 所影响。
                        E x i j l = m = 0 k 1 1 n = 0 k 2 1 E x i m , j n l + 1 x i m , j n l + 1 x i j l
                               = m = 0 k 1 1 n = 0 k 2 1 δ i m , j n l + 1 x i m , j n l + 1 x i j l         (11)
在(11)中, x i m , j n l + 1 = w m n l + 1 o i m + m , j n + n l + b l + 1 ,故:
                        x i m , j n l + 1 x i j l = x i j l ( m n w m n l + 1 o i m + m , j n + n l + b l + 1 )
                                    = x i j l ( m n w m n l + 1 f ( x i m + m , j n + n l ) + b l + 1 )         (12)
  继续根据偏导数的性质有:
                        x i m , j n l + 1 x i j l = x i j l ( w m n l + 1 f ( x 0 m + m , 0 n + n l ) + . . . + w m , n l + 1 f ( x i j l ) + . . . + b l + 1 )
                                    = x i j l ( w m , n l + 1 f ( x i j l ) )
                                    = w m , n l + 1 x i j l ( f ( x i j l ) )
                                    = w m , n l + 1 f ( x i j l )         (13)
  将(13)代入(11),有:
                        E x i j l = m = 0 k 1 1 n = 0 k 2 1 δ i m , j n l + 1 w m , n l + 1 f ( x i j l )         (14)
  对于上述(14)可以将这种相关关系表达为卷积形式即:
                        x i j l = m = 0 n = 0 δ i m , j n l + 1 w m , n l + 1 f ( x i j l )
                               = r o t 180 ( m = 0 n = 0 δ i + m , j + n l + 1 w m , n l + 1 f ) f ( x i j l )         (15)
                               = δ i j l + 1 r o t 180 ( w m , n l + 1 ) f ( x l , j j )         (16)
  而对于偏置b来说,因为误差敏感项 δ 是三维张量,而偏置b指示一维向量,通常的作法是将误差敏感项 δ 各个子矩阵的项分别求和,得到一个误差向量:
                        E b l = u , v ( δ l ) u , v

池化层

  池化层的作用就是通过逐渐降低表达能力的维度来减少网络中的参数量以及计算量,从而也达到控制过拟合的作用。
  池化层常包括最大池化、平均池化以及L2范数池化。在池化层中,前向传播使得一个NxN的特征图减小降维,反向传播中进行上采样。
  最大池化:先利用padding对深层进行扩充,然后通过前向传播时记录最大池化中最大值的位置,然后利用这个最大位置,将深层的特征图中的值代入扩充的池化层中即可。
  平均池化:先利用padding对深层进行扩充,然后将深层中的特征图中的每个值对即将代入的扩充的池化层进行均值处理,然后代入。