本文章参考:写给新手炼丹师:2021版调参上分手册
寻找合适的学习率
学习率是一个非常重要的超参数,在面对不同规模的网络、不同batch-size、不同优化方式,不同数据集,甚至可能不同时间段训练的合适值都不确定。我们唯一可以做的是在训练中不断寻找最合适当前状态的学习率。比如利用fastai中的lr_find()函数寻找合适的学习率。
-
较大的学习率加速了网络训练,但可能无法达到最优解。
-
较小的学习率会使网络训练缓慢。除此之外,过小的学习率可能会使网络陷入局部最优解。
-
学习率过大的情况小,网络无法学习到有效的知识。
策略:在网络训练初期使用大的学习率加速收敛,之后降低学习率提高模型训练效果。这被称为学习率衰减(Learning Rate Decay)。
learning-rate与batch-size的关系
越大的batch-size使用越大的学习率。在显存足够的条件下 ,最好采用较大的batch-size进行训练,找到合适的学习率后,可以加快收敛速度。另外较大的batch-size可以避免一些小问题,参考pytorch库的issue。
权重初始化
权重初始化一般使用模型都是一些在大型数据集上已经预训练好的模型。只有没有预训练模型的领域会自己初始化权重,或者在模型中去初始化神经网络最后那几个全连接层的权重。常用的权重初始化算法是【Kaiming_normal】或者【Xavier_normal】
Dropout
Dropout指的是在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。对于随机梯度下降而言,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
Dropout类似于bagging ensemble减少variance。通常在全连接层使用dropout,在卷积层不使用,注意Dropout并不适合所有的情况。
数据集处理
数据筛选以及数据增强
难例挖掘
分析模型难以预测正确的样本,给出针对性方法
多模型融合
- 同样的参数,不同的初始化方式
- 不同的参数,通过cross-validation,选取最好的几组
- 同样的参数,模型训练的不同阶段,即不同迭代次数的模型
- 不同的模型,进行线性融合。
- probs融合和投票法
差分学习率与迁移学习
迁移学习是利用很多预训练的经典模型直接训练我们自己的任务,虽然说领域不同,但是在学习权重的广度方面,两个任务之间还是有联系的。差分学习率在拿其他任务的训练权重的时候,进行optimize需要选择一个适当的学习率。在不同层提高设计不同的学习率,可以提高神经网络训练的效果。调整差分学习率可以通过余弦退火和热重启的随机梯度下降。
尝试过拟合一个小的数据集
关闭正则化、Dropout,数据增强,使用训练集一小部分,让神经网络训练几个周期。确保可以实现零损失。
多尺度训练
多尺度训练是一种直接有效的方法,由于神经网络卷积池化的特殊性,通过输入不同尺度的图像数据集,能让神经网络充分地学习不同分辨率下图像特征,提高机器学习的性能。同时也可以处理过拟合效应,在图像数据集不是特别充足的情况下,可以先训练小尺寸图像,然后增大尺寸并再次训练相同模型。需要注意:多尺度训练并不是所有的深度学习应用都适用,要看多尺度会不会对图像的整体信息有没有影响,如果有影响,直接训练会误导算法,导致产生不良效果。
Cross Validation交叉验证
交叉验证往往是对实际应用中数据不充足而采用的,基本目的就是重复使用数据。
优化算法
不同优化算法适用于不同的任务,大多数采用的优化算法是adam和SGD+monmentum。
训练技巧
- 要做梯度归一化,即梯度/minibatch size
- 尽量对数据做shuffle
- 在数据集很大的情况下,建议先用数据集的1/100,1/10的数据跑一下,对模型的性能和训练时间有个底,外推全量数据到底需要跑多久。
- GPU上报错时尽量放在CPU上重跑,错误信息更友好。
- 在确定初始学习率时,从一个很小的值开始,然后每一步指数增大学习率进行训练。
- 注意实验的可复现性和一致性,注意养成良好的实验记录习惯。
- 在超参数上,learning rate最重要,推荐了解cosine learning rate和cyclic learning rate,其次是batchsize和weight decay。
训练过程的效果较好,但是预测的时候出现NAN
请检查下数据集是否混进了误差数据,导致模型学习的时候出现偏差
Warmup
目前在做深度学习任务的时候,都会在tensorflow的github上下载一些预训练好的模型。也有尝试过权重初始化为0进行训练,然而收敛不太好。除此之外对于学习率的选择,一开始是选择较大的学习率,然后随着训练的推移,逐步调整学习率。
Label-smoothing
标签平滑是为了解决模型的过拟合问题。具体思想是降低对于标签的信任。
Batch size
Batch Size主要影响的是每个Epoch的训练时长和每次迭代的梯度平滑度。
假设全量样本为n,Batch Size设置为b,则每个Epoch的迭代次数为n/b。从这个点来看,当Batch Size减小时,迭代次数变多,每次迭代的训练时长减少,但整个Epoch的训练时长是增加的。
Batch Size过小:
迭代的梯度不平滑,模型训练loss振荡。模型的训练更偏重于拟合个体,导致在训练过程中模型容易忽视数据的整体规律性。
训练时长增加。
内存利用率低。
Batch Size过大:
容易陷入局部最优,从而影响模型效果。过大的Batch Size容易忽视数据中的个体差异性,并使得模型的梯度下降方向固定。
内存容易溢出。在实际训练中,如果新进程导致了额外的内存占用,容易强行终止模型训练。
需要强调的是,大的Batch Size会降低模型精度,但模型的梯度下降方向更为准确,所以辅以设置更大的学习率可以加速模型的收敛;小的Batch Size可以更好的捕获到模型的个体差异性,从而具有较高的模型精度,并且应该设置更小的学习率缓解loss振荡问题。
数据集增广
数据集增广有多种方式,裁剪取样,旋转,翻转,加噪声等,还有Cutout(随意把图像的一部分减掉,提升模型的鲁棒性,思想来源于视觉任务中物体被遮挡了。),Random erasing,Mixup training等
Cyclical Learning Rates for Training Neural Networks
CLR可操作性地消除往常需要实验般地去手动寻找最佳的最佳学习率和全局的学习率的schedule调整方案,CLR通过调整学习率在上边界和下边界中变化,而不是单调地减少学习率来达到网络的最佳拟合状态。关于CLR在分类任务上的表现,作者提到,通过CLR的表现,可以避免再微调和用更少的iterations达到最佳精度。使用了triangular的变化策略,使得一个范围(base_lr ~ max_lr)里的学习率在训练中都能得到运用,也就是说,在下边界和上边界中,那个最佳的学习率将会在训练中有机会运用到训练中,通过绘制精度走势图,我们也可以看出这点。在论文中,作者是通过一种更为实际的理由来进行这般解释的。