目录
- 深度卷积神经网络
- 经典网络
- 残差网络
- 为什么残差有效?
- \(1\times1卷积\)
- Inception网络简介
- Inception网络
深度卷积神经网络
经典网络
LeNet-5模型是Yann LeCun教授于1998年提出来的,它是第一个成功应用于数字识别问题的卷积神经网络。在MNIST数据中,它的准确率达到大约99.2%。典型的LeNet-5结构包含CONV layer,POOL layer和FC layer,顺序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer,即\(\hat y\)。
在这篇论文写成的那个年代,人们更喜欢使用平均池化,而现在我们可能用最大池化更多一些
下图所示的是一个数字识别的LeNet-5的模型结构:
因为没有padding,如果我们从左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的32×32缩小到28×28,再到14×14、10×10,最后只有5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从1增加到6个,再到16个。
这个神经网络中还有一种模式至今仍然经常用到,就是一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。
该LeNet模型总共包含了大约6万个参数。值得一提的是,当时Yann LeCun提出的LeNet-5模型池化层使用的是average pool,而且各层激活函数一般是Sigmoid和tanh。现在,我们可以根据需要,做出改进,使用max pool和激活函数ReLU。AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其结构如下所示:
AlexNet模型与LeNet-5模型类似,只是要复杂一些,总共包含了大约6千万个参数。同样可以根据实际情况使用激活函数ReLU。
VGG-16模型更加复杂一些,一般情况下,其CONV layer和POOL layer设置如下:
- CONV = 3x3 filters, s = 1, same
- MAX-POOL = 2x2, s = 2
VGG-16结构如下所示:
VGG-16的参数多达1亿3千万。
残差网络
非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。这里介绍跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。可以利用跳跃连接构建能够训练深度网络的ResNets。
Residual Networks由许多隔层相连的神经元子模块组成,我们称之为Residual block。单个Residual block的结构如下图所示:
上图中红色部分就是skip connection,直接建立\(a^{[l]}\)与\(a^{[l+2]}\)之间的隔层联系。相应的表达式如下:
\[z^{[l+1]}=W^{[l+1]}a^{[l]}+b^{[l+1]}\]
\[a^{[l+1]}=g(z^{[l+1]})\]
\[z^{[l+2]}=W^{[l+2]}a^{[l+1]}+b^{[l+2]}\]
\[a^{[l+2]}=g(z^{[l+2]}+a^{[l]})\]
\(a^{[l]}\)直接隔层与下一层的线性输出相连,与\(z^{[l+2]}\)共同通过激活函数(ReLU)输出\(a^{[l+2]}\)。
该模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多个Residual block组成的神经网络就是Residual Network。实验表明,这种模型结构对于训练非常深的神经网络,效果很好。另外,为了便于区分,我们把非Residual Networks称为Plain Network。
Residual Network的结构如上图所示。与Plain Network相比,Residual Network能够训练更深层的神经网络,有效避免发生发生梯度消失和梯度爆炸。从下面两张图的对比中可以看出,随着神经网络层数增加,Plain Network实际性能会变差,training error甚至会变大。然而,Residual Network的训练效果却很好,training error一直呈下降趋势。
为什么残差有效?
下面用个例子来解释为什么ResNets能够训练更深层的神经网络。
如上图所示,输入x经过很多层神经网络后输出\(a^{[l]}\),\(a^{[l]}\)经过一个Residual block输出\(a^{[l+2]}\)。\(a^{[l+2]}\)的表达式为:
\[a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})\]
如果对W进行正则化或者权重衰减的话,最后会使得\(W^{[l+2]}\),这里为了方便再假设对偏置参数b进行了正则化或权重衰减,那么有b[l+2]≈0,则有:
\[a^{[l+2]}=g(a^{[l]})=ReLU(a^{[l]})=a^{[l]}\ \ \ \ when\ a^{[l]}\geq0\]
因为ReLU的图像是这样的:
可以看出,即使发生了梯度消失,\(W^{[l+2]}\approx0\),\(b^{[l+2]}\approx0\),,也能直接建立\(a^{[l+2]}\)与\(a^{[l]}\)的线性关系,且\(a^{[l+2]}=a^{[l]}\),这其实就是恒等函数。与\(a^{[l]}\)直接连到\(a^{[l+2]}\),从效果来说,相当于直接忽略了\(a^{[l]}\)之后的这两层神经层。这样,看似很深的神经网络,其实由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。而且从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能。
当然,如果Residual blocks确实能训练得到非线性关系,那么也会忽略short cut,跟Plain Network起到同样的效果。
有一点需要注意的是,如果Residual blocks中\(a^{[l]}\)和\(a^{[l+2]}\)的维度不同,通常可以引入矩阵\(W_s\),与\(a^{[l]}\)相乘,使得W_s*a{[l]}$的维度与$a\(一致。参数矩阵\)W_s\(有来两种方法得到:一种是将\)W_s\(作为学习参数,通过模型训练得到;另一种是固定\)W_s\(值(类似单位矩阵),不需要训练,\)W_s\(与\)a{[l]}$的乘积仅仅使得$a\(截断或者补零。这两种方法都可行。下图所示的是CNN中ResNets的结构:![image]()ResNets同类型层之间,例如CONV layers,大多使用same类型,保持维度相同。如果是不同类型层之间的连接,例如CONV layer与POOL layer之间,如果维度不同,则引入矩阵\)W_s$。
\(1\times1卷积\)
Min Lin, Qiang Chen等人提出了一种新的CNN结构,即1x1 Convolutions,也称Networks in Networks。这种结构的特点是滤波器算子filter的维度为1x1。对于单个filter,1x1的维度,意味着卷积操作等同于乘积操作。
那么,对于多个filters,1x1 Convolutions的作用实际上类似全连接层的神经网络结构。效果等同于Plain Network中\(a^{[l]}\)到\(a^{[l+1]}\)的过程。这点还是比较好理解的。
1x1 Convolutions可以用来缩减输入图片的通道数目。方法如下图所示:
Inception网络简介
之前介绍的CNN单层的滤波算子filter尺寸是固定的,1x1或者3x3等。而Inception Network在单层网络上可以使用多个不同尺寸的filters,进行same convolutions,把各filter下得到的输出拼接起来。除此之外,还可以将CONV layer与POOL layer混合,同时实现各种效果。但是要注意使用same pool。
Inception Network由Christian Szegedy, Wei Liu等人提出。与其它只选择单一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并将CONV和POOL混合起来,将所有功能输出组合拼接,再由神经网络本身去学习参数并选择最好的模块。
Inception Network在提升性能的同时,会带来计算量大的问题。例如下面这个例子:
此CONV layer需要的计算量为:28x28x32x5x5x192=120m。可以看出这一层的计算量都是很大的。为此,我们可以引入1x1 Convolutions来减少其计算量,结构如下图所示:
通常我们把该1x1卷积层称为“瓶颈层”(bottleneck layer)。
因为在这个网络中它最小,在它之前大,在它之后也大,就像一个瓶子的形状,瓶颈部分是最小的。
引入bottleneck layer之后,总共需要的计算量为:28x28x16x192+28x28x32x5x5x16=12.4m。明显地,虽然多引入了1x1 Convolution层,但是总共的计算量减少了近90%,效果还是非常明显的。由此可见,1x1 Convolutions还可以有效减少CONV layer的计算量。
总结一下,如果你在构建神经网络层的时候,不想决定池化层是使用1×1,3×3还是5×5的过滤器,那么Inception模块就是最好的选择。我们可以应用各种类型的过滤器,只需要把输出连接起来。
可能会有这样的疑问,仅仅大幅缩小形式上面的尺寸会不会影响神经网络的性能?事实证明,只要合理构建瓶颈层,你既可以显著缩小表示出来的规模,又不会降低网络性能,从而节省了计算成本。
Inception网络
上一节使用1x1 Convolution来减少Inception Network计算量大的问题。引入1x1 Convolution后的Inception module如下图所示:
多个Inception modules组成Inception Network,效果如下图所示:
上述Inception Network除了由许多Inception modules组成之外,值得一提的是网络中间隐藏层也可以作为输出层Softmax,有利于防止发生过拟合。
还有这个特别的Inception网络是由Google公司的作者所研发的,也被叫做GoogLeNet,这个名字是为了向LeNet网络致敬。