1.0 Base Knowledge
CNN(Convolution Neural Network,卷积神经网络)作为一种经典的 DNN 结构,上世纪90年代就已经被提出了,却沉寂近20年。有趣的是,在2012年 AlexNet 大放异彩后,CNN 在随后几年近乎卷席了整个图像处理领域,很有点戏剧性。近些年,CNN 在语音处理、NLP 领域也发展迅速。随着时间的推移,CNN的架构不断更新迭代,本文将详细介绍CNN相关发展历程。
CNN其实可以看作DNN的一种特殊形式。它跟传统DNN标志性的区别在于两点,卷积核(Convolution Kernel) 以及 池化层(Pooling)。
1.1 Convolution Kernel
说起 Convolution Kernel,首先要解释一下 Convolution(卷积),可以参考guide。一般我们接触过的都是一维信号的卷积,也就是
在信号处理中,$x[n]$是输入信号,$h[n]$是单位响应,于是信号$y[n]$就是输入信号$x[n]$响应的延迟叠加。这也就是一维卷积本质:加权叠加/积分。
那么对于二维信号,比如图像,卷积公式就成了如下公式:
假设现在 Convolution Kernel 大小是,我们就可以化简上式为:
公式看起来很复杂,用图来解释就很简单了,假如 Convolution Kernel 如下图:
那么,从 Input Image 到 Output Image 的变化如下:
可以看出,其实二维卷积一样也是加权叠加/积分。需要注意的是,其中 Convolution Kernel 进行了水平和竖直方向的翻转。
卷积核的意义
Convolution Kernel 其实在图像处理中并不是新事物,Sobel 算子等滤波算子,一直都在被用于边缘检测等工作中,只是以前被称为 Filter。图像处理的同学应该有印象。
Convolution Kernel 的一个属性就是局部性。即它只关注局部特征,局部的程度取决于 Convolution Kernel 的大小。比如用 Sobel 算子进行边缘检测,本质就是比较图像邻近像素的相似性。
也可以从另外一个角度理解 Convolution Kernel 的意义。学过信号处理的同学应该记得,时域卷积对应频域相乘。所以原图像与 Convolution Kernel 的卷积,其实对应频域中对图像频段进行选择。比如,图像中的边缘和轮廓属于是高频信息,图像中区域强度的综合考量属于低频信息。在传统图像处理里,这些物理意义是指导设计 Convolution Kernel 的一个重要方面。
CNN 的 Convolution Kernel
CNN 中的 Convolution Kernel 跟传统的 Convolution Kernel 本质没有什么不同。仍然以图像为例,Convolution Kernel 依次与 Input 不同位置的图像块做卷积,得到 Output,如下图。
同时,CNN 有一些它独特的地方,比如各种定义,以及它属于 DNN 的那些属性:
- CNN 可以看作是 DNN 的一种简化形式,Input 和 Output 是 DNN 中的 Layer,Convolution Kernel 则是这两层连线对应的w,且与 DNN 一样,会加一个参数 Bias
- 一个 Convolution Kernel 在与 Input 不同区域做卷积时,它的参数是固定不变的。放在 DNN 的框架中理解,就是对 Output Layer 中的神经元而言,它们的w和b是相同的,只是与 Input Layer 中连接的节点在改变。在 CNN 里,这叫做 Shared Weights and Biases
- 在 CNN 中,Convolution Kernel 可能是高维的。假如输入是m n k维的,那么一般 Convolution Kernel 就会选择为d d k维,也就是与输入的 Depth 一致
- 最重要的一点,在 CNN 中,Convolution Kernel 的权值其实就是w,因此不需要提前设计,而是跟 DNN 一样利用 GD 来优化
- 如上面所说,Convolution Kernel 卷积后得到的会是原图的某些特征(如边缘信息),所以在 CNN 中,Convolution Kernel 卷积得到的 Layer 称作 Feature Map
- 一般 CNN 中一层会含有多个 Convolution Kernel,目的是学习出 Input 的不同特征,对应得到多个 Feature Map。又由于 Convolution Kernel 中的参数是通过 GD 优化得到而非设定的,于是w的初始化就显得格外重要了
CNN 的 Pooling
Pooling 的本质,其实是采样。Pooling 对于输入的 Feature Map,选择某种方式对其进行压缩。如下图,表示的就是对 Feature Map 2 * 2邻域内的值,选择最大值输出到下一层,这叫做 Max-Pooling。于是一个的 Feature Map 被压缩到了。
除此之外,还有Mean-Pooling,Stochastic-Pooling 等。它们的具体实现如名称所示,具体选择哪一个则取决于具体的任务。
Pooling 的意义,主要有两点:
第一个显而易见,就是减少参数。通过对 Feature Map 降维,有效减少后续层需要的参数
另一个则是 Translation Invariance,也就是增大感受野。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就增强了网络的鲁棒性,有一定抗扰动的作用。
1.2 The way of convolution
Convolution:
DepthWise Convolution:
DepthWise卷积主要还是为了减少网络的参数,使网络能够更好地部署到移动端。
Deformable Convolutional:
再接着,为了解决图像中可能呈现的不同大小、姿态、视角变化甚至费缸体变形,微软亚洲研究院(MSRA)提出了可变性卷积网络(Deformable Convolutional Networks)。
标准的卷积中一般都是正方形,这种规则的采样是网络难以适应几何形变的主要原因。为了削弱这个限制,对每个点的位置都增加一个偏移变量,通过这个变量,卷积核可以在当前位置附近随意采样,不再受限于之前的规则格点。如下图:
DCN中增加的偏移量是网络结构的一部分,通过另一个平行的标准卷积单元计算得到,进而也可以通过梯度反向传播进行端到端的训练。从下图更加直观的看到加入偏移后,卷积位置的变化特点:
这种卷积结构在分割以及检测任务上都非常有效。笔者认为这种思想和Attention的思想(下面网络结构会介绍)有异曲同工之妙,都是想要在图像中找到关键信息,然后抑制无效信息。
Dilated Convolution
Dilated Convolution(空洞卷积)设计之初最主要用于分割任务。传统的分割任务都会有pooling操作,这样是为了降低尺寸同时增大感受野,然后进行反卷积将feature map 还原到原尺寸,但是这个过程有一定的信息损失,所以空洞卷积应运而生。空洞卷积示意图如下:
间隔大小取决于空洞率。DC最大的优势就是在不进行pooling操作的同时,扩感受野,相当于获得了多尺度的特征,因此在分割任务中很有效。
但是最初的网络设计会导致The Gridding Effect。后面也有对此进行优化的文章Understanding Convolution for Semantic Segmentation,Rethinking Atrous Convolution for Semantic Image Segmentation
1.3 Upsampling
这里指的上采样(upsampling)是指为了让经过pooling操作的feature map恢复原有尺寸的operation。我总结是有两种方式,一种是untrainable的方式,如插值,还有一种是trainable方式,transposed convolution(转置卷积),也有人称作deconvolution,但是stanford class称不太准确。个人理解deconvolution是用已经训练好的kernel将output恢复到input的过程,常用于CNN可视化;而网络中常用到的这种operation只是为了恢复尺寸,用的仍然是普通的conv,只不过有一定的策略,下面会解释。
插值
插值操作不需要训练,权重由认为预先定义。常用的方式有nearest interpolation、bilinear interpolation、bicubic interpolation。
- nearest interpolation :将离待插值最近的已知值赋值给待插值。
- bilinear interpolation :根据离待插值最近的 2*2 个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
- bicubic interpolation :根据离待插值最近的 4*4 个已知值来计算待插值,每个已知值的权重由距离待插值距离决定,距离越近权重越大。
Transpose
Transpose是卷积操作的逆操作。策略有很多,具体参考动图。
1.4 Conclusion
卷积方式是构成卷机网络的基石。随着研究的推进,已经不是简单的卷积结构堆叠能够完成所有的任务了。不同卷积方式构成的CNN网络有着不同的作用,所以在面对不同的任务是,选择合适的卷积方式就显得十分重要了。
2.0 The Development of Architecture
2.1 Summarize
CNN 的架构发展可以参考刘昕博士总结的图
下图中的坐标轴我们可以看出横坐标是操作的复杂度,纵坐标是精度
LeNet-5 是最经典的 CNN 架构,上面介绍的 Convolutional Kernel 和 Pooling 它都有了。它在1998年由 LeCun 提出,用于对“Mnist手写数字数据集”进行分类。不过效果并不比当时手工设计的特征有明显提升,因此并没有太大反响。
十来年后,Alex Krizhevsky 在2012年提出 AlexNet,凭借它在 ILSVRC2012 的 ImageNet 图像分类项目中获得冠军,且错误率比上一年冠军下降十多个百分点。举圈震惊。
随后几年,CNN 卷席整个图像处理领域,ILSVRC 每年被刷榜,也就出现了我们常见的这张错误率下降趋势的图。当然,也伴随着如图所示的 Layer 数的激增。
2.2 LeNet
LeNet5 是 LeCun 在1998年“Gradient-Based Learning Applied to Document. Recognition”中提出的网络架构。用于对“Mnist手写数字数据集”进行分类。其具体的结构如下图:
input 是一个手写图像。
C1 层由6个 Feature Map 组成,其中每个神经元与 Input 的的邻域相连。这些连接对应的w就是上面所说的 Convolution Kernel。当然,与 DNN 一样,这里还有一个参数 Bias b。所以,此层有(55+1)6=156个参数。而如果不使用共享权重,则会需要(5x5+1)x(28x28)x6 = 122304个参数。
S2 层即下采样层,对应着现在的 Pooling 操作后的层。其依然是6个 Channel,每个神经元与上一层2 \times 2的邻域相连。作者在此层进行的操作是加权平均,再加上 bias,并将结果输入到激活函数 Sigmoid 函数中。因此,此层共有2*6=12个参数。
C3 层由16个 Feature Map 组成,其中每个神经元与 S2 的5*5的邻域相连。不过,当时作者对连接进行了一些设计,让每个 Feature Map 仅与上一层部分 Channel 相连。只是这种 trick 现在也很少用到,这里就不细讲了。
S4 层也是下采样层,与 S2 是意义一样。由于有16个 Channel,因此共2*16=32个参数。
C5 层由120个 Feature Map 组成,其中每个神经元与 S4 每个 Channel 的的邻域相连。恰巧,这里 C3 的每一个 Feature Map 都是1*1,显得好像跟 S4 是全连接,不过这仅仅是恰巧罢了。
F6 由84个神经元组成,与 C5 全连接。并将结果输入到激活函数,得到每个神经元的状态。这里激活函数使用的是双曲正切函数(tanh)。此层共(120+1)84=10164个参数。而之所以使用84个神经元,是因为有人曾将 ASCII 码绘制于12 7的 bit-map 上,如下图,作者希望此层的输出有类似的效果。
Output 是10个神经元,分别代表十个数字。作者还使用欧式径向基函数(Euclidean Radial Basis Function)对数据进行了一些变换,有兴趣的同学可以自行参考原文。
网络结构设计好之后,选择 Loss Function,并利用 GD 学习网络参数,这些都是套路了。最后,LeNet-5 每一层的输出可以用以下这张图来辅助理解。
2.3 AlexNet
AlexNet 是 Alex Krizhevsky 于2012年在“ImageNet Classification with Deep Convolutional Neural Networks”中提出的网络架构。Alex Krizhevsky 凭借它在 ILSVRC2012 的 ImageNet 图像分类项目中获得冠军,错误率比上一年冠军下降十多个百分点。其具体的结构如下图,第一个图为作者论文中的辅助理解的图示,第二个图为将 AlexNet 每一层的细节进行总结的图。
从上图可以看出,AlexNet 在结构上没有大改变。它真正区别于传统 CNN 的,在于对网络参数的选择上,而其中很多方法如今依然在用:
- 不同于传统 CNN 使用 Sigmoid 或者 Tanh 作为激活函数,AlexNet 使用的是 Relu。Relu 能有效抑制 Gradient Vanish 以及 Gradient Explode 的问题,现在仍然是最常用的激活函数。
- AlexNet 开始使用了 Droupout 来防止过拟合,这是一种简单且有效减少过拟合的方法,如今依然是手常用方法之一。
- AlexNet 使用 LRN(Local Response Normalization)对网络中的数据进行归一化。当然现在 LRN 已经不太使用,使用的较多的是效果好得多的 Batch Normalization。但是 AlexNet 当时已经开始注意对数据进行归一化,这一点还是很厉害的。
- AlexNet 使用了 GPU 来加速网络中的运算,现在 GPU 来加速计算已经是标配了
AlexNet 中这些技巧,很多已经成了现在的标准方法,足见其影响力之大。
2.4 VGGNet
VGG与Alex很相似,都是卷积池化-卷积池化-…-全连接的套路,不同的是kernel大小,卷积stride,网络深度。
VGGNet将小卷积核带入人们的视线,分析一下卷积核的区别和优势:
在上面提到的第一个卷积层使用的kernrl大小为11$\times$11,stride为4,中间一些层用的都是5$\times$5卷积核,而现在VGGNet中卷积核大小为3$\times$3,stride为1。
直观上我们会觉得大的卷积核更好,因为它可以提取更大区域的信息,但是实际上,大的卷积核可以用多个卷积核叠加代替。这样的替代方式可以有两点好处:
- 减少了参数的个数
两个串联的小卷积核需要3$\times$3$\times$2=18个参数,一个5$\times$5=25的卷积核则有25个参数。
三个串联的小卷积核需要3$\times$3$\times$3=27个参数,一个7$\times$7=49的卷积核则有25个参数。
大大减少了参数
- 引入了更多的非线性
多少个串联的小卷积核就对应着多少次激活的过程,而一个大的卷积核就只有一个一次激活的过程。引入了更多的非线性变换,也就意味着模型的表达能力会更强,可以去模拟更高维的分布。
VGGNet相比于AlexNet层数更深,参数更多,但是却可以更快的收敛。
2.5 GoogLeNet
GoogLeNet 其实属于 Inception 网络结构系列,其启发是 NIN(Network In Network),而后整个 Inception 系列共发展出四个版本。这里,先简单介绍这几种结构。
- NIN
NIN 出自文章“Network in Network”,主要是提出了两点新的构想,以下简单描述:
- 使用多层$1\times 1$的 Convolution Kernel,来代替传统 CNN 一层的若干个$N \times N$的 Convolution Kernel。原因在于,单层的 Convolution Kernel + Activation 只是扩展的线性变换,表达能力有限;但是多层 Convolution Kernel + Activation 的堆叠,后面几层的抽象能力会大大增强,所以表达能力比以前强,而参数可能还比以前少
- 使用 Global Average Pooling 代替传统 CNN 中最后一层的 Fully Connected 层,其中 Global Average Pooling 表示取每个 Feature Map 的均值。因此,对多类分类,最后一层的每个 Feature Map 即对应一个类别,在大大减少了 CNN 参数的同时,强制 Feature Map 学习不同类别的特征
- Inception V1,BN,V3,V4
- GoogLeNet 就是 Inception V1,出自2015年的“Going Deeper with Convolutions”。它继承并扩展了 NIN 中使用小 Convolution Kernel 来代替或者表示大 Convolution Kernel 的思想,在网络能力不减的情况下大大降低参数量
- Inception BN 出自2015年的“Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”。在本文中,作者提出了大名鼎鼎的 Batch Normalization,现在是 DNN 调参的一个重要手段,提高了 DNN 对参数的稳定性。
- Inception V3 出自2016年的“Rethinking the Inception Architecture for Computer Vision”。其在 Inception V1 的基础上,利用 Factorization 进一步降低 Convolution Kernel 中的参数数量
- Inception V4 出自2016年的“Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning”。如其名所说,它就是结合了 Inception 和 ResNet 的思想。
可以看出,除了 Inception BN 主题有点跑偏,其他的 Inception 都是在 GoogLeNet 的基础上的改进。所以,以下我会详细介绍 GoogLeNet。
- InceptionV1(GoogLeNet)
来自于文章《Going deeper with convolutions》
GoogLeNet 最大的特点就是下面这种结构,暂且称之为原始的 Inception。
可以看出它本质跟 NIN 一样,使用 Network 来代替原来的一个 Convolution Kernel。但跟 NIN 只使用$1\times 1$不同,这里使用了更大的 Convolution Kernel,以及 Pooling Layer,原因在于提取视野更大、或者提取类型不同的特征。但是由于这种 Network 的参数会非常大,所以作者先进行了降维,就得到了真正的 Inception 结构,如下图:
$1\times 1$Kernel 在这里的作用就是为了在叠加 Inception 模块时,不至于让网络参数数量爆炸,所做的降维。在理解了 Inception 模块后,整个 GoogLeNet 的结构上就很容易看懂了,基本就是 Inception 模块、Pooling Layer 的不停叠加而已。其结构如下图(大图预警):
上图中我们能看到有一点比较特殊,就是除了最上层的 softmax2 分类器外,中间还有一些层连接了分类器(softmax0、softmax1)。
按照作者初期的说法,这是因为网络太深,Gradient Vanish 导致无法高效的更新参数,所以加了两个较浅的分类器辅助 BP 以加快网络收敛速度。可是在 Inception V3 中,作者发现其实它们对网络收敛速度并没什么帮助,更多的是起到了 Regularizer 的作用。
Inception 提出了新的 CNN 结构,并在 ILSVRC2014 使错误率再创新低。可它在深层网络 Gradient Vanish 的问题上并未找到好的解决办法,这就制约了网络进一步的加深。就在大家看似都一筹莫展时,另一个大佬微软笑着掏出了 ResNet。在介绍完所有inception网络之后会介绍ResNet。
- InceptionV2(BN) and InceptionV3
来自于文章《Rethinking the Inception Architecture for Computer Vision》和《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
V2和V3都出自于同一篇文章,只是里面的Inception架构有所不同,思路大致相同,在这里就不严格区分。
在V2模型中,主要针对V1进行了两点改进:
- 加入了Batch Normalization层,减少了Internal Covariate Shift(内部数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯分布;
- 用多个更小的3*3的kenel代替较大的kernel,即降低了参数数量,也加速了运算。
值得注意到的是,在加入BN层之后,网络在做卷积运算时可以不用添加bias参数。原因会在另一篇介绍BN的文章中做具体证明。
具体的inception结构如下:
在v3模型中,一个重要的改进是分解操作(Factorization),即将n*n的卷积操作分解为1*n和n*1的卷积。如下图:
结构图如下:
- InceptionV4
InceptionV4结构是吸纳ResNet精华,结合之前构建Inception的思想,开发出了InceptionV4网络,同时还设计了更深更优化的Inception-ResNet-V2模型。
Inception-resnet-v1 and Inception-ResNetv2都是用的这个结构图,区别在于下图的注释中,
上图具体提到的Inception结构请在论文中查看。
个人觉得到V4这个结构,越来越复杂,其实也很难从理论上解释哪个结构好,哪个结构差,都是以结果论英雄。那么,对于那些没钱买机器的小团队就只能跟着大佬走了。
2.6 ResNet
ResNet 出自“Deep Residual Learning for Image Recognition,2016”。它源于作者一些实验:在 Relu、BN 已经缓解了深层的网络无法收敛的问题后,随着网络层数的增加,训练和测试错误率仍然呈现先减后增的趋势。这时,就不再是过拟合的问题,而表明太深的网络其参数难以优化。比如对于恒等变换$H(x)=x$,更深的网络其对此函数的拟合效果甚至不如较浅的网路。
为了解决上述$H(x)=x$难以拟合的问题,作者提出了一种设想:我们不去拟合$H(x)$,改之去拟合$F(x)=H(x)-x$。而最终网络输出的是$F(x)=H(x)+x$,如下图:
这种做法会涉及到两个问题:
- 在恒等变换中我们拟合的函数变成了F(x)=0,它为什么比原始的H(x)=x更容易拟合呢?作者表示,此时参数们只需要逼近0即可,这看起来比优化到其他值简单(这个虽然抽象,但似乎还有点道理)
- 实际情况中$H(x)$不太可能都是恒等变换,这种拟合残差的做法为何有好处呢?作者表示,首先我们要假设它更好优化,其次我们的实验证明了它确实效果更好。
RessNet 在起初时的理论匮乏。其实在后续,分析其理论依据的文章也相继有提出,如:
- 在“Identity Mappings in Deep Residual Networks,2016”中,作者从实验和理论两方面来说明为什么 ResNet 使用 Identity Mappping 来计算残差是合理的,且稳定性更强,如下图。
- 在”Residual Networks Behave Like Ensembles of Relatively Shallow Networks,2016“中,作者则用实验表明 ResNet 可能效果显著的原因在于其 Ensemble 的性质,即它的 Shortcut 层可以看作多种不同的路径的 Ensemble,如下图。同时作者也表示 ResNet 真实选择路径时其实选的都是较短的路径,因此本质上并不算解决了深层网络 Gradient Vanish 的问题
无论如何,ResNet 虽然理论不足,却被大量检验证明能有效改善网络参数的优化,一方面是即使网络深度剧增依然能够很好的学习参数,保持较好的网络分类效果;另一方面,参数收敛速度也更快。最终的 ResNet 架构如下,可以看出层数已经超深了(大图预警)
2.7 Xception
总的来说,Xception网络基于Inception系列网络结构的基础上,结合depthwise separable convolution。
首先对于原始的inception模块,可以表示成如下:
模块中,基本上先通过一系列1x1卷积降维,然后再通过3x3卷积提取特征。如果我们将上述结构再进行简化,可以得到如下简化结构:
从上图中我们可以看出,1x1卷积将输入数据的channel维度上进行了拆解,再输送到空间卷积3x3,改写成下图:
可以考虑一种更加极端的情况:3x3卷积在1x1卷积后的每一个通道上运行,则有:
其实这个思想跟depth wise非常相似,只是顺序不同
depth wise separable convolutions:先进行channel-wise 空间卷积,然后1x1卷积进行融合
Inception:先进行1x1卷积,然后进行channel-wise空间卷积
depthwise separable convolution:两个操作之间没有激励函数
Inception:两个操作之间,添加了ReLU非线性激励
作者提到,前两个区别影响不大,因为模块是堆叠起来的,多层堆叠后顺序的影响不大了。但后两个影响还是比较明显的,
整体模型如下:
整体效果比inceptionV3略胜一筹。具体实验验证参考原文吧。
2.8 DenseNet
- Dense Block
如图所示就是Dense Block,它包括输入层在内共有5层,H是BN+ReLU+3$\times$3Conv的操作,并不改变feature map的大小。对于每一层来说前面所有层的feature map都直接被拿来当做这一层的输入。grouth rate就是除了输入层之外,每一层feature map的个数。它的目的是,使得block中任意两层能够直接沟通。
在Dense Block输出的地方还有一个bottleneck layer中的操作是一个1$\times$1的卷积,卷积核共有4K个,降低channel维度,也减少了模型参数。
在transition layer中进一步压缩的操作称为compression,减少$\theta$%的feature map数量,论文中使用的是$\theta$=0.5
- DenseNet
DenseNet其实就是若干个DenseBlock串联起来而得到的,在每个DenseBlock之间有一个Conv+Pooling的操作,也就是上面所说的是transition layer。transition layer存在的意义就是实现池化层。
- 为什么ResNet到DenseNet
ResNet直接通过“summation”操作将特征加起来,一定程度阻碍了网络的信息流。DenseNet通过连接操作来结合feature map,并且每一层都与其他层有关系,都有“沟通”,这种方式使得信息流最大化。
2.9 SENet
- Squeeze-and-Excitation Networks 主要利用attention机制来构造网络。SE-block如下图。
图中的 $F_{tr} = \rm{X} \to \rm{U}$ 就是普通的卷积网络操作。$F_{sq}(\cdot)$是Global Average Pooling,也就是作者称的Squeeze过程。然后将$1\times 1 \times C$的vector通过$F_{ex}(\cdot,\rm{W})$即两级全连接层,,也就是作者称的Excitation过程。最后用sigmoid(文中提到的self-gating mechanism)限制到$[0,1]$的范围,把这个值作为scale乘到U的C个通道上。作为下一级的输入数据$\widetilde{\rm{X}}$。
简而言之,模块的核心思想就是想通过控制scale的大小,把重要特征增强,不重要的特征减弱,从而提取更好的特征。
$F_{sq}(\cdot)$的实现方式有很多,论文利用如下公式:
- 将SE-block加到inception结构和resnet结构中组成SE-Net,如下图:
- 论文中还有SE-block的很多种形式,如下:
- 文中的实验也做得十分到位,干货十足,有理有据,值得学习一下。
2.10 RAN
Residual Attention Network for Image Classification提出了一种基于attention机制的网络,和SE-NET又有些不一样。
- 提出一种可堆叠的Residual Attention Module模块,可以通过模块堆叠可以达到比较深的层次。
提出一种基于Attention的残差学习方式,因为直接进行Attention Module的堆叠使得性能下降。
具体的结构通过如下图可以看得非常清楚:
Attention Module如下图:
值得注意的是Soft Mask Branch最后的激活函数是sigmoid,其目的就是将像素值压缩在[0,1]范围,对结果比较重要的像素权重高,对结果不重要的权重低。但是注意到连续多个的Module直接相乘会导致feature map的值越来越小,使网络性能降低,所以在这里借鉴ResNet等映射方法,最终的输入为(1+M(x))*T(x)。
其效果如下:
2.11 NonLocalNet
Non-local Neural Networks提出了一个新的block,可以捕获远程的依赖关系。与其说提出一个模型,不如说是基于前面工作提出的一个思路,根据这个思路可以设计出很多具体的实例模型。
a non-local operation computes the response at a position as a weighted sum of the features at all positions in the input feature maps
抽象来说,可以用下面公式来表示Non-local思想。
其中$i$ 表示输出position(可以表示空间的,时间的或时空连续的)的index, $j$表示所有可能position的index。$\rm{x}$表示输入的信号(可以是图像,序列,视频,经常是featuremap)。$f$是用来计算一个scalar(用来表征position之间的关系)。$g$用来估计一个输入信号在position$j$的表示。然后对整个结果进行标准化。
实例化,将上面抽象的idea转化为具体的模型。
令$g(\rm{x}_j) = W_gx_j$,其中$W_g$是一个参数矩阵,例如1*1的卷积层。
$f(\rm{x}_i,\rm{x}_j) = $有很多表示方法,具体参见原文。
上面都是理论分析。运用到神经网络中如下图,也是论文中做实验用到的block。这样就方便将这个block运用到其他网络。
其中$ z_i = W_z \rm{y}_i + x_i$,这里是用了resnet的skipconnection结构。
然后作者利用这个block重新build一些模型进行测试,当然效果都还不错。
2.12 WCD
WCD是AAAI2019的一篇关于神经网络结构的工作。思路和attention机制有些类似。
WCD主要思想如下:
- 首先对前一层输出的通道进行评级,为每一个通道进行打分。打分通过全局平均池化得到的。
- 然后,生成一个mask,抑制部分节点,保留部分节点。
- 最后,使用一个额外的随机数生成器来进一步为下一层过滤通道。
WCD不依赖任何参数,仅用少量的计算成本就可以添加到训练阶段的网络
- WCD仅作用于训练阶段,不影响inference。
- 和SENet非常类似,WCD只不过当作训练阶段的小插件。
2.13 BagNet
BagNet是ICLR2019的一篇关于CNN可视化的工作,关注度比较高。作者发现基于小型局部图像特征分类的简单模型可以在ImageNet上实现惊人的高准确率。论文作者认为,这表明过去几年DNN的进步大部分是通过调参取得的。
下面是整个模型的pipline:
- 将输入图像截取为33*33像素的图像块;
- 在每一个截取的图像块上使用深度网络(1*1卷积)获得类别向量;
- 按空间对所有输出的类别向量进行求和(所有截取的图像块);
- 通过类别向量最大的元素预测类别。
BagNet 在使用 33×33 像素的图像块时效果好于 17×17 的图像块(80%)。所以深度网络确实抽取了有用的空间信息(9x9 vs. 17x17 vs. 33x33),但可能不是我们以前想像的全局空间范围(例如 112×112 或 224×224).
BagNet 模型的空间敏感特征并不会超出 bagging 步骤,这就引出了一个问题:深度网络最强大的能力是否还仅来自于对局部特征的处理。深度网络仅仅和这种不考虑全局空间信息的 BagNet 相同吗?如果是的话,那么深度卷积网络还有很长的路要走。
论文给出的模型细节不是很具体,源码也没有给出如何训练出来模型的,难以复现,但是大致的思路就是把一整张图像分成局部进行分类,忽视掉空间信息。和CNN的思想有些背道而驰的意思。
2.13 SBNet(2019.03.20)
SBNet是cvpr2018的一个工作,主要目的为了推理加速,更加适应于移动端部署,思路和上面的bagnet有些相似之处,都是将目标分割成几个部分做判断。
思路主要是根据已知或者预测的binary mask(attention),对feature map进行blockwise 分解,生成稀疏块以及对应的 tile indices。
将这些稀疏块聚集在一起形成新的tensor,通过卷积操作后将结果分散回原先的位置,并更新原始tensor
可以看到,只对mask对应的稀疏块进行卷积,大大提高了系统的运行效率。
- 作者拿出自动驾驶的3D场景数据进行了mask分析。个人觉得在2d部分同样也应该work。
- idea非常有趣,但是需要更进一步的验证和运用。相信在工业上的运用应该会很广泛。
3.0 Model Compression
3.1 Summarize
模型压缩是非常有落地价值的研究方向。因为对于移动端的部署具有重要的意义,有效的降低了计算资源的消耗,使得基于深度学习的方法能够大面积运用。
模型压缩大致可以分为两种思路:
- 前端压缩:知识蒸馏,结构设计,剪支处理。
- 后端压缩:低秩近似,未加限制的剪支,参数量化,二值网络。
3.2 SqueezeNet
SqueezeNet这个算是比较偏早期的工作。想法也比较简单,尽可能使用1*1和3*3的卷积模块。
SqueezeNet提出了fire module。如下图:
整体的网络架构基本都是由fire module组装。
3.2 MobileNet
MobileNet是google系的轻网络。
- 采用深度可分离卷积(DepthWise可以在减少参数的同时提升运算速度。但是由于每个channel的feature map只被一个卷积核卷积,所以channel之间的信息无法得到交流。所以之后会有一个PointWise层(1*1卷积核的卷积层),来搭建channel之间的信息交流。
- 采用stride=2的卷积替代pooling层。提升运算速度,这个idea还是比较work的。
- 具体的模块见上面卷积的那一部分,图示比较清楚了。
MobileNet的具体模型如下图。
3.3 MobileNetV2
MobileNetV2是针对MobileNet的改进。
采用inverted residuals。在resnet中,res block先经过1*1降channel的维数,然后再经过3*3的卷积层,最后经过1*1再讲channel扩张到原维数。而inverted residuals则是反其道而行,先扩张后压缩。之所以会选择这种方式,是因为MobieNet采用DW方式提取特征,特征量已经压缩,如果再压缩,信息量急剧下降,会导致结果变差。两者的比较如下图。
采用linear bottlenecks。ReLu激活函数的半抑制性会一定程度的阻碍信息的流通,因此在block的最后一层会使用线性函数来保留整个特征的信息。不仅如此,还借鉴了resnet的shortcuts增加信息的流通。block对比图如下:
网络的模型如下表:
3.4 ShuffleNet-v1
ShuffleNet-v1是face++团队推出的基于移动端的轻量级网络。主题思路是利用group convolution。
- 采用group convolution减少大量参数。但是单纯的group和DW存在信息阻塞。
采用channel shuffle来增强信息交流。论文中也给出了实验得结果,确实能够提高性能。
采用concat替代add的channel叠加操作。增加信息量。
ShuffleNet的模型如下表:
3.4 ShuffleNet-v2
ShuffleNet-v2是基于ShuffleNet-v1的网络。
论文提出影响神经网络速度的四个因素。
- FLOPs(FLOPs就是网络执行了多少multiply-adds操作)
- MAC(内存访问成本)
- 并行度(如果网络并行度高,速度明显提升)
- 计算平台(GPU,ARM)
基于此,提出了四种思路:
- 输入输出的channel相同时,MAC最小
- 过度的组卷积会增加MAC
- 网络碎片化会降低并行度
- 元素级运算不可忽视
ShuffleNet V2提出channel split。将输入的channel分为两部分,其中没有做任何操作的一部分与经过几层卷积操作的channel组合,之后再shuffle,见下图c。对下采样的block,见图d,少了channel split。这两个block组成了ShuffleNet V2。
具体的网络结构如下: