【深度学习】深度学习模型训练的tricks总结

前言
得到更改的准确率模型的设计自然是重要,而使用一些数据处理和训练的技巧也能提高最终模型的训练效果,因此也十分重要 。本文基于对一些资料的阅读总结一些模型训练常见的trick,能够更快地拟合以及在一定程度上提升模型效果 。
学习率角度 1、Warm up
由于刚开始训练时模型的权重()是随机初始化的,此时选择一个较大的学习率,可能会带来模型的不稳定 。学习率预热就是在刚开始训练的时候先使用一个较小的学习率,训练一些或,等模型稳定时再修改为预先设置的学习率进行训练 。
上述的方法是,18年又针对上面的进行了改进,因为从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大 。提出了 来解决这个问题,即从最开始的小学习率开始,每个增大一点,直到最初设置的比较大的学习率 。
(代码实现可以参考“参考资料”部分的链接)
2、rate
实验证明,大的batch size在相同的epoch下准确率会更小,使用warm up可以在一定程度上解决这个问题,而rate也是一种有效的方法 。
在mini-batch SGD训练时,梯度下降的值是随机的,因为每一个batch的数据是随机选择的 。增大batch size不会改变梯度的期望,但是会降低它的方差 。也就是说,大batch size会降低梯度中的噪声,所以我们可以增大学习率来加快收敛 。
具体做法很简单,比如原论文中,batch size为256时选择的学习率是0.1,当我们把batch size变为一个较大的数b时,学习率应该变为 0.1 × b/256 。即线性的根据batch大小设置学习率,从而达到更好的学习效果 。
简单的说,大的batch size计算得到的梯度噪声更小,所以可以使用更大的学习率来加大收敛 。那么这里就有一个问题了,为什么小的batch size一般收敛的更快呢?这是因为小的batch size尽管方向不一定准确,但是更新次数多,最终收敛速度会更快 。而大的batch size虽然噪声小,方向也更准确,但是由于学习率效果不会很好,这样线性的增加学习率其实也是相当于用单次更新量变大弥补更新次数小的事实 。
3、rate decay
在之后的训练过程中,学习率不断衰减是一个提高精度的好方法 。其中有step decay和 decay等,前者是随着epoch增大学习率不断减去一个小的数,后者是让学习率随着训练过程曲线下降 。
两者都是比较常用的学习率衰减算法,能够提高训练效率,减少学习率不合适带来的振荡或学习缓慢的现象 。至于选择哪一个还是具体问题具体分析 。
对于 decay,假设总共有T个batch(不考虑阶段),在第t个batch时,学习率η_t为:
这里,η代表初始设置的学习率 。这种学习率递减的方式称之为 decay 。
数据与标签角度 1、Label-
在分类问题中,我们的最后一层一般是全连接层,然后对应标签的one-hot编码,即把对应类别的值编码为1,其他为0 。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来,会有一些问题 。这种方式会鼓励模型对不同类别的输出分数差异非常大,或者说,模型过分相信它的判断 。
但是,对于一个由多人标注的数据集,不同人标注的准则可能不同,每个人的标注也可能会有一些错误 。模型对标签的过分相信会导致过拟合 。
标签平滑(Label- ,LSR)是应对该问题的有效方法之一,它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1 。标签平滑最早在-v2中被提出,它将真实的概率改造为:
其中,ε是一个小的常数,K是类别的数目,y是图片的真正的标签,i代表第i个类别,q_i是图片为第i类的概率 。