论文: ImageNet Classification with Deep Convolutional Neural Networks
文章首先开头就皮了一波,说Yann LeCun的文章被拒绝了,拒绝原因是使用了神经网络但是不能很好解释这个网络的工作原理。
神经网络参数初始化困难? 不,只是我们需要更多的数据和计算。
Why AlexNet
为什么是AlexNet?看一下文章做了啥。
- 在ImageNet数据集上训练了当时最大的CNN网络,并取得了最好的效果;
- 提出了一些优化方法提高准确度与加速训练:
- 提出使用Relu激活函数,
- 并行GPU训练,
- 局部响应归一化,
- 重叠池化等;
- 使用了一些过拟合的技术,包括数据增强,Dropout等(这两个技术不是本文发明的,但是也在这里说明一下Dropout)。
在当时的情况下,AlexNex的错误率在ILSVRC-2010的TOP-1,与TOP-5上比第二名低了8%左右。(如果没有理解错误的话)。而Relu激活的训练速度在达到错误率25%的情况下,比tanh要快6-7倍左右。动摇了SVM霸主地位;尝试着加深加宽网络结构;
整体架构
这个结构,实在没啥好说的,而且不太美观,分两个GPU训练,每个GPU负责图像的一半训练,在中间进行一次特征共享,然后继续各干各的,在到最后的时候进行全连接。层之间的操作按顺序包括:激活,池化,局部响应归一化。
技术细节
Relu
rule函数简单是真的简单。
- 我们知道之前就存在sigmoid与tanh等激活函数。他们的函数表现形式都是指数,在进行计算的时候,计算复杂,提出使用relu激活函数,复杂度为1.
- 这两个函数的在趋近正无穷与负无穷时,它们的导数都趋近于0,即它们是饱和激活函数,随着网络的加深,参数经过多次激活后,可能产生梯度消失或者梯度爆炸问题。什么叫梯度消失,一句话解释就是链式求导完事后,结果趋近0,用接近 0的梯度更新不了权重。梯度爆炸就是梯度消失的反面。 所以产生的原因是链式求导次数太多了(网络太深),或者当前激活函数特性在多次链式求导中存在这一现象(激活函数导数缩放)。
梯度消失问题简单讨论--Sigmoid
上个图,sigmoid为啥可能会梯度消失。左边sigmoid, 有边为sigmoid的导数。
可以看到sigmoid的导数最大值不到0.25,也就是说,哪怕一直取最大值,当网络深度足够大时,这个梯度也会变得很小。
局部响应归一化--LRN
先解释一下参数:
- N表示我们现在在卷积层使用了N个kernel, 即kernel的个数,(假设N=96, kernel size = (11 , 11));
- i表示第i个kernel, (假设i=10);
- j表示相邻的要进行求和的kernel index;
- x,y 表示kernel中的位置,可以看做横纵轴坐标值;
- k=2, n=5, = , =0.75 都为超参数,人为设定。
使用假设参数,则
作者说在top-1与top-5,这个局部响应归一化分别能够降低1.4%与1.2%的错误率。
我们可以看到,整个操作都是在kernel上面完成的,那么就是说,这个归一化仅仅针对我们的训练参数,据说这个原理是根据神经元之间的相互抑制作用。2012年的时候呢,就被人给质疑了,由于LRN的不稳定性,或者说没有太明显的效果,后面的网络基本上不使用这个技术了,另一方面也是因为出现了更优秀的方法BN。
说下自己的理解,局部响应归一化的作用主体是kernel,当一张张图片训练时,每个kernel都可能因图片而不同,但是在一张图片的一个网络层的不同kernel之间进行归一化,似乎看起来更像不同特征的混杂,比如直角特征与圆特征的混合,变成了一个圆角。这在某些过拟合情况,可能有效,在正常情况下,更像是丢失了原来的信息。所以才在不同的数据集上表现大相径庭吧。如果有错误,请指正。
Dropout
实际操作就是网络在进行往下传递的过程中,随机丢弃掉一部分神经元,从而达到防止过拟合的目的。(不是本文提出,但也是作者干的)
原理参考这个https://baijiahao.baidu.com/s?id=1662291933985664260&wfr=spider&for=pchttps://baijiahao.baidu.com/s?id=1662291933985664260&wfr=spider&for=pc从数学上解释了可行性,当然直观上也能理解,大数定律了解一下。