热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Overview|CNN发展史(待续)

目录I.基础知识II.早期尝试1.Neocognitron,19802.LeCun,1989A.概况B.

目录

  • I. 基础知识
  • II. 早期尝试
    • 1. Neocognitron, 1980
    • 2. LeCun, 1989
      • A. 概况
      • B. Feature maps & Weight sharing
      • C. 网络设计
      • D. 实验
    • 3. LeNet, 1998
  • III. 历史性突破:AlexNet, 2012
    • 1. Historic
    • 2. 困难之处
    • 3. 选择CNN
    • 4. 本文贡献
    • 5. 网络设计
      • A. ReLU
      • B. Training on Multiple GPUs
      • C. Local Response Normalization
      • D. Overlapping Pooling
    • 6. 抑制过拟合设计
      • A. Data Augmentation
      • B. Dropout
    • 7. 讨论
  • IV. 网络加深
    • 1. VGG Net, 2014
    • 2. MSRA-Net, 2015
      • A. 背景
      • B. 实验方法
      • C. 实验设计
      • D. 实验结果

I. 基础知识

在对CNN进行概览之前,请先务必清楚以下问题:

机器学习基础知识:

  1. 什么是“全连接”?
  2. 前向传播和反向传播各自的作用是?为什么需要反向传播?
  3. 什么是感知机?其致命缺陷是什么?
  4. 常见的激活函数有哪些?“激活”了什么特性?(非线性,最直接解决了亦或问题)

深度学习基础知识:

  1. 常见的损失函数有哪些?最好能知道是怎么得到的(比如由最大似然推出)。
  2. 常见的优化方法有哪些?利弊如何?
  3. 抑制过拟合最简单的方法是什么?
  4. 什么是泛化能力?
  5. Dropout目的?如何实现?测试阶段需要用吗?
  6. 什么是梯度消失?有哪些解决方式?(RNN→LSTM,sigmoid、tanh→ReLU,Batch Normalization,GoogLeNet中的辅助损失函数等)
  7. Batch Normalization目的?如何实现?
  8. 什么是梯度爆炸?有哪些解决方式?

CNN基础知识:

  1. 离散卷积怎么实现?
  2. 假设有一个单通道28x28的图片,使用尺寸为5x5,步长为1的3个卷积核(滤波器),则卷积层尺寸为?(3x24x24)
  3. 相比于全连接网络,CNN的两大创新点是什么,使得它易于训练,又能学习到较高级的特征?(稀疏连接和参数共享)
  4. 什么是感受野?层数越大,该层单元的感受野会越大吗?
  5. 什么是转置卷积?(参见我的博客及其参考链接)
  6. 什么是池化?参数共享和最大池化,分别为CNN引入了什么特性?
    (平移等变性和平移不变性。如果是分离参数的卷积输出的池化,那么会引入多种特征的不变性,比如旋转不变性)

以下内容的提纲,参考中科院PPT:《CNN近期进展与实用技巧》。
而具体内容,为笔者阅读论文后的学习总结。

II. 早期尝试

CNN的演化脉络:

1

1. Neocognitron, 1980

1959年Hubel等人提了对视觉皮层的功能划分:

2

受此启发,1980年,Kunihiko Fukushima提出了Neocognitron,可用于手写数字识别等模式识别任务。

Paper: Neocognitron: A self-organizing neural network model for a mechanism of pattern recognition unaffected by shift in position

创新点:Neocognitron使用了两种细胞:simple cellcomplex cell,并且让二者级联工作
前者直接提取特征,后者处理特征的畸变,比如平移等,使Neocognitron具有平移不变性。

3

2. LeCun, 1989

A. 概况

Yann Le Cun是第一个在计算机视觉领域(手写邮政编码识别问题)使用CNN的人。

Paper: Backpropagation Applied to Handwritten Zip Code Recognition

我们知道,引入先验知识,也就是引入限制,可以增强网络的泛化能力。
那么,我们应该如何引入呢?
LeCun认为,引入先验最基本的原则(方法)是:在保证计算能力不变的情况下,尽可能减少冗余参数。
该原则的解释是:一可以减小 entropy ,二可以减小 VC 维数,因此可以增强泛化能力。

个人理解:对同一个问题,如果参数较多,要么是问题比较复杂,要么是先验知识不够,假设空间大。
如果在保证 computational power 不下降的情况下,尽可能减少参数,也就等同于引入了尽可能多的先验知识,缩小了假设空间。

现在的问题就是:如何实现这一点?
LeCun将要说明:我们可以通过构造特殊的 network architecture ,来实现这一点。

B. Feature maps & Weight sharing

与之前识别工作的最显著不同之处在于:

  • 该网络是端到端的,即直接利用 low-level information ,而不是从 feature vectors 开始。
  • 网络中所有的连接都是自适应的,而之前的工作中前几层的连接参数是手动选择的。

具体设计:

首先网络继承了特征提取的方式:
提取 local features ,整合在一起,然后再形成 higher order features 。
其优势在前人工作中已被证实。

一个目标的特征有很多而且各不相同,因此我们应该:
用 a set of feature detectors 来检测这些特征。

一个相同的特征可能出现在各个位置,因此:
我们可以采用 Rumelhart 等人在1986年提出的 weight sharing 方法,在较小的计算代价下,在各个位置上检测出该特征。

综合上述两点,第一个隐藏层应该是一个 feature maps ,每一个 plane 内部共享参数、表示一种特征。
由于某特征的具体位置信息不那么重要,因此该层可以比输入层小。

C. 网络设计

4

D. 实验

  1. 非线性激活单元采用 scaled hyperbolic tangent Symmetric functions ,收敛更快。但在函数输入值特别大或特别小时,学习也会很慢。
  2. 损失函数为MSE。
  3. 输出单元采用 sigmoid ,保证loss不会过大(梯度也会很大)。
  4. 目标输出要求在 sigmoid 的拟线性区,保证梯度不会产生于 sigmoid 的平坦区域。
  5. 在一个小范围内随机初始化,目的同上。
  6. 随机梯度下降,收敛更快。
  7. 拟牛顿法调节学习率,让下降更可靠。

最终效果:在数字识别领域当然是 state of the art ~

3. LeNet, 1998

这篇文章是引用过万的综述性文章,对当时手写数字识别的方法做了概述。

Paper: Gradient-based learning applied to document recognition

文章中提到了许多有意思的历史:

在过去,特征提取是重中之重,甚至会被整体手工设计。
原因是,过去分类器的分类任务比较简单,类别差距大,因此假设空间比较小。
因此,分类器的准确性很大程度上取决于该低维空间的拟合程度,特征提取就显得尤为关键。

但时过境迁,随着计算机性能提升、数据库日益扩大和越来越棒的深度学习技术的出现,设计者不再需要仔细设计特征提取器,而可以更依赖于真实数据,并且构造出足够复杂的假设。

该综述长达46页,我们重点说一下CNN的经典构架:LeNet-5

5

6

LeNet-5有7层:

  1. 输入层,尺寸大于任何一个字母,以保证每个字母都会出现在第七层单元的感受野的中心。
  2. 中间五层分别是:卷积层→降采样层→卷积层→降采样层→卷积层。
  3. 第一个卷积层使用了六种滤波器,因此具有六个通道的 feature maps 。
  4. 第二个卷积层上升到16个通道。每一个通道与前6个通道的关系都不一样,见上图,目的是破坏对称性,迫使每个通道学习不同的特征(理想情况是互补特征)。
  5. 在全连接层,特征进行内积和非线性激活。
  6. 最后是输出层,10种数字对应10个输出单元,分别计算输出向量和该分类参考向量的欧式距离。
    参数要么是+1要么是-1,主要是因为输出向量的每一个元素都用sigmoid归一化,其值域就是[-1,+1]。
    比如,[1 -1...-1]和[1 -1...-1]距离是0,[-1 1 -1...-1]和[1 -1...-1]距离是8。

在统计学上,如果真实概率模型是高斯分布,那么对于线性回归,最大化关于w的对数似然,和最小化MSE是等价的。
而输出层就是一个线性回归问题,并且我们可以假设简单先验为高斯分布。具体参见《DEEP LEARNING》。

那么为什么不用0-9这十个数字来分类呢?
一是上述理由阐述了 distributed codes 在衡量距离时的合理性;
二是实验证明,当类别较多时,这种 place code 效果非常差。因为只让大多数输出为0,只有1个输出非0是很困难的;
三是如果输入的不是字符,place code 更难拒绝判断。

III. 历史性突破:AlexNet, 2012

1. Historic

AlexNet competed in the ImageNet Large Scale Visual Recognition Challenge in 2012.
The network achieved a top-5 error of 15.3%, more than 10.8 percentage points lower than that of the runner up.
因此,AlexNet引爆了深度学习的热潮,我们称之为历史性突破。

Paper: ImageNet classification with deep convolutional neural networks

2. 困难之处

AlexNet解决的最直接问题,就是 ImageNet 图像分类问题,训练集高清图片容量达到120万,类别达1000种;神经网络参数达到6000万个,神经元达65万个,问题复杂度可想而知。
训练如此大规模的网络,显然是困难的。

本文在开头也说明了问题的复杂性:即便是 ImageNet 这样庞大的数据集,也无法 specify 这一复杂的问题。

也就是说,假设空间有很大的未知区域。

因此,我们需要许多先验知识,来补偿那些训练集中没有的数据。

3. 选择CNN

CNN 是理想的模型,因为它通常能为天然图片(测试图片)带来强大而正确的假设,即统计稳定性(平移不变性)和像素的位置依赖性(也就是二者兼顾的意思)。

最重要的是,它的计算成本相对较低。

4. 本文贡献

本文主要贡献有:

  1. 提出的网络结构,在图像分类比赛中达到了惊人的效果。
  2. 编写了高度优化的 GPU 2D 卷积实现,并已公开。但该实现偏硬件,新手建议从caffe入手。
  3. 采取了许多抑制过拟合的措施;虽然数据库很大,但是参数也很多,过拟合很严重。
  4. 该网络只包含5个卷积层,参数量只占了不到5%,但缺一不可(效果会变差);发现深度很重要。
  5. 当前的工作仅仅受到硬件水平的限制,还有很大的发展空间。

5. 网络设计

7

根据重要性依次排序,该网络有以下创新:

A. ReLU

之前使用的 tanh 和 sigmoid 激活函数都存在饱和区。
改用无饱和的 ReLU ,收敛速度可以达到数倍于 tanh !

实验:同一个4层卷积网络,要求在 CIFAR-10 上达到25%准确率,分别测试 ReLU (实线)和 tanh (虚线),如图。

8

B. Training on Multiple GPUs

2个 GPU 协同,最直接的作用是加快了训练速度。
作者尝试将网络改为单GPU,同时保证参数数量不变,速度略逊于双 GPUs 。

其次,这两个 GPU 实际上是有交互的。与独立工作相比,交互将准确率提高了1.2%以上。

最后,当时的 GPU 性能不够强大,显存只有3GB。
这种协同的思想可以将大任务分解为多个小任务执行。

C. Local Response Normalization

在真实神经元中,存在一种侧边抑制效应 lateral inhibition 。
简单来说,就是在一个小区域内,如果有一个神经元被激活,那么其附近的神经元会相对受到抑制。

换句话说,这是一种促进神经元局部竞争的机制。但这一点其实有点牵强。

受此启发,AlexNet 在某些层的非线性激活以后采用 Local Response Normalization ,公式如图:

9

ReLU 的原始输出就是 \(\alpha_{x,y}^i\) ,位于第 \(i\) 个核的 \((x,y)\) 位置。
抑制是在不同核之间发生的,如图,在当前核的左右共 \(n\) 个通道上进行,核序号不要超过上限 \(N\) 和下限 \(0\)
显然,如果邻域内存在较大的 \(\alpha_{x,y}^j\) 而自身很小,那么除后将会小的可怜;如果反之,那么影响不大。
这样就拉开了“贫富差距”

作者说明,该 trick 使得准确率提高了1.2%以上。

但据各路大神反馈,该 trick 基本无效。

D. Overlapping Pooling

实验证明,重叠池化可以更好地抑制过拟合,使准确率提高约0.4%和0.3%。

6. 抑制过拟合设计

A. Data Augmentation

最简单的抑制过拟合技术,就是 label-preserving transformations
简单来说,就是让图像进行各种不影响目标本质的变换,扩大数据量。

该网络采用的是简单的变换,不需要存储,并且用 CPU 即可实现,不影响正在计算上一个 batch 的 GPU 。

  1. 镜像对称变换;
  2. 图像光照强度和色彩变换。

第二点具体而言:

  • 先提取 RGB 三通道分量;
  • 对每一个通道分别进行主成分分析,提取出主成分;
  • 然后再进行三通道的随机系数线性组合。

个人认为,先主成分分析可以减少数据量吧~

以上方案在抑制过拟合的同时,让准确率提升了至少1%。

B. Dropout

如果我们有多个不同的模型合作进行预测,那么泛化误差将会有效降低。
问题是,训练多个模型的计算成本很高昂。

Dropout 为我们提供了新思路:让这些模型分享相同的权重系数,但神经元的输出结果不尽相同。
这样,我们就相当于得到了许多模型。

具体而言,是让 hidden neuron 的输出有50%的概率被置零。
这样,每次反向传播时,参考的 loss 都是由不同模型计算得到的。

总的来说,Dropout 技术打破了神经元之间的依赖性,强迫网络学习更鲁棒的神经元连接。

我们只在全连接层使用,因为全连接层的连接非常多。
在测试阶段不采用 Dropout 。

Dropout 会延长收敛时间,但能有效抑制过拟合。

7. 讨论

作者发现,去掉网络中任意一个中间层,都会让整体表现下降2%左右。因此深度非常重要。

为了简化计算,作者并没有采用无监督的 pre-training 。
尽管 pre-training 可能可以在不提高数据量的同时,提升网络性能。

最后,深层次网络可以用于视频,以利用时间相关性。

IV. 网络加深

1. VGG Net, 2014

VGG 的深度是前所未有的,卷积层达到10个,全连接层有3个。
VGG 获得了 ImageNet2014 的分类赛冠军和定位赛亚军,并且泛化能力非常好。

Paper: Very deep convolutional networks for large-scale image recognition

重要贡献:探究了深度和滤波器尺寸的权衡问题,发现深度远比滤波器尺寸重要
为了探究这一问题,滤波器尺寸固定为3x3,网络深度逐渐加深,同时进行实验。

为了保证客观,VGG Net 沿用了 AlexNet 的配置(ReLU等),但放弃了 LRN ,并且认为该 trick 不仅无效而且冗余。

下表是实验的几种配置,从左到右深度递增,对比效果:

10

下表可以看到,不仅深度越深效果更好,而且多尺度训练的效果也更好:

11

下表是当时各种网络的测试结果对比:

12

2. MSRA-Net, 2015

Paper: Convolutional neural networks at constrained time cost

A. 背景

时间成本控制很重要,特别是处理在线实时任务,多用户请求,移动终端处理等时。
这篇文章的重点就是时间成本控制。作者提到:

Most of the recent advanced CNNs are more timeconsuming than Krizhevsky et al.’s [14] original architecture in both training and testing.
The increased computational cost can be attributed to the increased width1 (numbers of filters) [21, 24, 1], depth (number of layers) [22, 23], smaller strides [21, 24, 22], and their combinations.

B. 实验方法

在实验中,时间成本是一个固定指标。时间成本用以下公式衡量:
\[ O(\sum_{l=1}^d n_{l-1} \cdot s_l^2 \cdot n_l \cdot m_l^2) \]
四个参数分别代表:上一卷积层的滤波器个数,当前层滤波器尺寸,当前层滤波器个数和当前层 feature map 尺寸。
熟悉 CNN 的同学应该能理解这个公式:

  • 输出 feature map 一共有 \(n_l\) 个通道,每一个通道有 \(m_l^2\) 个元素,因此输出一共有 \(n_l \cdot m_l^2\) 个元素;
  • 每一个输出元素,和输入 feature map 的每一个卷积结果都有关;
  • 而卷积发生在输入 feature map 的每一层,每一层卷积都只和同一个尺寸为 \(s_l\) 的滤波器有关。如果只考虑时间(大致是并行进行的),那么就是 \(n_{l-1} \cdot s_l^2\)

在时间成本不变的条件下,我们调整滤波器尺寸、网络深度、滤波器个数( feature map 宽度)这三个关键参数,来判断哪个参数对网络性能更重要,从而在简化网络时着重保留。

与前人工作的不同之处主要有:

  1. 前人是固定总参数数目,这里是固定时间成本
  2. 这里只研究卷积层。虽然全连接层和池化层参数占比最大,但是时间消耗通常只有 5-10% 。
  3. 通篇都是根据这个理论公式来计算权衡的,因为实际消耗时间和硬件等有关,不好限制,并且这个公式和实际情况也基本符合。
  4. 只研究 single-path 和 non-recursive 。

C. 实验设计

下表是实验中的网络配置情况和性能表现。
A是原始网络,采用的是最基本最普适的配置。

1

下面几张图片是图解:

2

通过理论公式计算,这些网络的时间复杂度都是一致的。

实验通过改变池化步长,来改变 feature map 的尺寸。

D. 实验结果

本文实验获得了以下几个重要结论:

  1. 网络深度是保证准确率的核心指标,比其余参数都重要,应该在 trade off 中倾斜考虑。
    这个结论并非简单直接得到的,因为其他文章仅仅是堆叠更多层,但这篇文章是做了一个 trade off 来控制一定的时间成本。
  2. 当网络深度过度增加时,网络会存在退化现象,哪怕没有 trade off 也是如此。
    经过分析,该现象并非是过拟合导致的,因为训练误差也特别大
    该现象为何凯明 ResNet 的创新埋下了伏笔。
  3. feature map 的宽度比尺寸重要。
  4. 我们通常在池化层就完成了降采样。实验发现,如果我们改为在卷积层中采用大步长,那么效果会更好。

最直接的效果是,作者仅用 AlexNet 40% 的复杂度,GPU 速度快20%,就实现了高4.2%的分类准确率。


推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • h5调用本地摄像头和麦克风一
    h5调用本地摄像头和麦克风一,Go语言社区,Golang程序员人脉社 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
author-avatar
古零零碎碎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有