摘要: 深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。卷积神经网络(CNN)是深度学习框架中的一个重要算法,本文介绍了CNN主流模型结构的演进过程,从一切的开始LeNet,到王者归来AlexNet,再到如今的CNN模型引领深度学习热潮。本文也将带领大家了解探讨当下与CNN模型相关的工业实践。
演讲嘉宾简介:
周国睿(花名:逐水),毕业于北京邮电大学模式识别实验室,目前是阿里妈妈事业部算法专家,服务阿里妈妈精准定向广告的排序相关业务;致力于深度学习在广告排序的应用和研究,涉及模型结构设计、模型压缩、深度学习框架开发,相关工作发表于AAAI等会议中。
以下内容根据演讲嘉宾视频分享以及PPT整理而成。
本次的分享主要围绕以下三个方面:
1.CNN Architectures 演进过程
2.网络从浅至深的思考
3.工业界的选择

一、CNN Architectures 演进过程
熟悉技术的发展历史,能帮助大家掌握当下的技术,同时也能对未来的技术更富想象力。接下来,为大家分享CNN-based model主流模型结构的演进过程。
下图中横轴表示时间线,纵轴表示模型的深度(即神经网络的层数)。用最简单的视角概括图中CN的发展就是,层数愈来愈深了。下面,为大家简单介绍图中涉及的模型。
上图为LeNet的网络结构,虽然该模型层数较浅,但是麻雀虽小,五脏俱全。模型中包含的卷积网络,降采样,全连接网络等,这些都是现代CNN网络的基本组件。LeNet依靠多个领域相关的filter, 采用单filter参数共享(即参数复用,降采样),以此保障一定程度的平移,形变扭曲的不变性。LeNet试图通过这种模型结构,让模型自己提取输入信号中特征的关系。
2012年,AlexNet 在当年的ImageNet数据集的分类竞赛中,取得了第一名,而且在性能方面远超过当年的第二名,使得深度学习再一次获得人们的关注,回到了历史的舞台。下图为AlexNet的模型结构,AlexNet成功的原因有以下两点:
1. ReLU激活函数
首先,常用的激活函数Sigmoid,在输入非常大时,神经元的梯度是接近于0的,存在饱和现象。而Alex采用的ReLU激活函数在输入信号小于0时,输出都为0,在输入信号大于0时,输出等于输入,一定程度上降低了过拟合,梯度爆炸的风险,减少了反向传播的计算量。
2. Heavy Data augmentation,Dropout
AlexNet在训练时,对于256*256的图片进行随机提取其中224*224的图片,然后允许水平翻转,相当于将样本扩大到了((256-224)^2)*2=2048倍。在测试时,固定了五个位置,即左上、右上、左下、右下、中间,对这几个位置提取五个224*224的图片,然后翻转,共10个图片,之后对结果求平均作为最后的预测目标。以上的技术极大的增强了模型的泛化能力。另外,AlexNet对图像的RGB空间做PCA,然后对主成分做一个(0, 0.1)的高斯扰动,使得错误率又下降了1%。AlexNet也采用了Dropout的技术,它做的就是以0.5的概率,将每个隐层神经元的输出设置为零。
AlexNet相对于LeNet,虽然看起来只是增加了计算量,层数变深了,但是提出AlexNet的作者依靠对CV领域相关技术的长时间积累,做了很多细节工作,将许多技术综合起来才取得了这一突破性的成果。AlexNet的提出是一个新时代开始的标志,非常值得我们尊敬。
VGGNet 探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核,VGGNet 成功地构筑了16~19层深的卷积神经网络,在训练时,VGGNet输入是大小为224*224的RGB图像,预处理只有在训练集中的每个像素上减去RGB的均值。
VGGNet选择3*3滤波器尺寸的原因如下:
1. 这是能捕捉到各个方向(即上下,左右,中间)的最小尺寸;
2. 如下图所示从感知视野的角度,一个5*5可以用两个3*3来近似代替,一个7*7可以用三个3*3的卷积核来代替;
3. 对于3个3*3的卷积核,通道数为C,则参数为3×(3×3×C×C)=27C^2,而一个7*7的卷积核,通道数也为C,则参数为7×7×C×C=49C^2,不仅增强了模型的泛化能力,而且还减少了参数。
VGGNet性能相对于AlexNet提升了,但是VGGNet在模型接近输入的前几层,需要大量的内存。同时,VGGNet,AlexNet两者模型在最后几层的全连接上,需要的参数非常多,计算量也非常大。
在GoogleNet出现之前,CV领域常用的模型如果通过粗暴地扩充层数或者增加神经元的个数,以此加深模型的层数,这是很浪费计算机资源的,并且由于模型是串联的,所以会直接增加计算代价,同时并不能保证这些计算都是必要的。GoogleNet的模型结构与之前提出的模型结构不一样,GoogLeNet采用了模块化的结构,方便增添和修改;模型移除了全连接,减少了大量的参数;为了让梯度更好的回传,模型额外的增加了两个辅助的分类器的loss。
下面具体介绍GoogleNet模型中Inception模块的设计。如下图所示,Inception模块由滤波器和几个采样器并联组成,简单的说就是共享输入,连接合并输出。这个设计的假设是基于底层的相关性高的单元,通常会聚集在图像的局部区域,所以使用尺寸为1*1的滤波器,同时为了保证信号的接收范围,模块之后使用更大尺寸的卷积学习即可。另外,网络越到后面,特征越抽象,而且每个特征所涉及的信号视野也更大了,因此随着层数的增加,3*3和5*5卷积的比例也要增加。
上图的Inception模块,如果使用5*5的卷积核仍然会带来巨大的计算量,因此GoogleNet的作者采用1*1卷积核来进行降维,降低输入维度的信号。改进后的Inception模块如下图所示,Inception技术既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。
ResNet提出的动机是“退化”问题的发现,即当模型的层次加深时,错误率却提高了,如下图所示。但是模型的深度加深,学习能力增强,因此更深的模型不应当产生比它更浅的模型更高的错误率。而这个“退化”问题产生的原因归结于优化难题。
ResNet的作者提出了一个残差结构,如下图所示。结构增加一个identity mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)+x,这样的结构让模型有了一个显式的F(x)+x的计算逻辑,模型的学习难度大幅度下降。ResNet依靠这个技术极大的扩展了模型的深度,ResNet作者发明的残差网络,将之前的GoogleNet和VggNet等不到40层的网络直接提升到151层甚至到201层,也让模型性能获得了极大提高,这是模型结构上的突破性贡献。
二、网络从浅至深的思考
为什么更深的网络性能会更好呢?在这个问题上,人们已经做了很多研究。最早在1989年,George Cybenko提出了如下的理论:一个神经网络的层数可以很浅,只要在有足够多的隐层结点的前提下,这个神经网络就具有拟合任何函数的能力。但是,较浅的神经网络在大多数情况下,它的表现都是弱于深的神经网络,原因在于,浅的神经网络虽然存在一个拟合特定函数的解,但是求解的过程可能是很困难的,简单的梯度优化算法可能无法找到函数的解。此外,在2013年,Eigen等人提出在CNN-based的模型中,通过叠加模型的层数,就能提高模型的计算能力。在一篇论文《SNN-MIMIC:Do Deep Nets Really Need to be Deep?》中,作者用真正的实验数据证明了浅的神经网络有能力和深的神经网络学习到一样的函数。SNN-MMIC的作者尝试让浅层网络模拟深度网络的表现,下图为SNN-MIMIC使用的Teacher-Student学习框架。Teacher是一个更深的网络,Student是一个更浅但可能更宽的网络,先训练好Teacher直至收敛之后,用Teacher的输出结果作为Soft Target,并用这个Soft Target监督Student。通过这样的训练框架,SNN-MIMIC的作者成功证明在实际情况下,是有方法使浅层网络达到和更深的网络差不多的性能。SNN-MIMIC的作者也解释了在下图训练框架中,浅层模型模拟深层模型相较于单独训练浅层模型,训练性能来的好的原因。原因总结如下:
1. 假设训练样本中的label是错的(例如将猫标注成了狗),在这种情况下,如果用label进行训练,预测会显示这是一条狗,因此带来噪声,误导模型的训练。但是Teacher的预测结果,会得到这是一条狗或者一只猫,输出可能和label相反,让Teacher的预测结果监督Student的训练,会将错误的那部分信息抹掉。这种假设在作者的实验环境中是不存在的,但至少这种假设在现实生活中是存在的。
2. Teacher网络更深,通过浅层网络模拟深层网络,可以解决Student不能解决的更难的问题。
3. Soft target本身更容易学习,拟合平滑的波相对于拟合尖锐的波更简单。
增加模型的深度提高了模型的性能,但是,更深的网络在gradient-based训练方法下,更难训练(FIT-Nets的提出早于ResNet)。FIT-Nets作者的目标是通过更浅的网络(即student)指导更深的网络(即teacher),以此训练一个比Teacher性能更好的网络。Teacher中间隐层的信息叫做hints,框架通过将Teacher与Student中间的隐层降到同一个维度,以此对Student的信息重构出Teacher的表达。
 
三、工业界的选择
下面介绍工业界对神经网络的应用。模型的精度与响应延迟存在一个天然的tradeoff,模型越复杂,精度可能越高,但响应时间越长。虽然这两者是相互矛盾的,但是幸运的是,工业界可以用离线训练的复杂化换取更高效的模型精度,也就是说把离线训练过程做的复杂,而在线的时候保证inference的高效同时提升模型的精度。解决上述问题的思路可以分为两种,一种是硬性的压缩(hard compress),比如说mobilenet直接减少了卷积的计算,把模型结构变得更简单,直接降低了计算复杂度。另一种是soft tradeoff,离线的时候利用训练出来的复杂模型辅助简单模型的学习,提升简单模型的精度,在线的时候只需要使用简单模型,例如SNN-MIMIC,Knowledge Distillation,FitNet,Rocket Launching等。这两种思路就体现了离线时训练复杂化,在线时就可以使用更高效,精度也能得到保证的模型这样的一个过程。
下面介绍一下演讲者周国睿他们团队在这方面的工作,即Rocket Launching。训练框架如下图所示,Rocket Launching算法也属于Teacher-student算法的范畴,算法训练一个Teacher及Student网络,Teacher网络辅助Student网络的学习,虽然训练的网络更浅,但是性能更高,inference速度快,因此可以满足上线的需要。
不同于之前的算法,周国睿团队认为模型可以拆解为输入的表达层和最后的决策层,通过参数共享更直接地将Teacher学习到的信息传递给Student。此外,之前Teacher-Student的训练框架先是固定Teacher,之后使用Teacher输出结果指导Student的学习,不同于以往Teacher-Student训练框架,Rocket Launching让Teacher网络与Student网络同时学习,最后Student网络不仅能学习到Teacher拟合的结果,还能学习到整个Teacher收敛过程中的路径。同时,Rocket Launching对Teacher网络独有的参数做一个Gradient Block,让Teacher网络的学习不受Student网络和它共同学习的影响。Rocket Launching训练的过程类似于火箭的发射,卫星与推进器组合起来才称为火箭,使用Teacher网络与Student网络一起学习(类似于卫星与推进器一起发射),最后在线时只需要使用Student网络(类似于推进器将卫星送上天),因此周国睿团队将训练框架称为Rocket Launching。
周国睿团队在公开数据集CIFAR-10,CIFAR-100等上,将Rocket Launching模型与属于Teacher-Student范畴的方法进行对比,效果取得了明显的提高。同时,周国睿团队还做了非常仔细的Ablation Study,以此验证之前提到的三个改进点(即协同训练,参数共享,Gradient Block) 都提高了模型的训练效果。此外,周国睿团队将Rocket Launching中协同训练方法与KD结合,结果显示结合了KD后,Rocket Launching 模型取得了进一步提高。使用Rocket Launching后,使在线的计算量减少了8倍,性能也没有发生损耗。
本文由云栖志愿小组沈金凤整理,编辑百见

理论与实践中的CNN模型结构,如何引领深度学习热潮相关推荐

  1. 【模型结构绘制】深度学习神经网络模型结构图绘制工具及方法总结【写论文必备】

    本文我们聊聊如何才能画出炫酷高大上的神经网络图,下面是常用的几种工具. 这个工具可以非常方便的画出各种类型的图,是下面这位小哥哥开发的,来自于麻省理工学院弗兰克尔生物工程实验室, 该实验室开发可视化和 ...

  2. Java 理论与实践: 修复 Java 内存模型,第 1 部分

    为什么80%的码农都做不了架构师?>>>    什么是 Java 内存模型,最初它是怎样被破坏的? Brian Goetz ( brian@quiotix.com), 首席顾问, Q ...

  3. 深度学习(四):卷积神经网络(CNN)模型结构,前向传播算法和反向传播算法介绍。

    在前面我们讲述了DNN的模型与前向反向传播算法.而在DNN大类中,卷积神经网络(Convolutional Neural Networks,以下简称CNN)是最为成功的DNN特例之一.CNN广泛的应用 ...

  4. cnn 反向传播推导_深度学习中的参数梯度推导(三)下篇

    前言 在深度学习中的参数梯度推导(三)中篇里,我们总结了CNN的BP推导第一步:BP通过池化层时梯度的计算公式.本篇(下篇)则继续推导CNN相关的其他梯度计算公式. 注意:本文默认读者已具备深度学习上 ...

  5. 如何在实际中计划和执行一个机器学习和深度学习项目

    2019-11-27 20:27:28 作者:Sayak Paul 编译:ronghuaiyang 导读 做研究打比赛和真正的做一个机器学习和深度项目是不一样的,如果你有这方面的困惑的话,可以看看这篇 ...

  6. 《深度学习入门:基于Python的理论与实现》读书笔记:第8章 深度学习

    目录 8.1 加深网络 8.1.1 向更深的网络出发 8.1.2 进一步提高识别精度 8.1.3 加深层的动机 8.2 深度学习的小历史 8.2.1 ImageNet ​8.2.2 VGG 8.2.3 ...

  7. 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人

    我用 tensorflow 实现的"一个神经聊天模型":一个基于深度学习的聊天机器人 个工作尝试重现这个论文的结果A Neural Conversational Model(aka ...

  8. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优

    DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优 目录 基于keras对LSTM算法进行超参数调优 1.可视化LSTM模型的loss和acc曲线

  9. DL之模型调参:深度学习算法模型优化参数之对深度学习模型的超参数采用网格搜索进行模型调优(建议收藏)

    DL之模型调参:深度学习算法模型优化参数之对深度学习模型的超参数采用网格搜索进行模型调优(建议收藏) 目录 神经网络的参数调优 1.神经网络的通病-各种参数随机性 2.评估模型学习能力

最新文章

  1. java设计一个bank类实现银行_SAP银企直连之平安银行(ECC版)
  2. Windows文件操作的直接函数调用
  3. OpenNI框架介绍
  4. SourceTree 3.0.17如何跳过注册进行安装? — git图形化工具(一)
  5. 基于Mahout的电影推荐系统
  6. 管理神话2:专家只有权这样做
  7. Openssl 之大数运算函数 BN
  8. 2019-04-28 Mybatis generator逆向工程生成的Example代码分析
  9. python批量ping脚本_Python多线程批量Ping主机IP的脚本
  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---31
  11. Nagios 监控温度感应器
  12. 游戏是怎么赚钱的?(科普篇 )
  13. 把汇总报表页面生成 pdf文件方案!
  14. 任务管理器被停用解决方法
  15. 试图运行项目时出错:未能加载文件或程序集 或它的某一个依赖项。该模块应包含一个程序集清单 .
  16. Satellite卫星遥感图像中小物体的分割识别
  17. 20230105无剩余飞行时间的时间制导律:当导弹位于静止目标右侧时就打不中目标?
  18. robotframework中文乱码---robotframework日志输出时出现中文以unicode编码方式
  19. 极客时间《Java并发编程》学习笔记
  20. “你尝试连接的远程计算机需要网络级身份验证NLA“处理办法

热门文章

  1. 重返全球第三,小米做对了什么?
  2. 想 new 个对象过七夕,她却抛了异常
  3. 太牛了!30 年开源老兵,10 年躬耕 OpenStack,开源 1000 万行核心代码!
  4. android中进程的优先级
  5. 【Spring实战】—— 5 设值注入
  6. nginx正向代理和反正代理区别
  7. 动捕技术是拯救VR体验的关键,但如何落地却已成为世界难题
  8. struts2中struts.xml和web.xml文件解析及工作原理
  9. 怎样只接受固定长度数组为参数 数组形参
  10. webablizer 分析Apache 的access 日志