网络结构
使用ReLU非线性层
作者在网络结构中使用了ReLU作为非线性激活层来代替当时比较常用的tanh或sigmoid,加速了网络的训练速度,对此作者也做了对比实验并可视化了结果。
可以看到同样是下降到0.25的loss rate,ReLU(实现)比tanh(虚线)少用了六倍的时间。
局部响应归一化(LRN)
由于ReLU不像tanh或sigmoid一样,输出有一定范围,所以需要对其输出做归一化。作者在前两个卷积层的pooling层后面加入了LRN层,看一下公式,
a
x
,
y
i
a^i_{x,y}
ax,yi表示LRN层的输入feature,
b
x
,
y
i
b^i_{x,y}
bx,yi表示归一化后的feature,角标表示位于第
i
i
i个channel的像素
(
x
,
y
)
(x,y)
(x,y)位置的feature。可以看出这个归一化是在channel(depth)维度,半径为
n
n
n的feature层做的归一化。
重叠位置Pooling
我们知道一般在做pooling的时候pooling窗口的stride和size一般是相等的,这样pooling的输入不会有重复区域,但是作者在文中尝试了一种不同的方式,也就是stride=2、window_size=3的pooling,事实证明这种方式比stride=window_size=2的方式得到了更加不容易过拟合。
多GPU训练
作者提到,由于使用的GPU内存限制,无法将整个网络全部加载进去,所以使用了两块GPU同时训练的策略,并对不同的layer采取不同的GPU间连接方式。具体的来说,在第二个MaxPooling后面对两块GPU的输出层做了交叉连接,类似于将两个GPU的feature maps concatenate到一起,另外最后一个卷积层到全连接层、和全连接层之间也采用了相同的连接方式。除了这三个地方之外,其他的卷积层都是在单个GPU内部进行feature map传递的。
作者在文章最后提到由于硬件限制才会这样设计网络,而且网络训练的很长时间,如果有更好的硬件条件完全可以避免这个问题。
防止过拟合
为了防止过拟合,作者使用了两种方式,数据增强和DropOut。
其中数据增强主要是图像平移(不同位置的图像裁剪)、水平镜像翻转和RGB通道颜色变化(类似加入随机白噪声),由于数据增强逻辑比较简单,几乎不会增加训练时的计算量,作者提到他们的做法是在当前batch在GPU上做训练时就将下一个batch的图像在CPU上做好数据增强。
另一个便是DropOut,作者用在了前两个全连接网络之后。这个方式实际上是减少网络在训练和推断时对某一个神经元的依赖或对某几个神经元组合的依赖,于是在每次有新的输入图像时,神经元都会以0.5的概率被隐藏,也就是不参与前向推断,同时梯度回传的时候不会传到这个神经元,这样的思路相当于设计了一个模型,而训练的是多个模型的组合。作者经过对比得出结论:如果不加入DropOut,模型训练后会有比较严重的过拟合现象,加入后便可以缓解这个现象,但是模型的收敛速度比原来多了一倍。
结果和讨论
这个模型在当时的2012年ImageNet比赛中获得了冠军,作者对自己的模型也做了一些分析,例如,作者可视化了经过第一个卷积层的所有kernel,结果如下:
可以看出,网络确实学习到了如何去检测一下底层特征(边缘,方向等等),并且第一个GPU学到的kernel(前三行)总是与颜色无关的,第二个GPU学到的kernel(后三行)总是与颜色相关的。
作者在最后也提到,这个网络结构中每一个中间layer都十分重要,无论移掉任何一个中间卷积层都会使网络的性能变差至少2%。