Deep Learning 读书笔记(一)

来源:互联网 发布:怎么做淘宝联盟分享赚 编辑:程序博客网 时间:2024/04/29 00:41
 

Deep Learning 读书笔记(一):ImageNet Classification with Deep Convolutional Neural Networks

本文来自:http://blog.csdn.net/tuqinag/article/details/40077333        


       这篇文章的内容是描述作者在ImageNet LSVRC-2010这个竞赛中,所达到the-state-of-art的工作。记得原来有在微博中看到过,现在世界上做图像最顶尖的那一批人都投身在ImageNet中。而且所给的数据又是非常的庞大,就拿本篇文章所使用的数据集来说,任务是需要将1,200,000高维的图片分为1000个不同的类,可见要取得好的成绩难度还是非常大的。

        言归正传,先大体的介绍下文章模型的结构,让大家认识到这个模型是有多么庞大。整个模型共有60,000,000个参数,650,000个神经元,共有5个卷积层,其中有一些卷积层之后是最大池化层(这个告诉我们并不一定卷积层之后就一定是池化层),还有三个全连接层,最后是一个有1000个输出的softmax层。之后会给出模型结构的图示。模型的参数这么多,训练数据的量又这么大,我们必然需要找到一些方法来加快模型的训练速度以及避免过拟合问题的出现。之后会一一介绍所使用的措施。

        首先是在加快模型训练速度方面所使用的一些方法(接下来介绍的顺序是根据作者认为重要性的由大到小来排序的):

        (1)ReLU Nonlinearity

        这里,每一个神经元所使用的激活函数不再是或是,而是f(x)=max(0,x).将之前的两个函数称之为saturating nonlinearities函数,而将之后的函数称为non-saturating nonlinearities函数。在梯度下降的过程中,使用saturating nonlinearities函数的训练速度要慢于使用non-saturating nonlinearities函数。作者还做了一个实验来证明这一点:

        图中实线表示的是使用non-saturating nonlinearities函数。可以发现在使用相同数目epochs的训练数据进行训练时,使用non-saturating nonlinearities函数的训练速度明显更快。

        (2) 使用多个GPU进行训练

        使用GPU来训练CNN网络是当前的主流方法,因为对于2D卷积,现在的GPU能对其有很好的优化。但因为GPU内存的限制,所以网络的规模也会有所限制,而且同样要考虑到我们所能忍受的模型的训练时间。考虑到文章所使用的模型太大,一块GPU并不能将其完全容纳下,而现在的GPU的并行技术已经能够做到比较好了,可以直接从另一块GPU的内存中读取数据,而不需要再经过主机的内存。具体的实现中,在一块GPU中放入网络的一半,我们并不会在网络的每一层之后进行GPU数据的交换,而是在固定的层之后才会进行。在之后给出模型的结构图之后,这一点我们可以看得很清楚。对于网络的连接模式,我们可以利用交叉验证的方法来得到,而且也可以调整交换的数据量的大小,使其在一个可接受的范围。

        (3)局部响应正则化(LRN)

        使用这个方法的原因是,它能够带来更好的泛化能力。Hinton等人认为LRN层模仿生物神经系统的侧抑制机制,对局部神经元的活动创建竞争机制,使得响应比较大的值相对更大,提高模型的泛化能力。

记作在位置(x,y)处利用核i计算出神经元的激活值,然后再利用ReLU nonlinearity,响应正则化项的表达式为:

        其中,N表示这一层所有核的个数。整个和式是在相同位置,n个相邻的核上计算得到的。参数的具体值都是通过一个具体的测试集所得到的。

        (4)有重叠的池化

        从前一篇博客描述CNN的池化过程,我们可以知道典型的池化过程是不重叠的。但是本篇文章中所使用的池化过程是重叠的,池化区域的大小为3x3,而相隔区域的大小只有2,等于说是重叠了一个像素。而且,作者也说明了,如果使用了重叠的池化,有助于防止过拟合的发生。

        在介绍完模型中所使用的一些trick后,我们来讨论下模型的整体结构。先给出模型的结构图:

        模型的前5层为卷积层,有些层之后跟有最大池化层,但是并没有在图中画出来,只是标注了下。之后三层是全连接层,最后是一个有1000个输出的softmax层,输出输入图像的分类结果。模型的目标函数是一个多项的logistic回归函数。第二层、第四层、第五层的卷积函数只与其在同一GPU中的那一半网络的前一层进行连接。而第三层的卷积层则需要与前一层的所有神经元进行连接,两块GPU也就是在这里进行了数据的交换。局部响应正则化技术是在第一层和第二层卷积层之后使用。最大池化层是在局部响应正则化层之后以及第五层卷积层之后使用。ReLU non-linearity技术则是利用在每一层卷积层和全连接层之中。至于网络每一层具体的大小,这里就不再叙述了。

        前面我们也提到了,整个网络有60,000,000个参数,怎样防止模型出现过拟合问题也是我们急需解决的问题。接下来我们就来叙述下本篇文章中所使用的一些方法。

        (1)增加数据

        对于图像数据来说,减少过拟合问题,最早使用的同时也是最常用的方法就是,在保持数据标签不变的情况下增大数据集。这里我们使用了两种不同的方法,它们都只需要很少的计算量,因此变换后的图像并不需要存储在硬盘中,而只需要存放在内存中即可。在实际的使用中,都是在GPU计算上一个batch的图像时,在CPU上进行图像的一些变换操作。之后就来讲讲所使用到的两个方法。

        1)image translations and horizontal reflection

        是从256x256的图片中随机提取224x224的片段,这样的话会造成数据之间的关联性,从而可能会造成过拟合现象的发生。但是,这样我们可以使用一个更小的网络。在实际应用中,是取5个224x224的片段,从原图的4个角和中心处提取,还有horizontal reflections共10个片段。

        2)altering the intensities of the RGB channels

        perform PCA on the set of RGB pixel values(由于我不是专业做图像处理的,这句话我也不能准确的理解它的意思,只能抄原文了).之后在PCA所得到的主成分上乘以一个随机的变量,这个变量服从均值为0,标准差为0.1的正态分布。每一个RGB像素值为,再加上这一项,其中分别是RGB像素值协方差矩阵的特征向量和特征值,就是之前提到的那个变量。对不同的图像进行处理时,就需要取不同的的值。这种方法能够有效地捕捉到图像中一些重要的特征,比如说目标在光照或者背景发生变化的情况下是不会发生改变的。

        (2)dropout 方法

        dropout方法是近年来应用在深度模型中用于减少过拟合问题所采用的一种很普遍的做法,也能够取得很不错的效果。我打算在下一篇博客中详细说一下这个方法,这里就不再重复了。

        但是,dropout方法所带来的一个问题,这里还是有必要说下。文章中提到了,在使用了该方法后,需要增加一倍的循环次数来使得模型的参数达到收敛,这无疑也增加了模型的训练时间。

        最后,我们来讲一讲模型在训练过程中所使用到的一些方法。文章使用随机梯度下降法进行模型的训练。权值的更新公式为:

        其中,i表示循环的次数,v表示动量,表示学习率,表示在batch中,目标函数反传的误差。

        为网络中的所有连接权值赋上一个服从均值为0,标准差为0.01的正态分布的一个随机数。为第二、四、五层的卷积层和所有的全连接层神经元的偏置都赋予1的初始值,而其他层神经元的偏置均为0。这种初始化方法在模型的训练初期,能够有效的提速。因为为ReLU输入的都是正值。

        网络所有层的学习率都是一样的,但在训练过程中会对这个值进行调整。如果在某个学习率下,模型在验证集上的错误率已无法下降,那么就将学习率除以10。学习率的初始值为0.01,在学习率被减小3次以后就不会再发生改变了。

0 0