Case studies
Classic Networks
下图所示的是一个数字识别的LeNet-5的模型结构:
下图所示是Alex-Net模型:
AlexNet模型与LeNet-5模型类似,只是要复杂一些,总共包含了大约6千万个参数。同样可以根据实际情况使用激活函数ReLU。原作者还提到了一种优化技巧,叫做Local Response Normalization(LRN)。 而在实际应用中,LRN的效果并不突出。
VGG-16模型更加复杂一些,一般情况下,其CONV layer和POOL layer设置如下:
- CONV = 3x3 filters, s = 1, same
- MAX-POOL = 2x2, s = 2
VGG-16结构如下所示:
VGG-16的参数多达1亿3千万。
ResNets
如果神经网络层数越多,网络越深,源于梯度消失和梯度爆炸的影响,整个模型难以训练成功。解决的方法之一是人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为Residual Networks(ResNets)。
Residual Networks由许多隔层相连的神经元子模块组成,我们称之为Residual block。单个Residual block的结构如下图所示:
其前向传播的计算步骤为:
Linear:
Relu:
Linear:
Relu:
由多个Residual block组成的神经网络就是Residual Network。实验表明,这种模型结构对于训练非常深的神经网络,效果很好。另外,为了便于区分,我们把非Residual Networks称为Plain Network。
与Plain Network相比,Residual Network能够训练更深层的神经网络,有效避免发生发生梯度消失和梯度爆炸。从下面两张图的对比中可以看出,随着神经网络层数增加,Plain Network实际性能会变差,training error甚至会变大。然而,Residual Network的训练效果却很好,training error一直呈下降趋势。
Why ResNets Work
如上图所示,输入x经过很多层神经网络后输出
,
经过一个Residual block输出
。
的表达式为:
输入x经过Big NN后,若
,
,则有:
可以看出,即使发生了梯度消失, , ,也能直接建立 与 的线性关系,且 。 直接连到 ,从效果来说,相当于直接忽略了 之后的这两层神经层。这样,看似很深的神经网络,其实由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。而且从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能。
当然,如果Residual blocks确实能训练得到非线性关系,那么也会忽略short cut,跟Plain Network起到同样的效果。
有一点需要注意的是,如果Residual blocks中 和 的维度不同,通常可以引入矩阵 ,与 相乘,使得 的维度与 一致。参数矩阵 有来两种方法得到:一种是将 作为学习参数,通过模型训练得到;另一种是固定 值(类似单位矩阵),不需要训练, 与 的乘积仅仅使得 截断或者补零。这两种方法都可行。
下图所示的是ResNets的结构:
ResNets同类型层之间,例如CONV layers,大多使用same类型,保持维度相同。如果是不同类型层之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵
Networks in Networks and 1X1 Convolutions
介绍了一种新的CNN结构,即1x1 Convolutions,也称Networks in Networks。这种结构的特点是滤波器算子filter的维度为1x1。对于单个filter,1x1的维度,意味着卷积操作等同于乘积操作。
那么,对于多个filters,1x1 Convolutions的作用实际上类似全连接层的神经网络结构。效果等同于Plain Network中 到 的过程。这点还是比较好理解的。
1x1 Convolutions可以用来缩减输入图片的通道数目。方法如下图所示:
Inception Network Motivation
主要结构:
Inception Network在单层网络上可以使用多个不同尺寸的filters,进行same convolutions,把各filter下得到的输出拼接起来。除此之外,还可以将CONV layer与POOL layer混合,同时实现各种效果。但是要注意使用same pool。
在上面的Inception结构中,应用了不同的卷积核,以及带padding的池化层。在保持输入图片大小不变的情况下,通过不同运算结果的叠加,增加了通道的数量。
成本问题:
对于上图conv layer的计算量为:28x28x32x5x5x192=120m,其中m表示百万单位。可以看出但这一层的计算量都是很大的。为此,我们可以引入1x1 Convolutions来减少其计算量,结构如下图所示:
对于1×1大小卷积核用作过渡的计算成本,也将上面的中间的层叫做“bottleneck layer”。
- 1×1卷积层计算成本:28×28×16×1×1×192=2.4M
- 5×5卷积层计算成本:28×28×32×5×5×16=10.0M
- 总的计算成本: 2.4M+10.0M=12.4M
明显地,虽然多引入了1x1 Convolution层,但是总共的计算量减少了近90%,效果还是非常明显的。由此可见,1x1 Convolutions还可以有效减少CONV layer的计算量。
Inception Network
上一节我们使用1x1 Convolution来减少Inception Network计算量大的问题。引入1x1 Convolution后的Inception module如下图所示:
多个Inception modules组成Inception Network,效果如下图所示:
上述Inception Network除了由许多Inception modules组成之外,值得一提的是网络中间隐藏层也可以作为输出层Softmax,有利于防止发生过拟合。
Practical advices for using ConvNets
Transfer Learning
小数据集:
如今在深度学习领域,许多研究者都会将他们的工作共享到网络上。在我们实施自己的工作的时候,比如说做某种物体的识别分类,但是只有少量的数据集,对于从头开始训练一个深度网络结构是远远不够的。
但是我们可以应用迁移学习,应用其他研究者建立的模型和参数,用少量的数据仅训练最后自定义的softmax网络。从而能够在小数据集上达到很好的效果。
大数据集:
如果我们在自己的问题上也拥有大量的数据集,我们可以多训练后面的几层。总之随着数据集的增加,我们需要“ freeze”的层数越来越少。最后如果我们有十分庞大的数据集,那么我们可以训练网络模型的所有参数,将其他研究者训练的模型参数作为参数的初始化来替代随机初始化,来加速我们模型的训练。
Data Augmentation
常用的Data Augmentation方法是对已有的样本集进行Mirroring和Random Cropping。
另一种Data Augmentation的方法是color shifting。color shifting就是对图片的RGB通道数值进行随意增加或者减少,改变图片色调。
除了随意改变RGB通道数值外,还可以更有针对性地对图片的RGB通道进行PCA color augmentation,也就是对图片颜色进行主成分分析,对主要的通道颜色进行增加或减少,可以采用高斯扰动做法。这样也能增加有效的样本数量。具体的PCA color augmentation做法可以查阅AlexNet的相关论文。
最后提一下,在构建大型神经网络的时候,data augmentation和training可以由两个不同的线程来进行。
State of Computer Vision
神经网络需要数据,不同的网络模型所需的数据量是不同的。Object dection,Image recognition,Speech recognition所需的数据量依次增加。一般来说,如果data较少,那么就需要更多的hand-engineering,对已有data进行处理,比如上一节介绍的data augmentation。模型算法也会相对要复杂一些。如果data很多,可以构建深层神经网络,不需要太多的hand-engineering,模型算法也就相对简单一些。
值得一提的是hand-engineering是一项非常重要也比较困难的工作。很多时候,hand-engineering对模型训练效果影响很大,特别是在数据量不多的情况下。
在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
-
Ensembling: Train several networks independently and average their outputs.
-
Multi-crop at test time: Run classifier on multiple versions of test images and average results.
但是由于这两种方法计算成本较大,一般不适用于实际项目开发。
最后,我们还要灵活使用开源代码:
- Use archittectures of networks published in the literature
- Use open source implementations if possible
- Use pretrained models and fine-tune on your dataset