文章目录
- 前言
- 1-2页
-
- 摘要与引言
- 数据集
- 3-5页
-
- Relu函数(ReLU Nonlinearity)
- 多GPU并行(Training on Multiple GPUs)
- 局部响应归一化( Local Response Normalization)
- 重叠池化(Overlapping Pooling)
- 整体结构(Overall Architecture)
- 5-6页
-
- 减少过拟合(Reducing Overfitting)
-
- 数据增强
- Dropout
前言
上个礼拜复现了 LeNet-5,没看过的可以去看一下,CNN基础论文复现----LeNet5 (一).
这几天弄另一篇比较知名的论文AlexNet。
论文原版和中英文对照版放GitHub上了:https://github.com/shitbro6/paper
这篇论文和上一篇有很多相同的知识点,建议大概过一下LeNet,再看这个会轻松一些。
还好这篇文章比较短,只有9页。
1-2页
摘要与引言
这篇文章的结构比上一篇LeNet-5要清晰的多。
首先摘要说了一下背景,就是有个团队他们发明了一种新的网络模型,用它跑了一下2010年的竞赛数据集,取得了很好的效果,然后又改进了一下这个网络模型,并拿他去参加了2012年的竞赛,取得了第一名的好成绩,并且比第二名的正确率好很多。
摘要中有一句话 we achieved top-1 and top- 5 error rates of 37.5% and 17.0%
简单的说一下这里提到的 top-1 和 top-5错误率,
top-1:通俗的讲 假如模型预测只有一张狗的图片,且只能输出一个预测结果,如果预测的结果刚好为狗,则叫top-1正确率,反之,预测错误就叫top-1错误率。
top-5:同理top-1 ,这里输出的为五个预测结果,五个预测结果中错误的概率,就是top-5错误率。
之后的引言部分介绍了一下当前训练模型的弊端,就是在机器上训练的很好,然后放到现实生活中就不太行了,所以为了尽量改善这个情况,需要更好的模型和更大的数据(也就是防止过拟合导致现实情况表现变差),整篇文章似乎都在围绕如果防止过拟合这个主要问题展开的讨论。
这两部分提到的一些概念:
- 卷积层、池化层、全连接层这种就不说了,上一篇文章中也说过了,可以看下面的链接。卷积神经网络基础
- softmax:这个函数一般用于分类中的问题,就是将输出的值通过softmax映射到【0,1】上,用于表示概率问题,我觉得知道有这个作用就行了。深究softmax
- 非饱和神经元(non-saturating neurons): 相对于饱和神经元来讲,饱和神经元最后的值会被挤压到一个特定的区间,比如sigmoid函数的[0,1] tanh函数的[-1,1],而这个文章中的非饱和函数使用的是relu 函数,他没有限制到特定的区间,所以没有最大值限制。
- 过拟合,dropout:在我前一篇的文章介绍过了,这里就简单说一下,过拟合就是防止过分拟合训练集,把噪声也训练上了,dropout就是训练的时候故意扔掉一些特征,目的也是防止过拟合。
引言最后作者说了一下,网络共有8个学习层 其中,5个卷积层, 3个全连接层。
引言的最后作者说 ,使用 当年的 GTX580 上训练了五六天~好家伙,一会我就扔谷歌云上看看训练多久,也不知道谷歌云能不能在线下载这么大的数据集,我可不想下我电脑上。。。
数据集
第二页中间介绍了一下论文使用的数据集–ImageNet ,就是作者提到的竞赛中使用的数据集。
刚看了一下网上的简介,ImageNet数据集有1400W+的图片,2W多个类别??离谱啊,据说有1T的大小,我硬盘才512G。我感觉这个数据集如果云上下不下来的话我就用CIFAR10了。。。。
这里面的分辨率有很多种不同的像素分辨率,然后论文中说通过采样固定到统一的 256 * 256分辨率。
3-5页
上来第一段介绍了一下网络 它包含八个学习层–5 个卷积层和 3 个全连接层。
Relu函数(ReLU Nonlinearity)
作者提到使用Relu函数,可以提高训练速度,比tanh等快了6倍,并且还能防止梯度消失的现象。
前面介绍非饱和函数的时候也提到了,Relu函数通俗讲就是要么取0要么取本身 , 通常情况下 f(x) = max(0,x)
。
如果网络参数设置的不合理,很有可能导致激活函数的计算一直在0区间内,造成输出的梯度一直是0区间,最后导致模型崩溃(训练速度大幅增加)。
Relu函数也有一定缺点,这里就不叙述了,记得设置较小的学习率。
对于Relu函数过多的原理我认为没必要深究,对比LeNet-5中的sigmoid和tanh ,只知道为啥要用以及优缺点就行了。
多GPU并行(Training on Multiple GPUs)
这是第三章第二小节提到的概念,由于当时GPU不是很好,作者使用的 GTX580进行训练,GPU发展到现在,又有云服务器,如果想在现在用多路GPU,也只是Pytorch调用API的问题,所以我觉得这一章大概看一下就行了,知道有这么个事就OK。
局部响应归一化( Local Response Normalization)
Local Response Normalization 简称 LRN。
第三章第三小节,文章上来说了一堆公式,LRN实际上就是起 ‘抑制’ Relu函数的作用,刚才上面已经提到了非饱和神经元,就是说Relu函数并没有将结果挤压到一个特定的范围中,所以要对Relu得到的结果进行归一化,使用局部归一化的方案有助于增加泛化能力。
泛化能力:
指算法模型对于未知数据的预测能力。
若算法学习到了数据模型背后的规律,则当换一组数据模型时,算法依旧能够给出合理的输出,则表明该算法具有不错的泛化能力。
重叠池化(Overlapping Pooling)
之前在LeNet-5中的那个池化,是池化卷积核k=X 则步长也就为X,所以在卷积窗口移动的过程中是没有元素重叠的(就是没有元素被重复使用)。在这里作者将使用 卷积核尺寸 > 移动步长 的情况,这样的话就有元素被使用多次,发生重叠。
经过作者的测试,发现这样使用池化层,降低了错误率,且不易发生过拟合现象。
整体结构(Overall Architecture)
这一节作者描述了一下他的网络结构。
给出了一张图:
这张图相比较LeNet-5的图,看上去乱的多,原因就是因为作者将多路GPU并行的情况描述在了图中,所以看上去会没那么简洁。
在网上找到下面一个多路GPU简化版:
由于我们现在使用单GPU运行,所以找了一个单GPU版本:
这个图看上去就清晰多了。
5-6页
减少过拟合(Reducing Overfitting)
前面一直在提,使用重叠池化,使用dropout,使用Relu函数,都是为了减少过拟合,因为训练集数据量很大,拟合过度会导致结果出现严重偏差。
数据增强
文章中提到使用了两种方式进行数据增强,这两种方式都是通过很少的计算量进行图像的变换。在代码中使用CPU进行图像变换生成,而训练模型使用GPU所以不占计算量,
第一种方法,作者将输入的 256*256尺寸的图片 ,随机扣一个224 * 224尺寸的图片,这样就导致每次输入的和原始的有稍微的区别,作者测试将 一个图片取四个角和中间,然后水平旋转,得到十个样本,通过softmax进行平均。
第二种方法,就是 改变RGB通道的强度,实际上就是对RGB通道进行某种运算,怎么算的没必要深究(我没看懂),导致颜色和明暗发生变化,即对图像加噪。然后说这个方案降低了 top-1 1%以上的错误率。
Dropout
前面在LeNet-5中已经出现了类似dropout的算法,这里算是正式提出了?
前面已经说了很多次这个算法了,简单理解就是在正常的网络训练中,每一个部分,或者说每一个特征都参与了运算。而在dropout中,故意的丢掉一部分特征。比如进行人物识别的时候,故意只给半边脸。
像下面这样:
使用dropout的目的也是防止过拟合,所以将dropout应用在了全连接的隐层,因为全连接的隐层有较多数据,数据越多越容易发生过拟合现象。 更加详细的解读 移步 什么是dropout
第一部分差不多到这吧,这篇论文的开头以及主要的思想基本分析完了。后面开始就是使用代码复现网络模型了。