天天看点

深度学习之四大经典CNN技术浅析 | 硬创公开课

深度学习之四大经典CNN技术浅析 | 硬创公开课

雷锋网按2月28日下午3点《tensorflow实战》作者黄文坚做客【硬创公开课】为我们讲解了关于四大经典cnn网络alexnet、vggnet、google inception net和resnet的基本原理。本次公开课内容主要节选自作者《tensorflow实战》第6章关于这四大cnn网络实现方式可参考作者新书《tensorflow实战》其中有这几种网络的详细实现步骤。

嘉宾介绍

黄文坚ppmoney

大数据算法总监谷歌 tensorflow 贡献者畅销书《 tensorflow 实战》作者该书获得到了谷歌 tensorflow

团队的官方推荐。前明略数据技术合伙人领导了对诸多大型银行、保险公司、基金的数据挖掘项目包括建立金融风控模型、新闻舆情分析、保险复购预测等。曾就职于阿里巴巴搜索引擎算法团队负责天猫个性化搜索系统。曾参加阿里巴巴大数据推荐算法大赛于

7000 多支队伍中获得前 10 名。本科、研究生就读于香港科技大学曾在顶级会议和期刊 sigmobile mobicom、ieee

transactions on image processing

发表论文研究成果获美国计算机协会移动计算大会mobicom最佳移动应用技术冠军并获得两项美国专利和一项中国专利。

深度学习之四大经典CNN技术浅析 | 硬创公开课

以下为本次公开课主要内容。

大家好我这次将主要介绍四种经典的卷积神经网络它们分别是

alexnet vggnet google inception net resnet

这4种网络依照出现的先后顺序排列深度和复杂度也依次递进。它们分别获得了ilsvrcimagenet large scale visual recognition challenge比赛分类项目的2012年冠军top-5错误率16.4%使用额外数据可达到15.3%8层神经网络、2014年亚军top-5错误率7.3%19层神经网络2014年冠军top-5错误率6.7%22层神经网络和2015年的冠军top-5错误率3.57%152层神经网络。

这4个经典的网络都在各自的年代率先使用了很多先进的卷积神经网络结构对卷积网络乃至深度学习有非常大的推动作用也象征了卷积神经网络在2012—2015这四年间的快速发展。如图1所示ilsvrc的top-5错误率在最近几年取得重大突破而主要的突破点都是在深度学习和卷积神经网络成绩的大幅提升几乎都伴随着卷积神经网络的层数加深。

而传统机器学习算法目前在ilsvrc上已经难以追上深度学习的步伐了以至于逐渐被称为浅层学习shallow learning。目前在imagenet数据集上人眼能达到的错误率大概在5.1%这还是经过了大量训练的专家能达到的成绩一般人要区分1000种类型的图片是比较困难的。而ilsvrc 2015年冠军——152层resnet的成绩达到错误率3.57%已经超过了人眼这说明卷积神经网络已经基本解决了imagenet数据集上的图片分类问题。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图1  历届ilsvrc比赛代表性模型的成绩及其神经网络深度

前面提到的计算机视觉比赛ilsvrc使用的数据都来自imagenet如图2所示。imagenet项目于2007年由斯坦福大学华人教授李飞飞创办目标是收集大量带有标注信息的图片数据供计算机视觉模型训练。imagenet拥有1500万张标注过的高清图片总共拥有22000类其中约有100万张标注了图片中主要物体的定位边框。imagenet项目最早的灵感来自于人类通过视觉学习世界的方式如果假定儿童的眼睛是生物照相机他们平均每200ms就拍照一次眼球转动一次的平均时间那么3岁大时孩子就已经看过了上亿张真实世界的照片可以算得上是一个非常大的数据集。imagenet项目下载了互联网上近10亿张图片使用亚马逊的土耳其机器人平台实现众包的标注过程有来自世界上167个国家的近5万名工作者帮忙一起筛选、标注。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图2  imagenet数据集图片示例

每年度的ilsvrc比赛数据集中大概拥有120万张图片以及1000类的标注是imagenet全部数据的一个子集。比赛一般采用top-5和top-1分类错误率作为模型性能的评测指标图3所示为alexnet识别ilsvrc数据集中图片的情况每张图片下面是分类预测得分最高的5个分类及其分值。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图3  alexnet识别ilsvrc数据集的top-5分类

alexnet 

2012年hinton的学生alex krizhevsky提出了深度卷积神经网络模型alexnet它可以算是lenet的一种更深更宽的版本。alexnet中包含了几个比较新的技术点也首次在cnn中成功应用了relu、dropout和lrn等trick。同时alexnet也使用了gpu进行运算加速作者开源了他们在gpu上训练卷积神经网络的cuda代码。alexnet包含了6亿3000万个连接6000万个参数和65万个神经元拥有5个卷积层其中3个卷积层后面连接了最大池化层最后还有3个全连接层。alexnet以显著的优势赢得了竞争激烈的ilsvrc 2012比赛top-5的错误率降低至了16.4%相比第二名的成绩26.2%错误率有了巨大的提升。alexnet可以说是神经网络在低谷期后的第一次发声确立了深度学习深度卷积网络在计算机视觉的统治地位同时也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。

alexnet将lenet的思想发扬光大把cnn的基本原理应用到了很深很宽的网络中。alexnet主要使用到的新技术点如下。

1成功使用relu作为cnn的激活函数并验证其效果在较深的网络超过了sigmoid成功解决了sigmoid在网络较深时的梯度弥散问题。虽然relu激活函数在很久之前就被提出了但是直到alexnet的出现才将其发扬光大。

2训练时使用dropout随机忽略一部分神经元以避免模型过拟合。dropout虽有单独的论文论述但是alexnet将其实用化通过实践证实了它的效果。在alexnet中主要是最后几个全连接层使用了dropout。

3在cnn中使用重叠的最大池化。此前cnn中普遍使用平均池化alexnet全部使用最大池化避免平均池化的模糊化效果。并且alexnet中提出让步长比池化核的尺寸小这样池化层的输出之间会有重叠和覆盖提升了特征的丰富性。

4提出了lrn层对局部神经元的活动创建竞争机制使得其中响应比较大的值变得相对更大并抑制其他反馈较小的神经元增强了模型的泛化能力。

5使用cuda加速深度卷积网络的训练利用gpu强大的并行计算能力处理神经网络训练时大量的矩阵运算。alexnet使用了两块gtx 580 gpu进行训练单个gtx 580只有3gb显存这限制了可训练的网络的最大规模。因此作者将alexnet分布在两个gpu上在每个gpu的显存中储存一半的神经元的参数。因为gpu之间通信方便可以互相访问显存而不需要通过主机内存所以同时使用多块gpu也是非常高效的。同时alexnet的设计让gpu之间的通信只在网络的某些层进行控制了通信的性能损耗。 

6数据增强随机地从256´256的原始图像中截取224´224大小的区域以及水平翻转的镜像相当于增加了(256-224)2´2=2048倍的数据量。如果没有数据增强仅靠原始的数据量参数众多的cnn会陷入过拟合中使用了数据增强后可以大大减轻过拟合提升泛化能力。进行预测时则是取图片的四个角加中间共5个位置并进行左右翻转一共获得10张图片对他们进行预测并对10次结果求均值。同时alexnet论文中提到了会对图像的rgb数据进行pca处理并对主成分做一个标准差为0.1的高斯扰动增加一些噪声这个trick可以让错误率再下降1%。

整个alexnet有8个需要训练参数的层不包括池化层和lrn层前5层为卷积层后3层为全连接层如图4所示。alexnet最后一层是有1000类输出的softmax层用作分类。 lrn层出现在第1个及第2个卷积层后而最大池化层出现在两个lrn层及最后一个卷积层后。relu激活函数则应用在这8层每一层的后面。因为alexnet训练时使用了两块gpu因此这个结构图中不少组件都被拆为了两部分。现在我们gpu的显存可以放下全部模型参数因此只考虑一块gpu的情况即可。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图4  alexnet的网络结构

alexnet每层的超参数如图5所示。其中输入的图片尺寸为224´224第一个卷积层使用了较大的卷积核尺寸11´11步长为4有96个卷积核紧接着一个lrn层然后是一个3´3的最大池化层步长为2。这之后的卷积核尺寸都比较小都是5´5或者3´3的大小并且步长都为1即会扫描全图所有像素而最大池化层依然保持为3´3并且步长为2。我们可以发现一个比较有意思的现象在前几个卷积层虽然计算量很大但参数量很小都在1m左右甚至更小只占alexnet总参数量的很小一部分。这就是卷积层有用的地方可以通过较小的参数量提取有效的特征。而如果前几层直接使用全连接层那么参数量和计算量将成为天文数字。虽然每一个卷积层占整个网络的参数量的1%都不到但是如果去掉任何一个卷积层都会使网络的分类性能大幅地下降。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图5  alexnet每层的超参数及参数数量

vggnet是牛津大学计算机视觉组visual geometry group和google deepmind公司的研究员一起研发的的深度卷积神经网络。vggnet探索了卷积神经网络的深度与其性能之间的关系通过反复堆叠3´3的小型卷积核和2´2的最大池化层vggnet成功地构筑了16~19层深的卷积神经网络。vggnet相比之前state-of-the-art的网络结构错误率大幅下降并取得了ilsvrc 2014比赛分类项目的第2名和定位项目的第1名。同时vggnet的拓展性很强迁移到其他图片数据上的泛化性非常好。vggnet的结构非常简洁整个网络都使用了同样大小的卷积核尺寸3´3和最大池化尺寸2´2。到目前为止vggnet依然经常被用来提取图像特征。vggnet训练后的模型参数在其官方网站上开源了可用来在domain specific的图像分类任务上进行再训练相当于提供了非常好的初始化权重因此被用在了很多地方。

vggnet论文中全部使用了3´3的卷积核和2´2的池化核通过不断加深网络结构来提升性能。图6所示为vggnet各级别的网络结构图图7所示为每一级别的参数量从11层的网络一直到19层的网络都有详尽的性能测试。虽然从a到e每一级网络逐渐变深但是网络的参数量并没有增长很多这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深但是消耗的参数量不大不过训练比较耗时的部分依然是卷积因其计算量比较大。这其中的d、e也就是我们常说的vggnet-16和vggnet-19。c很有意思相比b多了几个1´1的卷积层1´1卷积的意义主要在于线性变换而输入通道数和输出通道数不变没有发生降维。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图6  vggnet各级别网络结构图

深度学习之四大经典CNN技术浅析 | 硬创公开课

图7  vggnet各级别网络参数量单位为百万

vggnet拥有5段卷积每一段内有2~3个卷积层同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样越靠后的段的卷积核数量越多64 – 128 – 256 – 512 – 512。其中经常出现多个完全一样的3´3的卷积层堆叠在一起的情况这其实是非常有用的设计。如图8所示两个3´3的卷积层串联相当于1个5´5的卷积层即一个像素会跟周围5´5的像素产生关联可以说感受野大小为5´5。而3个3´3的卷积层串联的效果则相当于1个7´7的卷积层。除此之外3个串联的3´3的卷积层拥有比1个7´7的卷积层更少的参数量只有后者的。最重要的是3个3´3的卷积层拥有比1个7´7的卷积层更多的非线性变换前者可以使用三次relu激活函数而后者只有一次使得cnn对特征的学习能力更强。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图8  两个串联3´3的卷积层功能类似于一个5´5的卷积层

vggnet在训练时有一个小技巧先训练级别a的简单网络再复用a网络的权重来初始化后面的几个复杂模型这样训练收敛的速度更快。在预测时vgg采用multi-scale的方法将图像scale到一个尺寸q并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测将不同窗口的分类结果平均再将不同尺寸q的结果平均得到最后结果这样可提高图片数据的利用率并提升预测准确率。同时在训练中vggnet还使用了multi-scale的方法做数据增强将原始图像缩放到不同尺寸s然后再随机裁切224´224的图片这样能增加很多数据量对于防止模型过拟合有很不错的效果。实践中作者令s在[256,512]这个区间内取值使用multi-scale获得多个版本的数据并将多个版本的数据合在一起进行训练。图9所示为vggnet使用multi-scale训练时得到的结果可以看到d和e都可以达到7.5%的错误率。最终提交到ilsvrc 2014的版本是仅使用single-scale的6个不同等级的网络与multi-scale的d网络的融合达到了7.3%的错误率。不过比赛结束后作者发现只融合multi-scale的d和e可以达到更好的效果错误率达到7.0%再使用其他优化策略最终错误率可达到6.8%左右非常接近同年的冠军google inceptin net。同时作者在对比各级网络时总结出了以下几个观点。

1lrn层作用不大。 2越深的网络效果越好。 31´1的卷积也是很有效的但是没有3´3的卷积好大一些的卷积核可以学习更大的空间特征。
深度学习之四大经典CNN技术浅析 | 硬创公开课

图9  各级别vggnet在使用multi-scale训练时的top-5错误率

google inception net首次出现在ilsvrc 2014的比赛中和vggnet同年就以较大优势取得了第一名。那届比赛中的inception net通常被称为inception v1它最大的特点是控制了计算量和参数量的同时获得了非常好的分类性能——top-5错误率6.67%只有alexnet的一半不到。inception v1有22层深比alexnet的8层或者vggnet的19层还要更深。但其计算量只有15亿次浮点运算同时只有500万的参数量仅为alexnet参数量6000万的1/12却可以达到远胜于alexnet的准确率可以说是非常优秀并且非常实用的模型。inception v1降低参数量的目的有两点第一参数越多模型越庞大需要供模型学习的数据量就越大而目前高质量的数据非常昂贵第二参数越多耗费的计算资源也会更大。inception v1参数少但效果好的原因除了模型层数更深、表达能力更强外还有两点一是去除了最后的全连接层用全局平均池化层即将图片尺寸变为1´1来取代它。全连接层几乎占据了alexnet或vggnet中90%的参数量而且会引起过拟合去除全连接层后模型训练更快并且减轻了过拟合。用全局平均池化层取代全连接层的做法借鉴了network in network以下简称nin论文。二是inception v1中精心设计的inception module提高了参数的利用效率其结构如图10所示。这一部分也借鉴了nin的思想形象的解释就是inception module本身如同大网络中的一个小网络其结构可以反复堆叠在一起形成大网络。不过inception v1比nin更进一步的是增加了分支网络nin则主要是级联的卷积层和mlpconv层。一般来说卷积层要提升表达能力主要依靠增加输出通道数但副作用是计算量增大和过拟合。每一个输出通道对应一个滤波器同一个滤波器共享参数只能提取一类特征因此一个输出通道只能做一种特征处理。而nin中的mlpconv则拥有更强大的能力允许在输出通道之间组合信息因此效果明显。可以说mlpconv基本等效于普通卷积层后再连接1´1的卷积和relu激活函数。

我们再来看inception module的基本结构其中有4个分支第一个分支对输入进行1´1的卷积这其实也是nin中提出的一个重要结构。1´1的卷积是一个非常优秀的结构它可以跨通道组织信息提高网络的表达能力同时可以对输出通道升维和降维。可以看到inception module的4个分支都用到了1´1卷积来进行低成本计算量比3´3小很多的跨通道的特征变换。第二个分支先使用了1´1卷积然后连接3´3卷积相当于进行了两次特征变换。第三个分支类似先是1´1的卷积然后连接5´5卷积。最后一个分支则是3´3最大池化后直接使用1´1卷积。我们可以发现有的分支只使用1´1卷积有的分支使用了其他尺寸的卷积时也会再使用1´1卷积这是因为1´1卷积的性价比很高用很小的计算量就能增加一层特征变换和非线性化。inception module的4个分支在最后通过一个聚合操作合并在输出通道数这个维度上聚合。inception module中包含了3种不同尺寸的卷积和1个最大池化增加了网络对不同尺度的适应性这一部分和multi-scale的思想类似。早期计算机视觉的研究中受灵长类神经视觉系统的启发serre使用不同尺寸的gabor滤波器处理不同尺寸的图片inception v1借鉴了这种思想。inception v1的论文中指出inception module可以让网络的深度和宽度高效率地扩充提升准确率且不致于过拟合。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图10  inception module结构图

人脑神经元的连接是稀疏的因此研究者认为大型神经网络的合理的连接方式应该也是稀疏的。稀疏结构是非常适合神经网络的一种结构尤其是对非常大型、非常深的神经网络可以减轻过拟合并降低计算量例如卷积神经网络就是稀疏的连接。inception net的主要目标就是找到最优的稀疏结构单元即inception module论文中提到其稀疏结构基于hebbian原理这里简单解释一下hebbian原理神经反射活动的持续与重复会导致神经元连接稳定性的持久提升当两个神经元细胞a和b距离很近并且a参与了对b重复、持续的兴奋那么某些代谢变化会导致a将作为能使b兴奋的细胞。总结一下即“一起发射的神经元会连在一起”cells that fire together, wire together学习过程中的刺激会使神经元间的突触强度增加。受hebbian原理启发另一篇文章provable bounds for learning some deep representations提出如果数据集的概率分布可以被一个很大很稀疏的神经网络所表达那么构筑这个网络的最佳方法是逐层构筑网络将上一层高度相关correlated的节点聚类并将聚类出来的每一个小簇cluster连接到一起如图11所示。这个相关性高的节点应该被连接在一起的结论即是从神经网络的角度对hebbian原理有效性的证明。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图11  将高度相关的节点连接在一起形成稀疏网络

因此一个“好”的稀疏结构应该是符合hebbian原理的我们应该把相关性高的一簇神经元节点连接在一起。在普通的数据集中这可能需要对神经元节点聚类但是在图片数据中天然的就是临近区域的数据相关性高因此相邻的像素点被卷积操作连接在一起。而我们可能有多个卷积核在同一空间位置但在不同通道的卷积核的输出结果相关性极高。因此一个1´1的卷积就可以很自然地把这些相关性很高的、在同一个空间位置但是不同通道的特征连接在一起这就是为什么1´1卷积这么频繁地被应用到inception net中的原因。1´1卷积所连接的节点的相关性是最高的而稍微大一点尺寸的卷积比如3´3、5´5的卷积所连接的节点相关性也很高因此也可以适当地使用一些大尺寸的卷积增加多样性diversity。最后inception module通过4个分支中不同尺寸的1´1、3´3、5´5等小型卷积将相关性很高的节点连接在一起就完成了其设计初衷构建出了很高效的符合hebbian原理的稀疏结构。

在inception module中通常1´1卷积的比例输出通道数占比最高3´3卷积和5´5卷积稍低。而在整个网络中会有多个堆叠的inception module我们希望靠后的inception module可以捕捉更高阶的抽象特征因此靠后的inception module的卷积的空间集中度应该逐渐降低这样可以捕获更大面积的特征。因此越靠后的inception module中3´3和5´5这两个大面积的卷积核的占比输出通道数应该更多。

inception net有22层深除了最后一层的输出其中间节点的分类效果也很好。因此在inception net中还使用到了辅助分类节点auxiliary classifiers即将中间某一层的输出用作分类并按一个较小的权重0.3加到最终分类结果中。这样相当于做了模型融合同时给网络增加了反向传播的梯度信号也提供了额外的正则化对于整个inception net的训练很有裨益。

当年的inception v1还是跑在tensorflow的前辈distbelief上的并且只运行在cpu上。当时使用了异步的sgd训练学习速率每迭代8个epoch降低4%。同时inception v1也使用了multi-scale、multi-crop等数据增强方法并在不同的采样数据上训练了7个模型进行融合得到了最后的ilsvrc 2014的比赛成绩——top-5错误率6.67%。

同时google inception net还是一个大家族包括

2014年9月的论文going deeper with convolutions提出的inception v1top-5错误率6.67%。 2015年2月的论文batch normalization: accelerating deep network training by reducing internal covariate提出的inception v2top-5错误率4.8%。 2015年12月的论文rethinking the inception architecture for computer vision提出的inception v3top-5错误率3.5%。 2016年2月的论文inception-v4, inception-resnet and the impact of residual connections on learning提出的inception v4top-5错误率3.08%。

inception v2学习了vggnet用两个3´3的卷积代替5´5的大卷积用以降低参数量并减轻过拟合还提出了著名的batch normalization以下简称bn方法。bn是一个非常有效的正则化方法可以让大型卷积网络的训练速度加快很多倍同时收敛后的分类准确率也可以得到大幅提高。bn在用于神经网络某层时会对每一个mini-batch数据的内部进行标准化normalization处理使输出规范化到n(0,1)的正态分布减少了internal covariate shift内部神经元分布的改变。bn的论文指出传统的深度神经网络在训练时每一层的输入的分布都在变化导致训练变得困难我们只能使用一个很小的学习速率解决这个问题。而对每一层使用bn之后我们就可以有效地解决这个问题学习速率可以增大很多倍达到之前的准确率所需要的迭代次数只有1/14训练时间大大缩短。而达到之前的准确率后可以继续训练并最终取得远超于inception v1模型的性能——top-5错误率4.8%已经优于人眼水平。因为bn某种意义上还起到了正则化的作用所以可以减少或者取消dropout简化网络结构。

当然只是单纯地使用bn获得的增益还不明显还需要一些相应的调整增大学习速率并加快学习衰减速度以适用bn规范化后的数据去除dropout并减轻l2正则因bn已起到正则化的作用去除lrn更彻底地对训练样本进行shuffle减少数据增强过程中对数据的光学畸变因为bn训练更快每个样本被训练的次数更少因此更真实的样本对训练更有帮助。在使用了这些措施后inception v2在训练达到inception v1的准确率时快了14倍并且模型在收敛时的准确率上限更高。

而inception v3网络则主要有两方面的改造一是引入了factorization into small convolutions的思想将一个较大的二维卷积拆成两个较小的一维卷积比如将7´7卷积拆成1´7卷积和7´1卷积或者将3´3卷积拆成1´3卷积和3´1卷积如图12所示。一方面节约了大量参数加速运算并减轻了过拟合比将7´7卷积拆成1´7卷积和7´1卷积比拆成3个3´3卷积更节约参数同时增加了一层非线性扩展模型表达能力。论文中指出这种非对称的卷积结构拆分其结果比对称地拆为几个相同的小卷积核效果更明显可以处理更多、更丰富的空间特征增加特征多样性。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图 12  将一个3´3卷积拆成1´3卷积和3´1卷积

另一方面inception v3优化了inception module的结构现在inception module有35´35、17´17和8´8三种不同结构如图13所示。这些inception module只在网络的后部出现前部还是普通的卷积层。并且inception v3除了在inception module中使用分支还在分支中使用了分支8´8的结构中可以说是network in network in network。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图13  inception v3中三种结构的inception module

而inception v4相比v3主要是结合了微软的resnet而resnet将在6.4节单独讲解这里不多做赘述。因此本节将实现的是inception v3其整个网络结构如表1所示。由于google inception net v3相对比较复杂所以这里使用tf.contrib.slim辅助设计这个网络。contrib.slim中的一些功能和组件可以大大减少设计inception net的代码量我们只需要少量代码即可构建好有42层深的inception v3。

表1  inception v3网络结构

深度学习之四大经典CNN技术浅析 | 硬创公开课

resnetresidual neural network由微软研究院的kaiming he等4名华人提出通过使用residual unit成功训练152层深的神经网络在ilsvrc 2015比赛中获得了冠军取得3.57%的top-5错误率同时参数量却比vggnet低效果非常突出。resnet的结构可以极快地加速超深神经网络的训练模型的准确率也有非常大的提升。6.3节我们讲解并实现了inception v3而inception v4则是将inception module和resnet相结合。可以看到resnet是一个推广性非常好的网络结构甚至可以直接应用到inception net中。本节就讲解resnet的基本原理以及如何用tensorflow来实现它。

在resnet之前瑞士教授schmidhuber提出了highway network原理与resnet很相似。这位schmidhuber教授同时也是lstm网络的发明者而且是早在1997年发明的可谓是神经网络领域元老级的学者。通常认为神经网络的深度对其性能非常重要但是网络越深其训练难度越大highway network的目标就是解决极深的神经网络难以训练的问题。highway network相当于修改了每一层的激活函数此前的激活函数只是对输入做一个非线性变换highway network则允许保留一定比例的原始输入x即其中t为变换系数c为保留系数论文中令。这样前面一层的信息有一定比例可以不经过矩阵乘法和非线性变换直接传输到下一层仿佛一条信息高速公路因此得名highway network。

highway network主要通过gating units学习如何控制网络中的信息流即学习原始信息应保留的比例。这个可学习的gating机制正是借鉴自schmidhuber教授早年的lstm循环神经网络中的gating。几百乃至上千层深的highway network可以直接使用梯度下降算法训练并可以配合多种非线性激活函数学习极深的神经网络现在变得可行了。事实上highway network的设计在理论上允许其训练任意深的网络其优化方法基本上与网络的深度独立而传统的神经网络结构则对深度非常敏感训练复杂度随深度增加而急剧增加。

resnet和highway network非常类似也是允许原始输入信息直接传输到后面的层中。resnet最初的灵感出自这个问题在不断加神经网络的深度时会出现一个degradation的问题即准确率会先上升然后达到饱和再持续增加深度则会导致准确率下降。这并不是过拟合的问题因为不光在测试集上误差增大训练集本身误差也会增大。假设有一个比较浅的网络达到了饱和的准确率那么后面再加上几个的全等映射层起码误差不会增加即更深的网络不应该带来训练集上误差上升。而这里提到的使用全等映射直接将前一层输出传到后面的思想就是resnet的灵感来源。

假定某段神经网络的输入是x期望输出是如果我们直接把输入x传到输出作为初始结果那么此时我们需要学习的目标就是。如图14所示这就是一个resnet的残差学习单元residual unitresnet相当于将学习目标改变了不再是学习一个完整的输出只是输出和输入的差别即残差。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图14  resnet的残差学习模块

图15所示为vggnet-19以及一个34层深的普通卷积网络和34层深的resnet网络的对比图。可以看到普通直连的卷积神经网络和resnet的最大区别在于resnet有很多旁路的支线将输入直接连到后面的层使得后面的层可以直接学习残差这种结构也被称为shortcut或skip connections。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图15  vgg-19直连的34层网络resnet的34层网络的结构对比

传统的卷积层或全连接层在信息传递时或多或少会存在信息丢失、损耗等问题。resnet在某种程度上解决了这个问题通过直接将输入信息绕道传到输出保护信息的完整性整个网络则只需要学习输入、输出差别的那一部分简化学习目标和难度。

在resnet的论文中除了提出图14中的两层残差学习单元还有三层的残差学习单元。两层的残差学习单元中包含两个相同输出通道数因为残差等于目标输出减去输入即因此输入、输出维度需保持一致的3´3卷积而3层的残差网络则使用了network in network和inception net中的1´1卷积并且是在中间3´3的卷积前后都使用了1´1卷积有先降维再升维的操作。另外如果有输入、输出维度不同的情况我们可以对x做一个线性映射变换维度再连接到后面的层。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图16  两层及三层的resnet残差学习模块

图17所示为resnet在不同层数时的网络配置其中基础结构很类似都是前面提到的两层和三层的残差学习单元的堆叠。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图17  resnet不同层数时的网络配置

在使用了resnet的结构后可以发现层数不断加深导致的训练集上误差增大的现象被消除了resnet网络的训练误差会随着层数增大而逐渐减小并且在测试集上的表现也会变好。在resnet推出后不久google就借鉴了resnet的精髓提出了inception v4和inception-resnet-v2并通过融合这两个模型在ilsvrc数据集上取得了惊人的3.08%的错误率。

可见resnet及其思想对卷积神经网络研究的贡献确实非常显著具有很强的推广性。在resnet的作者的第二篇相关论文identity mappings in deep residual networks中resnet v2被提出。resnet v2和resnet v1的主要区别在于作者通过研究resnet残差学习单元的传播公式发现前馈和反馈信号可以直接传输因此skip connection的非线性激活函数如relu替换为identity mappings。同时resnet v2在每一层中都使用了batch normalization。这样处理之后新的残差学习单元将比以前更容易训练且泛化性更强。

根据schmidhuber教授的观点resnet类似于一个没有gates的lstm网络即将输入x传递到后面层的过程是一直发生的而不是学习出来的。同时最近也有两篇论文表示resnet基本等价于rnn且resnet的效果类似于在多层网络间的集成方法ensemble。resnet在加深网络层数上做出了重大贡献而另一篇论文the power of depth for feedforward neural networks则从理论上证明了加深网络比加宽网络更有效算是给resnet提供了声援也是给深度学习为什么要深才有效提供了合理解释。

以上我们简单回顾了卷积神经网络的历史图18所示大致勾勒出最近几十年卷积神经网络的发展方向。

perceptron感知机于1957年由frank resenblatt提出而perceptron不仅是卷积网络也是神经网络的始祖。neocognitron神经认知机是一种多层级的神经网络由日本科学家kunihiko fukushima于20世纪80年代提出具有一定程度的视觉认知的功能并直接启发了后来的卷积神经网络。lenet-5由cnn之父yann lecun于1997年提出首次提出了多层级联的卷积结构可对手写数字进行有效识别。

深度学习之四大经典CNN技术浅析 | 硬创公开课

图18  卷积神经网络发展图

可以看到前面这三次关于卷积神经网络的技术突破间隔时间非常长需要十余年甚至更久才出现一次理论创新。而后于2012年hinton的学生alex依靠8层深的卷积神经网络一举获得了ilsvrc 2012比赛的冠军瞬间点燃了卷积神经网络研究的热潮。alexnet成功应用了relu激活函数、dropout、最大覆盖池化、lrn层、gpu加速等新技术并启发了后续更多的技术创新卷积神经网络的研究从此进入快车道。

在alexnet之后我们可以将卷积神经网络的发展分为两类一类是网络结构上的改进调整图18中的左侧分支另一类是网络深度的增加图18中的右侧分支。

2013年颜水成教授的network in network工作首次发表优化了卷积神经网络的结构并推广了1´1的卷积结构。在改进卷积网络结构的工作中后继者还有2014年的google inception net v1提出了inception module这个可以反复堆叠的高效的卷积网络结构并获得了当年ilsvrc比赛的冠军。2015年初的inception v2提出了batch normalization大大加速了训练过程并提升了网络性能。2015年年末的inception v3则继续优化了网络结构提出了factorization in small convolutions的思想分解大尺寸卷积为多个小卷积乃至一维卷积。

而另一条分支上许多研究工作则致力于加深网络层数2014年ilsvrc比赛的亚军vggnet全程使用3´3的卷积成功训练了深达19层的网络当年的季军msra-net也使用了非常深的网络。2015年微软的resnet成功训练了152层深的网络一举拿下了当年ilsvrc比赛的冠军top-5错误率降低至3.46%。其后又更新了resnet v2增加了batch normalization并去除了激活层而使用identity mapping或preactivation进一步提升了网络性能。此后inception resnet v2融合了inception net优良的网络结构和resnet训练极深网络的残差学习模块集两个方向之长取得了更好的分类效果。

我们可以看到自alexnet于2012年提出后深度学习领域的研究发展极其迅速基本上每年甚至每几个月都会出现新一代的技术。新的技术往往伴随着新的网络结构更深的网络的训练方法等并在图像识别等领域不断创造新的准确率记录。至今ilsvrc比赛和卷积神经网络的研究依然处于高速发展期cnn的技术日新月异。当然其中不可忽视的推动力是我们拥有了更快的gpu计算资源用以实验以及非常方便的开源工具比如tensorflow可以让研究人员快速地进行探索和尝试。在以前研究人员如果没有像alex那样高超的编程实力能自己实现cuda-convnet可能都没办法设计cnn或者快速地进行实验。现在有了tensorflow研究人员和开发人员都可以简单而快速地设计神经网络结构并进行研究、测试、部署乃至实用。

问题1最新版本的tensorflow 1.0到底有什么实质性的提升如何看待加入的动态图

1.0版本的tensorflow是第一个稳定版本提供了可以长期支持的api。相比于之前的0.12这个版本主要添加了xlajit编译优化java接口tensorflow

fold动态图框架同时在分布式计算上的性能也有了重大提升目前训练inception v3网络在8块gpu上可获得7倍多的提速。

fold主要是学习了pytorch、chainer、dynet等框架使用命令式变成生成计算图同时执行计算这样训练某些网络比如rnn、lstm等更灵活。不过fold和这些框架略有不同它属于使用dynamic

batching的方式可以对不同长度、大小、尺寸的

输入做batch训练效率比pytorch、chainer、dynet等完全动态生成计算图的方式效率更高。

问题2以上谈到的几种网络分别适用于什么类型的任务

这几种网络都属于2维的卷积网络主要任务可以做图像分类、定位等他们功能上应该是递进的关系越新的网络使用到的技术越好性能越高而inception-resnet-v2则是把这几种网络的优势都融为一体。

当然卷积网络不止2维也可以有1维的可以处理时间序列的信号也可以有3维的可以处理3维空间的信息或者处理视频信息。卷积网络适应的场景应该是输入信号在空间上和时间上存在一定关联性的场景满足了这个条件都可以很好的利用深度卷积神经网络解决问题。

问题3看过一些tensorflow写的程序总觉不是特别清晰简洁。keras就是清楚的多但keras是否可以完全覆盖tensorflow的功能呢

keras目前已经准备正式进入tensorflow代码库了以后可以使用keras创建tensorflow网络但是功能肯定是不能完全覆盖的。比如多gpu、分布式训练或者生成各种中间训练结果给tensorboard展示或者是一些复杂的多分支的、条件控制的网络等这些用keras都实现不了。但是keras可以用来实现一些逻辑简单结构不复杂的网络。

问题4深度学习相关的开源社区如何能够对其做出contribution是需要算法或网络结构上的创新吗

这个一般不用算法或网络结构的创新一般是发paper。协助开发一些框架就简单的多一开始可能是修复bug而后是完成一些tensorflow开发团队任务可以交给社区完成的相对简单的功能。到后面随着对框架和代码的熟悉可以逐渐参与一些有趣的新功能的开发当然也可以把最新出的一些论文中的网络结构实现在tensorflow中提供接口不过这个要求就比较高了甚至需要有开发cuda程序的能力。

本期公开课中奖名单小哒、云杉、devin-2、baymax大大白。

恭喜以上四位读者每人获得一本《tensorflow实战》书籍。请大家后台回复一下姓名、地址和联系方式不久就将收到来自雷锋网的礼物了。

更多雷锋网文章

<a href="http://www.leiphone.com/news/201701/dzeawe2qgx8jhbu8.html">深度学习框架太抽象其实不外乎这五大核心组件</a>

<a href="http://www.leiphone.com/news/201610/s2fwkopa5e1ocjxd.html">caffe作者贾扬清教你如何打造优秀的深度学习架构</a>

本文作者亚萌

继续阅读