学以致用。
学习经典CNN后,会对如何构建有效的CNN更有感觉。
AlexNet与LeNet在很多地方很相似,但是要大很多。LeNet-5大概6万个参数。而AlexNet大概6000万个参数。
AlexNet(比LeNet-5)表现出色的原因:
看论文可以绕过的点:
该论文是深度学习进入计算机视觉领域的开端。从这篇论文开始,计算机视觉的研究者开始重视深度学习,最后使得深度学习在其他领域也发扬光大。
一种没有很多超参数,只需要专注于构建卷积层的简单网络。VGG-16简化了神经网络结构。
VGG-16,即有16层网络的VGG,有13个CONV和3个FC。一共1.38亿个参数。
虽然是个大网络,但结构简单,规整,过滤器数量变化存在规律(64 - 128 - 256 - 512 - 512)。
缺点是:需要训练的特征数量非常巨大。
非常非常深的网络存在梯度消失和梯度爆炸问题,因此很难训练。
跳远连接(skip connections)可以从某一网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。
利用跳远连接构建能够训练深度网络的ResNets。
跳远连接(skip connections),又叫捷径(short cut),用来构建残差块,而残差块可以训练更深的神经网络。
将 a[l] a [ l ] 除了主路以外,直接在 a[l+2] a [ l + 2 ] 的激活函数前输入。
也就是 a[l+2]=g(z[l+2]+a[l]) a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) 。
构成一个残差块。
ResNet网络就是由很多这样的残差块构成。
上图,普通网络(plain network)使用跳远连接,构成5个残差块,生成了一个残差网络。
随着网络层数的增加,理论上训练误差应该越来越小;但在普通网络上却不是这样;而残差网络可以做到。
深度网络存在退化问题,即随着深度的加深,训练误差反而加大。
给一个普通网络加入残差块,如图所示。
整个网络使用Relu激活函数,那么,所有的激活值a>=0。
如果使用 L2 L 2 正则化或者权重衰减,会压缩 w[l+2] w [ l + 2 ] 的值。
如果对 b b 使用权重衰减,也可以达到相同效果。
如果 w[l+2]=0 w [ l + 2 ] = 0 ,为方便分析,假设此时 b[l+2]=0 b [ l + 2 ] = 0 ,那么 a[l+2]=a[l] a [ l + 2 ] = a [ l ] 。
以上分析表明:
残差块可以很容易地学习到恒等式函数。
即,skip connection 使网络很容易得到 a[l+2]=a[l] a [ l + 2 ] = a [ l ] 这个恒等式。
这意味着,即使给神经网络增加了两层,也没有使得网络的性能降低。因为学习恒等式函数对残差块来说很简单。尽管多了两层,但是也只是把 a[l] a [ l ] 的值赋给 a[l+2] a [ l + 2 ] 。
所以,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的性能。
但我们的目标不是仅仅在保持网络性能的条件下单纯的增加层数(要深还要好)。
如果我们新添加的隐藏单元能够学习到一些有用信息,那么它可能比学习到恒等式函数表现的更好(深,好)。
如果是没有残差块的深度普通网络,当网络不断加深时,其仅仅选择学习恒等式函数的参数都很困难。所以增加层数最后的表现不但不能变好,反而更糟。
总结:残差块学习恒等函数非常容易。所以可以很肯定的说,增加残差块不会使得网络的性能受到影响。很多时候,这些增加的残差块还可以提升网络的性能(如果残差块学习到有用信息的话)。反过来说,增加残差块至少不会降低网络的性能。
细节:
a[l+2]=g(z[l+2]+a[l]) a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) 中,假设 a[l] a [ l ] 和 z[l+2] z [ l + 2 ] 相同维度。
所以,ResNets使用了很多same convolutions。
如果 a[l] a [ l ] 和 z[l+2] z [ l + 2 ] 维度不相同,那么,给 a[l] a [ l ] 添加参数 ws w s 。
在图像信道数ch=1的时候,1 × × 1卷积核就是一个数字,没有什么意义。
在图像信道数ch>1的时候,1 × × 1卷积核会和输入矩阵构成网中网。
如上图所示,在输入中切出一个1 × × 1 × × 32的部分,和一个卷积核卷积,卷积核的32个数字就是一个网络的权重,如下图所示:
现在网络中会存在多个1 × × 1$过滤器,对于输入图像中的一个像素点(有多个通道)来说,和一个过滤器卷积,产生一个输出,和多个过滤器卷积,产生多个输出。如下图所示:
假设,图像的一个像素点为1 × × 1 × × 32,而1 × × 1 × × 32的卷积核有16个,那么最终产出就是1 × × 1 × × 16。
通过这一个像素点和多个1 × × 1卷积核生成的就是一个网中网,在本来的神经网络中,通过1 × × 1卷积操作产生的小神经网络。
一副6 × × 6的图像有36个像素点,就是这个网中网的36个输入。
用途:
上图中,如果选择192个过滤器,那就不是压缩信道数量。这时候,卷积核中带有的非线性函数,可以让网络学习更复杂的函数。
ps:卷积核卷积之后带有非线性函数。不光是1 × × 1卷积核。
当构建网络时,你需要决定卷积核的大小(1 × × 1、3 × × 3、5 × × 5等),以及是否添加池化层。
这些 Inception 网络都可以自动选择决定。 即代替人工来决定卷积层中过滤器的类型,或者确定是否需要创建卷积层或池化层。
即 Inception 层将不同的卷积核以及池化层罗列出来(注意输出的高度和宽度要保持一致,卷积和池化都需要做到)。
存在的问题是,5 × × 5卷积非常耗费算力。
计算成本问题:
上图,对个这个5 × × 5卷积,需要1.2亿次乘法运算。
为了缩减这个算力成本,用1\times$1卷积来压缩信道数量。压缩信道的这一层就叫做瓶颈层(bottleneck large)。
加入瓶颈层,改变网络架构后,需要1240万次乘法运算。
运算成本下降了十分之一。
瓶颈层的作用就是降低运算成本。
大幅压缩信道数量会不会影响网络性能?
只要合理选择瓶颈层大小,就可以显著缩小表示层规模的同时,不降低网络的性能。
Inception 网络论文资料:
把很多Inception模块通过某种方式连接起来,构成了Inception网络。
红色带箭头部分是为了修改数据的高度和宽度,所加入的池化层。
多出来的分支,是利用隐藏层信息做预测。隐藏层也参与了特征运算,也能够预测图像的分类。分支在Inception网络中,起到调整的作用,并用来防止网络发生过拟合。
上图中的网络是谷歌开发的,为向LeNet致敬,叫做GooLeNet。
那么为什么叫做Inception Network呢?
该论文中提到一个梗:“We need to go deeper”。
这句话出自盗梦空间(Inception)。
Inception原意为开始。
电影的解释为:insert + deception(插入+欺骗)。
论文的作者通过这个梗表达的是要建立更深的神经网络的决心。
最终,这个网络也被叫做Inception network。
之后还有Inception V2、Inception V3、Inception V4,以及加入了跳远连接的Inception。
像我这样的小白学习者学习深度学习的时候,很难做到复现论文中的成果。
幸运的是,很多大牛会把自己的成果开源。
如果看到一篇论文,想复现它的结果,那么就去github之类的网站找作者或者其他大牛的开源代码。
如果你在开发一个计算机视觉应用,一个常见的工作流程就是,先选择一个你喜欢的架构,
这个架构可能是你学习的,或者朋友推荐的,或者看文献看到的。然后去寻找一个开源实现。从github上下载下来,以此为基础开始构建。
这样做的好处是,这些网络通常都需要很长时间训练,或许有人已经使用多个gpu通过庞大的数据集预先训练了这些网络。这样以来,你就可以使用这些预训练的网络进行迁移学习。
用别人已经预训练好的神经网络,来实现自己感兴趣的东西。
实现一个猫分类器,将别人的网络下载下来,同时权重也下载下来,冻结其他层权重,仅更换softmax层,然后训练softmax层参数。
通过使用其他人预训练的权重,即使只有一个小的数据集,自己微调后也很有可能会得到很好的性能。
一个加速训练的技巧:
先得到冻结参数的那些层最后的激活值(或者叫计算特征),即输入数据集,得到冻结层输出。然后将这些激活值存储在硬盘中。(预计算)
之后,用这些激活值作为改变了网络结构或者要训练权重的层的输入值(上图中为softmax层)去训练。这是一个很浅层的网络。
冻结规律:
对于小的训练集,可能会冻结所有隐藏层,仅改变输出层结构,训练输出层权重。
那么大的训练集怎么办呢?
规律:训练集数据越多,需要冻结的层数越少。
反过来说,数据集中的数据越多,能够训练的网络规模就越大。
如果数据集足够大,就可以不冻结,将开源的整个网络权重作为你要训练的网络的初始权重。仅改变网络的输出层结构。然后开始训练。
迁移学习:
预训练已经由开源者完成;
如果存在冻结,先进行预计算;
微调。
计算机视觉是一个经常用到迁移学习的领域。
除非你有一个非常非常大的数据集、非常大的算力以及大量的时间让你可以从头开始训练所有的东西。要不然迁移学习就是一个值得考虑的很好的选择。
常见数据扩充方法(主要使用镜像和随机裁剪):
镜像(mirroring);
随机裁剪(random cropping);
色彩转换(color shifting):
基于某种分布,对三个通道的像素值进行增减,产生新的图像。
这样可以使得模型对于照片的颜色更改更具鲁棒性。
RGB有不同的采样方式,其中一种扭曲颜色的算法PCA(主成分分析法),具体在AlexNet论文中。这种办法也叫做PCA色彩增强(PCA color augmentation)。
PCA的大体思路:
假设图像呈紫色,即含有的红色和蓝色量大,绿色分量少。即R、B通道数值大,G通道数值小。PCA会对红色和蓝色增减很多。绿色变化少一点。从而使得整体的颜色保持一致。
数据增强和网络训练可以同时并行的进行。
当数据量大时,人们倾向于使用更简单的算法和更少的手工工程。也就是不需要为此进行精心设计,而是可以用一个大的神经网络,甚至更简单的架构。
而数据量少的时候,就必须依赖于手工工程。
PS:图像识别和目标检测是两种不同的计算机视觉任务,由于图像识别的每一张图像仅需要一个标签,而目标检测必须用一个一个的框将一张图像中诸多物体框出来。所以目标检测的数据量更小。
机器学习有两种获取知识的途径:
计算机视觉在试图解决一个很复杂的问题,往往我们没有足够的数据来满足我们的需求。这就是为什么计算机视觉从过去到现在,都要更多地依赖手工工程的原因。也是计算机视觉一直在发展相当复杂的网络架构的原因。这也解释了为什么计算机视觉任务具有那么多的超参数。
在数据量不足的时候,手工工程是一个非常有技巧的任务,需要很强的洞察力。对手工工程有深刻见解的人将获得更好的表现。
在数据量不足的时候,迁移学习是另一个有用的工具。
集成:
在测试时多裁剪:
计算机视觉任务是小数据类型任务。而在一个计算机视觉任务上获得成功的模型很可能在另一个任务中也有不俗的表现。所以,尽量使用开源。
拥抱开源: