今天我们总结一下可以提升图像分类训练效率的小技巧:
- 大batch训练
- 低精度训练
这篇文章是基于论文Bag of Tricks for Image Classification with Convolutional Neural Networks和Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
。
1. large-batch 训练
在以往的经验中模型的拟合速度会随着batch变大而减缓。换句话说在模型在训练同样的epochs下,使用大batch训练的模型比使用小batch训练的模型在验证集上的准确率要差。 下面我们讲一下有哪些方法可以使模型在大batch训练的同时不损失准确率,有些甚至会提升模型的准确率。
1.1 线性调整学习率
在mini-batch SGD的训练过程中,由于batch中样本的选取是随机的所以梯度下降也是个随机的过程,正是因为这个随机的过程可以使得训练过程中模型可以逃离局部最优解而走向全局最优解。虽然大的batch依旧可以保留这样的随机性,但是程度变低了,换句话说大的batch减少了梯度的随机性,使得模型减小了逃离局部最优解的能力。因此一个大的学习率可以正好弥补这方面的不足,在梯度更新的过程中大的学习率可以让模型有机会一大步跨出局部最优解。
1.2 学习率的warmup
上面我们说到了提高学习率是一个很好的办法,但是在模型训练初期,所有的参数都是随机值,离最优解还很远,在这种情况下使用很大的学习率会使得模型中参数的更新在数值上变的不稳定。一个很好的解决办法就是预热学习率,一开始使用一个小的学习率训练模型,当模型的训练过程变的稳定的时候提高学习率到预设的比较大的值。在论文中Goyal提出了线性的将学习率从0提高到预设值的学习率预热方法。
1.3 Zero
一个ResNet模型包含多个残差结构,每一个残差结构由多个卷积层组成。给定一个输入,假定残差结构的最后一层的输出是, 那整个残差结构的输出是。需要注意的是残差结构最后一层可能是一个batch normalization层, batch normalization首先标准化它的输入结果用 表示,然后batch normalization执行一个数值的缩放结果用. 和都是可学习的参数,且初始值分别是1和0。 Zero 初始化的意思是,我们将所有残差结构最后一层的batch normalization层的初始化为0。 这样做所有残差结构相当于直接输出它的输入,相当于模型有更少的层数和更少的参数, 好处是在模型训练的初期更容易一些。