1 人工神经网络概述
早期的人工神经网络(Artificial Neural Networks,下面简称为ANN),在输出层和输入层之间仅有一层隐含层,因此也被称为浅层网络。在隐含层中有多个神经元,对于一个单一的神经元而言,假设x 是其输入参数、w 是其权值参数、b 是其阈值、a 是预测的结果、h(x)是激活函数、y 是最终的预测结果并作为下一层某个神经元的输入[16]。
单个神经元的工作过程可以用四个函数描述:
1)前向传播函数:建立起训练集数据x 与预测结果a 之间的线性关系,通过输入值x、权值w 及阈值b 计算出预测结果a,其数学表达式如下所示:
2)激活函数:预测结果a 的值往往会出现数值上的分化:一部分a 的数值为负数,这代表此时的预测结果与实际情况不符;一部分a 的数值为正数,这代表此时的预测结果与实际情况相近。由于此时的a 的数值在正负数的范围内存在波动,难以直接与标签值label(通常取0 或1,0 代表与实际情况不符,1 代表与实际情况相近)进行比较,因此需要利用激活函数将a 的值映射到0~1 的区间上,判断预测结果与实际情况是否相符。常见的将a 值映射至0~1范围的激活函数有Sigmoid 函数,Sigmoid 函数公式如下所示:
3)反向传播函数:反向传播函数会先根据此时输出的y 的值与标签值label 进行对比,求出dz,再对w, b 进行反向求导得出dw 和db,计算过程如下所示,其中的m 代表训练集中x 的总个数。
根据dw 和db 的数值采用梯度下降法(不同的ANN 中使用的反向传播方法不同,这里采用最常见的梯度下降法)更新w, b 的数值,重复之前的运算过程。
4)损失函数:损失函数常用于计算预测值y 与标签值label 之间的误差,损失值越小,代表该ANN 对图像的识别预测能力越好,通过不断地训练,最终损失值会越来越小。损失函数表达式如下所示:
在ANN 的训练阶段,在输入层可以有多个x 分量用于输入大量的训练数据(如图2.1 中的x1, x2),通过前向传播函数可以得出预测结果y,同时利用预测结果y 与标签值label 进行对比得出对比结果,根据反向传播函数就可以对参数w, b 进行梯度更新,即完成一次学习过程。
2 深度神经网络
深度神经网络(Deep Neural Networks,下面简称为DNN)的基本思想是在ANN 的基础上,增加其隐含层的层数,构建多层网络,也就是增加了ANN 的深度[17]。在输出层,通过多个神经元可以实现多个输出,使得DNN 不再像ANN 以单一方式对预测结果是否符合实际做出判断,而是可以灵活输出坐标、形状、大小以及分类等信息。
以含有三层隐含层的DNN 网络结构为例。在DNN 中采用全连接的方式连接层与层,即前一层中的任意一个神经元,都与后一层中的每个神经元相连接。虽然在结构上显得更加复杂了,但是其工作原理依旧与单个神经元相同,从输入层的x 到输出层的y,每一条通路都可以看作是一次完整的前向传播过程。随着隐含层层数的增加,层与层之间的前向传播不断将上一层所学的特征交给下一层做进一步的细分、抽象和提取,反向传播则不断更新着每条通路上的权值参数,使得深层网络较浅层网络具有更加强大的高阶特征学习能力,预测的结果也更与实际相近。
随着DNN 中层数的不断增加,对于图像中所含特征的提取以及预测能力获得了显著的提升,但是过于复杂的模型也带来了新的问题:
1)对于深层模型而言,每一层隐含层都需要处理与第一层隐含层所输入的相同大小的图像,如果层数越来越多,那么就需要更多的内存空间用于图像的暂存,这使得模型训练与识别图像的时间变得很长。
2)网络结构中层数的增加使得每一层神经元个数也随之增加,这也就意味着需要更多的权值参数和阈值来表达神经元,这些参数在不断的更新传播过程中极有可能出现重复,使得神经元对特征的泛化能力变差,带来了过拟合的问题。所谓的过拟合就是指,训练好的DNN网络模型,可以对训练集中数据准确进行识别,但是对训练集以外的数据预测识别能力很差。
3 卷积神经网络
卷积神经网络(Convolution Neural Networks,下面简称为CNN),是一类采用卷积运算来代替低层隐含层提取特征,提升泛化能力的深度神经网络[18]。在CNN 的隐含层中,低层的隐含层由卷积层和池化采样层交替出现组成,而高层的隐含层则采用全连接的形式对卷积层提取出的特征进行分类回归。
1)卷积层(Convolution):
每一层卷积层中都包含了多个卷积核,卷积核的结构类似于单个神经元结构中所介绍的单个神经元,组成卷积核的参数包括了一个权重系数和一个阈值。每一个卷积核都可以有规律地对上一层传递过来的图像进行滤波,以一张5*5 的二维图像数据为例,假设卷积层内包含的是大小为3*3,滤波步长为1 的卷积核,通过该卷积核对这张二维图像进行处理:
利用卷积核从图像的左上角开始进行第一次特征提取:
卷积核在每次提取后都会向右移动一个像素单位,当前行提取完成后向下移动一个像素单位,进行下一行的特征提取,最终卷积层提取出的特征图像如下:
卷积层对图像的处理方式不再像DNN 隐含层中的神经元对每一个像素进行逐一对应式的操作,而是用一个卷积核来提取多个像素的特征,以局部特征来代替整体输入,使得每层隐含层中的图像分辨率得到降低,图像的识别处理速度得到提升。而更高层中的卷积层也会对低层中提取的卷积特征图进行再卷积,使得局部的特征在高层中进一步提取并整合,保证了全局信息不会丢失。
每层卷积层中的卷积核的权值是共享的。这样做不仅可以解决隐含层中单层参数过多的问题,避免训练集过拟合,也保证了每层卷积层中的卷积核都可以提取出相同的特征。虽然,每层卷积核中的不同卷积核负责提取的区域不同,但经过权值共享后,同层的卷积核可以在图像的不同区域提取出相同类型的特征,这使得CNN 可以适应目标在图像中存在小范围的平移,较DNN 而言具有更好的平移不变性。
2)池化层(Pooling)
池化层通过对池化区域大小的规划,步长的确定以及池化方式的选择,对卷积层中提取的特征图实现特征筛选与特征压缩[19]。
上图就是一个对4*4 的特征图以2*2 的池化区域、2 个像素为步长、提取最大值为池化方式的池化过程。通过对比卷积层输入与池化层输出可知,图像的分辨率被再一次压缩,同时原有的特征经过池化后保留下的特征更加明显。
由于卷积层和池化层的交替出现,CNN 大大减少了隐含层中的参数数量,避免对训练集过度拟合。在提取特征的同时降低了图像的分辨率,减少了在训练过程中内存空间的占用,提高了图像识别与处理的速度。
4 反向传播梯度消失
为了能进一步提高提取高阶图像和语义特征的能力,DNN 与CNN 都会采用增加隐含层层数的方式来实现,但是层数的加深也给其带来了新的问题:梯度消失。
在单个神经元结构所介绍的反向传播函数中,用一次前向传播的预测结果y 与标签值label 的差值来代表误差值dz,而对于多层神经网络则用正向传播的预测值output 与样本值target 的均方差来表示输出误差Etotal,函数表达式如下:
反向传播的目的,就是要根据最后的输出误差来对前向神经元节点的权重w 进行更新,通过不断前向提取特征和反向更新参数,使得最后的预测结果与实际情况更加接近[20]。反向传播的过程如下所示:
要想根据Etotal 反向求出第i 层隐含层传播权重w1 的下降梯度,需要先求出Etotal 对的第i+1 层的输出值output 的偏导数,再求出第i+1 层的输出值output 对第i+1 层的预测结果A的偏导数,最后求出第i+1 层的预测结果A 对第i 层的输出值output1 的偏导数,根据链式法则将这几个偏导数相乘,就可以求出第i 层隐含层传播权重w1 的下降梯度,其函数表达式如下:
在这个表达式中,由于第i+1 层中的预测结果A 通过Sigmoid 激活函数(2.2)得到输出值output,即output 等于h(A),因此通过输出值output 来对预测结果A 求偏导,也就相当于对Sigmoid 函数求其导数:
假设此时的输出值output 较为接近样本值target,取output 值为0.8,那么此时上式的计算结果为0.16,这也就意味着,对于激活函数采用Sigmoid 函数进行映射的神经元而言,每一次向后传播都会使第i 层的权重w 的下降梯度仅为第i+1 层下降梯度的0.16。随着层数的不断上升,低层隐含层中的神经元接收到的下降梯度越来越小几乎等于0,即出现了梯度消失,这也就意味着此时的低层网络失去了学习的能力。
梯度消失导致在常规网络(Plain Networks, 下面简称为PN)中,学习效果并非与网络层数成正比,当网络达到一定层数后再增加层数反而会导致学习效果的下降。对于一个PN,在其网络层数为20 层与56 层时,分别检测其训练集误差与测试集误差,测试结果显示,随着网络层数的加深,无论是训练集误差还是测试集误差都变大了,测试结果如下图:
在PN 中网络层数过少,意味着其提取高阶语义特征的能力有限,而网络层数的过多又会导致反向传播中梯度消失,使得学习效果下降。为了解决这一问题,Kaiming He 等学者提出了著名的残差网络结构(Residual Networks, 简称为ResNet)。
5 ResNet核心模块
为了解决梯度消失的问题,ResNet[21]在两个卷积层之间增加了一条捷径连接(shortcut connection),并将这两个卷积层合并称为一个残差模块(residual building block),如下图所示:
对于卷积层的输入x,ResNet 在保留原有的前向传递f(x)的同时,通过捷径将输入与输出相连。当层与层之间的前向传递函数过于复杂时,就可以通过输出与捷径的残差F(x)-x 来代替直接学习前向传播函数f(x),保证了学习能力可以随着网络层数的增加而得到提升。
在进行反向传播时,由于捷径的存在使得高层梯度在向低层的传递过程中,不再仅依靠对前向传播函数进行求导得df(x)/dx 来进行传递,同时也会将高层的梯度通过捷径直接传递给低层,以两者之和(1+df(x)/dx)的方式进行梯度下降,使得梯度并不会随着层数的增加而在反向传播的过程中完全消失,即使在反向传播的过程中df(x)/dx 逐渐趋向于0,但捷径的存在依然可以让低层的网络保持很好的学习能力。