《ImageNet Classification with Deep Convolutional Neural Networks》 剖析
CNN 领域的经典之作, 作者训练了一个面向数量为 1.2 百万的高分辨率的图像数据集ImageNet, 图像的种类为1000 种的深度卷积神经网络。并在图像识别的benchmark数据集上取得了卓越的成绩。
和之间的LeNet还是有着异曲同工之妙。这里涉及到 category 种类多的因素,该网络考虑了多通道卷积操作, 卷积操作也不是 LeNet 的单通道卷积了 (LeNet仅仅限于 gray image 的 digit recognition , label种类就10个)。
该神经网络有6千万个参数,650,000个神经元。包含了五个卷积层(卷积操作层和下采样层统称之为卷积层), 和三个全连接层。 为了使得训练更快,让网络实现在GPU上进行卷积操作运算,为了减小overfitting, 全连接层引入一个最近兴起的方法:dropout。下面是整个网络的大致介绍:
如图,其中第一层为输入层,就是一张224X224X3的image, 首先进行的是卷积层,kernel 是11X11X3的, 那么每11X11的图像大小范围被卷积操作成为一个新的像素点的一个信道。卷积的步长为4, 说明224 X 224 被卷积成为是 55X55 的大小, 因为卷积核有96个,上下平分(因为被分到不同的GPU进行运算),所以第二层是 55X55X48 的新的层。
(1), Relu非线性操作:
我们知道在浅层神经网络中, 引入非线性操作(也叫激活函数 active function),可以增强神经网络的泛化能力,使得神经网络更加robusting。但是在深层网络中,使用tanh函数,作为激活函数,增加了大量的计算,使得训练更加慢了,引入Hinton的Rectified Linear units (Relu) 来作为激活函数,
Relu(x) = max(0, x)
这样的好处: 第一是在论文中也说明了,简单的max计算,大大减少了计算量,可以提高训练速度, 第二是梯度在Relu中是直接传递的,鉴于深度网络的梯度衰减的现象,Relu可以保持梯度,减缓梯度衰减的趋势。 另外一个方面也是bp过程中没有了梯度换算的操作,加快了训练。
(2), 在多GPU上进行运算
因为整个神经网络的训练是卷积之间的操作基本是独立的,所以可以采用独立的两个GPU进行运算,增快训练的速度。
(3), Normalization
为了不让某一些kernel的weight变得很大,要对不同的kernel进行Normalization。
(为什么weight不能很大,如果某一个kernel 的weight变得很大的话,它的权值稍微变化则会引起很大的影响,那会重点改变它的weight而忽视其他太小weight的kernel)
其中, k, n, alpha, beta 这些常量都是“可调参数”, 由最好的validation set决定
(4), 对下采样层进行Overlapping Pooling
传统的下采样是不重叠的,但是为了精确性,使得识别度更高,对Pooling层进行Overlapping Pooling。
Pooling的好处,有点类似了 SIFT 的pyramid 结构去解读一张图片,此外还可以减少 pixels 的个数, 减少后面全连接层的神经元个数。
这么庞大的神经网络,这么多参数,很容易陷入overfitting的,减少overfitting的方式有两种Data Augmentation 和 Dropout
(5), Data Augmentation
最常用的方法是:增大数据集的量,Label-preserving transformation. 本文中使用了两种Data Augmentation的方法,第一个是产生图片transformation和水平转换。因为有些图像进行水平转换是一致的,还有的操作是缩放操作(SIFT中算法的思想),旋转操作(可以增强物体识别的robustness)等。
第二种是改变训练图片的RGB的强度。 对图片中每一个RGB像素点进行一种变换,通过类似PCA的方法,求出特征向量和特征值,来提取主元
其中三个Alpha值对应image的三个channel,一张图片的每个像素都使用这个特定的随机值进行提取主元。
按照论文所说的,这种方法获取了image的天然特性,该特征对光照强度和光照颜色保持鲁棒性。
(6), Dropout
在全连接层,对有些隐层的神经元的输出置为0,对每个神经元输出置为0的概率是0.5,Dropout的神经元不会对前向传播操作造成影响,也退出了反向传导权值修正。这样即可以提高训练效率,也防止了overfitting。
本文的神经网络在前面的两个全连接层进行Dropout,有效防止了overfitting。
(7), 训练的过程
每个batch使用128个样本进行训练,设置好动量参数,权值decay, 学习率, 等参数。
对于全连接层:
类似浅层神经网络的训练,反向传播,权值修正。BP算法对每一个weight进行反向修正,根据误差函数对权值的偏导,进行负梯度下降的训练。
对于卷积层:
矩阵权值修正, 这里涉及到BP算法的二维应用。 卷积层首先在训练之前是随机化处理(随机化应该也是有技巧的随机化)。
评论:
CNN真的是一个充满前景的深度网络, 从不同的角度和不同的方式去提取特征,尽可能地去提取图片中的信息,同时,还需要很多的训练技巧,防止overfitting。
网络结构是越大越好,网络结构越复杂,神经元的个数越多,这个网络的capacity 越强。 同时在训练的过程中,训练技巧则是在防止overfitting 和 underfitting 之间找到那个平衡点。
最近的参与到openface的训练,体会到了这两个至关重要的point。
reference:
(1), http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html
(2), 在路上 http://zhangliliang.com/2014/07/01/paper-note-alexnet-nips2012/