【Valse首发】CNN的近期进展与实用技巧(上)

作者:程程
链接:https://zhuanlan.zhihu.com/p/21432547
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

深度学习大讲堂致力于推送人工智能,深度学习方面的最新技术,产品以及活动。请关注我们的知乎专栏!

一.DL基础理论

本页PPT给出了本节内容概要,我们从MCP神经元模型开始,首先回顾全连接层、卷积层等基础结构单元,Sigmoid等激活函数,Softmax等损失函数,以及感知机、MLP等经典网络结构。接下来,将介绍网络训练方法,包括BP、Mini-batch SGD和LR Policy。最后我们会介绍深度网络训练中的两个理论问题:梯度消失和梯度溢出。

MCP神经元模型提出于1943年,可以看作是人工神经网络研究的起点。MCP是作者名字的缩写。MCP模型中包括多个输入参数和权重、内积运算和二值激活函数等人工神经网络的基础要素。MCP模型的提出甚至早于1946年第一台计算机的发明。

在MCP神经元模型的基础上,我们可以得到全连接结构。输入层神经元和输入层神经两两相连,故名全连接。全连接层实际上是内积运算,我们也给出了全连接层前向和后向计算的公式。

下面我们介绍卷积层,卷积是深度网络的重要结构单元之一。我们给出了2D卷积的连续和离散形式,注意卷积核需要做中心翻转。在Caffe实现中,卷积核假设已经翻转,所以卷积运算可以看作当前窗口和卷积核的一个内积(不考虑bias项),上图我们给出了一个卷积运算的示意。

与全连接层相比,卷积层的输出神经元只和部分输入层神经元连接,同时相同响应图内,不同空间位置共享卷积核参数,因此卷积层大大降低了要学习的参数数量。

Caffe当中,为了避免卷积运算中频繁的内存访问和过深的循序嵌套,对卷积运算进行了以下加速:通过Im2Col操作一次取出所有的patch并组成矩阵,与kernel矩阵做乘法运算直接得到卷积结果。

有卷积就有反卷积,反卷积是卷积的逆运算,实现了信号的复原。在全卷积网络中,反卷积层实现了图像的上采样,从而得到如输入图像大小相同的输出。

Pooling层一般配合卷积层使用,可以获得特征的不变性。常见的Pooling操作有max pooling、mean pooling和随机pooling。其中max pooling取最大值,mean pooling取均值,随机pooling按响应值的大小依概率选择。

激活函数一般用于卷积层和全连接层之后,激活函数是深度网络非线性的主要来源。常见的激活函数Sigmoid, 双曲正切,ReLU(生物启发,克服了梯度消失问题), PReLU(alpha可学习), ELU和maxout。 其中PReLU和ELU都是ReLU的改进。

Dropout由Hinton组提出于2012年,Dropout随机将比例为p的神经元输出设置为0,是一种避免深度网络过拟合的随机正则化策略,同时Dropout也可以看作是一种隐式的模型集成。

Batch Normalization提出于2015年,通过逐层尺度归一(零均值方差归一,scale和shift),BN避免了梯度消失和梯度溢出。BN可以加速收敛5x~20x, 作为一种正则化技术也提高了泛化能力。

下面我们介绍损失函数:用于单标签分类问题的Softmax损失函数,用于实值回归问题的欧式损失函数,用于多标签分类的Sigmoid交叉熵损失和用于深度测度学习的Contrastive损失。

下面我们介绍经典网络结构。1957年,Rosenblatt提出了感知机模型。最早感知机模型用于解决二分类问题,在MCP模型的基础上增加了一个损失函数。随后,感知机也被扩展到多分类问题和回归问题,成为解决机器学习问题的一个通用学习器。

1969年,Minsky在一本名为感知机的专著中指出,感知机不能解决XOR问题,从而宣告了感知机甚至人工神经网络研究的死刑,造成了NN长达十几年的寒冬,这也是NN研究的第一次寒冬。遗憾的是,Rosenblatt 1971年死于意外,没有等到春天的到来(下图是Rosenblatt的墓碑)。

1986年之后,随着误差反向传导算法的再次发明并在Nature上发表,多层感知机和卷积神经网络成为NN研究新亮点。然而由于多层网络训练困难:梯度消失问题,训练数据和计算资源不足,NN研究在20世纪末再次进入寒冬,这段时间更为流行的方法包括决策树,SVM等,八卦一下,NN研究曾长期是一门“显学”,SVM引用次数最多的那篇文章的题目叫Support Vector Network。

2006年,NN的研究迎来转机,Hinton、Bengio等人经过跨世纪的努力,提出了通过分层无监督预训练的策略来解决多层网络收敛困难的问题,深度学习也因此得名。

下面我们介绍优化方法。首先误差反向传导,实际上在1974年,Webos在其博士论文中就提出来BP的思想,今天我们广为使用的BP算法则由Hinton等人“重新”发明于1986年。

有了BP算法传递的梯度,基于梯度下降方法,就可以对网络参数进行更新。梯度下降方法的缺点是速度慢且数据量大的时候内存不足,随机梯度下降方法的缺点是方差大导致损失函数震荡严重。两者折中的Mini-batch SGD,我们也给出了基于Mini-batch SGD的NN训练流程。

进一步的,在Mini-batch SGD中,有两个关键技术细节:weight decay和momentum. Weight decay是一种避免过拟合的正则化手段,而Momentum通过对历史梯度的moving average来避免陷入局部最优。

Learning rate的控制是网络收敛的关键,Caffe中支持四种策略,其中使用较多的是step和polynomial。

下面我介绍网络训练中的两个理论问题。首先是梯度消失,梯度消失的主要原因是sigmoid激活函数“糟糕”的解析性质,一阶梯度的取值范围是[0,1/4],梯度向下传导一次最少会减小1/4,随着深度的增加,梯度传导的过程中不断减小从而引发所谓的“梯度消失”问题。

为了解决梯度消失问题,学术界提出了多种策略,例如,LSTM中的选择性记忆和遗忘机制,Hinton等提出的无监督pre-train方法,新的激活函数ReLU, 辅助损失函数和Batch Normalization.

除了梯度消失之外,梯度溢出也是深度网络训练中的一个常见问题,例如Softmax损失变成86.33并且保持不变,这是因为梯度溢出导致网络参数NAN。梯度溢出的根本原因是网络参数初始化的尺度不平衡问题。PPT中展示了一个例子,W2的初始值是0.01,梯度却达到10^4。

为了解决这个问题,Bengio等人提出了Xavier初始化策略,其基本思想是保持网络的尺度不变。

二. CNN结构演化

下面我们介绍CNN的结构演化。

历史奔流向前,往事并不如烟。上图所示是我总结的CNN结构演化的历史,起点是神经认知机模型,已经出现了卷积结构,但是第一个CNN模型诞生于1989年,1998年诞生了LeNet。随着ReLU和dropout的提出,以及GPU和大数据带来的历史机遇,CNN在12年迎来了历史突破。12年之后,CNN的演化路径可以总结为四条:1)更深的网络,2)增强卷积模的功能以及上诉两种思路的融合,3)从分类到检测,4)增加新的功能模块。

首先,我们介绍CNN的早期探索,1962年,Hubel和Wiesel提出了视觉皮层的功能模型,从简单细胞到复杂细胞再到超复杂细胞。受此启发,1980年,神经认知及提出,简单细胞被实现为卷积,复杂细胞被实现为pooling。

神经认知机采用自组织的方式进行无监督的卷积核训练,因此并不是CNN(通过BP端到端训练)。

第一个CNN模型诞生于1989年,发明人LeCun。需要指出的是,从诞生的第一天起,CNN自带deep属性。

LeCun同时研究了四个问题,这也是文章中留下的四枚彩蛋,其中问题3)和Xavier初始化之间有神秘的联系。

1998年,LeCun提出LeNet,并成功应用于美国手写数字识别。但很快,CNN的锋芒被SVM和手工设计的局部特征盖过。

历史的转折在2012年到来,AlexNet, 在当年的ImageNet图像分类竞赛中,top-5错误率比上一年的冠军下降了十个百分点。AlexNet的成功既得益研究者的自我奋斗:Relu和Dropout的提出, 也是大历史进程的结果:大数据训练和GPU并行计算。

2012年之后,CNN朝着不同方向演化。

第二条演化路径,增强卷积模块的功能。


13年底,颜水成老师组提出了NIN结构,并于2014年取得了ILSVRC物体检测竞赛的冠军。

在NIN的基础上,Google于2014年提出了GoogLeNet(Inception V1),并随后改进出Inception V3和V4。

Residual Net可以看作是前两条演化路径的集成。何凯明等人发现,单纯增加深度会导致网络退化,例如CIFAR-10数据集,网络从20层到56层性能反而会下降。为此ResNet中引入了一个shortcut结构,将输入跳层传递与卷积的结果相加。ReNet可以训练深达152层的网络,是15年ILSVRC不依赖外部数据的物体检测与物体识别竞赛的双料冠军。

进一步的,Google将Inception结构与Residual Net结合,提出了Inception-Residual Net结构,实验表明,虽然采用Inception V4结构能够得到与ResNet可比的性能,但是残差结构能够加速收敛1倍以上。


2016年初,何凯明等提出了恒等映射深度残差网络,通过去掉Addition操作后的ReLU操作,残差项跨层可加,损失层的梯度可以直接传到任意一层,使得1001层网络的训练成为可能,并在CIFAR-10上取得了4.92%的错误率,刷新了state-of-the-art。

第三条演化路径:从物体识别到物体检测。

R-CNN的缺点是速度慢,Fast R-CNN是R-CNN和SPP Pooling的融合,这样每张图像只需要通过卷积网络一次同时支持端到端训练而不需要保存中间结果。

Faster R-CNN支持多类物体的同时检测而只需要一个网络,目前基于Faster R-CNN的行人与车辆检测技术是汽车高级辅助驾驶系统的关键技术之一。

第四条演化路径:增加新的功能模块。

本节介绍三个工作:反卷积层、ST-Net和CNN与RNN/LSTM的混合架构。

时间: 2024-10-23 13:30:17

【Valse首发】CNN的近期进展与实用技巧(上)的相关文章

转:面向视觉识别的卷积神经网络课程 & CNN的近期进展与实用技巧

http://mp.weixin.qq.com/s?__biz=MjM5ODkzMzMwMQ==&mid=2650408190&idx=1&sn=f22adfb13fb14f8a220222355659913f 1. 如何了解NLP的现状: 看最新的博士论文的一些Tips 了解一个领域的现状,看最新的博士论文也许是个捷径.譬如有童鞋问如何了解NLP的state-of-the-art, 其实就斯坦福,伯克利, CMU, JHU等学校的近期博士论文选读一些,领域主流方向的概况就能了解一

【老鸟分享】LINUX命令行终端提示符多种实用技巧!

1.Linux命令行提示符简介 众所周知,Linux命令行是系统管理员管理Linux的重要手段,我们管理Linux,首先要面对的就是Linux命令行提示符. Linux命令行结尾的提示符有"#"和"$"两种不同的符号,如下所示: [[email protected] ~]# #<==这是超级管理员root用户对应的命令行. [[email protected] ~]$ #<==这是普通用户oldboy对应的命令行. 其中: 1)#号,是使用超级用户roo

干货!深度学习七个实用技巧

深度学习已经成为解决许多具有挑战性的现实世界问题的方法.对目标检测,语音识别和语言翻译来说,这是迄今为止表现最好的方法.许多人将深度神经网络(DNNs)视为神奇的黑盒子,我们放进去一堆数据,出来的就是我们的解决方案!事实上,事情没那么简单.在设计和应用DNN到一个特定的问题上可能会遇到很多挑战.为了达到现实世界应用所需的性能标准,对数据准备,网络设计,训练和推断等各个阶段的正确设计和执行至关重要.在这里,我将与大家分享7个实用技巧,让您的深度神经网络发挥最大作用. 1 - 数据,数据,数据 这不

Mac预览怎么用 Mac预览功能实用技巧大全

Mac预览怎么用?有很多的用户以为Mac自带的预览功能只具有简单的图片浏览功能,其实不然,其实"预览"是一款强大的看图.修图.改图软件,也同时是一款多功能的 PDF 阅读与编辑工具,接下来Pc6苹果小编给大家详细介绍一下Mac预览功能实用技巧. 目前的 Mac 预览程式可以支持 TIFF. PNG. JPEG. GIF. BMP. PDF 等主要文件格式的浏览与编辑,而单纯预览上也可以支持像是 Photoshop 等专业图像处理软件. Office 等专业文书处理软件所产生的特殊文件格

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code 一.使用for循环 要遍历字典.数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: 1 //普通的for循环遍历 2 -(void)iteratorWithFor 3 { 4 //////////处理数组/////

NSString的八条实用技巧

NSString的八条实用技巧 有一篇文章写了:iOS开发之NSString的几条实用技巧 , 今天这篇,我们讲讲NSString的八条实用技巧.大家可以收藏起来,方便开发随时可以复制粘贴. 0.首字母大写 代码: //首字母大写 NSString *string = @"ligang"; NSLog(@"string: %@",[string capitalizedString]); 打印: 2015-07-16 23:06:11.652 iOSStrongDem

Android开发:TVBox智能机顶盒开发实用技巧分享

本文旨在指导想要进入Android TVBox智能机顶盒开发领域或刚刚进入Android TVBox开发领域的新人带路,愿你们越走越远! 实用工具篇 Eclipse+ADT 别问它干嘛用的,我也不知道. SercureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议. SecureCRT是一款用于连接运行包括Windows.UNIS和VMS的远程系统的理想工具. 通过使用内含的VCP命令行程序可以进行加密文件的传输.有流行CR

程序员在编程开发中的10个实用技巧

程序员在编程开发中的10个实用技巧,下面是我自己在工作中学到的一些简单的技巧和策略,希望能对各位有用.1.     橡皮鸭调试法不知道各位有没有这样的经历,当你正在给别人描述问题的时候,突然灵机一动想到了解决方案?这种情况的产生是有科学依据的.高谈阔论能让我们的大脑重新有条理地组织问题.在这种情况下,你的聊天对象就是“橡皮鸭”.团队中的每个人都应该积极主动乐意地成为彼此的“橡皮鸭”.有时候,如果你幸运的话,你的“橡皮鸭”搞不好还能给出有效的建议呢.2.     快速信息反馈一旦写好代码就要尽快得

iOS实用技巧 - 简易实现多皮肤功能

前言:不记得谁说的了,中国的用户大概是世界上最喜欢多皮肤功能的用户了.我很讨厌写安卓程序,图形界面设计工具及其难用,还不如手写,编辑器慢如蜗牛,智能提示总是跟不上我输入的速度,相同的功能,安卓的代码量至少是iOS的三倍,每写一行代码,都觉得自己的手指在滴血.可是安卓灵活统一的style功能确实很贴心!5之前,iOS平台上实现相同的功能一直没有个比较好的办法. iOS5之后,苹果将所有界面组件的设定,都绑定在一个叫UIAppearance的协议上了,你可以简单的通过UIAppearance设定组件