关于深度学习的一些训练技巧

主要总结了一些别人的、同时我也赞同的深度学习训练技巧:
1.尽量对数据做shuffle(shuffle是对数据进行打乱的意思);
2.除了模型结构,模型的各种超参对效果的影响也很大,要小心谨慎对待。
所以Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式同样的参数,不同的初始化方式不同的参数,通过cross-validation,选取最好的几组同样的参数,模型训练的不同阶段,即不同迭代次数的模型。不同的模型,进行线性融合. 例如RNN和传统模型.
3.不要一开始就自己写模型,写把成熟的开源的代码跑一遍,研究一下细节,对比一下,再开始修改;
4.数据量很大的时候,先不要跑全量数据,先用少量数据跑一下,对模型的效果、训练时间心里有个底;
5.Adam好用,强推,很多时候用SGD训练loss不再下降收敛,换成Adam就好了,但是也有人强推sgd+momentum和SGD。
6.很多时候在调参修改模型的过程中,只保存了模型参数,对比发现某一版效果最好的时候却忘了是怎么训练得来的,所以我的习惯训练完之后保存实验结果和代码,必须要在日后也能翻到结果是怎么来的,如果新的训练是在之前旧的训练上来的,也要重新开工程保存之前训练的代码;
7.不是每一个实验都要出一个好模型,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,建议先设一个目标,比如说就是在一天的训练时间下做对比实验。首先用小图小模型做对比试验。
8.先把锦上添花的东西去掉,比如数据增广,玄学学习率和超参,魔幻损失函数,异形模型。如果世界上有一个非要加旋转增广和 1.96e-4 学习率 42 batchsize,配上四种混合损失函数才能训练好的模型,它应该存在于灵能文明。可以先造一些尽量玩具的模型,验证代码正确性。
9.先确认影响模型性能的组件。感性认识就是,数据是否需要增加或增广。模型是大了还是小了,再根据速度和精度期望开始寻找合适的模型。能用全卷积的任务,少用全连接层,参数量小。基本模型上 ResNet, Unet 结构还是主流。
10.超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。当你的模型还不错的时候,可以试着做数据增广和改损失函数锦上添花了。
11.优化器只推荐 Momentum 和 Adam。
12.绝大多数情况自己设计的参数都不如教程和框架的默认参数好
13.模型学习率要逐渐降下来,在训练到一定程度,学习率下降下来性能会有一个很大提升,网络性能越好,学习率要越小。
14.随时存档模型,发现记录不同epoch的效果,分析开始过拟合的节点和欠拟合的节点。
15.网络层数、参数量在性能不丢的情况下减到最小
16.batchsize通常影响不大,塞满卡即可;
17.从分解卷积核的大小,到bottleneck,到depth-wise conv,到depth-wise seperabel conv,参数越来越少,网络可以设计的越来越深,性能要越来越好
18.resnet的shortcut确实会很有用,重点在于shortcut支路一定要是identity,主路是什么conv都无所谓
不同尺寸的feature maps的concat,只用一层的feature map一把梭可能不如concat好
19.对于激活函数, Relu 外只推荐试一下 Swish
20.关于SE:SE在分类上是个涨点必备的工具,换言之,堆最高精度是一定要给每个block都加上它的,但是如果需要考虑时间,参数量和精度等的trade-off,无脑堆就没有意义了,这个时候应该要选择在合适的地方使用合适的模块。这个时候,推荐在block数量和添加SE上做权衡,即给部分blcok加上SE,同时砍掉一些block来加速,这样可以在精度差不多的情况下减少一些参数量。当然inference时间这个事需要看具体的应用平台对SE的实现,就是GAP和FC的速度,这就具体问题具体分析了。有余力有卡的人,可以迁移某种NAS方法来做这个的搜索。关于SE之前忘说了一点,SE在其他任务的使用并不是一帆风顺,之前看过一个回答说是检测上有些情况下会掉点,个人解释是SE是个channel attention,对于一个channel的spatial domain用一个scale值,那对于anchor-based的检测任务,由于在feature map上会放不同scale的anchor,那么一个feature map对应检测的既有大物体又有小物体,而SE中Global Average Pooling之后的结果一般来说是受大物体影响较多的,所以加了SE就会使大物体涨点小物体掉点,最终有些数据集上,总的mAP就会下降,而现在的一些anchor-free的方法,是强行设定一个feature map检一个scale,那么可能就没有这个问题,当然具体anchor-free和这个的关系还需要有心人实验去验证了。
21.这一点很实用很重要!!!!:
不管什么模型,先在一个较小的训练集上train和test,看看它能不能过拟合。如果不能过拟合,可能是学习率太大,或者代码写错了。先调小学习率试一下,如果还不行就去检查代码,先看dataloader输出的数据对不对,再看模型每一步的size是否符合自己期待。
22.这一点也很重要!!!在training loss和test loss同时检查问题;
看train/eval的loss曲线,正常的情况应该是train loss呈log状一直下降最后趋于稳定,eval loss开始时一直下降到某一个epoch之后开始趋于稳定或开始上升,这时候可以用early stopping保存eval loss最低的那个模型。如果loss曲线非常不正常,很有可能是数据处理出了问题,比如label对应错了,回去检查代码。
23.不要一开始就用大数据集,先在一个大概2w训练集,2k测试集的小数据集上调参。尽量不要自己从头搭架子(新手和半新手)。找一个已经明确没有bug能跑通的其它任务的架子,在它的基础上修改。否则debug过程非常艰难,因为有时候是版本迭代产生的问题,修改起来很麻烦。
24.batchsize设置小一点通常会有一些提升,某些任务batchsize设成1有奇效。
25有CNN的地方就用shortcut。CNN层数加到某一个值之后对结果影响就不大了,这个值作为参数可以调一下。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值