笔者主要从事图像的识别与分类研究,在这里笔者值探讨卷积神经的发展史。
1.BP
1985年,Rumelhart和Hinton等人提出了后向传播(Back Propagation,BP)算法(也有说1986年的,指的是他们另一篇paper:Learning representations by back-propagating errors),使得神经网络的训练变得简单可行,这篇文章在Google Scholar上的引用次数达到了19000多次,目前还是比Cortes和Vapnic的Support-Vector Networks稍落后一点,不过以Deep Learning最近的发展劲头来看,超越指日可待。
【注】BP虽然不算卷积神经网络,但它是神经网络的老前辈,学习神经网络不得不知道的一个网络啊。
Hinton主页
2.LeNet5
1988年,LeCun在BP网络的基础上发表了“A theoretical framework for Back-Propagation”几年后,LeCun利用BP算法来训练多层神经网络用于识别手写邮政编码,(论文:Handwritten Digit Recognition: Applications of Neural Net Chips and Automatic Learning)这个工作也可以说是就是CNN的开山之作,多处用到了55的卷积核,但在这篇文章中LeCun只是说把55的相邻区域作为感受野,并未提及卷积或卷积神经网络。在随后很多年,LeCun不断优化,发表了很多关于手写识别的文章。
1994年,word-level training of a handwritten word recognizer based on convolutional neural networks发表,这可以说是最早的卷积神经网络之一, 并且推动了深度学习领域的发展。自从1988年开始,在许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5(参见:Gradient-Based Learning Applied to Document Recognition).
1998年的LeNet5标注着CNN的真正面世,但是这个模型在后来的一段时间并未能火起来,主要原因是要求机器性能较好,而且其他的算法像SVM也能达到类似的效果甚至超过。
LeNet5的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方法。在那时候,没有GPU帮助训练,甚至CPU的速度也很慢。因此,能够保存参数以及计算过程是一个关键的进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5阐述了那些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。
LeNet5特征能够总结为如下几点:
1)卷积神经网络使用三个层作为一个系列: 卷积,池化,非线性;
2)使用卷积提取空间特征;
3)使用映射到空间均值下采样(subsample);
4)双曲线(tanh)或S型(sigmoid)形式的非线性;
5)多层神经网络(MLP)作为最后的分类器;
6)层与层之间的稀疏连接矩阵避免大的计算成本。
总体看来,这个网络是最近大量神经网络架构的起点,并且也给这个领域带来了许多灵感。
【注】以上提及的文章均可在LeCun的主页中找到。
从1998年到2010年,神经网络处于孵化阶段,大多数人没有意识到他们不断增强的力量,与此同时其他研究者则进展缓慢。由于手机相机以及便宜的数字相机的出现,越来越多的数据可被利用。并且计算能力也在成长,CPU变得更快,GPU变成了多种用途的计算工具。这些趋势使得神经网络有所进展,虽然速度很慢,数据和计算能力使得神经网络能够完成的任务越来越有趣,之后一切变得清晰起来。
3.Dan Ciresan Net
2010 年的时候,**Dan Claudiu Ciresan 和 Jurgen Schmidhuber **发布了最早的 GPU 神经网络的一个实现。这个实现是在一块 NVIDIA GTX 280 图形处理器上运行 9 层的神经网络,包含前向与反向传播。
2010年Dan Claudiu Ciresan和Jurgen Schmidhuber发表了一个GPU神经网络(Deep Big Simple Neural Nets Excel on Handwritten Digit Recognition)。论文里面证明了使用 NVIDIA GTX 280 GPU之后能够处理高达9层的神经网络。
从此之后,Nvidia公司的股价开始不断攀升,深度学习也越来越为人们所熟知。
4. AlexNet
2012年,Alex Krizhevsky发表了AlexNet(参见 ImageNet Classification with Deep Convolutional Neural Networks),它是LeNet的一种更深更宽的版本,并以显著的优势赢得了困难的ImageNet竞赛。
AlexNet是在2012年被发表的一个经典之作,并在当年取得了ImageNet最好的成绩,也是在那年之后,更多的更深的神经网络被提出,其官方提供的数据模型。
AlexNet 将LeNet的思想扩展到了更大的能学习到更复杂的对象层次的神经网络上。这项工作的贡献有:
1)使用修正的非线性单元(ReLU)
2)在训练的时候使用Dropout技术有选择的忽视单个神经元,从而避免过拟合
3)覆盖进行最大池化,避免平均池化的平均化效果。
4)使用GPU NVIDIA GTX580减少训练时间
在那时, GPU比CPU提供更多数量的核,训练时间可以提升10倍。这又反过来允许使用更大的数据集和更大的图像。
AlexNet的成功掀起了一场小革命。卷积神经网络现在是深度学习的骨干。它已经变成了现在能够解决有用任务的大型神经网络的代名词。
Alex Krizhevsky主页及论文下载地址1
Alex Krizhevsky主页及论文下载地址2
5.ZF Net
2013 ILSVRC比赛冠军,结构相对于AlexNet无太大的变化,只是进行了参数的优化。使用Relu激活函数,交叉熵代价函数。
Matthew D. Zeiler论文下载
Rob Fergus主页
6.Overfeat
2013年12月, 纽约大学的Yann LeCun实验室提出了AlexNet的衍生–Overfeat(参见: OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks). 这篇文章也提过了学习边界框(learning bounding box),并导致之后出现了很多研究同一主题的论文。
7.VGG-Net
2014年,来自牛津大学的VGG网络(参见: Very Deep Convolutional Networks for Large-Scale Image Recognition)是第一个在各个卷积层使用更小的3*3过滤器(filter),并把他们组合成为一个卷积序列进行处理的网络。
这看起来和LeNet的原理相反,即使用大的卷积来获得一张图像中相似的特征。和AlexNet的99或1111过滤器不同,VGG的过滤器很小,离LeNet竭力所要避免的臭名昭著的11的卷积异常接近–至少在该网络的第一层是这样。但是VGG巨大的进展是通过依次采用多个33的卷积,能够模仿出更大的感受野(receptive field)的效果,例如55或77.这些思想也被用在了最近的更多的网络架构上。如Inception与ResNet。
VGG网络使用多个33卷积层去表征复杂特征。如果VGG-E的第3,4,5块(block):256256 和 512512个33过滤器被依次使用多次,以提取更多复杂特征以及这些特征的组合。其效果就等于一个带有3个卷积层的大型的512*512分类器。这显然意味着大量的参数和学习能力。但是这些网络训练困难,必须划分到较小的网络,并逐层累加。这是因为缺少强大的方式对模型进行正则化,这样或多或少约束大量由于大量参数增长的搜索空间。
VGG在许多层中都使用大特征尺寸,因为推断(inference)在运行时是相当耗费时间。正如Inception的瓶颈那样,减少特征的数量将节省一些计算成本。
VGG-Net 在ILSVRC localization and classification 两个问题上分别取得了第一名和第二名,VGG-Net不同于AlexNet的地方是:VGG-Net使用更多的层,通常有16-19层,而AlexNet只有8层。另外一个不同的地方是:VGG-Net的所有 convolutional layer 使用同样大小的 convolutional filter,大小为 3 x 3。
目前VGG有6个版本。
Andrew Zisserman主页
Karen Simonyan主页
8.NIN
网络中的网络(NiN,参见论文: Network in Network)的思路简单又伟大: 使用1*1卷积为卷积层的特征提供更组合型的能力。
NiN架构在各个卷积之后使用空间MLP层,以便更好地在其它层之前组合特征。同样,你可以认为11卷积与LeNet最初的原理相悖,但是事实上他们可以以一种更好的方式组合卷积特征,而这时不可能通过简单的堆叠更多的卷积特征做到的。这和使用原始像素作为下一层输入是有区别的。其中11卷积常常被用于在卷积之后的特征映射上对特征进行空间组合,所以它们实际上可以使用非常少的参数,并在这些特征上的所有像素上共享。
MLP的能力是通过将卷积特征组合到更复杂的组(group)来极大地增强单个卷积特征的有效性。这个想法之后被用到一些最近的框架上,例如ResNet,Inception及其衍生技术。
NiN也使用了平均池化层作为最后分类器的一部分,这是另一种将会变得常见的实践。这是用过在分类之前对网络针对多个输入图像的响应进行平均完成的。
NIN目前有3个版本。
9. R-CNN、Fast R-CNN、Faster R-CNN
RCNN(Regions with CNN features)是将CNN方法应用到目标检测问题上的一个里程碑,由年轻有为的RBG大神提出,借助CNN良好的特征提取和分类性能,通过RegionProposal方法实现目标检测问题的转化。
各个论文均可在Ross Girshick主页找到。
源码:
R-CNN:
https://github.com/rbgirshick/rcnn
Fast R-CNN:
https://github.com/rbgirshick/fast-rcnn
https://github.com/rbgirshick/caffe-fast-rcnn
Faster R-CNN:
https://github.com/chenyuntc/simple-faster-rcnn-pytorch
https://github.com/YoungGer/Faster-RCNN-Pytorch
https://github.com/rbgirshick/py-faster-rcnn
10.GoogLeNet
来自Google的Christian Szegedy 开始追求减少深度学习网络的计算开销, 并设计出GoogleLeNet-第一个Inception架构。
在2014年秋季,深度学习模型正在变得在图像与视频帧的分类中非常有用。大多数怀疑者已经不再怀疑深度学习与神经网络这一次真的回来了。而且相信这种趋势将一直发展下去。鉴于这些技术的用处,谷歌这样的巨头非常有兴趣在他们的服务器上高效且大规模的部署这些架构。
在2014年ILSVRC挑战赛获得冠军,将Top5 的错误率降低到6.67%. 一个22层的深度网络,论文题目为:Going deeper with convolutions。GoogLeNet这个名字也是挺有意思的,为了像开山鼻祖的LeNet网络致敬,他们选择了这样的名字。
GoogLeNet使用没有Inception模块的主干作为初始层,之后是与NiN相似的一个平均池化层加softmax分类器。这个分类器比AlexNet与VGG的分类器的运算数量少的多。这也促成了一项非常有效的网络设计(参见论文: An Analysis of Deep Neural Network Models for Practical Applications)Christian和他的团队都是非常高产的研究人员。2015年2月,Batch-normalized Inception被引入作为InceptionV2(参见论文: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift).Batch-normalization 在一层的输出上计算所有特征映射的均值和标准差,并且使用这些值规范化它们的响应。这相当于数据增白(whitening),因此使得所有的神经图(neural maps)在同样的范围内有响应,而且是零均值。在下一层不需要从输入数据中学习offset时,这有助于训练,还能重点关注如何最好的结合这些特性。
2015年12月, 该团队发布Inception模块和类似架构的一个新版本(参见论文:Rethinking the Inception Architechture for Computer Vision).该论文更好地解释了原始的GoogLeNet架构,在设计选择上给出了更过的细节。原始思路如下:
通过谨慎构建网络,平衡深度与宽度,从而最大化进入网络的信息流。在每次池化之前,增加特征映射。每当深度增加时,网络层的深度或者特征的数量也系统性的增加。使得每一层深度增加之前,先增加特征的结合。一般只使用33的卷积,可能情况下将55和77过滤器分成多个33。
Inception v4也结合了Inception模块和ResNet模块的特性。我认为该架构不太简洁。但也充斥着较少透明度的启发法。很难理解里面的选择,对作者而言也难以解释。考虑到网络的简洁性,可被轻易理解并修正,那ResNet可能就更好了。
目前GoogLeNet有4个版本。
论文地址:
[v1] Going Deeper with Convolutions, 6.67% test error
http://arxiv.org/abs/1409.4842
[v2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error
http://arxiv.org/abs/1502.03167
[v3] Rethinking the Inception Architecture for Computer Vision, 3.5% test error
http://arxiv.org/abs/1512.00567
[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error
http://arxiv.org/abs/1602.07261
11.ResNet
2015年12月又出现了新的变革,这和Inception V3出现的时间一样。ResNet有着简单的思路:供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层(参见论文: Deep Residual Learning for Image Recognition)。
这和之前的一些旧思路类似。DanReSNet中,他们分流两个层并被应用于更大的规模。在两层后分流是一个关键的直觉。因为分流一个层并未给出更多的改进。通过两层可能认为是一个小型的分类器,或者一个Network-In-Network。
这是第一个超过100的网络, 甚至还能训练出1000层的网络。
有大量网络层的ResNet开始使用类似于Inception瓶颈层的网络层,这种层通过首先由带有更小输出的11卷积较少特征的数量,然后使用一个33的层,再使用1*1层处理更大量的特征。类似于Inception模块,这样能够保证计算量低,同事提供丰富的特征结合。
ResNet在输入上使用相对简单的初始化层: 一个带有两个池的7*7卷积层。可以把这个与更复杂、更少直觉性的InceptionV3 V4坐下对比。ResNet也是用一个池化层加上softmax作为最后的分类器。
关于ResNet的其他洞见每天都有发生:
ResNet可被认为既是平行模块又是连续模块,把输入输出视为在许多模块中并行,同时每个模块的输出又是连续连接的。
ResNet也可被视为并行模块或连续模块的多种组合(参见论文: Residual Networks are Exponential Ensembles of Relatively Shallow Networks)。
已经发现ResNet通常在20-30层的网络块上以并行的方式运行。而不是连续流过整个网络长度。
当ResNet像RNN一样把输出反馈到输入时,该网络可被视为更好的生物上可信的皮质模型(参见论文: Bridging the Gaps between Residual Learning, Recurrent Neural Networks and Visual Cortex)。
12.SqueezeNet
2016年,SqueezeNet(参见论文: SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size)是最近才公布的,该架构对ResNet与Inception里面的概念进行了重新的处理。一个更好的架构设计网络型号要小,而且参数还不需要复杂的压缩算法。
目前有4个版本。
13.ENet
详细了解ENet可参见论文:ENet: A Deep Neural Network Architecture for Real-time semantic Segmentation. ENet 是一个编码加解码的网络,将分类反向传播给原始图像进行分割。这只使用了神经网络,没有其他算法进行图像分割。
ENet被设计为在开始时尽可能使用最小数量的资源。正是因为它有着如此小的脚本,编码器和解码器网络共占有0.7MB 16fp的精度。即使这么小的型号,ENet在分割准确度上也类似于或高于其他神经网络的解决方案。
14. FractalNet
(参见论文: FractalNet:Ultra-Deep Neural Network without Residuals)使用递归架构,它没有在ImageNet上测试。该架构是ResNet的衍生或者更通用的ResNet。
目前有4个版本。
15.Xception
Xception是google继Inception后提出的对Inception v3的另一种改进,主要是采用depthwise separable convolution来替换原来Inception v3中的卷积操作。
目前有3个版本。