上篇博文主要对CNN的基本网络结构及连接方式做了简单的介绍,还介绍了一个界内经典的LeNet-5
模型。下面重点介绍CNN模型的训练过程/参数学习,在阅读本文之前,最好需要有以下方面的预备知识:
- 神经网络基础(网络结构,前向/后向传播方式,激活函数等);
- 基础的最优化求解方法(梯度法,牛顿法等);
- 机器学习基础
神经网络模型常用于处理有监督学习的问题,例如分类问题,CNN也不例外。模型需要一些有标注的数据进行训练,训练过程中主要涉及到网络的前向传播和反向传播计算,前向传播体现了特征信息的传递,而反向传播则是体现误差信息对模型参数的矫正。
CNN前向传播
对于卷积层,其前向传播如下图:
CNN反向传播
代价函数
代价函数(或损失函数)有较多形式,常用的有平方误差函数,交叉熵等。这里我们用平方误差函数作为代价函数,公式如下:
以上公式描述了样本 n 的训练误差,其中 c为输出层节点的个数(通常就是最终的分类类别数目),t 是训练样本的正确结果,y是网络训练的输出结果。
BP反向传播
基本的反向传播与BP神经网络类似,首先,简单回顾一下BP神经网络中的反向传播计算过程:
权值参数调整的方向如下公式:
其中,η为学习率。
其中,δ 称之为敏感度,也就是误差度。 δ的计算方式如下:
其中,L表示网络的最后一层,l表示网络的其他层,∘表示点乘。 以上的两个公式反映了误差由网络的最后一层逐步向前传递的计算过程。
特殊的反向传播
由于CNN中有不同类型的层级,并且层级之间的连接关系有可能是不确定的(如LeNet-5网络中S2层到C3层)。所以,有几个情形下的反向传播比较特别:
- 情况一:当前为Pooling层,前一层是卷积层;
- 情况二:当前为卷积层,前一层是Pooling层;
- 情况三:当前层与前一层的连接关系不确定(?尚不理解?);
情况一:当前为Pooling层,前一层是卷积层
其中,Kronecker
乘积的计算如下:
情况二:当前为卷积层,前一层是Pooling层
以上的矩阵1和矩阵2进行卷积操作时,需要将矩阵2先水平翻转,然后再垂直翻转;最后在矩阵1上进行卷积操作
(和前向传播时类似)。
情况三:当前层与前一层的连接关系不确定
个人理解,当前层与前一层的连接关系不确定时,反向传播与传统的BP算法类似,只不过更新的是局部连接的那些值。所以需要提前记录当前层的神经元与前一层的哪些元素是连接的。