前言

寒假忙一个会议论文去了,到现在才有时间更新博客,大四生活和想像的不一样,一如既往的多事做(捂脸。

本文所有深度学习技巧均针对于图像识别模型。

训练深度学习模型需要大量数据,这将导致需要花费大量的时间训练模型,本文将总结加速深度学习模型收敛的技巧,同时将总结如何让深度学习模型尽可能收敛到一个好的解,从而提高模型的泛化能力。


如何加速模型收敛

本节将总结如何在不影响模型准确率的前提下,加速模型训练的技巧。


增大batch size

当前大部分深度学习模型都使用Minibatch SGD,或是使用BN算法。增大batch size一定程度上可以加速模型收敛,提高模型的泛化能力,但是batch size过大会影响模型的泛化性能与收敛速度,因此batch size并不是越大越好,并且batch size的大小会影响初始学习率的选择,而初始学习率会影响到模型的收敛速度

《Bag of Tricks for Image Classification with Convolutional Neural Networks》一文总结了batch size对模型收敛与泛化能力的影响,结论:batch size在一定范围时,让模型稳定收敛的初始学习率具有较大的选择空间,并且可以提高泛化性能,该论文做了较多实验,这里截取两张支撑上述结论的结果

在这里插入图片描述
在这里插入图片描述
上面两幅图,右图表明batch size在一定范围时,使模型收敛的初始学习率的选择范围较广,并且初始学习率大小会影响到模型的泛化性能,当batch size过大时,初始学习率的选择范围较窄,并且模型的泛化性能下降。左图表明batch size过大,会导致模型的泛化性能下降。


Linear scaling learning rate

从上一节可知,增大batch,可以加速模型收敛速度,但是大batch会导致模型的泛化性能下降。如果让大batch一次梯度更新后的权重与小batch k k k次梯度更新后的权重一致,那么就能在加速模型收敛的同时,防止模型泛化性能下降,这便是Linear scaling learning rate的出发点。

Linear scaling learning rate是指当batch size增大n倍时,learning rate也要增大n倍。该理论的推导过程如下:

设小batch size为 m m m,大batch size为 n m nm nm L ( θ ) L(\theta) L(θ)表示参数为 θ \theta θ时的损失函数。小batch在n次梯度更新后,模型权重 θ k + n s m a l l \theta_{k+n}^{small} θk+nsmall
θ k + n s m a l l = θ k s m a l l − α m ∑ j = 1 n ∑ i = 1 m ∇ θ L i + j m ( θ k + j ) (1.0) \theta_{k+n}^{small}=\theta_{k}^{small}-\frac{\alpha}{m} \sum_{j=1}^n\sum_{i=1}^m\nabla_{\theta}L_{i+jm}(\theta_{k+j})\tag{1.0} θk+nsmall=θksmallmαj=1ni=1mθLi+jm(θk+j)(1.0)

大batch在1次梯度更新后,模型权重 θ k + 1 l a r g e \theta_{k+1}^{large} θk+1large
θ k + 1 l a r g e = θ k l a r g e − α ′ n m ∑ i = 1 n m ∇ θ L i ( θ k ) (2.0) \theta_{k+1}^{large}=\theta_{k}^{large}-\frac{\alpha'}{nm}\sum_{i=1}^{nm}\nabla_{\theta}L_{i}(\theta_{k})\tag{2.0} θk+1large=θklargenmαi=1nmθLi(θk)(2.0)

如果让
∑ j = 1 n ∑ i = 1 m ∇ θ L i + j m ( θ k + j ) ≈ ∑ i = 1 n m ∇ θ L i ( θ k ) (3.0) \sum_{j=1}^n\sum_{i=1}^m\nabla_{\theta}L_{i+jm}(\theta_{k+j}) \approx \sum_{i=1}^{nm}\nabla_{\theta}L_{i}(\theta_{k})\tag{3.0} j=1ni=1mθLi+jm(θk+j)i=1nmθLi(θk)(3.0)

α ′ = α ∗ n (4.0) \alpha'=\alpha*n\tag{4.0} α=αn(4.0)

则有 θ k + 1 l a r g e ≈ θ k + n s m a l l \theta_{k+1}^{large} \approx \theta_{k+n}^{small} θk+1largeθk+nsmall,注意到batch size越大,式3.0越难成立,因此Linear scaling learning rate只在一定batch size范围内可能有效。


learning rate warmup

如果参数变化非常剧烈,那么式3.0将难以满足,而在训练初期,由于参数随机化,参数离真正的解差距较大,模型的参数变化最为剧烈,为了防止训练初期参数变化过于剧烈,研究人员提出了learning rate warmup。顾名思义,warm up即让模型在进行正式训练前,先使用小的学习率迭代一定epoch,即热身,通过热身降低参数离真正的解的差距,从而防止训练初期参数变化过于剧烈。

warm up有两种策略:

1、Constant warmup:使用固定的学习率 α ′ \alpha' α,迭代一定次数后,改为正式训练的学习率 α \alpha α,在目标检测与语义分割领域有很好的应用(部分pretrain层与随机初始化层一起训练,而非全部随机初始化)
2、Gradual warmup:设warm up的迭代次数为 m m m,epoch为 i i i( 0 ≤ i ≤ m 0\leq i\leq m 0im),则第 i i i个epoch使用的学习率为 ( i ∗ α ) m \frac{(i*\alpha)}{m} m(iα),经过m个epoch后,学习率大小变为正式训练的学习率。


Zero γ γ γ

在BN算法中,设经过标准化的特征图为 x ^ \hat{x} x^,则BN层的输出为 γ x ^ + β γ\hat{x}+\beta γx^+β,Zero γ γ γ即在初始化时,将 γ γ γ设置为0。该启发式方案只针对ResNet,此时残差结构的输出等于输入(可以看成是一层),在训练初期,Zero γ γ γ相当于降低了网络层数,而浅层网络往往较容易训练。


No bias decay

weight decay会对网络的所有超参数施加正则化,例如BN层的 γ 、 β γ、\beta γβ、卷积层与全连接层的bias,No bias decay建议只对卷积层与全连接层的权重施加L2正则化,No bias decay降低了weight decay的正则化程度,这在一定程度上会加速网络的收敛。


实验

上述操作可以在一定程度上加速网络训练,但是否会大幅度影响网络泛化能力呢?2019年CVPR论文《Bag of Tricks for Image Classification with Convolutional Neural Networks》对此进行了实验,结果如下:
在这里插入图片描述
利用Linear scaling,增大batch后,网络的泛化性能会略有下降,但在此基础上stack其他技巧,测试准确率不会出现非常严重的下滑,表明这些策略在加速网络训练你的同时,对网络泛化能力的影响不大。


如何提高模型的准确率

本节将总结固定其他一切训练配置(例如使用的网络、batch size)的前提下,提高模型准确率的技巧


Cosine Learning Rate Decay

训练网络时,一般每隔一定epoch数后,会将learning rate降低一定倍数,这被称为step decay。假设batch的个数为 T T T(数据总数除以batch size),初始学习率为 α \alpha α,则在第t个batch,Cosine Learning Rate Decay的大小为
α ′ = 1 2 ( 1 + cos ⁡ t π T ) α \alpha'=\frac{1}{2}(1+\cos\frac{t\pi}{T})\alpha α=21(1+cosTtπ)α

假设我们使用了warm up策略,则step decay与Cosine Learning Rate Decay的学习率变化与准确率变化率曲线为
在这里插入图片描述
可以看到,相比于step decay,Cosine Learning Rate Decay在初期训练,学习率下降速度迅猛,在中期下降速度与epoch呈线性趋势,后期下降速度减缓,准确率曲线上升较为平缓有序。step decay的准确率曲线与学习率下降曲线波动都较大。


Label Smoothing

在分类任务中,常通过将fc层输出经过softmax处理后,通过最小化交叉熵损失函数进行优化。图像的label为hard label(即one hot),此时最小化交叉熵相当于鼓励fc层的target score远大于other score,例如图像的label为狗,则最小化交叉熵相当于鼓励fc层表示狗的神经元,其score远大于其他类别的score,如果数据集太小,这有可能导致过拟合。为了解决上述问题,Label Smoothing提倡smooth hard label,将hard label更改为:
在这里插入图片描述
ε \varepsilon ε为一个超参数,取值(0,1), K K K为类别总数。设第i个类别,fc层的输出为 z i z_i zi,则使损失函数最小的 z i z_i zi(其为凸函数,推导过程略)变为:
在这里插入图片描述
α \alpha α可以是任意值, K K K为类别总数。可见,使用Label Smoothing后,target score与other score之间的差距将为 log ⁡ ( ( K − 1 ) ( 1 − ε ) / ε ) \log((K-1)(1-\varepsilon)/\varepsilon) log((K1)(1ε)/ε),该差距的大小与 ε \varepsilon ε的关系如下:
在这里插入图片描述


Mixup Training

Mixup Training相当于在数据集中加入一些噪声,个人理解为一种数据增强。我们随机采样两张图片,记录为 ( x i , y i ) 、 ( x j , y j ) (x_i,y_i)、(x_j,y_j) (xi,yi)(xj,yj),我们将这两张图片通过下列方式合并为一张新图片 ( x ^ , y ^ ) (\hat x,\hat y) (x^,y^)
x ^ = λ x i + ( 1 − λ ) x j y ^ = λ y i + ( 1 − λ ) y j \begin{aligned} \hat x&=\lambda x_i+(1-\lambda) x_j\\ \hat y&=\lambda y_i+(1-\lambda) y_j \end{aligned} x^y^=λxi+(1λ)xj=λyi+(1λ)yj

λ \lambda λ的取值为(0,1),为 B e t a ( α , α ) Beta(\alpha,\alpha) Beta(α,α)分布随机采样获得。


参考资料

[1] Priya Goyal,Piotr Dolla ́r,Ross Girshick,Pieter Noordhuis.Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.CoRR 2017
[2] Tong He,Zhi Zhang,Hang Zhang,Zhongyue Zhang,Junyuan Xie,Mu Li
.Bag of Tricks for Image Classification with Convolutional Neural Networks.CVPR 2019
[3] Dominic Masters,Carlo Luschi. Revisiting small batch training for deep neural networks.CVPR 2018

在这里插入图片描述

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐