先上文章下载地址:ImageNet Classification with Deep Convolutional Neural Networks
2012年出现的AlexNet是目前这个深度卷积神经网络热潮的开端,这篇文章就是介绍的AlexNet,其中用的许多techniques其实现在都很常用,但是在当时都是挺新的,比如在一片用sigmoid的大环境用上了ReLu等等。
除了输入输出层外,这个网络包含了5个卷积层和3个全连接层,参数分别为:
1). Input layer: 224 * 224 * 3 (RGB图片,224 * 224像素)(看Stanford的CS231n课程时候,Andrej Karpathy说Alex坚持这里是224,然后这里应该是227,不然没法成立,即下一层不会是55)
2). Conv layer: 96 kernels of 11 * 11 * 3 - LRN - Max-Pooling - ReLU
3). Conv layer2: 256 kernels of 5 * 5 * 48 - LRN - Max-Pooling - ReLU
4). Conv layer3: 384 kernels of 3 * 3 * 256 - ReLU
5). Conv layer4: 384 kernels of 3 * 3 * 192 - Max-Pooling - ReLU
6). Conv layer5: 256 kernels of 3 * 3 * 192 - ReLU
7). Fully-connected1 of size 4096 - ReLU
8). Fully-connected2 of size 4096 - ReLU
9). Fully-connected3 of size 4096 - ReLU(这一层称为FC7,因为这一层刚好是分类层前面一层,所有现在人们一般在别的结构中也称这一层为FC7,即使那一层实际并不在第7层)
10). Softmax output 1000
下面先按作者所认为的重要性列一下用到的东西:
1. ReLU Nonlinearity
这里不是跟以前一样用的是
f(x)=tanh(x)
或者
f(x)=(1+e−x)−1
,而是
f(x)=max(0,x)
,最后一个要比前二者训练速度快很多,作者在文中也有相应的实验。而且由ReLu本身的性质知道,其求导容易,这在BP中比较好,而且其是非饱和的,解决了梯度消失的问题。
其实后续人们还有对ReLu的改进型进行研究,如PReLu,Random ReLu。
2.Multi-GPU
利用多个GPU进行计算,这也是人们现在的常用手段,不过现在又有新的诸如FPGA的计算方式
不过有一点比较奇怪,文中作者在6.1提到
The kernels on GPU 1 are largely color-agnostic, while the kernelson
on GPU 2 are largely color-specific. This kind of specialization
occurs during every run and isindependent of any particular random
weight initialization (modulo a renumbering of the GPUs).
比较奇怪为什么会有这样的现象。
3.Local Response Normalization
LRN层是用来做归一化的,它能够带来更好的泛化能力,
aix,y
将记作在位置(x,y)处利用核i计算出神经元的激活值,然后再利用ReLU,响应正则化项
bix,y
主要公式如下:
这个trick之前貌似有听过说没什么用,就没怎么研究,以后有机会查一查。
更新:后续在学习CS231n时,Andrej Karpathy称这是在12年左右用在normalization的一个layer,后续研究已经证明其没什么鸟用
4.有重叠的pooling
典型的池化过程是不重叠的,但这里是重叠的,因为保留了更多的原信息,所以提高了一点成绩。文章最后还说了对防止过拟合有一点点(slightly)作用,所以目测并没有什么卵用
尽管有1.2million的训练数据,分为1000类,但每一类也只有一千多个,这会导致过拟合。下面讲一讲作者用到的一些防止过拟合的措施:
1.Data Augmentation
有两种:
1)简单地说就是对现有数据进行变换,文中把原始训练图像缩放到256X256,然后从中随机取出224X224的若干图像使得数据量增到2048倍(没说具体怎么取,可能可以算出来吧)。对于测试图像分别取四个corner以及中间的224X224大小的patch,以及其flip后的patch(这样一共有10个 patches),最后在softmax输出层那里对预测结果做一个平均。不过这样做应该会增大了数据的关联性,增加了过拟合风险。
2)更改数据图片RGB通道的强度。通过PCA主成分分析,找出整个数据集中RGB像素值的主成分,但是不降维,只取特征向量和特征值。对训练集上每张图片的每个像素
Ix,y=[IRx,y,IGx,y,IBx,y]T
加上值:
其中 pi 分别为特征向量, λi 为特征值, αi 为标准正态分布的随机值(对于特定一幅图的 αi 是同一个的,直到它被拉去训练)
2.Dropout
这也是现在非常常用的一个方法,通过随机的训练中的一些节点暂时“丢掉”,来防止过拟合,而且既可以达到多个模型联合的效果(因为每次的结构都不同,但又共享参数),增强了学到的特征的鲁棒性,又不用花太多的时间去训练多个网络。但是这样一定程度上会延长训练的时间,因为随机性不只是会打乱过拟合的过程,也会打乱正常拟合的过程。 在测试的时候,不使用dropout,使所有神经元都运算,最后乘个0.5后输出(不过不乘也没问题,只是乘了以后比较凸显这种差别。而且也与训练的效果一致了不会让别人多一步疑惑)。
最后简要说一下训练过程,权值更新公式如下:
其中,i表示循环的次数,v表示动量,lr表示学习率, ⟨∂L∂ω|ωi⟩Di 表示在batch中,目标函数反传的误差。
另外关于此部分,作者有一句话:
We found that this small amount of weight decay was important for the
model to learn. In other words, weight decay here is not merely a
regularizer:it reduces the model’s training error.
文章别的地方也没有解释,不大明白为什么。