4.1 经典的浅层卷积神经网络

4.1.1 Neocognitron网络[1]

在Hubel和Wiesel的视觉感知机制的启发下,1980年,日本NHK技术研究所的研究员福岛邦彦(Kunihiko Fukushima)在论文Neocognitron:A Self-Organizing Neural Network Model for a Mechanism of Visual Pattern Recognition中提出了Neocognitron网络,这是第一个真正意义上的多层级联神经网络,被认为是卷积神经网络的基础。

Neocognitron网络是提出者对Cognitron网络的改进,改进之后的网络结构能够满足平移不变性。提出者在1988年重新对Neocognitron网络结构进行了梳理,它的网络结构示意如图4.1所示。

图4.1 Neocognitron网络结构示意

从图4.1中可以看出,这是一个级联结构,按照S、C模块进行重复串接。S、C模块分别指Hubel和Wiesel在视觉感知机制中提出的Simple细胞和Complex细胞,简称S细胞和C细胞。S模块可以提取特征,它与上一层的所有模块相连。C模块则将上一层同一通道内的S模块的特征进行整合,从而增强特征在图像中的平移等结构不变性。两者的级联形成了一个基本的结构,多个这样的结构级联,可以完成更加复杂和抽象的特征提取,同时其也拥有更强的平移不变性和更大的感受野。

Neocognitron网络结构已经有了现在广泛使用的卷积神经网络的基本特征,对其结构介绍如下。

输入层是原始的图像信号,大小为19×19,说明这是一个无监督的特征学习过程。

第一个S层,大小为19×19×12,通道数为12。

注意:在本书中,一个三维的张量大小通常用H×W×C来表示,其中H表示张量的高,W表示张量的宽,C表示张量的通道数。

第一个C层,大小为21×21×8,进行了一个像素的边界补齐,从S层到C层,丢弃了某些层,输入通道数为12,输出通道数为8。

第二个S层,大小为21×21×38,进行了通道的升维。

第二个C层,大小为13×13×19,进行了一次池化操作并丢弃了某些通道。

第三个S层,大小为13×13×35,进行了通道的升维。

第三个C层,大小为7×7×23,进行了一次池化操作并丢弃了某些通道。

第四个S层,大小为3×3×11,丢弃了某些通道。

输出层,大小为1×10,对应0~9这10类手写数字的识别概率。

值得注意的是,从S层到C层,输入输出神经元的连接并不是通过一个标准的滑动窗口的卷积来完成的。如图4.2所示为一个T形的采样方案,设计不同的形状,它就可以识别不同的数字。

图4.2 Neocognitron网络结构采样方案示例——T形采样方案

Neocognitron网络对于要识别的目标的小的形状变化和位移拥有不变性,将S层提取的局部特征输入到C层,就可以完成低层局部特征到高层的整合。不过它并不完全是现在的卷积的形式,它不需要位于多个网络位置的单元具有相同的可训练权重,即没有权重共享机制。

Neocognitron网络自被提出后也进行了多次迭代。1988年,研究者开发了处理时间信号的版本,1998年,研究者又对其网络结构进行了改进,并在2003年发布了通用版本。

Neocognitron网络中S模块和C模块串接的结构被后来更著名的LeNet系列网络所使用,这两个模块分别对应如今卷积神经网络中的卷积模块和池化模块。可惜Neocognitron网络并没有取得更大的突破,一方面是因为其没有使用反向传播算法进行优化,而使用了WTA(Winner Take All)的无监督学习方案;另一方面是因为其没有权重共享机制,这限制了模型的表征能力。

4.1.2 TDNN[2]

时间延迟神经网络(Time Delay Neural Network,TDNN)是第一个用于声音信号处理的卷积网络,是多伦多大学的Geoffrey Hinton研究组于1989年在论文Phoneme Recognition Using Time-delay Neural Networks中提出的,初衷是解决语音识别中传统HMM方法无法适应语音信号中的动态时域变化的问题。

TDNN是固定大小的卷积网络,沿时间维度共享权重。其结构参数较少,拥有类似于CNN提供的平移不变性。使用TDNN进行语音识别时,不需要预先将音标与音频在时间线上进行对齐,实验证明,TDNN比HMM表现更好。

TDNN的两个明显的特征是动态适应时域特征变化和参数较少,传统的深层神经网络的输入层与隐藏层一一连接,TDNN对此做了一些改变,即其隐藏层的特征不仅与当前时刻的输入有关,而且与未来时刻的输入有关。

一个包含多帧输入的TDNN如图4.3所示,令B、D、G代表网络的输出结果,即一个音素,输入层每个矩形内的圆点表示特征。对于语音任务来说,MFCC特征被广泛采用,它的维度为13。假设有10个隐藏层,那么连接的权重数目为3×13×10=390。

图4.3中,颜色相同的连接线具有相同的权重,完整的TDNN网络结构输入是语谱图,输入层纵向为经过Mel滤波器的16个特征,横向为时序帧。TDNN的训练采用了反向传播算法,这是其成功的一个重要原因。TDNN拥有以下几个重要的特点。

图4.3 TDNN示意

(1)网络是多层的,每层对特征有较强的抽象能力。

(2)其具有时序建模能力,可以表达语音特征在时间上的关系。

(3)学习过程中不要求对所学的标记进行精确的时间定位。

(4)其共享权值,参数量少。

4.1.3 Cresceptron网络

Cresceptron网络是John(Juyang)Weng等人于1992年在论文Cresceptron:A Self-organizing Neural Network Which Grows Adaptively中提出的网络,其名称是Cresco(Grow)和Perceptio(Perception)的结合,可以理解为“逐渐成长的感知器”,它的结构与Neocognitron网络相似。Neocognitron网络的连接和采样方式是由设计者决定的,需要进行反复尝试,不能通用。而Cresceptron的不同之处在于,它虽然也是层级结构,但每层可以通过无监督的方法学到任意数量的特征。

Cresceptron网络相比于Neocognitron网络有两大创新之处:其一是其具有更加清晰的分层机制,每层的节点数量和连接都是通过学习得来的,层与层之间相对独立,可以学习复杂程度不同的任务,如线条或物体形状;其二是其首次使用了最大池化来增强网络的平移不变形。

Cresceptron网络包含N个模块,每个模块的结构如图4.4所示。图中有5层,第1层是输入,最后1层是输出。越高的层学习的任务越复杂。每经过一层,分辨率降为原来的一半。每层有许多特征平面(Plane),这些特征平面的数量是学习得来的。从L1层到L2层采用了一个3×3的卷积操作和Sigmoid激活函数;从L2层到L3层采用了一个求和操作和Sigmoid激活函数;从L3层到L4层采用了一个5×5的卷积操作和Sigmoid激活函数;从L4层到L5层采用了一个最大池化操作,其将一个2×2的区域变为1×1的区域。

图4.4 Cresceptron网络模块示意

Cresceptron网络开始学习时,首先初始化一个空的网络,然后对输入图像进行学习。输入的图像由人工画出多项式轮廓,如果网络检测到一个新的模式,就增加一个神经元,添加相应的连接,并且在输入值中加入该连接的权重。对每个输入样本,可能会添加多个神经元。之后再对输入样本进行学习时,如果检测到类似的模式,就不需要再增加神经元,而这可以通过Sigmoid函数和阈值来判定。随着陆续在不同的输入样本中出现同样的模式,网络就会渐渐完成学习过程。在学习完之后,若网络还不能识别某个样本,说明该样本是新的样本,此时可在最高层的输出中添加新的节点,将其看作增加了一个类别。

与Cresceptron网络相似的还有探索分层特征学习机制的HMAX网络[4],其重点研究了最大池化对获取平移不变性、尺度及旋转不变性的重要性。

4.1.4 LeNet系列

在Hinton等人提出TDNN的同一年,纽约大学的Yann Lecun等人开始认真研究卷积神经网络。他们使用反向传播直接从手写数字图像中学习卷积核系数,获得了比手动设计系数更好的结果。在接下来的近10年中,LeNet系列网络开始迭代,直到1998年产生稳定的版本LeNet 5。

1.LeNet5的前身

在LeNet5为人熟知之前,Lecun等人还提出过其他早期的版本。在1989年的论文Backpropagation Applied to Handwritten Zip Code Recognition中,他们提出了一个很小的未命名的网络,该网络使用的数字大小为16×16,共包括9298个样本,网络结构共包含3个隐藏层,分别是H1、H2、H3。H1包含了12个8×8的特征图,使用的卷积大小为5×5。这层的网络参数很少,包含了8×8×12=768个偏置系数、5×5×12=300个卷积系数,共1068个参数。H2包含了12个4×4的特征图,每个特征图与前一层的8个通道相连,其输入不再是单通道的灰度图,而是具有12个通道,它的参数包括4×4×12=192个偏置系数、5×5×8×12=2400个卷积系数,共2592个参数。H3是一个全连接层,共30个通道,所以共包含4×4×12×30+30=5790个参数。最后的输出层也是一个全连接层,包含10个输出,共30×10+10=310个参数。这些网络层加起来共9760个参数,不到在2012年大胜传统机器学习算法的AlexNet的第一个卷积层参数量的1/3。

LeNet5的前身还包括LeNet1、LeNet4。LeNet1是于1990年提出的一个网络,它包含了H1、H2、H3和H4这4个网络层,其中H1和H3是卷积层,H2和H4是下采样层,即池化层,这是在该系列网络中第一次出现下采样层。另外,LeNet1的一个比较大的突破就是采用了比原始的输入有效图更大的尺寸,数据集中的数字大小不超过16×16,但LeNet1却使用了28×28的输入尺寸,这一点也被LeNet5借鉴。

LeNet4网络结构和LeNet5非常像,我们对其不做介绍。值得注意的是,当时的研究者使用3个LeNet4进行集成,取得了更好的性能,这也是对卷积神经网络集成的早期尝试。其中,用于集成的第一个网络采用了普通的训练方法;第二个网络采用了第一个网络识别失败的一些特征进行训练;第三个网络采用了前两个网络识别结果不同的特征进行训练。

以上这些网络虽然使用反向传播算法成功地完成了手写数字识别任务,但因为网络深度不够,输入尺寸太小,并不能商用。

2.LeNet5

LeNet系列最终稳定的版本是LeNet5,其后来被美国银行用于手写数字识别。如果不计算输入层,LeNet5一共有7层,每层都包含可以训练的参数。LeNet5有3个卷积层、2个池化层、2个全连接层(见图4.5)。其中,卷积层的卷积核都为5×5,步长为1;池化方法都为平均池化;激活函数为Sigmoid。

图4.5 LeNet5网络结构

下面我们详细介绍该网络结构,在此之前,先约定一些称呼:feature maps(f.maps)是每层网络的特征图;stride是卷积核的步长;C1层的特征图大小为28×28×6,其中28×28表示特征图的高度×宽度,6表示特征图的通道数;该层使用的卷积核大小5×5×1×6,表示高度×宽度×输入通道数×输出通道数。

首先是输入层,输入图像大小统一归一化为32×32,在正式输入网络之前,其灰度值也要进行归一化。

然后是第一个卷积层C1,其经过大小为5×5×1×6的卷积核(stride=1),生成特征图为28×28×6,不使用填充,步长为1。输入的图像是一个单通道的图像,因此,特征图的数量就等于卷积核的数量,每个输出通道都与一个输入通道相连。C1层包含了5×5×1×6+6=156个可训练的参数,以及28×28×6=4704个节点,每个节点都是经过一个5×5的卷积和一个偏置项计算所得到的,连接数为5×5+1=26个,所以C1层一共有4704×26=122304个连接。

接着是池化层S2,其首先对C1层输出中的2×2相邻的区域求和,再取平均值,然后乘以一个权值和加上一个偏置值,将结果通过Sigmoid函数进行映射。这是一个2×2的采样核,stride=2,生成特征图为14×14×6。注意,这里的池化层虽然没有卷积核,但有训练参数。其包括6×2=12个训练参数,分别是求和的权重和偏移量,共(4+1)×6×14×14=5880个连接。早期的LeNet5使用平均池化,后来使用最大池化。

然后是卷积层C3,经过大小为5×5×6×16的卷积核(stride=1),其生成特征图为10×10×16。其输入是6个通道,输出是16个通道,这里经过了一个编码,编码表如表4.1所示。

表4.1 LeNet5网络中S2层到C3层的编码表

C3层的前6个特征图与S2层相邻的3个特征图相连,接下来的6个特征图与S2层相邻的4个特征图相连,再接下来的3个特征图与S2层部分不相邻的4个特征图相连,最后一个特征图与S2层的所有特征图相连。这其实是一个非常主观的设定,输出的16个通道并没有与输入的每个通道相连。它的设计初衷有两个:第一是减小计算量;第二是打破对称性。实际上,在后来的网络设计中,很少会遵循这样的设计准则。

根据表4.1可以求出C3层有6×(5×5×3+1)+9×(5×5×4+1)+1×(5×5×6+1)=1516个参数,与S2层的连接一共有10×10×1516=151600个。

紧接着是池化层S4,其经过2×2的采样核(stride=2),生成特征图为5×5×16。S4层有32个可训练参数、2000个连接。S4层的池化方式与S2层相同,输入是10×10×16,输出是5×5×16。S4层一共有16×2=32个参数,与C3层一共有(4+1)×5×5×16=2000个连接。

然后是卷积层C5,它由120个5×5的卷积核组成,每个卷积核都与S4层中每个大小为5×5的特征图进行卷积,所以每个C5层的卷积核都会输出一个1×1的结果,有点类似于全局平均池化和全连接层,但C5层是一个卷积层而不是一个全连接层,如果这个LeNet5网络的输入变得更大而其他保持不变,那么这个输出将大于1×1。C5层与S4层共有120×(5×5×16+1)=48120个连接。

然后是全连接层F6,它的输入为1×1×120,输出为1×1×84,总参数量为120×84。F6层有84×(120+1)=10164个可训练的连接,84这个数字有当时的设计背景,与ASCII码表示的7×12的位图大小相等。F6层将输入向量与权重向量求点积,然后加上偏置项,用Sigmoid函数产生输出。

最后是输出全连接层,其输入为1×1×84,输出为1×1×10,总参数量为84×10个,其中10就是分类的类别数。输出层是由欧式径向基函数(RBF)组成的。每个输出对应一个RBF,每个RBF都有84维的输入向量。每个RBF都有一个输出,最后输出层会输出一个10维的向量。

注意,虽然是分类任务,但这里并没有采用现在广泛使用的Softmax损失,即交叉熵,而采用了一个欧式距离,称为Gaussian Connection,其等价于一个全连接层加上一个欧式损失层。

LeNet5是早期非常经典的卷积神经网络,也是网络成功商业化的代表,但它的输入图像太小,加上数据不足,在早期并没有在除手写数字识别之外的其他计算机视觉任务上取得大的突破。