前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >改善深度学习训练的trick总结 | CSDN博文精选

改善深度学习训练的trick总结 | CSDN博文精选

作者头像
AI科技大本营
发布2019-12-10 13:19:02
2.9K0
发布2019-12-10 13:19:02
举报
文章被收录于专栏:AI科技大本营的专栏
作者 | ZesenChen

来源 | CSDN博客精选

在深度学习中,同样一个模型用不同的初始化,数据处理,batch size,学习率,优化器都能得到不同性能的参数。我根据自己参与过的比赛中经常用到的一些trick进行大致的总结,有代码的会顺便附上,方便自己以后使用。

学习率调整

在训练模型过程中,我们可以使用固定的学习率,但一些研究工作显示在模型训练过程中使用动态的学习率有助于加速收敛,在更少的epoch里得到更好的模型精度。

CLR

https://arxiv.org/pdf/1506.01186.pdf

在每个batch/epoch训练结束后调整学习率,而且在一定范围内呈周期性变化,有助于用更少的迭代次数得到更优的参数。CLR一般有三中参数调整模式:‘exp_range’,‘triangular’和’triangular2’;下图是’triangular2’模式。

代码链接

pytorch版本:

https://github.com/anandsaha/pytorch.cyclic.learning.rate

keras版本:

https://www.kaggle.com/shujian/single-rnn-with-4-folds-clr

参数设置

1、其中stepsize最好设置为一个epoch迭代次数的2~10倍;

2、base_lr是最低学习率,max_lr是最高学习率,max_lr最好设置为base_lr的3到4倍;

3、一共有三种周期变化模式:trianglar、triangular2、exp_range,在论文中,后两者表现更好。

余弦退火

在采用批次随机梯度下降算法时,神经网络应该越来越接近Loss值的全局最小值。当它逐渐接近这个最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点。余弦退火(Cosine annealing)利用余弦函数来降低学习率,进而解决这个问题,如下图所示:

该调整学习率的方法pytorch是自带的,在torch.optim.lr_scheduler模块中,函数名为CosineAnnealingLR,用法可以参考pytorch文档:https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate。

SGDR

https://arxiv.org/pdf/1608.03983.pdf

神经网络在训练过程中容易陷入局部最优值,SGDR通过梯度下降过程中突然提高学习率来跳出局部最优值并找到通向全局最优值的路径。这种方式称为带重启的随机梯度下降。

代码链接

keras版本:

https://github.com/emrul/Learning-Rate

参数设置

1、min_lr:最小学习率,max_lr:最大学习率;

2、base_iterations:第一个下降周期的长度,mul_iterations:后面每个下降周期是之前下降周期的几倍;

3、使用SGDR回调函数的时候记得把模型的优化器设置为’sgd’;

Switch Adam to SGD

https://arxiv.org/pdf/1712.07628.pdf

前期用Adam优化器,迅速收敛,后期切换到SGD,慢慢寻找最优解。

集成手段

在传统集成方法中,stacking与bagging是比较主流的方法,stacking即是训练一些不同的模型在同一批数据上得到不同的预测结果,将预测结果作为新的特征,最后用一个上层的模型学习这些新特征到目标之间的映射关系,如果是用的线性分类器,那也可以称为blending。这种方法在深度学习中当然也是适用的,但需要多个基模型的训练,比较耗时。所以有相关的研究工作提出了单模型集成的方法。

Snapshot Ensemble

https://openreview.net/pdf?id=BJYwwY9ll

神经网络在训练过程中容易陷入局部最优值,快照集成方法把每个epoch中的局部最优参数保存下来,并最终取各个模型的平均。该方法属于单模型集成,不需要耗费额外的训练代价,而且适合与防止局部最优的方法结合使用。

代码链接

keras版本:

https://github.com/titu1994/Snapshot-Ensembles

FGE

https://arxiv.org/pdf/1802.10026.pdf

FGE采用线性分段循环学习策略代替余弦;每个循环只有2到4个epoch。由于在足够多的不同模型间,存在低损失的连接通路,沿着这些通路,采用短循环是可行的,而且在这一过程中,会产生差异足够大的模型,集成这些模型会产生很好的结果。与快照集成相比,FGE提高了模型的性能,每次循环经过更少的epoch就能找到差异足够大的模型(训练速度更快)。

SWA

https://arxiv.org/pdf/1803.05407.pdf

1、每次学习率循环结束时产生的局部最小值趋向于再损失面的边缘域累积,这些边缘区域上的损失值较小(W1,W2 and W3) 。通过对这几个这样的点取平均,很有可能得到一个更低损失的全局化的通用解(下图中的Wswa)。即在权重空间而不是模型空间对这些点进行平均。

2、FGE集成对k个模型集成的测试预测需要k倍的计算时间。但SWA可以解释成FGE集成的近似值,且只需单个模型的测试时间。

3、相较于SGD, SWA能够使所取得的解在本质上具有更好的优化。SGD一般收敛于最优点的宽阔平坦区域边界附近的点;此外,SWA能够找到一个位于该地区中心的点。

代码链接

keras版本:https://github.com/xuyiqiang-learn/SWA_keras

(*本文为AI科技大本营转载文章,转载请联系作者)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档