LeNet
1998年
LeCun
推出了LeNet
网络,它是第一个广为流传的卷积神经网络。LeNet
网络包含了卷积层、池化层、全连接层,这些都是现代CNN
网络的基本组件。输入层:二维图像,尺寸为
32x32
。C1、C3、C5
层:二维卷积层。其中
C5
将输入的feature map
(尺寸16@5x5
)转化为尺寸为120x1x1
的feature map
,然后转换为长度为120
的一维向量。这是一种常见的、将卷积层的输出转换为全连接层的输入的一种方法。
S2、S4
层:池化层。使用sigmoid
函数作为激活函数。后续的
CNN
都使用ReLU
作为激活函数。F6
层:全连接层。输出层:由欧式径向基函数单元组成。
后续的
CNN
使用softmax
输出单元。下表中,
@
分隔了通道数量和feature map
的宽、高。网络层 核/池大小 核数量 步长 输入尺寸 输出尺寸 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
AlexNet
2012年Hinton
和他的学生推出了AlexNet
。在当年的ImageNet
图像分类竞赛中,AlexeNet
以远超第二名的成绩夺冠,使得深度学习重回历史舞台,具有重大历史意义。
网络结构
AlexNet
有5个广义卷积层和3个广义全连接层。- 广义的卷积层:包含了卷积层、池化层、
ReLU
、LRN
层等。 - 广义全连接层:包含了全连接层、
ReLU
、Dropout
层等。
- 广义的卷积层:包含了卷积层、池化层、
网络结构如下表所示:
输入层会将
3@224x224
的三维图片预处理变成3@227x227
的三维图片。第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本
GPU
内的通道数据进行计算。第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算。
第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用
same
填充。当卷积的步长为1,核大小为
3x3
时,如果不填充0,则feature map
的宽/高都会缩减 2 。因此这里填充0,使得输出feature map
的宽/高保持不变。其它层的卷积,以及所有的池化都是
valid
填充(即:不填充 0 )。第六层广义连接层的卷积之后,会将
feature map
展平为长度为 4096 的一维向量。
编号 网络层 子层 核/池大小 核数量 步长 激活函数 输入尺寸 输出尺寸 第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 网络参数数量:总计约 6237万。
输出
Tensor size
采用channel last
风格描述。即227x227x3
等价于前文的3@227x227
。第6层广义连接层的卷积的参数数量最多,约3770万,占整体六千万参数的 60%。
原因是该子层的卷积核较大、输入通道数量较大、输出通道数量太多。该卷积需要的参数数量为:
。
编号 网络层 子层 输出 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
设计技巧
AlexNet
成功的主要原因在于:
- 使用
ReLU
激活函数。 - 使用
dropout
、数据集增强 、重叠池化等防止过拟合的方法。 - 使用百万级的大数据集来训练。
- 使用
GPU
训练,以及的LRN
使用。 - 使用带动量的
mini batch
随机梯度下降来训练。
数据集增强
局部响应规范化
多GPU 训练
AlexNet
使用两个GPU
训练。网络结构图由上、下两部分组成:一个GPU
运行图上方的通道数据,一个GPU
运行图下方的通道数据,两个GPU
只在特定的网络层通信。即:执行分组卷积。
- 第二、四、五层卷积层的核只和同一个
GPU
上的前一层的feature map
相连。 - 第三层卷积层的核和前一层所有
GPU
的feature map
相连。 - 全连接层中的神经元和前一层中的所有神经元相连。
重叠池化
一般的池化是不重叠的,池化区域的大小与步长相同。
Alexnet
中,池化是可重叠的,即:步长小于池化区域的大小。重叠池化可以缓解过拟合,该策略贡献了
0.4%
的错误率。为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。
优化算法
VGG-Net
VGG-Net
是牛津大学计算机视觉组和DeepMind
公司共同研发一种深度卷积网络,并且在2014年在ILSVRC
比赛上获得了分类项目的第二名和定位项目的第一名。VGG-Net
的主要贡献是:- 证明了小尺寸卷积核(
3x3
)的深层网络要优于大尺寸卷积核的浅层网络。 - 证明了深度对网络的泛化性能的重要性。
- 验证了尺寸抖动
scale jittering
这一数据增强技术的有效性。
- 证明了小尺寸卷积核(
VGG-Net
最大的问题在于参数数量,VGG-19
基本上是参数数量最多的卷积网络架构。
网络结构
通用结构:
输入层:固定大小的
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
设计技巧
Inception
Inception
网络是卷积神经网络的一个重要里程碑。在Inception
之前,大部分流行的卷积神经网络仅仅是把卷积层堆叠得越来越多,使得网络越来越深。这使得网络越来越复杂,参数越来越多,从而导致网络容易出现过拟合,增加计算量。而
Inception
网络考虑的是多种卷积核的并行计算,扩展了网络的宽度。Inception Net
核心思想是:稀疏连接。因为生物神经连接是稀疏的。Inception
网络的最大特点是大量使用了Inception
模块。
Inception v1
网络结构
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 模块
原始的
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
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 v3
虽然Inception v1
的参数较少,但是它的结构比较复杂,难以进行修改。原因有以下两点:
- 如果单纯的放大网络(如增加
Inception
模块的数量、扩展Inception
模块的大小),则参数的数量会显著增长,计算代价太大。 Inception v1
结构中的各种设计,其对最终结果的贡献尚未明确。
因此Inception v3
的论文重点探讨了网络结构设计的原则。
网络结构
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
瓶颈:representation
的大小应该从输入到输出缓缓减小,避免极端压缩。在缩小feature map
尺寸的同时,应该增加feature map
的通道数。representation
大小通常指的是feature map
的容量,即feature map
的width x height x channel
。空间聚合:可以通过空间聚合来完成低维嵌入,而不会在表达能力上有较大的损失。因此通常在
nxn
卷积之前,先利用1x1
卷积来降低输入维度。猜测的原因是:空间维度之间的强相关性导致了空间聚合过程中的信息丢失较少。
平衡网络的宽度和深度:增加网络的宽度或者深度都可以提高网络的泛化能力,因此计算资源需要在网络的深度和宽度之间取得平衡。
卷积尺寸分解
大卷积核的分解:将大卷积核分解为多个小的卷积核。
如:使用2个
3x3
卷积替换5x5
卷积,则其参数数量大约是1个5x5
卷积的 72% 。nxn
卷积核的非对称分解:将nxn
卷积替换为1xn
卷积和nx1
卷积。- 这种非对称分解的参数数量是原始卷积数量的 。随着
n
的增加,计算成本的节省非常显著。 - 论文指出:对于较大的
feature map
,这种分解不能很好的工作;但是对于中等大小的feature map
(尺寸在12~20
之间),这种分解效果非常好。
- 这种非对称分解的参数数量是原始卷积数量的 。随着
网格尺寸缩减
标签平滑正则化
Inception v4 & Inception - ResNet
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
在
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
填充)stem
部分的结构:Inception-A
模块(这样的模块有4个):Inception-B
模块(这样的模块有7个):Inception-C
模块(这样的模块有3个):Reduction-A
模块:(其中 分别表示滤波器的数量)网络 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
模块:
Inception-ResNet
在
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
基本相同 :stem
部分的结构:同inception_v4
的stem
部分。Inception-ResNet-v2
使用了inception v4
的stem
部分,因此后续的通道数量与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
相同,只是通道数发生了改变。
如果滤波器数量超过1000,则残差网络开始出现不稳定,同时网络会在训练过程早期出现“死亡”:经过成千上万次迭代之后,在平均池化之前的层开始只生成 0 。
解决方案:在残差模块添加到
activation
激活层之前,对其进行缩放能够稳定训练。降低学习率或者增加额外的BN
都无法避免这种状况。这就是
Inception ResNet
中的Inception-A,Inception-B,Inception-C
为何如此设计的原因。- 将
Inception-A,Inception-B,Inception-C
放置在两个Relu activation
之间。 - 通过线性的
1x1 Conv
(不带激活函数)来执行对残差的线性缩放。
- 将
Xception
一个常规的卷积核尝试在三维空间中使用滤波器抽取特征,包括:两个空间维度(宽度和高度)、一个通道维度。因此单个卷积核的任务是:同时映射跨通道的相关性和空间相关性。
Inception
将这个过程明确的分解为一系列独立的相关性的映射:要么考虑跨通道相关性,要么考虑空间相关性。Inception
的做法是:- 首先通过一组
1x1
卷积来查看跨通道的相关性,将输入数据映射到比原始输入空间小的三个或者四个独立空间。 - 然后通过常规的
3x3
或者5x5
卷积,将所有的相关性(包含了跨通道相关性和空间相关性)映射到这些较小的三维空间中。
一个典型的
Inception
模块(Inception V3
)如下:可以简化为:
- 首先通过一组
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
更加高效的利用了模型参数。根据论文
Xception: Deep Learning with Depthwise Separable Convolutions
,Inception V3
参数数量为 23626728,Xception
参数数量为 22855952 。在
ImageNet
上的benchmark
为(单个模型,单次crop
):模型 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%
ResNet
ResNet
提出了一种残差学习框架来解决网络退化问题,从而训练更深的网络。这种框架可以结合已有的各种网络结构,充分发挥二者的优势。ResNet
以三种方式挑战了传统的神经网络架构:ResNet
通过引入跳跃连接来绕过残差层,这允许数据直接流向任何后续层。这与传统的、顺序的
pipeline
形成鲜明对比:传统的架构中,网络依次处理低级feature
到高级feature
。ResNet
的层数非常深,高达1202层。而ALexNet
这样的架构,网络层数要小两个量级。通过实验发现,训练好的
ResNet
中去掉单个层并不会影响其预测性能。而训练好的AlexNet
等网络中,移除层会导致预测性能损失。
在
ImageNet
分类数据集中,拥有152层的残差网络,以3.75% top-5
的错误率获得了ILSVRC 2015
分类比赛的冠军。很多证据表明:残差学习是通用的,不仅可以应用于视觉问题,也可应用于非视觉问题。
网络退化问题
学习更深的网络的一个障碍是梯度消失/爆炸,该问题可以通过
Batch Normalization
在很大程度上解决。ResNet
论文作者发现:随着网络的深度的增加,准确率达到饱和之后迅速下降,而这种下降不是由过拟合引起的。这称作网络退化问题。如果更深的网络训练误差更大,则说明是由于优化算法引起的:越深的网络,求解优化问题越难。如下所示:更深的网络导致更高的训练误差和测试误差。
理论上讲,较深的模型不应该比和它对应的、较浅的模型更差。因为较深的模型是较浅的模型的超空间。较深的模型可以这样得到:先构建较浅的模型,然后添加很多恒等映射的网络层。
实际上我们的较深的模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题表明:通过多个非线性层来近似横等映射可能是困难的。
解决网络退化问题的方案:学习残差。
残差块
ResNet 分析
Veit et al.
认为ResNet
工作较好的原因是:一个ResNet
网络可以看做是一组较浅的网络的集成模型。但是
ResNet
的作者认为这个解释是不正确的。因为集成模型要求每个子模型是独立训练的,而这组较浅的网络是共同训练的。论文
《Residual Networks Bahave Like Ensemble of Relatively Shallow Networks》
对ResNet
进行了深入的分析。- 通过分解视图表明:
ResNet
可以被视作许多路径的集合。 - 通过研究
ResNet
的梯度流表明:网络训练期间只有短路径才会产生梯度流,深的路径不是必须的。 - 通过破坏性实验,表明:
- 即使这些路径是共同训练的,它们也不是相互依赖的。
- 这些路径的行为类似集成模型,其预测准确率平滑地与有效路径的数量有关。
- 通过分解视图表明:
分解视图
路径长度分析
路径梯度分析
路径破坏性分析
网络性能
plain
网络:一些简单网络结构的叠加,如下图所示。图中给出了四种plain
网络,它们的区别主要是网络深度不同。其中,输入图片尺寸 224x224 。ResNet
简单的在plain
网络上添加快捷连接来实现。FLOPs
:floating point operations
的缩写,意思是浮点运算量,用于衡量算法/模型的复杂度。FLOPS
:floating point per second
的缩写,意思是每秒浮点运算次数,用于衡量计算速度。相对于输入的
feature map
,残差块的输出feature map
尺寸可能会发生变化:输出
feature map
的通道数增加,此时需要扩充快捷连接的输出feature map
。否则快捷连接的输出feature map
无法和残差块的feature map
累加。有两种扩充方式:
- 直接通过 0 来填充需要扩充的维度,在图中以实线标识。
- 通过
1x1
卷积来扩充维度,在图中以虚线标识。
输出
feature map
的尺寸减半。此时需要对快捷连接执行步长为 2 的池化/卷积:如果快捷连接已经采用1x1
卷积,则该卷积步长为2 ;否则采用步长为 2 的最大池化 。
计算复杂度:
VGG-19 34层 plain 网络 Resnet-34 计算复杂度(FLOPs) 19.6 billion 3.5 billion 3.6 billion 模型预测能力:在
ImageNet
验证集上执行10-crop
测试的结果。A
类模型:快捷连接中,所有需要扩充的维度的填充 0 。B
类模型:快捷连接中,所有需要扩充的维度通过1x1
卷积来扩充。C
类模型:所有快捷连接都通过1x1
卷积来执行线性变换。
可以看到
C
优于B
,B
优于A
。但是C
引入更多的参数,相对于这种微弱的提升,性价比较低。所以后续的ResNet
均采用B
类模型。模型 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%
ResNet 变种
恒等映射修正
在论文《Identity Mappings in Deep Residual Networks》
中,ResNet
的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。
新残差块
- 新的残差单元中,恒等映射添加到
ReLU
激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。
快捷连接验证
激活函数验证
网络性能
在 ILSVRC 2012
验证集上的评估结果:
方法 | 数据集增强 | train crop | test crop | top-1 误差 | top-5 误差 |
---|---|---|---|---|---|
ResNet-152,原始残差块 | scale | 224x224 | 224x224 | 23.0% | 6.7% |
ResNet-152,原始残差块 | scale | 224x224 | 320x320 | 21.3% | 5.5% |
ResNet-152,full pre-activation | scale | 224x224 | 320x320 | 21.1% | 5.5% |
ResNet-200,原始残差块 | scale | 224x224 | 320x320 | 21.8% | 6.0% |
ResNet-200,full pre-activation | scale | 224x224 | 320x320 | 20.7% | 5.3% |
ResNet-200,full pre-activation | scale + asp ratio | 224x224 | 320x320 | 20.1% | 4.8% |
Inception v3 | scale + asp ratio | 299x299 | 299x299 | 21.2% | 5.6% |
ResNeXt
通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。
ResNeXt
网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。ResNeXt
的设计参考了VGG
和Inception
的设计哲学。VGG
:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。Inception
:通过执行分裂-变换-合并
策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并
行为预期能够达到一个大的dense
层的表达能力,但是计算复杂度要低的多。其缺点是:
- 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
- 一旦需要训练新的任务(如新任务是一个
NLP
任务),可能需要重新设计网络结构。因此可扩展性不高。
ResNeXt
结合了二者的优点:- 网络结构也是通过简单地层叠相同结构的层来实现。
- 网络的每一层都执行了
分裂-变换-合并
策略。
在相同的参数数量和计算复杂度的情况下,
ResNeXt
的预测性能要优于ResNet
。- 它在
ILSVRC 2016
分类任务中取得了第二名的成绩。 101
层的ResNeXt
就能够获得超过200
层ResNet
的准确率,并且计算量只有后者的一半。
- 它在
ResNeXt
改进了ResNet
网络结构,并提出了一个新的维度,称作“基数”cardinality
。基数是网络的深度和网络的宽度之外的另一个重要因素。作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。
分裂-变换-合并
ResNeXt 块
通常ResNeXt
模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。
- 此时并没有通过
1x1
卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。 - 如下图所示,它等价于图
(c)
中,去掉中间的变换层(128,3x3,128
层),同时将第一层、第三层的1x1
替换为3x3
卷积层。
网络性能
ResNeXt
的两种重要超参数是:基数C
和颈宽d
。- 基数
C
:决定了每个ResNeXt
模块有多少条路径。 - 颈宽(
bottleneck width
)d
:决定了ResNeXt
模块中第一层1x1
卷积降维的维度。
这二者也决定了
ResNeXt
模块等价形式中,通道分组卷积的通道数量为Cxd
。- 基数
ResNeXt
的网络参数和计算量与同等结构的ResNet
几乎相同。以ResNet-50
为例(输入图片尺寸224x224
):ResNeXt-50(32x4d)
意思是:基数C=32
,颈宽d=4
。在
ImageNet
上进行的对比实验(验证集误差,single crop
):基数 vs 颈宽:基数越大越好。
模型 配置 top-1 error(%) ResNet-50 C=1,d=64 23.9 ResNeXt-50 C=2,d=40 23.0 ResNeXt-50 C=4,d=24 22.6 ResNeXt-50 C=8,d=14 22.3 ResNeXt-50 C=32,d=4 22.2 ResNet-101 C=1,d=64 22.0 ResNeXt-101 C=2,d=40 21.7 ResNeXt-101 C=4,d=24 21.4 ResNeXt-101 C=8,d=14 21.3 ResNeXt-101 C=32,d=4 21.2 基数 vs 深度/宽度:基数越大越好。
与其它模型的预测能力比较(验证集误差,
single crop
):ResNet/ResNeXt
的图片尺寸为224x224
和320x320
;Inception
的图片尺寸为299x299
。
随机深度网络
随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。
如图所示:在
CIFAR-10
上,1202
层的ResNet
测试误差要高于110
层的ResNet
,表现出明显的过拟合。而1202
层的随机深度网络(结合了ResNet
)的测试误差要低于110
层的ResNet
。神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的
feature
消失、训练时间过长。虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。
随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:
在网络训练期间,对每个
mini batch
随机地移除部分层来显著的减小网络的深度。移除操作:删除对应的层,并用跳跃连接来代替。
在网络测试期间,使用全部的网络层。
随机深度的思想可以和
ResNet
结合。因为ResNet
已经包含了跳跃连接,因此可以直接修改。
随机深度
网络性能
SENet
SENet
提出了一种新的架构单元来解决通道之间相互依赖的问题。它通过显式地对通道之间的相互依赖关系建模,自适应的重新校准通道维的特征响应,从而提高了网络的表达能力。SENet
以2.251% top-5
的错误率获得了ILSVRC 2017
分类比赛的冠军。SENet
是和ResNet
一样,都是一种网络框架。它可以直接与其他网络架构一起融合使用,只需要付出微小的计算成本就可以产生显著的性能提升。
SE 块
squeeze 操作
excitation 操作
SE 块使用
网络性能
网络结构:其中
fc,[16,256]
表示SE
块中的两个全连接层的输出维度。在
ImageNet
验证集上的计算复杂度和预测误差比较(single-crop
)。original
列:从各自原始论文中给出的结果报告。re-implementation
列:重新训练得到的结果报告。SENet
列:通过引入SE
块之后的结果报告。GFLOPs/MFLOPs
:计算复杂度,单位为G/M FLOPs
。MobileNet
采用的是1.0 MobileNet-224
,ShuffleNet
采用的是1.0 ShuffleNet 1x(g=3)
。- 数据集增强和归一化:
- 随机裁剪成
224x224
大小(Inception
系列裁剪成299x299
)。 - 随机水平翻转。
- 输入图片沿着通道归一化:每个像素减去本通道的像素均值。
- 随机裁剪成
在
ImageNet
验证集上的预测误差比较(single-crop
):其中
SENet-154(post-challenge)
是采用320x320
大小的图片来训练的。
DenseNet
DenseNet
不是通过更深或者更宽的结构,而是通过特征重用来提升网络的学习能力。ResNet
的思想是:创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet
做得更为彻底:将所有层以前馈的形式相连,这种网络因此称作DenseNet
。DenseNet
具有以下的优点:- 缓解梯度消失的问题。因为每层都可以直接从损失函数中获取梯度、从原始输入中获取信息,从而易于训练。
- 密集连接还具有正则化的效应,缓解了小训练集任务的过拟合。
- 鼓励特征重用。网络将不同层学到的
feature map
进行组合。 - 大幅度减少参数数量。因为每层的卷积核尺寸都比较小,输出通道数较少 (由增长率 k 决定)。
DenseNet
具有比传统卷积网络更少的参数,因为它不需要重新学习多余的feature map
。传统的前馈神经网络可以视作在层与层之间传递
状态
的算法,每一层接收前一层的状态
,然后将新的状态
传递给下一层。这会改变
状态
,但是也传递了需要保留的信息。ResNet
通过恒等映射来直接传递需要保留的信息,因此层之间只需要传递状态的变化
。DenseNet
会将所有层的状态
全部保存到集体知识
中,同时每一层增加很少数量的feture map
到网络的集体知识中
。
DenseNet
的层很窄(即:feature map
的通道数很小),如:每一层的输出只有 12 个通道。
DenseNet 块
增长率
非线性变换 H_l
bottleneck
过渡层
网络性能
内存优化
内存消耗
内存优化
优化结果
小型网络
目前神经网络领域的研究基本可以概括为两个方向:探索模型更好的预测能力,关注模型在实际应用中的难点。
事实上卷积神经网络在图像识别领域超越了人类的表现,但是这些先进的网络需要较高的计算资源。这些资源需求超出了很多移动设备和嵌入式设备的能力(如:无人驾驶),导致实际应用中难以在这些设备上应用。
小型网络就是为解决这个难点来设计的。
小型网络的设计和优化目标并不是模型的准确率,而是在满足一定准确率的条件下,尽可能的使得模型小,从而降低对计算资源的需求,降低计算延迟。
小型高效的神经网络的构建方法大致可以归为两类:对已经训练好的网络进行压缩,直接训练小网络模型。
模型参数的数量决定了模型的大小,所谓的
小型网络
指的是网络的参数数量较少。小型网络具有至少以下三个优势:
较小的模型具有更高效的分布式训练效率。
Worker
与PS
以及Worker
与Worker
之间的通信是神经网络分布式训练的重要限制因素。在分布式数据并行训练中,通信开销与模型的参数数量成正比。较小的模型需要更少的通信,从而可以更快的训练。较小的模型在模型导出时开销更低。
当在
tensorflow
等框架中训练好模型并准备部署时,需要将模型导出。如:将训练好的模型导出到自动驾驶汽车上。模型越小,则数据导出需要传输的数据量越少,这样可以支持更频繁的模型更新。较小的模型可以在
FPGA
和嵌入式硬件上部署。FPGA
通常只有小于10MB
的片上内存,并且没有外部存储。因此如果希望在FPGA
上部署模型,则要求模型足够小从而满足内存限制。
SqueezeNet 系列
SqueezeNet
squeezenet
提出了Fire
模块,并通过该模型构成一种小型CNN
网络,在满足AlexNet
级别准确率的条件下大幅度降低参数数量。CNN
结构设计三个主要策略:策略 1:部分的使用
1x1
卷积替换3x3
卷积。因为1x1
卷积的参数数量比3x3
卷积的参数数量少了9
倍。策略 2:减少
3x3
卷积输入通道的数量。这会进一步降低网络的参数数量。策略 3:将网络中下采样的时机推迟到网络的后面。这会使得网络整体具有尺寸较大的
feature map
。其直觉是:在其它不变的情况下,尺寸大的
feature map
具有更高的分类准确率。
策略
1、2
是关于在尽可能保持模型准确率的条件下减少模型的参数数量,策略3
是关于在有限的参数数量下最大化准确率。
Fire 模块
网络性能
- 网络设计:
SqueezeNet
从一个独立的卷积层(conv1
)开始,后跟 8 个Fire
模块(fire2~9
),最后连接卷积层conv10
、全局平均池化层、softmax
输出层。- 从网络开始到末尾,每个
Fire
模块的输出通道数逐渐增加。 - 在
conv1、fire4、fire8
之后执行最大池化,步长为2。这种相对较晚的执行池化操作是采用了策略3。 - 在
expand
层中的3x3
执行的是same
卷积,即:在原始输入上下左右各添加一个像素,使得输出的feature map
尺寸不变。 - 在
fire9
之后使用Dropout
,遗忘比例为 0.5 。
- 模型性能:
- 网络压缩方法列:给出了网络裁剪方法,包括
SVD(Denton et al. 2014)
、Network pruning (Han et al. 2015b)
、Deep compression (Han et al. 2015a)
。 - 数据类型列:给出了计算精度。
- 模型压缩比例列:给出了模型相对于原始
AlexNet
的模型大小压缩的比例。 top-1 Accuracy/top-5 Accuracy
列:给出了模型在ImageNet
测试集上的评估结果。
可以看到,SqueezeNet
在满足同样准确率的情况下,模型大小比AlexNet
压缩了 50 倍。如果使用 Deep Compression
以及 6 bit
精度的情况下,模型大小比AlexNet
压缩了 510 倍。
CNN 网络结构 | 网络压缩方法 | 数据类型 | 模型大小 | 模型压缩比例 | top-1 Accuracy | top-5 Accuracy |
---|---|---|---|---|---|---|
AlexNet | None | 32 bit | 240 MB | 1x | 57.2% | 80.3% |
AlexNet | SVD | 32 bit | 48 MB | 5x | 56.0% | 79.4% |
AlexNet | Network Pruning | 32 bit | 27 MB | 9x | 57.2% | 80.3% |
AlexNet | Deep Compression | 5-8 bit | 6.9 MB | 35x | 57.2% | 80.3% |
SqueezeNet | None | 32 bit | 4.8 MB | 50x | 57.5% | 80.3% |
SqueezeNet | Deep Compression | 8 bit | 0.66 MB | 363x | 57.5% | 80.3% |
SqueezeNet | Deep Compression | 6 bit | 0.47 MB | 510x | 57.5% | 80.3% |
它们在ImageNet
测试集上的表现:
模型结构 | top-1 准确率 | top-5 准确率 | model size |
---|---|---|---|
SqueezeNet | 57.5% | 80.3% | 4.8MB |
SqueezeNet + 简单旁路连接 | 60.4% | 82.5% | 4.8MB |
SqueezeNet + 复杂旁路连接 | 58.8% | 82.0% | 7.7MB |
因此添加简单旁路连接能够提升模型的准确率,还能保持模型的大小不变。
SqueezeNext
现有的神经网络在嵌入式系统上部署的主要挑战之一是内存和功耗,SqueezeNext
针对内存和功耗进行优化,是为功耗和内存有限的嵌入式设备设计的神经网络。
SqueezeNext Block
SqueezeNext
块是在Fire
块的基础进行修改:- 将
expand
层的3x3
卷积替换为1x3 + 3x1
卷积,同时移除了expand
层的拼接1x1
卷积、添加了1x1
卷积来恢复通道数。 - 通过两阶段的
squeeze
得到更激进的通道缩减,每个阶段的squeeze
都将通道数减半。
- 将
SqueezeNext
块也采用类似ResNet
的旁路连接,从而可以训练更深的网络。下图中,左图为
ResNet
块,中图为SqueezeNet
的Fire
块,右图为SqueezeNext
块。
网络性能
网络结构:如下为一个23层的
SqueezeNext
网络(记做SqueezeNext-23
)。- 相同颜色的
SqueezeNext
块具有相同的输入feature map
尺寸和通道数。 - 该网络结构描述为
[6,6,8,1]
,意思是:在第一个conv/pooling
层之后有四组SqueezeNext
块,每组SqueezeNext
分别有6个、6个、8个、1个SqueezeNext
块。 - 在全连接层之前插入一个
1x1
卷积层来降低全连接层的输入通道数,从而大幅降低全连接层的参数数量。
23层
SqueezeNext
网络的另一种结构(记做SqueezeNext-23v5
):结构描述为[2,4,14,1]
。- 相同颜色的
SqueezeNext
网络在ImageNet
上的预测准确率:- 参数降低倍数是相对于
AlexNet
网络的参数而言。 G-SqueezeNext-23
是SqueezeNext-23
采用分组卷积的版本。
模型 top-1 准确率 top-5 准确率 参数数量(百万) 参数降低倍数 AlexNet 57.10% 80.30% 60.9 1x SqueezeNet 57.50% 80.30% 1.2 51x SqueezeNext-23 59.05% 82.60% 0.72 84x G-SqueezeNext-23 57.16% 80.23% 0.54 112x SqueezeNext-34 61.39% 84.31% 1.0 61x SqueezeNext-44 62.64% 85.15% 1.2 51x - 参数降低倍数是相对于
更宽和更深版本的
SqueezeNext
网络在ImageNet
上的预测准确率:1.5/2.0
分别表示将网络拓宽1.5/2
倍。拓宽指的增加网络的feature map
的通道数,做法是增加第一个conv
的输出通道数。- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
模型 top-1 准确率 top-5 准确率 参数数量(百万) 1.5-SqueezeNext-23 63.52% 85.66% 1.4 1.5-SqueezeNext-34 66.00% 87.40% 2.1 1.5-SqueezeNext-44 67.28% 88.15% 2.6 VGG-19 68.50% 88.50% 138 2.0-SqueezeNext-23 67.18% 88.17% 2.4 2.0-SqueezeNext-34 68.46% 88.78% 3.8 2.0-SqueezeNext-44 69.59% 89.53% 4.4 MobileNet 67.50%(70.9%) 86.59%(89.9%) 4.2 2.0-SqueezeNext-23v5 67.44%(69.8%) 88.20%(89.5%) 3.2 硬件仿真结果:
- 括号中的准确率是采用了数据集增强和超参数优化之后的最佳结果。
Time
表示模型的推断时间(相对耗时),Energy
表示模型的推断功耗。8x8,32KB
和16x16,128KB
表示仿真硬件的配置:NxN
表示硬件具有NxN
个PE
阵列。processing element:PE
是单个计算单元。32KB/128KB
表示全局缓存。
深度可分离卷积的计算密集性较差,因为其
计算/带宽
比例较低,所以在某些移动设备上表现较差。一个可分离卷积的计算需要多次
IO
和计算才能完成,相比而言普通卷积只需要一次IO
和计算。
MobileNet 系列
MobileNet
MobileNet
应用了Depthwise
深度可分离卷积来代替常规卷积,从而降低计算量,减少模型参数。MobileNet
不仅产生了小型网络,还重点优化了预测延迟。与之相比,有一些小型网络虽然网络参数较少,但是预测延迟较大
深度可分离卷积
网络结构
MobileNeet
网络结构如下表所示。其中:Conv
表示标准卷积,Conv dw
表示深度可分离卷积。- 所有层之后都跟随
BN
和ReLU
(除了最后的全连接层,该层的输出直接送入到softmax
层进行分类)。
MobileNet
大量的参数和计算量都被消耗在1x1
卷积上:Conv 1x1
包含了所有的1x1
卷积层,包括可分离卷积中的1x1
卷积。Conv DW 3x3
仅包括可分离卷积中的3x3
卷积。
层类型 乘-加运算 参数数量 Conv 1x1 94.86% 74.59% Conv DW 3x3 3.06% 1.06% Conv 3x3 1.19% 0.02% 全连接层 0.18% 24.33% 与训练大模型相反,训练
MobileNet
时较少的采用正则化和数据集增强技术,因为MobileNet
是小模型,而小模型不容易过拟合。论文特别提到:在
depthwise
滤波器上使用很少或者不使用L2
正则化,因为它们的参数很少。
宽度乘子 & 分辨率乘子
网络性能
MobileNet V2
MobileNet V2
创新性的提出了具有线性bottleneck
的Inverted
残差块。
这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的内存需求。
线性bottleneck
bottleneck block
bottleneck block
:输入feature map
首先经过线性bottleneck
来扩张通道数,然后经过深度可分离卷积,最后通过线性bottleneck
来缩小通道数。输入
bootleneck
输出通道数与输入通道数的比例称作膨胀比。- 通常较小的网络使用略小的膨胀比效果更好,较大的网络使用略大的膨胀比效果更好。
- 如果膨胀比小于 1 ,这就是一个典型的
resnet
残差块。
可以在
bottleneck block
中引入旁路连接,这种bottleneck block
称作Inverted
残差块,其结构类似ResNet
残差块。在
ResNeXt
残差块中,首先对输入feature map
执行1x1
卷积来压缩通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入
feature map
通道数先压缩、后扩张的过程。在
Inverted
残差块中,首先对输入feature map
执行1x1
卷积来扩张通道数,最后通过1x1
卷积来恢复通道数。这对应了一个输入
feature map
通道数先扩张、后压缩的过程。这也是Inverted
残差块取名为Inverted
的原因。
当深度可分离卷积的步长为
1
时,bottleneck block
包含了旁路连接。当深度可分离卷积的步长不为
1
时,bottleneck block
不包含旁路连接。这是因为:输入feature map
的尺寸与块输出feature map
的尺寸不相同,二者无法简单拼接。虽然可以将旁路连接通过一个同样步长的池化层来解决,但是根据
ResNet
的研究,破坏旁路连接会引起网络性能的下降。事实上旁路连接有两个插入的位置:在两个
1x1
卷积的前后,或者在两个Dwise
卷积的前后。通过实验证明:在两个
1x1
卷积的前后使用旁路连接的效果最好。在Imagenet
测试集上的表现如下图:bottleneck block
可以看作是对信息的两阶段处理过程:- 阶段一:对输入
feature map
进行降维,这一部分代表了信息的容量。 - 阶段二:对信息进行非线性处理,这一部分代表了信息的表达。
在
MobileNet v2
中这二者是独立的,而传统网络中这二者是相互纠缠的。- 阶段一:对输入
网络性能
MobileNet V2
的设计基于MobileNet v1
,其结构如下:- 每一行代表一个或者一组相同结构的层,层的数量由 给定。
- 相同结构指的是:
- 同一行内的层的类型相同,由
Operator
指定。其中bottleneck
指的是bottleneck block
。 - 同一行内的层的膨胀比相同,由
t
指定。 - 同一行内的层的输出通道数相同,由
c
指定。 - 同一行内的层:第一层采用步幅
s
,其它层采用步幅1
。
- 同一行内的层的类型相同,由
- 采用
ReLU6
激活函数,因为它在低精度浮点运算的环境下表现较好。 - 训练过程中采用
dropout
和BN
。
与
MobileNet V1
类似,MobileNet V2
也可以引入宽度乘子、分辨率乘子这两个超参数。网络推断期间最大内存需求(
通道数/内存消耗(Kb)
):采用 16 bit 的浮点运算。网络在
ImageNet
测试集上的表现:- 最后一列给出了预测单张图片的推断时间。
网络 Top 1 Params(百万) 乘-加 数量(百万) CPU MobileNet V1 70.6 4.2 575 113ms ShuffleNet (1.5) 71.5 3.4 292 - ShuffleNet (x2) 73.7 5.4 524 - NasNet-A 74.0 5.3 564 183ms MobileNet V2 72.0 3.4 300 75ms MobileNet V2(1.4) 74.7 6.9 585 143ms
ShuffleNet 系列
ShuffleNet
ShuffleNet
提出了 1x1分组卷积+通道混洗
的策略,在保证准确率的同时大幅降低计算成本。
ShuffleNet
专为计算能力有限的设备(如:10~150MFLOPs
)设计。在基于ARM
的移动设备上,ShuffleNet
与AlexNet
相比,在保持相当的准确率的同时,大约 13 倍的加速。
ShuffleNet block
在
Xception
和ResNeXt
中,有大量的1x1
卷积,所以整体而言1x1
卷积的计算开销较大。如ResNeXt
的每个残差块中,1x1
卷积占据了乘-加
运算的 93.4% (基数为32时)。在小型网络中,为了满足计算性能的约束(因为计算资源不够)需要控制计算量。虽然限制通道数量可以降低计算量,但这也可能会严重降低准确率。
解决办法是:对
1x1
卷积应用分组卷积,将每个1x1
卷积仅仅在相应的通道分组上操作,这样就可以降低每个1x1
卷积的计算代价。1x1
卷积仅在相应的通道分组上操作会带来一个副作用:每个通道的输出仅仅与该通道所在分组的输入(一般占总输入的比例较小)有关,与其它分组的输入(一般占总输入的比例较大)无关。这会阻止通道之间的信息流动,降低网络的表达能力。解决办法是:采用通道混洗,允许分组卷积从不同分组中获取输入。
- 如下图所示:
(a)
表示没有通道混洗的分组卷积;(b)
表示进行通道混洗的分组卷积;(c)
为(b)
的等效表示。 - 由于通道混洗是可微的,因此它可以嵌入到网络中以进行端到端的训练。
- 如下图所示:
ShuffleNet
块的结构从ResNeXt
块改进而来:下图中(a)
是一个ResNeXt
块,(b)
是一个ShuffleNet
块,(c)
是一个步长为2
的ShuffleNet
块。在
ShuffleNet
块中:第一个
1x1
卷积替换为1x1
分组卷积+通道随机混洗。第二个
1x1
卷积替换为1x1
分组卷积,但是并没有附加通道随机混洗。这是为了简单起见,因为不附加通道随机混洗已经有了很好的结果。在
3x3 depthwise
卷积之后只有BN
而没有ReLU
。当步长为2时:
恒等映射直连替换为一个尺寸为
3x3
、步长为2
的平均池化。3x3 depthwise
卷积的步长为2
。将残差部分与直连部分的
feature map
拼接,而不是相加。因为当
feature map
减半时,为了缓解信息丢失需要将输出通道数加倍从而保持模型的有效容量。
网络性能
在
Shufflenet
中,depthwise
卷积仅仅在1x1
卷积的输出feature map
上执行。这是因为depthwise
很难在移动设备上高效的实现,因为移动设备的计算/内存访问
比率较低,所以仅仅在1x1
卷积的输出feature map
上执行从而降低开销。ShuffleNet
网络由ShuffleNet
块组成。网络主要由三个
Stage
组成。- 每个
Stage
的第一个块的步长为 2 ,stage
内的块在其它参数上相同。 - 每个
Stage
的输出通道数翻倍。
- 每个
在
Stage2
的第一个1x1
卷积并不执行分组卷积,因此此时的输入通道数相对较小。每个
ShuffleNet
块中的第一个1x1
分组卷积的输出通道数为:该块的输出通道数的1/4
。使用较少的数据集增强,因为这一类小模型更多的是遇到欠拟合而不是过拟合。
复杂度给出了计算量(
乘-加运算
),KSize
给出了卷积核的尺寸,Stride
给出了ShuffleNet block
的步长,Repeat
给出了ShuffleNet block
重复的次数,g
控制了ShuffleNet block
分组的数量。g=1
时,1x1
的通道分组卷积退化回原始的1x1
卷积。
超参数
g
会影响模型的准确率和计算量。在ImageNet
测试集上的表现如下:ShuffleNet sx
表示对ShuffleNet
的通道数增加到s
倍。这通过控制Conv1
卷积的输出通道数来实现。g
越大,则计算量越小,模型越准确。其背后的原理是:小模型的表达能力不足,通道数量越大,则小模型的表达能力越强。
g
越大,则准确率越高。这是因为对于ShuffleNet
,分组越大则生成的feature map
通道数量越多,模型表达能力越强。- 网络的通道数越小(如
ShuffleNet 0.25x
),则这种增益越大。
随着分组越来越大,准确率饱和甚至下降。
这是因为随着分组数量增大,每个组内的通道数量变少。虽然总体通道数增加,但是每个分组提取有效信息的能力变弱,降低了模型整体的表征能力。
虽然较大
g
的ShuffleNet
通常具有更好的准确率。但是由于它的实现效率较低,会带来较大的推断时间。
通道随机混洗的效果要比不混洗好。在
ImageNet
测试集上的表现如下:- 通道混洗使得分组卷积中,信息能够跨分组流动。
- 分组数
g
越大,这种混洗带来的好处越大。
多种模型在
ImageNet
测试集上的表现:比较分为三组,每一组都有相差无几的计算量。 给出了在该组中,模型相对于
MobileNet
的预测能力的提升。MFLOPs
表示乘-加
运算量(百万),错误率表示top-1 error
。ShuffleNet 0.5x(shallow,g=3)
是一个更浅的ShuffleNet
。考虑到MobileNet
只有 28 层,而ShuffleNet
有 50 层,因此去掉了Stage 2-4
中一半的块,得到一个教浅的、只有 26 层的ShuffleNet
。
在移动设备上的推断时间(
Qualcomm Snapdragon 820 processor
,单线程):
ShuffleNet V2
ShuffleNet V2
基于一系列对照实验提出了高效网络设计的几个通用准则,并提出了ShuffleNet V2
的网络结构。
小型网络通用设计准则
目前衡量模型推断速度的一个通用指标是
FLOPs
(即乘-加
计算量)。事实上这是一个间接指标,因为它不完全等同于推断速度。如:MobileNet V2
和NASNET-A
的FLOPs
相差无几,但是MobileNet V2
的推断速度要快得多。如下所示为几种模型在
GPU
和ARM
上的准确率(在ImageNet
验证集上的测试结果)、模型推断速度(通过Batch/秒
来衡量)、计算复杂度(通过FLOPs
衡量)的关系。在
ARM
平台上batchsize=1
, 在GPU
平台上batchsize=8
。准确率与模型容量成正比,而模型容量与模型计算复杂度成成比、计算复杂度与推断速度成反比。
因此:模型准确率越高,则推断速度越低;模型计算复杂度越高,则推断速度越低。
FLOPs
和推断速度之间的差异有两个原因:- 除了
FLOPs
之外,还有几个因素对推断速度有重要的影响。- 内存访问量(
memory access cost:MAC
):在某些操作(如分组卷积)中,其时间开销占相当大比例。因此它可能是GPU
这种具有强大计算能力设备的瓶颈。 - 模型并行度:相同
FLOPs
的情况下,高并行度的模型比低并行度的模型快得多。
- 内存访问量(
- 即使相同的操作、相同的
FLOPs
,在不同的硬件设备上、不同的库上,其推断速度也可能不同。
- 除了
MobileNet V2
和ShuffleNet V1
这两个网络非常具有代表性,它们分别采用了group
卷积和depth-wise
卷积。这两个操作广泛应用于其它的先进网络。利用实验分析它们的推断速度(以推断时间开销来衡量)。其中:宽度乘子均为1,
ShuffleNet V1
的分组数g=3
。从实验结果可知:
FLOPs
指标仅仅考虑了卷积部分的计算量。虽然这部分消耗时间最多,但是其它操作包括数据IO
、数据混洗、逐元素操作(ReLU
、逐元素相加)等等时间开销也较大。小型网络通用设计准则:
ShuffleNet V2 block
网络性能
ShuffleNet V2
的网络结构类似ShuffleNet V1
,主要有两个不同:- 用
ShuffleNet v2 block
代替ShuffleNet v1 block
。 - 在
Global Pool
之前加入一个1x1
卷积。
- 用
ShuffleNet V2
可以结合SENet
的思想,也可以增加层数从而由小网络变身为大网络。下表为几个模型在
ImageNet
验证集上的表现(single-crop
)。ShuffleNet V2
和其它模型的比较:- 根据计算复杂度分成
40,140,300,500+
等四组,单位:MFLOPs
。 - 准确率指标为模型在
ImageNet
验证集上的表现(single-crop
)。 GPU
上的batchsize=8
,ARM
上的batchsize=1
。- 默认图片尺寸为
224x224
,标记为*
的图片尺寸为160x160
,标记为**
的图片尺寸为192x192
。
- 根据计算复杂度分成
ShuffleNet V2
准确率更高。有两个原因:ShuffleNet V2 block
的构建效率更高,因此可以使用更多的通道从而提升模型的容量。在每个
ShuffleNet V2 block
,有一半通道的数据()直接进入下一层。这可以视作某种特征重用,类似于DenseNet
。但是
ShuffleNet v2 block
在特征Concat
之后又执行通道混洗,这又不同于DenseNet
。
IGCV 系列
设计小型化网络目前有两个代表性的方向,并且都取得了成功:
- 通过一系列低秩卷积核(其中间输出采用非线性激活函数)去组合成一个线性卷积核或者非线性卷积核。如用
1x3 +3x1
卷积去替代3x3
卷积 。 - 使用一系列稀疏卷积核去组成一个密集卷积核。如:交错卷积中采用一系列分组卷积去替代一个密集卷积。
IGCV
简化神经网络结构的一个主要方法是消除结构里的冗余。目前大家都认为现在深度神经网络结构里有很强的冗余性。
冗余可能来自与两个地方:
- 卷积核空间方向的冗余。通过小卷积核替代(如,采用
3x3
、1x3
、3x1
卷积核)可以降低这种冗余。 - 卷积核通道方向的冗余。通过分组卷积、
depth-wise
卷积可以降低这种冗余。
IGCV
通过研究卷积核通道方向的冗余,从而减少网络的冗余性。- 卷积核空间方向的冗余。通过小卷积核替代(如,采用
事实上解决冗余性的方法有多种:
二元化:将卷积核变成二值的
-1
和+1
,此时卷积运算的乘加
操作变成了加减
操作。这样计算量就下降很多,存储需求也降低很多(模型变小)。浮点数转整数:将卷积核的
32
位浮点数转换成16
位整数。此时存储需求会下降(模型变小)。除了将卷积核进行二元化或者整数化之外,也可以将
feature map
进行二元化/整数化。卷积核低秩分解:将大卷积核分解为两个小卷积核 ,如:将
100x100
分解为100x10
和10x100
、将5x5
分解为两个3x3
。稀疏卷积分解:将一个密集的卷积核分解为多个稀疏卷积核。如分组卷积、
depth-wise
卷积。
IGCV block
IGCV
提出了一种交错卷积模块,每个模块由相连的两层分组卷积组成,分别称作第一层分组卷积primary group conv
、第二层分组卷积secondary group conv
。第一层分组卷积采用
3x3
分组卷积,主要用于处理空间相关性;第二层分组卷积采用1x1
分组卷积,主要用于处理通道相关性。每层分组卷积的每个组内执行的都是标准的卷积,而不是
depth-wise
卷积。这两层分组卷积的分组是交错进行的。假设第一层分组卷积有
L
个分组、每个分组M
个通道,则第二层分组卷积有M
个分组、每个分组L
个通道。第一层分组卷积中,同一个分组的不同通道会进入到第二层分组卷积的不同分组中。
第二层分组卷积中,同一个分组的不同通道来自于第一层分组卷积的不同分组。
这两层分组卷积是互补的、交错的,因此称作交错卷积
Interleaved Group Convolution:IGCV
。
这种严格意义上的互补需要对每层分组卷积的输出
feature map
根据通道数重新排列Permutation
。这不等于混洗,因为混洗不能保证严格意义上的通道互补。
由于分组卷积等价于稀疏卷积核的常规卷积,该稀疏卷积核是
block-diagonal
(即:只有对角线的块上有非零,其它位置均为 0 )。因此
IGCV
块等价于一个密集卷积,该密集卷积的卷积核由两个稀疏的、互补的卷积核相乘得到。
网络性能
IGCV
网络结构如下表所示,其中:RegConv-Wc
表示常规卷积,W
表示卷积核的尺寸为WxW
,c
表示通道数量;Summation
表示加法融合层(即常规的1x1
卷积,而不是1x1
分组卷积)。- 在
IGCV
块之后紧跟BN
和ReLU
,即结构为:IGC block+BN+ReLU
。 4x(3x3,8)
表示分成4组,每组的卷积核尺寸为3x3
输出通道数为 8 。- 网络主要包含3个
stage
,B
表示每个stage
的块的数量。 - 某些
stage
的输出通道数翻倍(对应于Output size
减半),此时该stage
的最后一个block
的步长为2(即该block
中的3x3
卷积的步长为2) 。
- 在
IGCV
网络的模型复杂度如下所示。SumFusion
的参数和计算复杂度类似RegConv-W16
,因此没有给出。IGCV
模型在CIFAR-10
和CIFAR-100
上的表现:如果增加恒等映射,则结果为:
所有的模型比较:
IGCV
模型在ImageNet
上的表现:(输入224x224
,验证集,single-crop
)超参数
L
和M
的选取:通过
IGCV
在CIFAR100
上的表现可以发现:L
占据统治地位,随着 的增加模型准确率先上升到最大值然后缓缓下降。
IGCV2
IGCV2 block
的主要设计思想是:将 IGCV block
两个结构化的稀疏卷积核组成的交错卷积推广到更多个结构化的稀疏卷积核组成的交错卷积,从而进一步消除冗余性。
IGCV2 block
互补条件 & 平衡条件
网络性能
IGCV3
IGCV3
结合了块稀疏的卷积核(如:交错卷积) 和低秩的卷积核(如:bottleneck
模块),并放松了互补条件。
IGCV3 block
loose 互补条件
网络性能
CondenseNet
CondenseNet
基于DenseNet
网络,它在训练的过程中自动学习一个稀疏的网络从而减少了Densenet
的冗余性。这种稀疏性类似于分组卷积,但是
CondenseNet
从数据中自动学到分组,而不是由人工硬性规定分组。CondenseNet
网络在GPU
上具有高效的训练速度,在移动设备上具有高效的推断速度。MobileNet、ShuffleNet、NASNet
都采用了深度可分离卷积,这种卷积在大多数深度学习库中没有实现。而CondenseNet
采用分组卷积,这种卷积被大多数深度学习库很好的支持。准确的说,
CondenseNet
在测试阶段采用分组卷积,在训练阶段采用的是常规卷积。
网络剪枝
有一些工作(
Compressing neural networks with the hashing trick
、Deep networks with stochastic depth
)表明:CNN
网络中存在大量的冗余。DenseNet
通过直接连接每个层的输出特征与之后的所有层来特征重用。但是如果该层的输出特征是冗余的或者不需要的,则这些连接会带来冗余。CNN
网络可以通过权重剪枝从而在不牺牲模型准确率的条件下实现小型化。有不同粒度的剪枝技术:- 独立的权重剪枝:一种细粒度的剪枝,它可以带来高度稀疏的网络。但是它需要存储大量的索引来记录哪些连接被剪掉,并且依赖特定的硬件/软件设施。
filter
级别剪枝:一种粗粒度的剪枝,它得到更规则的网络,且易于实现。但是它带来的网络稀疏性较低。
CondenseNet
也可以认为是一种网络剪枝技术,它与以上的剪枝方法都不同:CondenseNet
的网络剪枝发生、且仅仅发生在训练的早期。这比在网络整个训练过程中都采用L1
正则化来获取稀疏权重更高效。CondenseNet
的网络剪枝能产生比filter
级别剪枝更高的网络稀疏性,而且网络结构也是规则的、易于实现的。
LGC
训练和测试
IGR 和 FDC
网络性能
CondenseNet
与其它网络的比较:(*
表示使用cosine
学习率训练 600个 epoch)CondenseNet
与其它裁剪技术的比较:CondenseNet
的超参数的实验:(CIFAR-10
,DenseNet-50
为基准)裁剪策略:(
G=4
)Full Model
:不进行任何裁剪。Traditional Pruning
:在训练阶段(300个epoch)完成时执行裁剪(因此只裁剪一次),裁剪方法与LGC
一样。然后使用额外的300个 epoch 进行微调。
分组数量:(
C=8
)- 这里的分组值得是
3x3
分组卷积的分组数量。 - 随着分组数量的增加,测试误差逐渐降低。这表明
LGC
可以降低网络的冗余性。
- 这里的分组值得是
浓缩因子:(
G=4
)可以看到: 可以带来更好的效益;但是 时,网络的准确率和网络的
FLOPs
呈现同一个函数关系。这表明裁剪网络权重会带来更小的模型,但是也会导致一定的准确率损失。
在
ImageNet
上的比较:网络结构:
为了降低参数,在
epoch 60
时(一共120
个epoch
)裁剪了全连接层FC layer
50% 的权重。思想与1x1
卷积的LGC
相同,只是 。CondenseNet
与其它网络的比较:网络在
ARM
处理器上的推断时间(输入尺寸为224x224
):