Skip to main content

ImageNet Classification with Deep Convolutional Neural Networks

论文

深度学习要使用正则来避免过拟合

写论文时要提到别人的研究,进行对比,这个文章只提到了 CNN 来做图像分类

使用一个很大的模型,如何来避免

AlexNet

AlexNet 论文 读第一遍: 标题、摘要、结论、图表

AlexNet:DL 浪潮的奠基作之一

视角 1:回到 2012 年, 理解文章

视角 2:2021 年时,AlexNet 过时 or 仍然适用的 idea

1.标题

ImageNet (当时最大的图片分类数据集 100w 图片 1000 类别) Classification

Deep Convolutional:2012 convolution 没有 tree SVM 火

Neural Network

作者

Alex:第一作者命名的网络

轶事:Goolge 研究院 引用次数 > 10w 有 20 + 人,都去参加了讲座;Ilya 讲了 3 个 dirty tricks:图片增强、ReLU、dropout,赢了比赛。

大佬们的期待:这个工作揭示了深刻的见解,对世界的新理解;模型的新理解 or 任意关于模型的解释部分,不单纯只是 提出模型效果好 就可以。

Why 效果好?How to apply? 在哪些地方的应用好?

Hinton:DL 先驱

2.摘要

训练了卷积神经网络、图片分类效果好 SOTA (top1 + top5)、网络的参数和架构、加速训练的技巧、避免过拟合的 dropout、模型变体比赛赢

1 What:干了什么?

训练了 large, deep 的 CNN 以分类 120 w 图片的 1000 个类别。

2 Outcome:效果如何?

比前人工作好

top-1 error: 37.5%

top-5 error: 17%

3 网络长什么样?

600w 参数,65 w 神经元

5 个卷积层 (< 5 max-pooling 层) + 3 个全连接层(1000-way softmax)

4 这么多参数、怎么训练快点?

non-saturating neurons + GPU 实现卷积运算

5 这么多参数、学过头了怎么办?

避免 FCN 的过拟合,dropout 正则 effective

6 为什么我这么厉害?

想知道?不告诉你,但我的兄弟姐妹也厉害!比赛冠军!远超第二!

3.结论

本文无 conclusion(和摘要一一对应),只有 discussion (吐槽(😂)、为来做什么)

P1:文章总结

一句话,怎么总结我的好?

a large, deep CNN is capable of achieving record-breaking results (SOTA) on a highly challenging dataset(指的是 ImageNet)using purely supervised learning.

什么情况,我会表现得不好呢?

  • remove a single convolutional layer
  • i.e., 去掉中间层,降 2%

depth is important.

深度重要,但深度是最重要的吗?

去掉一层 convolutional layer, 降低 2%;不能证明深度是最重要的。

可能的情况:没设置好参数。

AlexNet 可以去掉一些层、调节中间参数,效果不变。直接砍掉一层,掉 2% 可能是搜索参数做的不够,没调好参数。

反过来讲,结论没问题?

深宽都重要,i.e., 照片的高宽比

深度重要 --> CNN 需要 很深

宽度也重要 --> 特别深 + 特别窄 or 特别浅 + 特别宽 ❌

P2:未来研究

不用 unsupervised pre-training 也没关系?

2012 年 DL 的目的是:像“人”(不一定知道真实答案) 书读百遍、其意自现。

通过训练一个非常大的神经网络,在没有标签的数据上,把数据的内在结构抽取出来。

关注的潮流怎么改变?

AlexNet 之前大佬们爱:无监督学习

Why 大佬们不爱 有监督学习?

(有监督学习 打不赢 树 SVM )

AlexNet 证明 大力出奇迹。模型够大、有标签数据够多、我 No. 1 !

最近大家一起爱:BERT、GAN

本文最重要的 是什么?real wow moment

Deep CNN 训练的结果,图片最后向量(学到了一种嵌入表示)的语义表示 特别好~!

相似的图片的向量会比较近,学到了一个非常好的特征;非常适合后面的 ML,一个简单的 softmax 就能分类的很好!

学习嵌入表示,DL 的一大强项。

和当前最好结果的对比:远远超过别人(卖点、wow moment、sexy point)

模型架构图

img

introduction

第一段

一篇论文的第一段通常是讲个故事

  • 做什么研究
  • 哪个方向
  • 这个方向有什么东西
  • 为什么很重要

第二段

描述了怎么做神经网络,这里只介绍了 CNN

写论文的时候,千万不要只说自己这个领域这个小方向大概怎么样,还要提到别的方向怎么样

第三段

CNN 虽然很好,但是很难训练,但是现在有 GPU 了,GPU 算力能够跟上,所以能够训练很大的东西,而且数据集够大,确实能够训练比较大的 CNN

前三段基本描述了

  • 我做了什么东西
  • 为什么能做

第四段

paper 的贡献

  • 训练了一个最大的的神经网络,然后取得了特别好的结果
  • 实现了 GPU 上性能很高的一个 2D 的卷积
  • 网络有一些新的和不常见的一些特性,能够提升性能,降低模型的训练时间
  • 使用了什么过拟合的方法使得模型变得更好
  • 模型具有 5 个卷积层,3 个全连接层,发现深度很重要,移掉任何一层都不行

结果很好,但是还是有新东西在里面的,如果就结果很好,没有新东西,大概是不会称为奠基作

the dataset

大概描述了一下所用的数据集

重点是最后一段:ImageNet 中图片的分辨率是不一样的,因此将每张图片变成了一个 256*256 的图片:

  • 将图片的短边减少到 256,长边是保证高宽比不变的情况下也往下降,长边如果依然多出来的话,如果多于 256 的话,就以中心为界将两边裁掉,裁成一个 256*256 的图片
  • 没有做任何的预处理,只是对图片进行了裁剪
  • 网络是在 raw RGB Value 上训练的
  • 当时做计算机视觉都是将特征抽出来,抽 SIFT 也好,抽别的特征也好(imagenet 数据集也提供了一个 SIFT 版本的特征),这篇文章说不要抽特征,直接是在原始的 Pixels 上做了
  • 在之后的工作里面基本上主要是end to end(端到端):及那个原始的图片或者文本直接进去,不做任何的特征提取,神经网络能够帮助你完成这部分工作

the architecture

讲整个网络的架构

  • relu 非线性激活函数
  • 使用了多 GPU 进行训练
  • 正则化、归一化
  • overlapping pooling
  • 总体架构

img

  • 方框表示每一层的输入和输出的数据的大小
  • 输入的图片是一个高宽分别为 224*224 的 3 通道 RGB 图片
  • 第一层卷积:卷积的窗口是 11*11,有 48 个输出通道,stride 等于 4
  • 有两个 GPU,GPU1 和 GPU0 都有自己的卷积核参数

img

  • 第一个卷积层在两个 GPU 上各有一个
  • 第二个卷积层是在每个 GPU 把当前的卷积结果拿过来(GPU0 的第二个卷积层读的是 GPU0 的第一个卷积层的卷积结果,GPU0 和 GPU1 之间没有任何通讯)
  • 到第三个卷积层的时候,GPU 还是每个 GPU 上有自己的卷积核,但是每个卷积核会同时将第二个卷积层中 GPU0 和 GPU1 的卷积结果作为输入,两个 GPU 之间会通讯一次
  • 第 4、5 个卷积层之间没有任何通讯
  • 每个卷积层的通道数是不一样的,通道数有所增加,高和宽也有所变化
  • 高宽慢慢变小、深度慢慢增加,随着深度的增加,慢慢地将空间信息压缩,直到最后每一个像素能够代表前面一大块的像素,然后再将通道数慢慢增加,可以认为每个通道数是去看一种特定的模式(例如 192 个通道可以简单地认为,能够识别图片中的 192 种不同的模式)
  • 慢慢将空间信息压缩,语义空间慢慢增加,到最后卷积完之后,进入全连接层
  • 全连接层中又出现了 GPU 之间的通讯,全连接层的输入是每个 GPU 第五个卷积的输出合并起来做全连接

img

  • 最后进入分类层的时候,变成了一个 4096 长的向量,每一块来自两个 GPU,每片是 2048,最后拼起来,所以一张图片会表示成一个 4096 维的向量,最后用一个线性分类做链接
  • 深度学习的主要作用是将一张输入的图片,通过卷积、池化、全连接等一系列操作,将他压缩成一个长为 4096 的向量,这个向量能够将中间的语义信息都表示出来(将一个人能够看懂的像素通过一系列的特征提取变成了一个长为 4096 的机器能够看懂的东西,这个东西可以用来做搜索、分类等)
  • 整个机器学习都可以认为是一个知识的压缩过程,不管是图片、语音还是文字或者视频,通过一个模型最后压缩成一个向量,然后机器去识别这个向量,然后在上面做各种事情
  • 模型并行(model parallel):现在在计算机视觉里面用的不多,但是在自然语言处理方面又成为主流了(将模型切开进行训练)

reducing overfitting

第四章讲述了如何降低过拟合

数据增强(data augmentation)

  • 把一些图片人工地变大
  • 在图片中随机地抠出一部分区域,做一张新的图片
  • 把整个 RGB 的颜色通道 channel 上做一些改变,这里使用的是一个**PCA(主成分分析)**的方法,颜色会有不同,因此每次图片跟原始图片是有一定的不同的

dropout

  • 随机的把一些隐藏层的输出变成用 50%的概率设为 0,每一次都是把一些东西设置为 0,所以模型也就发生了变化,每次得到一个新的模型,但是这些模型之间权重是共享的除了设置成 0 的,非 0 的东西都是一样的,这样就等价于做了模型融合
  • 后来大家发现 dropout 其实也不是在做模型融合,更多的 dropout 就是一个正则项(dropout 在现行模型上等价于一个 L2 正则项)
  • 这里将 dropout 用在了前面的两个全连接层上面
  • 文章说没有 dropout 的话,overfitting 会非常严重,有 dropout 的话,训练会比别人慢两倍
  • 现在 CNN 的设计通常不会使用那么大的全连接层,所以 dropout 也不那么重要,而且 GPU、内存也没那么吃紧了
  • dropout 在全连接上还是很有用的,在 RNN 和 Attension 中使用的非常多

details of learning

讲述了模型是如何训练的

  • 使用 SGD(随机梯度下降)来进行训练,SGD 调参相对来说可能会比较难调,后来发现 SGD 里面的噪音对模型的泛化性其实是有好处的,所以现在深度学习中普遍使用 SGD 对模型进行训练。在这个文章之后 SGD 基本上在机器学习界成为了最主流的一个优化算法
  • 批量大小是 128
  • momentum 是 0.9
  • weight decay 是 0.0005,也就是 L2 正则项,但是这个东西不是加在模型上,而是加在优化算法上,虽然他们两个是等价关系,但是因为深度学习的学习,所以大家现在基本上把这个东西叫做 weight decay 了
  • momentum 也是因为这篇文章之后用的特别多,虽然在 2010 年的时候有大量的加速算法,里面有很 fancy 的各种加速 SGD 算法,但是现在看起来似乎用一个简单的 momentum 也是不错的
  • momentum 实际上是,当优化的表面非常不平滑的时候,冲量使得不要被当下的梯度过多的误导,可以保持一个冲量从过去那个方向,沿着一个比较平缓的方向往前走,这样子不容易陷入到局部最优解
  • 权重用的是一个均值为 0,方差为 0.01 的高斯随机变量来初始化(0.01 对很多网络都是可以的,但是如果特别深的时候需要更多优化,但是对于一些相对简单的神经网络,0.01 是一个不错的选项)
  • 现在就算是比较大的那些 BERT,也就是用了 0.02 作为随机的初始值的方差
  • 在第二层、第四层和第五层的卷积层把初始的偏移量初始化成 1,剩下的全部初始化成 0
  • 每个层使用同样的学习率,从 0.01 开始,然后呢如果验证误差不往下降了,就手动的将他乘以 0.1,就是降低十倍
  • ResNet 中,每训练 120 轮,学习率每 30 轮就下降 0.1 另外一种主流的做法就是,前面可以做得更长一点,必须能够 60 轮或者是 100 轮,然后再在后面下降
  • 在 Alex 之后的很多训练里面,都是做规则性地将学习率往下下降十倍,这是一个非常主流的做法,但是现在很少用了,现在使用更加平滑的曲线来降低学习率,比如果用一个 cos 的函数比较平缓地往下降。一开始的选择也很重要,如果选的太大可能会发生爆炸,如果太小又有可能训练不动,所以现在主流的做法是学习率从 0 开始再慢慢上升,慢慢下降

img

  • 模型训练了 90 个 epoch,然后每一遍用的是 ImageNet 完整的 120 万张图片,需要 5-6 天在两个 GTX GPU 上训练