Bag of Tricks for Image Classification with Convolutional Neural Networks
论文地址:https://arxiv.org/pdf/1812.01187.pdf
2 训练过程
采用mini-batch 随机梯度下降法训练神经网络的模版如Algorithm 1所示。本节指定Algorithm 1的一种实现baseline。
2.1 训练过程的baseline
采用被广泛使用的ResNet的实现方法作为baseline。训练和验证的处理方式是不一样的。训练过程按如下步骤进行:
1.对图片进行随机采样,并解码为32位浮点值,其像素值取值范围为[0, 255]。
2.随机裁剪矩形区域,保持其宽高比范围为[3/4, 4/3],裁剪区域比例为[8%, 100%],然后统一将图像块缩放到224*224。
3.以0.5的概率进行随机水平翻转。
4.从均匀分布[0.6, 1.4]提取系数,来进行色相、饱和度和明亮度(HSB)的缩放。
5.从正态分布N(0, 0.1)中采样系数,用于添加PCA噪声。
6.对RGB三通道进行归一化,三通道分别减去123.68,116.779,103.939,并分别除以58.393, 57.12, 57.375。
验证时,在保持图像宽高比不变的前提下,将短边缩放到256个像素,然后在中心区域裁剪出224\*224的图像块,同时按训练时RGB通道归一化处理图像。验证过程中不对图像进行随机增强处理。
卷积层和全连接层全部按Xavier算法进行权重初始化。本文设定参数随机从正态分布\[-a, a\]中取值,其中![a=\\sqrt\{6/(d\_\{in\}+d\_\{out\})\}][a_sqrt_6_d_in_d_out]。![d\_\{in\}][d_in]和![d\_\{out\}][d_out]分别代表输入和输出通道数。所有的bias初始化为0。针对BN层,![\\gamma][gamma]初始化为1,![\\beta][beta]初始化为0。
训练采用的是NAG下降法。每个模型训练迭代120个epoch,batchsize设为256。学习率初始化为0.1,并在第30、60、90个epoch时分别除以10。
3 有效训练
本节中研究了多种在不降低模型准确率的前提下,采用低精度,大批量训练的方法。一些技巧还可提升准确率和训练速度。
3.1 large-batch training
Mini-batch SGD 可增加训练的并行性,同时减少通信损耗。增大batch size,可能会降低训练速度。针对凸优化问题,batch size增大会导致收敛速度变慢。针对相同的epoch数,大batch size训练得到的模型相比小batch size训练得到的模型,验证准确率下降了。
(1)线性缩放学习率
mini-batch SGD中,每个把batch随机选取样本导致梯度下降是一个随机的过程。增大batch size,随机梯度的期望不变,但使得方差降低,即减少了梯度的噪声。因此可以通过增大学习率使在梯度相反方向前进一大步。例如,针对batch size为256,初始学习率为0.1的情况,将batch size增大到b,则学习率可增大到0.1×b/256。
(2)学习率warmup
训练伊始,所有参数一般取随机值,因此与最终方案相差甚远。采用太大的学习率易导致数值不稳定。warmup即训练开始以小的学习率,当训练稳定时切换到初始学习率。例,在前m batch中采用warmup方案,设初始学习率为,则针对
的batch i,设置学习率为
。
(3) zero
ResNet网络由许多残差块组成,每个残差块又由卷积层组成。给定输入x,假设block(x)是残差块最后一层的输出。注意残差块最后一层可能是BN层。BN层首先对输入进行归一化,得到,再做变换
。
和
是可学习的参数,分别初始化为1和0。zero
策略中,所有残差块的最后一层BN层,初始化
。因此,所有残差块仅返回其输入值,使得网络在初始阶段拥有更少的层并更易训练。
(4)无偏置衰减
权重衰减通常用于包括权重和偏置的所有可学习的参数。它与应用L2正则化使参数逼近于0的方法类似。有关论文建议只对权重进行正则化可避免过拟合。无偏置衰减策略即只在卷积层和全连接层应用权值的权重衰减。
3.2低精度训练
神经网络通常采用32位浮点精度训练。即所有输入输出数据的存储格式都是32位浮点型。新的硬件针对低精度数据提升了算数逻辑单元。例如Nvidia V100针对FP32提供了14TFLOPS,但是对FP 16提供了超过100TFLOPS。因此,在V100上采用FP16比FP 32训练速度快了2~3倍。
除了效果上的优越性,低精度使得结果具有更窄的范围,从而不会因为越界而影响训练。有关论文提出所有的参数以FP16存储并计算梯度,同时所有参数以FP32进行参数更新。另外,loss乘以一个数使其与梯度FP16的范围对齐也是一个实用的方案。
还没有评论,来说两句吧...