卷积神经网络(Convolutional,简称CNN)是一类特殊的人工神经网络,区别于神经网络其他模型(如,递归神经网络、Boltzmann机等),其最主要的特点是卷积运算操作(convolution operator)。因此,在诸多领 域应用特别是图像相关任务上表现优异,诸如,图像分类(image classification)、 图像语义分割(image semantic segmentation)、图像检索(image retrieval)、 物体检测(object detection)等计算机视觉问题。此外,随着CNN研究的深 入,如自然语言处理(natural language processing)中的文本分类,软件工程 数据挖掘(software mining)中的软件缺陷预测等问题都在尝试利用卷积神经 网络解决,并取得了相比传统方法甚至其他深度网络模型更优的预测效果。
一、基础结构
总体来说,卷积神经网络是一种层次模型(hierarchial model),其输入是原始数据(raw data),如RGB图像、原始音频数据等。
卷积神经网络通过卷积(convolution)操作、汇合(pooling)操作和非线性激活函数(non-linear activation function)映射等一系列操作的层层堆叠,将高层语义信息逐层由原始数据输入层中抽取出来,逐层抽象,这一过程便是“前馈运算”(feed-forward)。
其中,不同类型操作在卷积神经网络中一般称作“层”:卷积操作对应“卷积层”,汇合操作对应“汇合层”等等。
最终,卷积神经网络的最后一层将其目标任务(分类、回归等)形式化为目标函数(objective) 。
通过计算预测值与真实值之间的误差或损失(loss),凭借反向传播算法(back-pripagation)将误差或损失由最后一层逐层向前反馈(back-forward),更新每层参数,并在更新参数后再次前馈,如此往复,知道网络模型收敛,从而达到模型训练的目的。
更通俗地讲,卷积神经网络犹如搭积木的过程,见公式1.1如下:
将卷积等操作层作为“基本单元”依次“搭”在原始数据(公式1.1中的x1)上,逐层“堆砌”,以损失函数的计算(公式1.1中的 z )作为过程结束,其中每层数据形式是一个三维张量(tensor)。具体地,在计算机视觉应用中,卷积神经网络的数据层通常是RGB颜色空间的图像:H行,W列,3个通道(分别为R,G,B),在此记作x1。x1经过第一层操作可得 x2 .对应第一层操作中的参数记为 ω1 ;x2 作为第二层操作层 ω2 的输入,可得 x3 .......直到第L-1层,此时网络输出为 xL。
在上述的过程中,理论上每层操作层可为单独卷积操作、汇合操作、非线性映射或其他操作变换,当然也可以是不同形式操作变换的组合。
最后,整个网络以损失函数的计算结束。若 y 是输入 x1 对应的真实标记(ground truth),则损失函数表示如下公式1.2:
其中,函数L()中的参数即WL。事实上,可以发现对于层中的特定操作,其参数xi是可以为空的,如汇合操作、无参的非线性映射以及无参损失函 数的计算等。实际应用中,对于不同任务,损失函数的形式也随之改变。以回归问题为例,常用的 L2 损失函数即可作为卷积网络的目标函数,此时有:
若对于分类问题,网络的目标函数常采用交叉熵(cross entropy)损失函数,有
其中
C为分类任务类别数。显然,无论回归问题还是分类问题,在计算Z前,均需要通过合适的操作得到与y同维度的xL,方可正确计算样本预测的损失/误差值。
二、前馈运算
无论训练模型时计算误差还是模型训练完毕后获得样本预测,卷积神经网络的 前馈(feed-forward)运算都较直观。同样以图像分类任务为例,假设网络已训练完毕,即其中参数ω1,...,ωL−1已收敛到某最优解,此时可用此网络进行图像类别预测。
预测过程实际就是一次网络的前馈运算:将测试集图像作为网络 输入x1 送进网络,之后经过第一层操作 ω1 可得 x2,依此下去⋯⋯直至输出xL ∈ RC。上一节提到,xL 是与真实标记同维度的向量。在利用交叉墒损失函 数训练后得到的网络中,xL 的每一维可表示 x1 分别隶属 C 个类别的后验概率。如此,可通过下式得到输入图像 x1 对应的预测标记如下公式1.3:
三、反馈运算
同其他许多机器学习模型(支持向量机等)一样,卷积神经网络包括其他所有深度学习模型都依赖最小化损失函数来学习模型参数,即最小化式中的 z。 不过需指出的是,从凸优化理论来看,神经网络模型不仅是非凸(non-convex) 函数而且异常复杂,这便带来优化求解的困难。该情形下,深度学习模型采用 随机梯度下降法(Stochastic Gradient Descent简记为SGD)和误差反向传播 (error back propogation)进行模型参数更新。
具体来讲,在卷积神经网络求解时,特别是针对大规模应用问题(如, 分类或检测任务),常采用批处理的随机梯度下降法(mini-batch SGD)。批处理的随机梯度下降法在训练模型阶段随机选取 n 个样本作为一批(batch)样本,先通过前馈运算得到预测并计算其误差,后通过梯度下降法更新参数,梯度从后往前逐层反馈,直至更新到网络的第一层参数,这样的一个 参数更新过程称为一个“批处理过程”(mini-batch)。不同批处理之间按照无放 回抽样遍历所有训练集样本,遍历一次训练样本称为“一轮”(epoch)。其中,批处理样本的大小(batch size)不宜设置过小。过小时(如batch size为1,2 等),由于样本采样随机,按照该样本上的误差更新模型参数不一定在全局上最优(此时仅为局部最优更新),会使得训练过程产生振荡。而批处理大小的上限 则主要取决于硬件资源的限制,如GPU显存大小。一般而言,批处理大小设 为32,64,128或256即可。当然在随机梯度下降更新参数时,还有不同的参数更新策略。
下面我们来看误差反向传播的详细过程,假设某批处理前馈后得到 n 个样本上的误差为 z,且最后一层 L 为 l2 损失函数,则易得公式1.4、1.5:
不难发现,实际上每层操作都对应了两部分导数:一部分是误差关于第 i 层参数ωi 的导数
,另一部分是误差关于该层输入的导数 。其中,
- 关于参数 ωi 的导数用于该层参数更新,η 是每次随机梯度下降的步长,一般随训练轮数(epoch)的增多减小,见公式1.6
- 关于输入 xi 的导数则用于误差向前层的反向传播。可将其视作最终 ∂x 误差从最后一层传递至第 i 层的误差信号。
下面以第 i 层参数更新为例。当误差更新信号(导数)反向传播至第 i 层时, 第 i+1 层的误差导数为
,第 i 层参数更新时需计算 和它的对应值。根据 链式法则,可得公式1.7、1.8:
此处使用向量标记“vec”是由于实际工程实现时张量运算均转化为向量运算。前面提到,由于第 i + 1 层时已计算得到
在第 i 层用于更新该层参数时仅需对其做向量化和转置操作即可得到
即公式1.7和1.8中等号右端的左项。另一方面,在第 i 层,由于 xi 经 ωi 直接作用得 x i+1,故反向求导时亦可直接得到其偏导数 ∂
和
如此,可求得公式1.7和1.8中等号左端项
和
。后根据式 1.6更新该层参数,并将
作为该层误差传至前层,即第 i − 1 层,如此下去, 直至更新到第1层,从而完成一个批处理(mini-batch)的参数更新。
当然,上述方法是通过手动书写导数并用链式法则计算最终误差对每层不 同参数的梯度,之后仍需通过代码将其实现。可见这一过程不仅繁琐,且容易 出错,特别是对一些复杂操作,其导数很难求得甚至无法显式写出。针对这种 情况,一些深度学习库,如Theano和Tensorflow都采用了符号微分的方法进行自动求导来训练模型。符号微分可以在编译时就计算导数的数学表示,并进一步利用符号计算方式进行优化。在实际应用时,用户只需把精力放在模型构建和前向代码书写上,不用担心复杂的梯度求导过程。不过,在此需指出的是,读者有必要对上述反向梯度传播过程了解,也要有能力求得正确的导数形式。
作者: 魏秀参(Xiu-Shen WEI)