Alex-net是CNN的开山之作,拜读一下大作,自己总结下记得请~
摘要
在ImageNet上训练了一个大型深度卷积神经网络,将120万高分辨率的图像分成1000类,在测试集上取得了TOP1(37.5%) TOP5(17.0%)的好成绩。Alex-net中有650K个神经元,60M个参数,5个卷积层,3个全连接层,1000维的softmax。为了训练得更快,我们采用非饱和神经元进行卷积以及高效的GPU工具。采用了dropout的方法减少过拟合。Alex-net的变种参加了ILSCRC-2O12的竞赛,成绩更好了。
1 简介
背景:现有成果的不足,数据集不够大,新出现的LabelMe---包含了数十万张完全分割的图像和ImageNet---包含了22000个类别上的超过1500万张标注的高分辨率的图像。为了从ImageNet的大量数据中分出很多对象,引入卷积神经网络(CNN)进行预处理,CNN可以对学习图像本质提供强有力的依据,通过改变depth和breadth的参数可以控制其性能。与标准前馈网络比,CNN连接数和参数少,性能虽稍差但更适宜训练。
本文贡献:
- 在ImageNet上训练了迄今为止最大的神经网络之一,并且取得了前所未有的性能
- 编写了深度优化的2D卷积神经网络在GPU上的应用,并公开其内部结构
- 新网络有全新的特性,提高性能,减少训练时间,见第三节
- 采用有效的预防过拟合技术,见第四节
- 最终网络结构为:5个卷积层+3个全连接层,大部分参数都是在全连接层,每一个卷积层包含不到1%的参数,去掉任何一层都会降低模型的性能
2 数据集
使用ImageNet,使用时下采样到256*256的大小,除了下采样外不做其他预处理,对原始图像的RGB像素进行网络训练。
3 结构
包含8个学习层,5个卷积层和3个全连接层。由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3,R1,R2,R3层上出现交互,所谓的交互就是通道的合并,是一种串接操作。论文中给出的结构图:
论文中maxpooling部分被比较简略,下图细化分解各个过程:
卷积计算公式为:
(原图大小N×N,卷积核大小n×n,卷积步长stride,边界填充padding)
卷积层1:输入图像224 × 224 × 3,使用96个大小为11 × 11 × 3的卷积核,步长4像素,第一层中feature map输出大小为 = 55,进行步长为2的max-pool,最终得到96个27×27的feature map
卷积层2:使用256个5 × 5 × 48的卷积核,步长1像素,边界填充为2,使用两个GPU进行运算,每个GPU上有128个卷积核,卷积核的大小为:5×5×48 ,进行步长为2的max-pool,最终得到256个13*13的feature map
卷积层3:使用384个3 × 3 × 256的卷积核,步长1像素,边界填充为1,最终得到384个13*13的feature map
卷积层4:使用384个3 × 3 的卷积核,步长1像素,边界填充为1,最终得到384个13*13的feature map
卷积层5:使用256个3 × 3 的卷积核,步长1像素,边界填充为1,最终得到256个13*13的feature map
全连接层6,7,8:卷积层5输出进行max-pooling后作为输入,每一层的神经元的个数为4096,最终输出softmax为1000
3.1非线性ReLU
非饱和的非线性函数比饱和的非线性函数在收敛的快,因此,采用ReLU函数作为激活函数。在CIFAR-10数据集上,在一个4层的卷积网络中使用ReLU函数达到25%的训练错误率要比在相同网络相同条件下使用tanh函数快6倍。
用于增加非线性
在全连接层中的激活过程就很好理解了,因为全连接层内所有的神经元的输出都是一个数,只要这个数x>0,则x=x;x<0,则x=0。
在卷积层中的激活针对的是每一个像素值,比如某卷积层输出中某个通道中i行j列像素值为x,只要这个数x>0,则x=x;x<0,则x=0。
3.2 多GPU训练
网络太大因此我们将网络分布在两个GPU上,每个GPU放置一半的核(或神经元),还有一个额外的技巧:只在某些特定的层上进行GPU通信。第3层的卷积会将第2层的所有输出作为输入,第4层的卷积只将位于相同GPU上的第3层的核映射作为输入。这种训练方法使top-1和top-5错误率和使用一个GPU训练一半的kernels相比分别降低了1.7%和1.2%,同时缩短了训练时间。
3.3 局部响应归一化
ReLU不需要通过输入归一化来防止饱和,但是我们发现局部响应归一化有助于泛化(???),公式如下:
表示神经元激活,在位置使用核,表示响应归一化结果,N是卷积核数目,k,n,α,β是超参数,给定值为:k=2,n=5,α=0.0001,β=0.75。
这部分再看一下这里:
https://blog.csdn.net/luoluonuoyasuolong/article/details/81750190
3.4 重叠池化层
CNN中通常采用局部池化,即pool_size = stride,如果 stride < pool_size, 那么就会产生覆盖的池化操作,Alexnet中使用重叠池化的方法,设置stride =2,pool_size=3,在top-1,和top-5中使用重叠池化分别将top-1和top-5错误率降低了0.4%和0.3%。
4 减少过拟合
论文说Alexnet虽然只有8层,但有6000万个参数,可以算一下,参数大部分在全连接层。参数量巨大容易导致过拟合,论文采用下面两种方法避免过拟合
4.1 数据增强
采用了两种方法进行数据增强:
- 产生图像变换和水平翻转
- 改变训练图像的RGB通道的强度
4.2 随机失活 Dropout
随机将隐层神经元的输出置0,概率为0.5。失活的的神经元不再参与前向传播何后向传播。每次输入,神经网络都是不同的架结构,但是各个结构的权重是一样的。使用dropout正则化后,每个神经元都有失活的可能,对于单个神经元来说,输入的特征量存在被清除的可能,这就使得神经元不会依赖于任何一个特征。
5 学习细节
AlexNet使用随机梯度下降算法,batch大小是128,动量衰减参数设置为0.9,权重衰减参数为0.0005,这里的权重衰减不仅仅是一个正规化器,同时它减少了模型的训练误差,权重 的更新过程变为:
其中, 是迭代次数索引, 是动量变量, 是学习速率, 是第 个batch中 的梯度的平均值。(???不太懂),网络参数的初始化方式为权重初始化方式是均值为0,标准差为0.01。第2、4、5和全连接层的偏置为1,这样可以使得神经元在初始阶段为正值,因为ReLU的负数部分激活值为0。其它层的偏置初始化为0。120万张图像在两块GTX580上训练了6天时间。
参考:论文原文
《深度学习》课程总结-深度学习的实用层面 dropout 看看这里
《ImageNet Classification with Deep Convolutional Neural Network》