8、CNN公式推导
(1)说明
- 参考论文:http://cogprints.org/5869/1/cnn_tutorial.pdf
- 或者在这里查看:https://github.com/lawlite19/DeepLearning_Python/blob/master/paper/cnn_tutorial.pdf
- BP神经网络之前写过推导,可以查看这里的第三部分BP神经网络:https://github.com/lawlite19/MachineLearning_Python
- 我们假设CNN中每个卷积层下面都跟着一个下采样层
- 文章的理解可能会有问题
(2)符号说明
l
………………当前层………………输入maps的集合
- up()………………上采样函数
- ㅇ………………..表示对应每个元素相乘
β
………………..下采样对应的“权重”(定义为常量)……………….
中在卷积运算中逐个与
相乘的
patch
- down()………………下采样函数
(3)卷积层
1)卷积层计算公式
表示第
l
层的第j
个feature map
(特征图)- 可以对照到上面多个卷积核的例子看
j
相当于是第几个卷积核i
相当于对应卷积核或是map的维度
2)卷积层梯度计算
- paper中叫做使用BP计算当前层layer单元的灵敏度(sensitivity)
- 也就是误差的计算,之前我在BP神经网络中推导过,这里不再给出
- 当前层的第
j
个unit的灵敏度结果就是:先对下一层的节点(连接到当前层
l
的感兴趣节点的第l+1
层的节点)的灵敏度求和(得到),然后乘以这些连接对应的权值(连接第
l
层感兴趣节点和第l+1
层节点的权值)W
。再乘以当前层l
的该神经元节点的输入u
的激活函数f的导数值 - 下采样的“weights”可以定义为常量
β
(可以查看下面Pooling层输出的表示) up
表示上采样操作,因为我们之前假设每个卷积层之后跟着一个Pooling层,所以反向传播需要进行上采样up
上采样可以使用克罗内克积(Kronecker)实现,如果A是一个m x n
的矩阵,而B是一个p x q
的矩阵,克罗内克积则是一个mp x nq
的矩阵,
- 所以偏置的梯度为:
(因为神经网络中对
b
的梯度为:((δ就是误差,根据定义的代价函数E得来的),其中
u
为layer的输入:)
- 所以卷积核权值的梯度为:
(其中:
为
中在卷积运算中逐个与
相乘的
patch
,因为权重的系数就是对应的patch
,对权重求导,就是这个系数)
(4)子采样层(Sub-sampling Layers)
1)子采样层计算公式
- 乘以一个常数权重
β
,再加上偏置,然后再调用激活函数(这里和上面的pooling的操作有所不同,但总的来数还是下采样的过程)
2)梯度计算
- 敏感度公式:
- 和上面的其实类似,就是换成下一层对应的权重
k
,rot180()是旋转180度,因为卷积的时候是将卷积核旋转180度之后然后在点乘求和的 - 对偏置
b
的梯度与上面的一样 - 对于乘法偏置(文中叫 multiplicative bias)
β
的梯度为:,其中
- 敏感度公式: