作者信息:
华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。
编者按:
算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!
ImageNet
数据集:一个开源的图片数据集,包含超过 1400万张图片和图片对应的标签,包含2万多个类别。
自从2010
年以来,ImageNet
每年举办一次比赛,即:ImageNet
大规模视觉识别挑战赛ILSVRC
,比赛使用 1000 个类别图片。
2017年7月,ImageNet
宣布ILSVRC
于2017
年正式结束,因为图像分类、物体检测、物体识别任务中计算机的正确率都远超人类,计算机视觉在感知方面的问题基本得到解决,后续将专注于目前尚未解决的问题。
ImageNet
中使用两种错误率作为评估指标:
top-5
错误率:对一个图片,如果正确标记在模型输出的前 5 个最佳预测(即:概率最高的前5个)中,则认为是正确的,否则认为是错误的。
最终错误预测的样本数占总样本数的比例就是 top-5
错误率。
top-1
错误率:对一个图片,如果正确标记等于模型输出的最佳预测(即:概率最高的那个),则认为是正确的,否则认为是错误的。
最终错误预测的样本数占总样本数的比例就是 top-1
错误率。
注:feature map
的描述有两种:channel first
,如256x3x3
;channel last
,如3x3x256
。这里如果未说明,则默认采用channel last
描述。另外也可以显式指定,如:3x3@256
。
1998年LeCun
推出了LeNet
网络,它是第一个广为流传的卷积神经网络。
LeNet
网络包含了卷积层、池化层、全连接层,这些都是现代CNN
网络的基本组件。
网络层 | 核/池大小 | 核数量 | 步长 | 输入尺寸 | 输出尺寸 |
---|---|---|---|---|---|
INPUT | - | - | - | - | 1@32x32 |
C1 | 5x5 | 6 | 1 | 1@32x32 | 6@28x28 |
S2 | 2x2 | - | 2 | 6@28x28 | 6@14x14 |
C3 | 5x5 | 16 | 1 | 6@14x14 | 16@10x10 |
S4 | 2x2 | - | 2 | 16@10x10 | 16@5x5 |
C5 | 5x5 | 120 | 1 | 16@5x5 | 120@1x1 |
F6 | - | - | - | 120 | 84 |
OUTPUT | - | - | - | 84 | 10 |
输入层:二维图像,尺寸为32x32
。
C1、C3、C5
层:二维卷积层。
其中C5
将输入的 feature map
(尺寸 16@5x5
)转化为尺寸为120x1x1
的 feature map
,然后转换为长度为120
的一维向量。
这是一种常见的、将卷积层的输出转换为全连接层的输入的一种方法。
S2、S4
层:池化层。使用sigmoid
函数作为激活函数。
后续的
CNN
都使用ReLU
作为激活函数。
F6
层:全连接层。
输出层:由欧式径向基函数单元组成。
后续的
CNN
使用softmax
输出单元。
上表中,@
分隔了通道数量和feature map
的宽、高。
2012年Hinton
和他的学生推出了AlexNet
。在当年的ImageNet
图像分类竞赛中,AlexeNet
以远超第二名的成绩夺冠,使得深度学习重回历史舞台,具有重大历史意义。
AlexNet
有5个广义卷积层和3个广义全连接层。
网络结构如下表所示:
编号 | 网络层 | 子层 | 核/池大小 | 核数量 | 步长 | 激活函数 | 输入尺寸 | 输出尺寸 |
---|---|---|---|---|---|---|---|---|
第0层 | 输入层 | - | - | - | - | - | - | 3@224x224 |
第1层 | 广义卷积层 | 卷积 | 11x11 | 96 | 4 | ReLU | 3@227x227 | 96@55x55 |
第1层 | 广义卷积层 | 池化 | 3x3 | - | 2 | - | 96@55x55 | 96@27x27 |
第1层 | 广义卷积层 | LRN | - | - | - | - | 96@27x27 | 96@27x27 |
第2层 | 广义卷积层 | 卷积 | 5x5 | 256 | 1 | ReLU | 96@27x27 | 256@27x27 |
第2层 | 广义卷积层 | 池化 | 3x3 | - | 2 | - | 256@27x27 | 256@13x13 |
第2层 | 广义卷积层 | LRN | - | - | - | - | 256@13x13 | 256@13x13 |
第3层 | 广义卷积层 | 卷积 | 3x3 | 384 | 1 | ReLU | 256@13x13 | 384@13x13 |
第4层 | 广义卷积层 | 卷积 | 3x3 | 384 | 1 | ReLU | 384@13x13 | 384@13x13 |
第5层 | 广义卷积层 | 卷积 | 3x3 | 256 | 1 | ReLU | 384@13x13 | 256@13x13 |
第5层 | 广义卷积层 | 池化 | 3x3 | - | 2 | - | 256@13x13 | 256@6x6 |
第6层 | 广义连接层 | 卷积 | 6x6 | 4096 | 1 | ReLU | 256@6x6 | 4096@1x1 |
第6层 | 广义连接层 | dropout | - | - | - | - | 4096@1x1 | 4096@1x1 |
第7层 | 广义连接层 | 全连接 | - | - | - | ReLU | 4096 | 4096 |
第7层 | 广义连接层 | dropout | - | - | - | - | 4096 | 4096 |
第8层 | 广义连接层 | 全连接 | - | - | - | - | 4096 | 1000 |
输入层会将3@224x224
的三维图片预处理变成3@227x227
的三维图片。
第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本GPU
内的通道数据进行计算。
第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算。
第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用same
填充。
当卷积的步长为1,核大小为
3x3
时,如果不填充0,则feature map
的宽/高都会缩减 2 。因此这里填充0,使得输出feature map
的宽/高保持不变。
其它层的卷积,以及所有的池化都是valid
填充(即:不填充 0 )。
第六层广义连接层的卷积之后,会将feature map
展平为长度为 4096 的一维向量。
网络参数数量:总计约 6237万。
编号 | 网络层 | 子层 | 输出 Tensor size | 权重个数 | 偏置个数 | 参数数量 |
---|---|---|---|---|---|---|
第0层 | 输入层 | - | 227x227x3 | 0 | 0 | 0 |
第1层 | 广义卷积层 | 卷积 | 55x55x96 | 34848 | 96 | 34944 |
第1层 | 广义卷积层 | 池化 | 27x27x96 | 0 | 0 | 0 |
第1层 | 广义卷积层 | LRN | 27x27x96 | 0 | 0 | 0 |
第2层 | 广义卷积层 | 卷积 | 27x27x256 | 614400 | 256 | 614656 |
第2层 | 广义卷积层 | 池化 | 13x13x256 | 0 | 0 | 0 |
第2层 | 广义卷积层 | LRN | 13x13x256 | 0 | 0 | 0 |
第3层 | 广义卷积层 | 卷积 | 13x13x384 | 884736 | 384 | 885120 |
第4层 | 广义卷积层 | 卷积 | 13x13x384 | 1327104 | 384 | 1327488 |
第5层 | 广义卷积层 | 卷积 | 13x13x256 | 884736 | 256 | 884992 |
第5层 | 广义卷积层 | 池化 | 6x6x256 | 0 | 0 | 0 |
第6层 | 广义连接层 | 卷积 | 4096×1 | 37748736 | 4096 | 37752832 |
第6层 | 广义连接层 | dropout | 4096×1 | 0 | 0 | 0 |
第7层 | 广义连接层 | 全连接 | 4096×1 | 16777216 | 4096 | 16781312 |
第7层 | 广义连接层 | dropout | 4096×1 | 0 | 0 | 0 |
第8层 | 广义连接层 | 全连接 | 1000×1 | 4096000 | 1000 | 4097000 |
总计 | - | - | - | - | - | 62,378,344 |
输出Tensor size
采用channel last
风格描述。即227x227x3
等价于前文的 3@227x227
。
第6层广义连接层的卷积的参数数量最多,约3770万,占整体六千万参数的 60%。
原因是该子层的卷积核较大、输入通道数量较大、输出通道数量太多。该卷积需要的参数数量为: 。
AlexNet
成功的主要原因在于:
使用ReLU
激活函数。
使用dropout
、数据集增强 、重叠池化等防止过拟合的方法。
使用百万级的大数据集来训练。
使用GPU
训练,以及的LRN
使用。
使用带动量的 mini batch
随机梯度下降来训练。
AlexNet
中使用的数据集增强手段:
随机裁剪、随机水平翻转:原始图片的尺寸为256xx256
,裁剪大小为224x224
。
每一个epoch
中,对同一张图片进行随机性的裁剪,然后随机性的水平翻转。理论上相当于扩充了数据集 倍。
在预测阶段不是随机裁剪,而是固定裁剪图片四个角、一个中心位置,再加上水平翻转,一共获得 10 张图片。
用这10张图片的预测结果的均值作为原始图片的预测结果。
PCA
降噪:对RGB
空间做PCA
变换来完成去噪功能。同时在特征值上放大一个随机性的因子倍数(单位1
加上一个 的高斯绕动),从而保证图像的多样性。
每一个epoch
重新生成一个随机因子。
该操作使得错误率下降1%
。
AlexNet
的预测方法存在两个问题:
这种固定裁剪四个角、一个中心
的方式,把图片的很多区域都给忽略掉了。很有可能一些重要的信息就被裁剪掉。
裁剪窗口重叠,这会引起很多冗余的计算。
改进的思路是:
执行所有可能的裁剪方式,对所有裁剪后的图片进行预测。将所有预测结果取平均,即可得到原始测试图片的预测结果。
减少裁剪窗口重叠部分的冗余计算。
具体做法为:将全连接层用等效的卷积层替代,然后直接使用原始大小的测试图片进行预测。将输出的各位置处的概率值按每一类取平均(或者取最大),则得到原始测试图像的输出类别概率。
下图中:上半图为AlexNet
的预测方法;下半图为改进的预测方法。
局部响应规范层LRN
:目地是为了进行一个横向抑制,使得不同的卷积核所获得的响应产生竞争。
LRN
层现在很少使用,因为效果不是很明显,而且增加了内存消耗和计算时间。
在AlexNet
中,该策略贡献了1.2%
的贡献率。
LRN
的思想:输出通道 i 在位置 (x,y) 处的输出会受到相邻通道在相同位置输出的影响。
为了刻画这种影响,将输出通道 i 的原始值除以一个归一化因子。
其中: 为输出通道 i 在位置 处的原始值, 为归一化之后的值。n 为影响第 i 通道的通道数量(分别从左侧、右侧 个通道考虑)。 为超参数。
一般考虑 。
AlexNet
使用两个GPU
训练。网络结构图由上、下两部分组成:一个GPU
运行图上方的通道数据,一个GPU
运行图下方的通道数据,两个GPU
只在特定的网络层通信。即:执行分组卷积。
第二、四、五层卷积层的核只和同一个GPU
上的前一层的feature map
相连。
第三层卷积层的核和前一层所有GPU
的feature map
相连。
全连接层中的神经元和前一层中的所有神经元相连。
一般的池化是不重叠的,池化区域的大小与步长相同。Alexnet
中,池化是可重叠的,即:步长小于池化区域的大小。
重叠池化可以缓解过拟合,该策略贡献了0.4%
的错误率。
为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。
AlexNet
使用了带动量的mini-batch
随机梯度下降法。
标准的带动量的mini-batch
随机梯度下降法为:
而论文中,作者使用了修正:
其中 ,, 为学习率。
为权重衰减。论文指出:权重衰减对于模型训练非常重要,不仅可以起到正则化效果,还可以减少训练误差。
VGG-Net
是牛津大学计算机视觉组和DeepMind
公司共同研发一种深度卷积网络,并且在2014年在ILSVRC
比赛上获得了分类项目的第二名和定位项目的第一名。
VGG-Net
的主要贡献是:
证明了小尺寸卷积核(3x3
)的深层网络要优于大尺寸卷积核的浅层网络。
证明了深度对网络的泛化性能的重要性。
验证了尺寸抖动scale jittering
这一数据增强技术的有效性。
VGG-Net
最大的问题在于参数数量,VGG-19
基本上是参数数量最多的卷积网络架构。
VGG-Net
一共有五组结构(分别表示为:A~E
), 每组结构都类似,区别在于网络深度上的不同。
结构中不同的部分用黑色粗体给出。
卷积层的参数为convx-y
,其中x
为卷积核大小,y
为卷积核数量。
如:conv3-64
表示 64
个 3x3
的卷积核。
卷积层的通道数刚开始很小(64通道),然后在每个池化层之后的卷积层通道数翻倍,直到512。
每个卷积层之后都跟随一个ReLU
激活函数,表中没有标出。
通用结构:
输入层:固定大小的224x224
的RGB
图像。
卷积层:卷积步长均为1。
填充方式:填充卷积层的输入,使得卷积前后保持同样的空间分辨率。
3x3
卷积:same
填充,即:输入的上下左右各填充1个像素。
1x1
卷积:不需要填充。
卷积核尺寸:有3x3
和1x1
两种。
3x3
卷积核:这是捕获左右、上下、中心等概念的最小尺寸。
1x1
卷积核:用于输入通道的线性变换。
在它之后接一个ReLU
激活函数,使得输入通道执行了非线性变换。
池化层:采用最大池化。
池化层连接在卷积层之后,但并不是所有的卷积层之后都有池化。
池化窗口为2x2
,步长为 2 。
网络最后四层为::三个全连接层 + 一个softmax
层。
前两个全连接层都是 4096个神经元,第三个全连接层是 1000 个神经元(因为执行的是 1000 类的分类)。
最后一层是softmax
层用于输出类别的概率。
所有隐层都使用ReLU
激活函数。
VGG-Net
网络参数数量:
其中第一个全连接层的参数数量为:7x7x512x4096=1.02亿
,因此网络绝大部分参数来自于该层。
与
AlexNet
相比,VGG-Net
在第一个全连接层的输入feature map
较大:7x7 vs 6x6
,512 vs 256
。
网络 | A , A-LRN | B | C | D | E |
---|---|---|---|---|---|
参数数量 | 1.13亿 | 1.33亿 | 1.34亿 | 1.38亿 | 1.44 |
输入预处理:通道像素零均值化。
先统计训练集中全部样本的通道均值:所有红色通道的像素均值 、所有绿色通道的像素均值 、所有蓝色通道的像素均值 。
其中:假设红色通道为通道0
,绿色通道为通道1
,蓝色通道为通道2
;n 遍历所有的训练样本,i,j 遍历图片空间上的所有坐标。
对每个样本:红色通道的每个像素值减去 ,绿色通道的每个像素值减去 ,蓝色通道的每个像素值减去 。
多尺度训练:将原始的图像缩放到最小的边 ,然后在整副图像上截取224x224
的区域来训练。
有两种方案:
在所有图像上固定 S :用 S=256 来训练一个模型,用 S=384 来训练另一个模型。最后使用两个模型来评估。
对每个图像,在 之间随机选取一个 S ,然后进行裁剪来训练一个模型。最后使用单个模型来评估。
该方法只需要一个单一的模型。
该方法相当于使用了尺寸抖动(scale jittering
) 的数据增强。
多尺度测试:将测试的原始图像等轴的缩放到预定义的最小图像边,表示为 Q (Q 不一定等于 S ),称作测试尺度。
在一张测试图像的几个归一化版本上运行模型,然后对得到的结果进行平均。
该方法相当于在测试时使用了尺寸抖动。实验结果表明:测试时的尺寸抖动导致了更好的性能。
评估有三种方案:
single-crop
:对测试图片沿着最短边缩放,然后选择其中的 center crop
来裁剪图像,选择这个图像的预测结果作为原始图像的预测结果。
该方法的缺点是:仅仅保留图片的中央部分可能会丢掉图片类别的关键信息。因此该方法很少在实际任务中使用,通常用于不同模型之间的性能比较。
multi-crop
:类似AlexNet
的做法,对每个测试图像获取多个裁剪图像,平均每个裁剪图像的预测结果为原始图像的预测结果。
该方法的缺点是:需要网络重新计算每个裁剪图像,效率较低。
dense
:将最后三个全连接层用等效的卷积层替代,成为一个全卷积网络。其中:第一个全连接层用7x7
的卷积层替代,后面两个全连接层用1x1
的卷积层替代。
该全卷积网络应用到整张图片上(无需裁剪),得到一个多位置的、各类别的概率字典。通过原始图片、水平翻转图片的各类别预测的均值,得到原始图片的各类别概率。
该方法的优点是:不需要裁剪图片,支持多尺度的图片测试,计算效率较高。
实验结果表明:multi-crop
评估方式要比dense
评估方式表现更好。另外,二者是互补的,其组合要优于任何单独的一种。下表中,S=[256;512]
,Q={256,384,512} 。
还有一种评估策略:
ensemble error
。即:同时训练同一种网络的多个不同的模型,然后用这几个模型的预测结果的平均误差作为最终的ensemble error
。有一种术语叫
single-model error
。它是训练一个模型,然后采用上述的多种crop/dense
评估的组合,这些组合的平均输出作为预测结果。
权重初始化:由于网络深度较深,因此网络权重的初始化很重要,设计不好的初始化可能会阻碍学习。
论文的权重初始化方案为:先训练结构A
。当训练更深的配置时,使用结构A
的前四个卷积层和最后三个全连接层来初始化网络,网络的其它层被随机初始化。
作者后来指出:可以通过 Xavier
均匀初始化来直接初始化权重而不需要进行预训练。
实验结果表明:
分类误差随着网络深度的增加而减小。
从A-LRN
和 A
的比较发现:局部响应归一化层LRN
对于模型没有任何改善。
Inception
网络是卷积神经网络的一个重要里程碑。在Inception
之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使得网络越来越深。这使得网络越来越复杂,参数越来越多,从而导致网络容易出现过拟合,增加计算量。
而Inception
网络考虑的是多种卷积核的并行计算,扩展了网络的宽度。
Inception Net
核心思想是:稀疏连接。因为生物神经连接是稀疏的。
Inception
网络的最大特点是大量使用了Inception
模块。
InceptionNet V1
是一个22层的深度网络。如果考虑池化层,则有29层。如下图中的depth
列所示。
网络具有三组Inception
模块,分别为:inception(3a)/inception(3b)
、inception(4a)/inception(4b)/inception(4c)/inception(4d)/inception(4e)
、inception(5a)、inception(5b)
。三组Inception
模块被池化层分隔。
下图给出了网络的层次结构和参数,其中:
type
列:给出了每个模块/层的类型。
patch size/stride
列:给出了卷积层/池化层的尺寸和步长。
output size
列:给出了每个模块/层的输出尺寸和输出通道数。
depth
列:给出了每个模块/层包含的、含有训练参数层的数量。
#1x1
列:给出了每个模块/层包含的1x1
卷积核的数量,它就是1x1
卷积核的输出通道数。
#3x3 reduce
列:给出了每个模块/层包含的、放置在3x3
卷积层之前的1x1
卷积核的数量,它就是1x1
卷积核的输出通道数。
#3x3
列:给出了每个模块/层包含的3x3
卷积核的数量,它就是3x3
卷积核的输出通道数。
#5x5 reduce
列:给出了每个模块/层包含的、放置在5x5
卷积层之前的1x1
卷积核的数量,它就是1x1
卷积核的输出通道数。
#5x5
列:给出了每个模块/层包含的5x5
卷积核的数量,它就是5x5
卷积核的输出通道数。
pool proj
列:给出了每个模块/层包含的、放置在池化层之后的1x1
卷积核的数量,它就是1x1
卷积核的输出通道数。
params
列:给出了每个模块/层的参数数量。
ops
列:给出了每个模块/层的计算量。
Inception V1
的参数数量为 697.7 万,其参数数量远远小于AlexNet
(6千万)、VGG-Net
(超过1亿)。
Inception V1
参数数量能缩减的一个主要技巧是:在inception(5b)
输出到linear
之间插入一个平均池化层avg pool
。
如果没有平均池化层,则inception(5b)
到 linear
之间的参数数量为:7x7x1024x1024
,约为 5 千万。
插入了平均池化层之后,inception(5b)
到 linear
之间的参数数量为:1x1x1024x1024
,约为 1百万。
原始的Inception
模块对输入同时执行:3个不同大小的卷积操作(1x1、3x3、5x5
)、1个最大池化操作(3x3
)。所有操作的输出都在深度方向拼接起来,向后一级传递。
三种不同大小卷积:通过不同尺寸的卷积核抓取不同大小的对象的特征。
使用1x1、3x3、5x5
这些具体尺寸仅仅是为了便利性,事实上也可以使用更多的、其它尺寸的滤波器。
1个最大池化:提取图像的原始特征(不经过过滤器)。
原始Inception
模块中,模块的输出通道数量为四个子层的输出通道数的叠加。这种叠加不可避免的使得Inception
模块的输出通道数增加,这就增加了Inception
模块中每个卷积的计算量。因此在经过若干个模块之后,计算量会爆炸性增长。
解决方案是:在3x3
和 5x5
卷积层之前额外添加1x1
卷积层,来限制输入给卷积层的输入通道的数量。
注意:
1x1
卷积是在最大池化层之后,而不是之前。这是因为:池化层是为了提取图像的原始特征,一旦它接在1x1
卷积之后就失去了最初的本意。
1x1
卷积在3x3
、5x5
卷积之前。这是因为:如果1x1
卷积在它们之后,则3x3
卷积、5x5
卷积的输入通道数太大,导致计算量仍然巨大。
为了缓解梯度消失的问题,InceptionNet V1
给出了两个辅助分类器。这两个辅助分类器被添加到网络的中间层,它们和主分类器共享同一套训练数据及其标记。其中:
第一个辅助分类器位于Inception(4a)
之后,Inception(4a)
模块的输出作为它的输入。
第二个辅助分类器位于Inception(4d)
之后,Inception(4d)
模块的输出作为它的输入。
两个辅助分类器的结构相同,包括以下组件:
一个尺寸为5x5
、步长为3
的平均池化层。
一个尺寸为1x1
、输出通道数为128
的卷积层。
一个具有1024
个单元的全连接层。
一个drop rate = 70%
的 dropout
层。
一个使用softmax
损失的线性层作为输出层。
在训练期间,两个辅助分类器的损失函数的权重是0.3,它们的损失被叠加到网络的整体损失上。在推断期间,这两个辅助网络被丢弃。
在Inception v3
的实验中表明:辅助网络的影响相对较小,只需要其中一个就能够取得同样的效果。
事实上辅助分类器在训练早期并没有多少贡献。只有在训练接近结束,辅助分支网络开始发挥作用,获得超出无辅助分类器网络的结果。
两个辅助分类器的作用:提供正则化的同时,克服了梯度消失问题。
Inception v2
的主要贡献是提出了Batch Normalization
。论文指出,使用了Batch Normalization
之后:
可以加速网络的学习。
相比Inception v1
,训练速度提升了14倍。因为应用了BN
之后,网络可以使用更高的学习率,同时删除了某些层。
网络具有更好的泛化能力。
在ImageNet
分类问题的top5
上达到4.8%
,超过了人类标注 top5
的准确率。
Inception V2
网络训练的技巧有:
使用更高的学习率。
删除dropout
层、LRN
层。
减小L2
正则化的系数。
更快的衰减学习率。学习率以指数形式衰减。
更彻底的混洗训练样本,使得一组样本在不同的epoch
中处于不同的mini batch
中。
减少图片的形变。
Inception v2
的网络结构比Inception v1
有少量改动:
5x5
卷积被两个3x3
卷积替代。
这使得网络的最大深度增加了 9 层,同时网络参数数量增加 25%,计算量增加 30%。
28x28
的inception
模块从2个增加到3个。
在inception
模块中,有的采用最大池化,有的采用平均池化。
在inception
模块之间取消了用作连接的池化层。
inception(3c),inception(4e)
的子层采用步长为 2 的卷积/池化。
Pool+proj
列给出了inception
中的池化操作。
avg+32
意义为:平均池化层后接一个尺寸1x1
、输出通道32
的卷积层。
max+pass through
意义为:最大池化层后接一个尺寸1x1
、输出通道数等于输入通道数的卷积层。
Inception V2
的网络参数约为1126
万。
层 | 参数数量 |
---|---|
conv1 | 9408 |
conv2 | 114688 |
inception-3a | 218094 |
inception-3b | 259072 |
inception-3c | 384000 |
inception-4a | 608193 |
inception-4b | 663552 |
inception-4c | 912384 |
inception-4d | 1140736 |
inception-4e | 1447936 |
inception-5a | 2205696 |
inception-5b | 2276352 |
fc | 1024000 |
共 | 11264111 |
Inception V2
在ImageNet
测试集上的误差率:
虽然Inception v1
的参数较少,但是它的结构比较复杂,难以进行修改。原因有以下两点:
因此Inception v3
的论文重点探讨了网络结构设计的原则。
如果单纯的放大网络(如增加Inception
模块的数量、扩展Inception
模块的大小),则参数的数量会显著增长,计算代价太大。
Inception v1
结构中的各种设计,其对最终结果的贡献尚未明确。
Inception v3
的网络深度为42层,它相对于Inception v1
网络主要做了以下改动:
7x7
卷积替换为3个3x3
卷积。
3个Inception
模块:模块中的5x5
卷积替换为2个3x3
卷积,同时使用后面描述的网格尺寸缩减技术。
5个Inception
模块:模块中的5x5
卷积替换为2个3x3
卷积之后,所有的nxn
卷积进行非对称分解,同时使用后面描述的网格尺寸缩减技术。
2个Inception
模块:结构如下。它也使用了卷积分解技术,以及网格尺寸缩减技术。
Inception v3
的网络结构如下所示:
3xInception
表示三个Inception
模块,4xInception
表示四个Inception
模块,5xInception
表示五个Inception
模块。
conv padded
表示使用0填充的卷积,它可以保持feature map
的尺寸。
在Inception
模块内的卷积也使用0填充,所有其它的卷积/池化不再使用填充。
在3xInception
模块的输出之后设有一个辅助分类器。其结构如下:
Inception v3
整体参数数量约 23,626,728万(论文Xception: Deep Learning with Depthwise Separable Convolutions
)。
Inception v3
总结出网络设计的一套通用设计原则:
representation
大小通常指的是feature map
的容量,即feature map
的width x height x channel
。
空间聚合:可以通过空间聚合来完成低维嵌入,而不会在表达能力上有较大的损失。因此通常在nxn
卷积之前,先利用1x1
卷积来降低输入维度。
猜测的原因是:空间维度之间的强相关性导致了空间聚合过程中的信息丢失较少。
平衡网络的宽度和深度:增加网络的宽度或者深度都可以提高网络的泛化能力,因此计算资源需要在网络的深度和宽度之间取得平衡。
避免representation
瓶颈:representation
的大小应该从输入到输出缓缓减小,避免极端压缩。在缩小feature map
尺寸的同时,应该增加feature map
的通道数。
大卷积核的分解:将大卷积核分解为多个小的卷积核。
如:使用2个3x3
卷积替换5x5
卷积,则其参数数量大约是1个5x5
卷积的 72% 。
nxn
卷积核的非对称分解:将nxn
卷积替换为1xn
卷积和nx1
卷积。
这种非对称分解的参数数量是原始卷积数量的 。随着n
的增加,计算成本的节省非常显著。
论文指出:对于较大的feature map
,这种分解不能很好的工作;但是对于中等大小的 feature map
(尺寸在12~20
之间),这种分解效果非常好。
假设输入的feature map
尺寸为dxd
,通道数为k
。如果希望输出的feature map
尺寸为d/2 x d/2
,通道数为2k
。则有以下的两种方式:
事实上每个Inception
模块都会使得feature map
尺寸缩半、通道翻倍,因此在这个过程中需要仔细设计网络,使得既能够保证网络的表征能力,又不至于计算代价太大。
首先使用2k
个 1x1
的卷积核,执行步长为1的卷积。然后执行一个2x2
的、步长为2的池化操作。
该方式需要执行 2d^2k^2 次乘-加
操作,计算代价较大。
直接使用2k
个1x1
的卷积核,执行步长为2的卷积。
该方式需要执行 次乘-加
操作,计算代价相对较小。但是表征能力下降,产生了表征瓶颈。
解决方案是:采用两个模块P
和 C
。
将模块P
和模块C
的输出按照通道数拼接,产生最终的输出feature map
。
模块P
:使用k
个1x1
的卷积核,执行步长为2的卷积。其输出feature map
尺寸为d/2 x d/2
,通道数为k
。
模块C
:使用步长为2的池化。其输出feature map
尺寸为d/2 x d/2
,通道数为k
。
标签平滑正则化的原理:假设样本的真实标记存在一定程度上的噪声。即:样本的真实标记不一定是可信的。
对给定的样本 ,其真实标记为 y 。在普通的训练中,该样本的类别分布为一个 函数:。记做 。
采用标签平滑正则化(LSR:Label Smoothing Regularization
)之后,该样本的类别分布为:
其中 是一个很小的正数(如 0.1),其物理意义为:样本标签不可信的比例。
该类别分布的物理意义为:
样本 的类别为 y 的概率为 。
样本 的类别为 的概率均 。
论文指出:标签平滑正则化对top-1
错误率和top-5
错误率提升了大约 0.2% 。
Inception v4
和 Inception-ResNet
在同一篇论文中给出。论文通过实验证明了:结合残差连接可以显著加速Inception
的训练。
性能比较:(综合采用了 144 crops/dense
评估的结果,数据集:ILSVRC 2012
的验证集 )
网络 | crops | Top-1 Error | Top-5 Error |
---|---|---|---|
ResNet-151 | dense | 19.4% | 4.5% |
Inception-v3 | 144 | 18.9% | 4.3% |
Inception-ResNet-v1 | 144 | 18.8% | 4.3% |
Inception-v4 | 144 | 17.7% | 3.8% |
Inception-ResNet-v2 | 144 | 17.8% | 3.7% |
Inception-ResNet-v2
参数数量约为 5500万,Inception-ResNet-v1/Inception-v4
的参数数量也在该量级。
在Inception v4
结构的主要改动:
修改了 stem
部分。
引入了Inception-A
、Inception-B
、Inception-C
三个模块。这些模块看起来和Inception v3
变体非常相似。
Inception-A/B/C
模块中,输入feature map
和输出feature map
形状相同。而Reduction-A/B
模块中,输出feature map
的宽/高减半、通道数增加。
引入了专用的“缩减块”(reduction block
),它被用于缩减feature map
的宽、高。
早期的版本并没有明确使用缩减块,但是也实现了其功能。
Inception v4
结构如下:(没有标记V
的卷积使用same
填充;标记V
的卷积使用valid
填充)
网络 | k | l | m | n |
---|---|---|---|---|
Inception-v4 | 192 | 224 | 256 | 384 |
Inception-ResNet-v1 | 192 | 192 | 256 | 384 |
Inception-ResNet-v2 | 256 | 256 | 256 | 384 |
Reduction-B
模块:
stem
部分的结构:
Inception-A
模块(这样的模块有4个):
Inception-B
模块(这样的模块有7个):
Inception-C
模块(这样的模块有3个):
Reduction-A
模块:(其中 k,l,m,n 分别表示滤波器的数量)
在Inception-ResNet
中,使用了更廉价的Inception
块:inception
模块的池化运算由残差连接替代。
在
Reduction
模块中能够找到池化运算。
Inception ResNet
有两个版本:v1
和 v2
。
v1
的计算成本和Inception v3
的接近,v2
的计算成本和Inception v4
的接近。
v1
和v2
具有不同的stem
。
两个版本都有相同的模块A、B、C
和缩减块结构,唯一不同在于超参数设置。
Inception-ResNet-v1
结构如下:
stem
部分的结构:
Inception-ResNet-A
模块(这样的模块有5个):
Inception-B
模块(这样的模块有10个):
Inception-C
模块(这样的模块有5个):
Reduction-A
模块:同inception_v4
的 Reduction-A
模块
Reduction-B
模块:
Inception-ResNet-v2
结构与Inception-ResNet-v1
基本相同 :
Inception-ResNet-A
模块(这样的模块有5个):它的结构与Inception-ResNet-v1
的Inception-ResNet-A
相同,只是通道数发生了改变。
Inception-B
模块(这样的模块有10个):它的结构与Inception-ResNet-v1
的Inception-ResNet-B
相同,只是通道数发生了改变。
Inception-C
模块(这样的模块有5个):它的结构与Inception-ResNet-v1
的Inception-ResNet-C
相同,只是通道数发生了改变。
Reduction-A
模块:同inception_v4
的 Reduction-A
模块。
Reduction-B
模块:它的结构与Inception-ResNet-v1
的Reduction-B
相同,只是通道数发生了改变。
stem
部分的结构:同inception_v4
的 stem
部分。Inception-ResNet-v2
使用了inception v4
的 stem
部分,因此后续的通道数量与Inception-ResNet-v1
不同。
如果滤波器数量超过1000,则残差网络开始出现不稳定,同时网络会在训练过程早期出现“死亡”:经过成千上万次迭代之后,在平均池化之前的层开始只生成 0 。
解决方案:在残差模块添加到activation
激活层之前,对其进行缩放能够稳定训练。降低学习率或者增加额外的BN
都无法避免这种状况。
这就是Inception ResNet
中的 Inception-A,Inception-B,Inception-C
为何如此设计的原因。
一个常规的卷积核尝试在三维空间中使用滤波器抽取特征,包括:两个空间维度(宽度和高度)、一个通道维度。因此单个卷积核的任务是:同时映射跨通道的相关性和空间相关性。
Inception
将这个过程明确的分解为一系列独立的相关性的映射:要么考虑跨通道相关性,要么考虑空间相关性。Inception
的做法是:
一个典型的Inception
模块(Inception V3
)如下
可以简化为:
首先通过一组1x1
卷积来查看跨通道的相关性,将输入数据映射到比原始输入空间小的三个或者四个独立空间。
然后通过常规的3x3
或者 5x5
卷积,将所有的相关性(包含了跨通道相关性和空间相关性)映射到这些较小的三维空间中。
Xception
将这一思想发挥到极致:首先使用1x1
卷积来映射跨通道相关性,然后分别映射每个输出通道的空间相关性,从而将跨通道相关性和空间相关性解耦。因此该网络被称作Xception:Extreme Inception
,其中的Inception
块被称作 Xception
块。
Xception
块类似于深度可分离卷积,但是它与深度可分离卷积之间有两个细微的差异:
其中第二个差异更为重要。
操作顺序不同:
深度可分离卷积通常首先执行channel-wise
空间卷积,然后再执行1x1
卷积。
Xception
块首先执行1x1
卷积,然后再进行channel-wise
空间卷积。
第一次卷积操作之后是否存在非线性:
深度可分离卷积只有第二个卷积(1x1
)使用了ReLU
非线性激活函数,channel-wise
空间卷积不使用非线性激活函数。
Xception
块的两个卷积(1x1
和 3x3
)都使用了ReLU
非线性激活函数。
对Xception
进行以下的修改,都可以加快网络收敛速度,并获取更高的准确率:
引入类似ResNet
的残差连接机制。
在1x1
卷积和3x3
卷积之间不加入任何非线性。
Xception
的参数数量与Inception V3
相同,但是性能表现显著优于Inception V3
。这表明Xception
更加高效的利用了模型参数。
模型 | top-1 accuracy | top-5 accuracy |
---|---|---|
VGG-16 | 71.5% | 90.1% |
ResNet-152 | 77.0% | 93.3% |
Inception V3 | 78.2% | 94.1% |
Xception | 79.0% | 94.5% |
根据论文Xception: Deep Learning with Depthwise Separable Convolutions
,Inception V3
参数数量为 23626728,Xception
参数数量为 22855952 。
在ImageNet
上的benchmark
为(单个模型,单次crop
):
ResNet
提出了一种残差学习框架来解决网络退化问题,从而训练更深的网络。这种框架可以结合已有的各种网络结构,充分发挥二者的优势。
ResNet
以三种方式挑战了传统的神经网络架构:
ResNet
通过引入跳跃连接来绕过残差层,这允许数据直接流向任何后续层。
这与传统的、顺序的pipeline
形成鲜明对比:传统的架构中,网络依次处理低级feature
到高级feature
。
ResNet
的层数非常深,高达1202层。而ALexNet
这样的架构,网络层数要小两个量级。
通过实验发现,训练好的 ResNet
中去掉单个层并不会影响其预测性能。而训练好的AlexNet
等网络中,移除层会导致预测性能损失。
在ImageNet
分类数据集中,拥有152层的残差网络,以3.75% top-5
的错误率获得了ILSVRC 2015
分类比赛的冠军。
很多证据表明:残差学习是通用的,不仅可以应用于视觉问题,也可应用于非视觉问题。
学习更深的网络的一个障碍是梯度消失/爆炸,该问题可以通过Batch Normalization
在很大程度上解决。
ResNet
论文作者发现:随着网络的深度的增加,准确率达到饱和之后迅速下降,而这种下降不是由过拟合引起的。这称作网络退化问题。
如果更深的网络训练误差更大,则说明是由于优化算法引起的:越深的网络,求解优化问题越难。如下所示:更深的网络导致更高的训练误差和测试误差。
理论上讲,较深的模型不应该比和它对应的、较浅的模型更差。因为较深的模型是较浅的模型的超空间。较深的模型可以这样得到:先构建较浅的模型,然后添加很多恒等映射的网络层。
实际上我们的较深的模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题表明:通过多个非线性层来近似横等映射可能是困难的。
解决网络退化问题的方案:学习残差。
假设需要学习的是映射 ,残差块使用堆叠的非线性层拟合残差: 。
其中:
和 是块的输入和输出向量。
是要学习的残差映射。因为 ,因此称 F 为残差。
+
:通过快捷连接
逐个元素相加来执行。快捷连接
指的是那些跳过一层或者更多层的连接。
快捷连接简单的执行恒等映射,并将其输出添加到堆叠层的输出。
快捷连接既不增加额外的参数,也不增加计算复杂度。
相加之后通过非线性激活函数,这可以视作对整个残差块添加非线性,即 。
前面给出的残差块隐含了一个假设: 和 的维度相等。如果它们的维度不等,则需要在快捷连接中对 执行线性投影来匹配维度: 。
事实上当它们维度相等时,也可以执行线性变换。但是实践表明:使用恒等映射足以解决退化问题,而使用线性投影会增加参数和计算复杂度。因此 仅在匹配维度时使用。
残差函数 F 的形式是可变的。
如果F 只有一层,则残差块退化线性层: 。此时对网络并没有什么提升。
此时
x
也是一个feature map
,而不再是一个向量。
连接形式可变:不仅可用于全连接层,可也用于卷积层。此时 F 代表多个卷积层的堆叠,而最终的逐元素加法+
在两个feature map
上逐通道进行。
层数可变:论文中的实验包含有两层堆叠、三层堆叠,实际任务中也可以包含更多层的堆叠。
残差学习成功的原因:学习残差 比学习原始映射 要更容易。
当原始映射 H 就是一个恒等映射时,F 就是一个零映射。此时求解器只需要简单的将堆叠的非线性连接的权重推向零即可。
实际任务中原始映射 H 可能不是一个恒等映射:
如果 H 更偏向于恒等映射(而不是更偏向于非恒等映射),则F 就是关于恒等映射的抖动,会更容易学习。
如果原始映射 H 更偏向于零映射,那么学习 H 本身要更容易。但是在实际应用中,零映射非常少见,因为它会导致输出全为0。
如果原始映射 H 是一个非恒等映射,则可以考虑对残差模块使用缩放因子。如Inception-Resnet
中:在残差模块与快捷连接叠加之前,对残差进行缩放。注意:ResNet
作者在随后的论文中指出:不应该对恒等映射进行缩放。因此Inception-Resnet
对残差模块进行缩放。
可以通过观察残差 F 的输出来判断:如果 F 的输出均为0附近的、较小的数,则说明原始映射 H 更偏向于恒等映射;否则,说明原始映射 H 更偏向于非横等映射。
Veit et al.
认为ResNet
工作较好的原因是:一个ResNet
网络可以看做是一组较浅的网络的集成模型。
但是ResNet
的作者认为这个解释是不正确的。因为集成模型要求每个子模型是独立训练的,而这组较浅的网络是共同训练的。
论文《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》
对ResNet
进行了深入的分析。
通过分解视图表明:ResNet
可以被视作许多路径的集合。
通过研究ResNet
的梯度流表明:网络训练期间只有短路径才会产生梯度流,深的路径不是必须的。
通过破坏性实验,表明:
即使这些路径是共同训练的,它们也不是相互依赖的。
这些路径的行为类似集成模型,其预测准确率平滑地与有效路径的数量有关。
考虑从输出 到 的三个ResNet
块构建的网络。根据:
下图中:左图为原始形式,右图为分解视图。分解视图中展示了数据从输入到输出的多条路径。
对于严格顺序的网络(如VGG
),这些网络中的输入总是在单个路径中从第一层直接流到最后一层。如下图所示。
分解视图中, 每条路径可以通过二进制编码向量 来索引:如果流过残差块 ,则 ;如果跳过残差块 ,则 。
因此ResNet
从输入到输出具有 条路径,第 i 个残差块 的输入汇聚了之前的 个残差块的 条路径。
普通的前馈神经网络也可以在单个神经元(而不是网络层)这一粒度上运用分解视图,这也可以将网络分解为不同路径的集合。
它与ResNet
分解的区别是:
普通前馈神经网络的神经元分解视图中,所有路径都具有相同的长度。
ResNet
网络的残差块分解视图中,所有路径具有不同的路径长度。
ResNet
中,从输入到输出存在许多条不同长度的路径。这些路径长度的分布服从二项分布。对于 n 层深的ResNet
,大多数路径的深度为 。
下图为一个 54 个块的ResNet
网络的路径长度的分布 ,其中95%
的路径只包含 19~35个块。
ResNet
中,路径的梯度幅度随着它在反向传播中经过的残差块的数量呈指数减小。因此,训练期间大多数梯度来源于更短的路径。
对于一个包含 54 个残差块的ResNet
网络:
下图表示:单条长度为 k 的路径在反向传播到 input
处的梯度的幅度的均值,它刻画了长度为 k 的单条路径的对于更新的影响。
因为长度为 k 的路径有多条,因此取其平均。
下图表示:长度为 k 的所有路径在反向传播到 input
处的梯度的幅度的和。它刻画了长度为 k 的所有路径对于更新的影响。
它不仅取决于长度为 k 的单条路径的对于更新的影响,还取决于长度为 k 的单条路径的数量。
有效路径:反向传播到 input
处的梯度幅度相对较大的路径。
ResNet
中有效路径相对较浅,而且有效路径数量占比较少。在一个54 个块的ResNet
网络中:
几乎所有的梯度更新都来自于长度为 5~17 的路径。
长度为 5~17 的路径占网络所有路径的 0.45% 。
论文从头开始重新训练ResNet
,同时在训练期间只保留有效路径,确保不使用长路径。实验结果表明:相比于完整模型的 6.10% 的错误率,这里实现了 5.96% 的错误率。二者没有明显的统计学上的差异,这表明确实只需要有效路径。
因此,ResNet
不是让梯度流流通整个网络深度来解决梯度消失问题,而是引入能够在非常深的网络中传输梯度的短路径来避免梯度消失问题。
和ResNet
原理类似,随机深度网络起作用有两个原因:
训练期间,网络看到的路径分布会发生变化,主要是变得更短。
训练期间,每个mini-batch
选择不同的短路径的子集,这会鼓励各路径独立地产生良好的结果。
在ResNet
网络训练完成之后,如果随机丢弃单个残差块,则测试误差基本不变。因为移除一个残差块时,ResNet
中路径的数量从 减少到 ,留下了一半的路径。
在VGG
网络训练完成之后,如果随机丢弃单个块,则测试误差急剧上升,预测结果就跟随机猜测差不多。因为移除一个块时,VGG
中唯一可行的路径被破坏。
删除ResNet
残差块通常会删除长路径。
当删除了 k 个残差块时,长度为 x 的路径的剩余比例由下式给定: 。
下图中:
ResNet
网络中,路径的集合表现出一种类似集成模型的效果。一个关键证据是:它们的整体表现平稳地取决于路径的数量。随着网络删除越来越多的残差块,网络路径的数量降低,测试误差平滑地增加(而不是突变)。
如果在测试时重新排序网络的残差块,这意味着交换了低层映射和高层映射。采用Kendall Tau rank
来衡量网络结构被破坏的程度,结果表明:随着 Kendall Tau rank
的增加,预测错误率也在增加。
plain
网络:一些简单网络结构的叠加,如下图所示。图中给出了四种plain
网络,它们的区别主要是网络深度不同。其中,输入图片尺寸 224x224 。
ResNet
简单的在plain
网络上添加快捷连接来实现。
FLOPs
:floating point operations
的缩写,意思是浮点运算量,用于衡量算法/模型的复杂度。
FLOPS
:floating point per second
的缩写,意思是每秒浮点运算次数,用于衡量计算速度。
相对于输入的feature map
,残差块的输出feature map
尺寸可能会发生变化:
有两种扩充方式:
直接通过 0 来填充需要扩充的维度,在图中以实线标识。
通过1x1
卷积来扩充维度,在图中以虚线标识。
输出 feature map
的尺寸减半。此时需要对快捷连接执行步长为 2 的池化/卷积:如果快捷连接已经采用 1x1
卷积,则该卷积步长为2 ;否则采用步长为 2 的最大池化 。
输出 feature map
的通道数增加,此时需要扩充快捷连接的输出feature map
。否则快捷连接的输出 feature map
无法和残差块的feature map
累加。
计算复杂度:
VGG-19 | 34层 plain 网络 | Resnet-34 | |
---|---|---|---|
计算复杂度(FLOPs) | 19.6 billion | 3.5 billion | 3.6 billion |
模型预测能力:在ImageNet
验证集上执行10-crop
测试的结果。
模型 | top-1 误差率 | top-5 误差率 |
---|---|---|
VGG-16 | 28.07% | 9.33% |
GoogleNet | - | 9.15% |
PReLU-net | 24.27% | 7.38% |
plain-34 | 28.54% | 10.02% |
ResNet-34 A | 25.03% | 7.76% |
ResNet-34 B | 24.52% | 7.46% |
ResNet-34 C | 24.19% | 7.40% |
ResNet-50 | 22.85% | 6.71% |
ResNet-101 | 21.75% | 6.05% |
ResNet-152 | 21.43% | 5.71% |
A
类模型:快捷连接中,所有需要扩充的维度的填充 0 。
B
类模型:快捷连接中,所有需要扩充的维度通过1x1
卷积来扩充。
C
类模型:所有快捷连接都通过1x1
卷积来执行线性变换。
可以看到C
优于B
,B
优于A
。但是 C
引入更多的参数,相对于这种微弱的提升,性价比较低。所以后续的ResNet
均采用 B
类模型。
本文福利
可以在 本公众号后台 回复关键词:“ DS ”获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!
—— 完 ——
文章作者:华校专
责任编辑:周岩 Logic 破茧
审核编辑:阿春
微信编辑:破茧
本文由『运筹OR帷幄』原创发布
如需转载请在公众号后台获取转载须知
原文链接:http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/5_CNN_1_classfication.html
往期精彩回顾
适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码: