【论文】 Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. Imagenet classification with deep convolutional neural networks. Advances in neural information processing systems. 2012.(pdf)
【新颖点】
- 更深的网络结构
- 使用层叠的卷积层(卷积 → ReLU → 池化)
- 使用 Dropout 抑制过拟合
- 使用数据增强(data augmentation)抑制过拟合
- 使用 ReLU 替代 sigmoid
网络结构
首先,我们说明一下论文中将网络分为上下两个部分是考虑到对应两块 GPU 用于计算,只有到了特定的网络层之后才需要两块 GPU 进行交互。为了方便理解,我们还是假设使用一块 GPU 进行运算,那么,网络总共有 8 层,其中 5 层卷积(第一和第二卷积层后面连接有 LRN,在此后的网络中有证明 LRN 并非 CNN 中必须包含的层,甚至有些网络加入 LRN 后效果反而降低)、3 层全连接
卷积层 C1: 卷积 → ReLU → 池化 → 归一层,输入为 224×224×3224\times224\times3224×224×3,卷积核的数量为 969696,对应论文中两片 GPU 就分别计算 48 个核,卷积核大小为 11×11×311\times11\times311×11×3,步长为 444,padding 为 000
如果按照公式 wide=(224+2×padding?kernel_size)/stride+1=54wide = (224 + 2 \times padding - kernel\_size) / stride + 1 = 54wide=(224+2×padding?kernel_size)/stride+1=54 计算,我们发现 (224?11)/4(224-11)/4(224?11)/4 并不是整除,那么也就说 kernel 在水平移动时的最后一个感受野并非是 11×1111\times1111×11。不过这个细节在 NetScope 中已经做出了修改,里面的输入被调整为 227×227×3227\times227\times3227×227×3,这样子第一层卷积的结果就是 55×55×9655\times55\times9655×55×96
池化使用 3×33\times33×3 步长为 222 的池化单元(重叠池化),输出为 (55?3)/2+1=27(55-3)/2+1=27(55?3)/2+1=27
局部响应归一化使用的超参数为 k=2,n=5,α=10?4,β=0.75k=2, n=5, \alpha = 10^{-4},\beta = 0.75k=2,n=5,α=10?4,β=0.75,输出大小仍为 27×27×9627\times27\times9627×27×96
卷积层 C2: 卷积 → ReLU → 池化 → 归一层,输入为 27×27×9627\times27\times9627×27×96,卷积核的数量为 256256256,分两组,卷积核大小为 5×55\times55×5,步长为 111,padding 为 222,于是输出为 (72+2×2?5)/1+1=27,27×27×256(72+2\times2-5)/1+1=27, 27\times27\times256(72+2×2?5)/1+1=27,27×27×256
池化使用 3×33\times33×3 步长为 222 的池化单元,输出为 (27?3)/2+1=13(27-3)/2+1=13(27?3)/2+1=13
局部响应归一化使用的超参数为 k=2,n=5,α=10?4,β=0.75k=2,n=5,\alpha=10^{-4},\beta=0.75k=2,n=5,α=10?4,β=0.75,输出大小仍为 13×13×25613\times13\times25613×13×256
卷积层 C3: 卷积 → ReLU,输入为 13×13×25613\times13\times25613×13×256,卷积核的数量为 384384384,分两组,卷积核大小为 3×33\times33×3,步长为 111,padding 为 111,于是输出为 13×13×38413\times13\times38413×13×384
卷积层 C4: 卷积 → ReLU,输入为 13×13×38413\times13\times38413×13×384,卷积核的数量为 384384384,分两组,卷积核大小为 3×33\times33×3,步长为 111,padding 为 111,于是输出为 13×13×38413\times13\times38413×13×384
卷积层 C5: 卷积 → ReLU → 池化,输入为 13×13×38413\times13\times38413×13×384,卷积核的数量为 256256256,分两组,卷积核大小为 3×33\times33×3,步长为 111,padding 为 111,于是输出为 13×13×25613\times13\times25613×13×256
池化使用 3×33\times33×3 步长为 222 的池化单元,输出为 (13?3)/2+1=6(13-3)/2+1=6(13?3)/2+1=6
全连接层 F6: (卷积)全连接层 → ReLU → Dropout,输入为 6×6×2566\times6\times2566×6×256,『该层有 409640964096 个卷积核,每个卷积核的大小为 6×66\times66×6,由于卷积核的尺寸刚好与输入特征图的尺寸相同,即卷积核中的每个稀疏只与特征图尺寸的一个像素值相乘,一一对应,因此该层又是全连接层。』 卷积后的输出结果为 4096×1×14096\times1\times14096×1×1,即全连接层有 409640964096 个神经元
全连接层 F7: 全连接层 → ReLU → Dropout,有 409640964096 个神经元
输出层: 输出 100010001000 个分类的得分
ReLU 作为激活函数
sigmoid 一个非常大的问题就是梯度饱和,当输入的数值较大或者较小时,其激活记过趋于不变,这样就导致其导数的变化非常的小。尤其在深度网络结构中,反向传播时由于很多很小的 sigmoid 导数累积,最终导致结果趋于 0,权值更新很慢
这对 sigmoid 梯度饱和导致训练收敛慢的问题,AlexNet 引入了 ReLU,ReLU 有以下的好处:
- 计算开销小,sigmoid 正向传播引入了指数、倒数等预算,而 ReLU 只是线性输出
- 解决了梯度饱和
- ReLU 使一部分神经元的输出为 0,这样就造成了网络的稀疏性,减少了参数的相互依存关系
ReLU 如何实现非线性激活?
假设我们从矩阵变化的角度来分析,将输入记成矩阵 AAA,输出记成矩阵 BBB,神经网络所做的变化记为 MMM,那么存在如下的关系 B=M?AB=M\cdot AB=M?A
对于 ReLU 来说,由于其实分段的,0 的部分可以看成是神经元没有激活,不同神经元激活或不激活,所以每次流经神经元所对应的变化矩阵是不同的
也就是说,假如样本 A1A_1A1? 和 A2A_2A2? 都流经网络,对应的变化矩阵是 M1M_1M1? 和 M2M_2M2?, 对单个训练样本这样的变化是线性的,但是每个训练样本的线性变化是不一样的,即 M1M1M1 和 M2M_2M2? 是不相同。那么,对于整个训练样本空间来说,就是将 非线性变化 MMM 拆为若干个线性变化 MiM_iMi? 的表示,即 M=M1?M2?MnM = M_1\cdot M_2\cdots M_nM=M1??M2??Mn?
数据增强
AlexNet 中对数据做了以下处理:
- 随机剪裁,对 256×256256\times256256×256 的图片进行随机剪裁到 227×227227\times227227×227,然后进行水平翻转
- 测试的时候,对左上、右上、左下、右下和中间分别做了 5 次剪裁,然后翻转,共 10 次剪裁,之后对结果求平均
- 对 RGB 空间做 PCA,然后对主成分做了一个 (0,0.1)(0, 0.1)(0,0.1) 的高斯扰动,结果使错误率又下降了 1%
层叠池化
在 LeNet 中池化不是重叠的,即池化窗口的大小和步长是相等的,但是在 AlexNet 中使用的池化却是重叠的,即每次移动的步长小于池化的窗口长度
局部响应归一化
虽然后来的很多网络都没有使用 LRN,甚至直接表示 LRN 对于网络没有任何提升,但是我们这里还是简单的说一下
LRN 加在 ReLU 的后面,能够增加网络的泛化能力。传统的 tanh 和 sigmoid 激活函数的阈值都是有范围的,但是 ReLU 激活函数得到的值域并没有固定的区间,所以需要对 ReLU 得到的结果进行一个归一化处理,也就是 AlexNet 中指出的 Local Response Normalization
局部响应归一化原理是仿造生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制),然后根据论文有如下公式:b(x,y)i=a(x,y)i(k+α∑j=max(0,i?n/2)min(N?1,i+n/2)(ax,yj)2)βb_{(x, y)}^i=\frac{a^i_{(x, y)}}{(k+\alpha\sum^{min(N-1, i+n/2)}_{j=max(0, i-n/2)}(a_{x, y}^j)^2)^\beta}b(x,y)i?=(k+α∑j=max(0,i?n/2)min(N?1,i+n/2)?(ax,yj?)2)βa(x,y)i??
a(x,y)ia^i_{(x, y)}a(x,y)i? 代表 ReLU 在第 iii 个核的 (x,y)(x, y)(x,y) 位置的输出,nnn 表示 a(x,y)ia^i_{(x, y)}a(x,y)i? 的邻居个数,NNN 表示该核的数量,b(x,y)ib_{(x, y)}^ib(x,y)i? 表示 LRN 的结果
怎么理解这个公式呢?
a(x,y)ia^i_{(x, y)}a(x,y)i? 表述特征图中的一个位置 [a,b,c,d][a, b, c, d][a,b,c,d],可以理解成第 aaa 张图片,在通道 ddd 下高度为 bbb,宽度为 ccc 的点
我们称 a,n/2,k,α,βa,\ n/2,\ k,\ \alpha,\ \betaa, n/2, k, α, β 分别为 input、depth_radius、bias、alpha、beta,其中除了 input 其他都是自定义的,需要特别指出的是公式中 ∑\sum∑ 求和是沿着通道方向的,即一个点同方向的前 n/2n/2n/2 个通道(最小为第 000 个通道)和后 n/2n/2n/2 个通道(最大为第 N?1N-1N?1 个通道)
我们用下面的代码演示一下