一些深度学习调参心得

实验效果校验心得

什么时候加augment,什么时候加multi-scale,学习率怎么设置?

数据增强

个人体会是,验证性阶段过了之后,当你开始跑ablation study时,一定要注意数据的合理性,不要瞎设计,导致时间利用低效,很多参数都白跑,后面又要重来。

首先是augment,分两种情况,先做几个小实验,看看提出方法在加和不加data Augmet的性能变化如何,然后选取比较好看的结果。比如我之前本着最后再加所有trick一把梭涨点的想法,前面的对比实验无论如何都不好看(有效果,但是涨点的变化情况忽高忽低)。但是加入augment数据丰富起来之后,模型的效果就起来了,虽然baseline也提上去了,会比较考验你的工作是否足够solid,如果你的framework不善于处理不大或者单一数据,最好还是加上。

多尺度训练

这玩意会稳定涨点,但是为了显示模型效果,而不是浑水摸鱼,建议最后加,因为augment就足够了,前期全梭上不太好。当然,也可以避免baseline刷的过高,导致你的idea增量微乎其微很尴尬。

学习率

这个挺简单,除了和stoa愣是拉不开差距的情况,无脑adam就够用,0.001,或者0.0001,加个step,warmup就完事。真正solid的工作也不咋在乎这个,咋调(当然基本法还是得要的)都能比较能看(当然那种被刷到顶的数据集也不算,毕竟模型性能拉不开的时候这玩意还是挺玄学的)。

优化器和学习率优化

· 收敛速度来说adam更快,可以用于验证调参,但是细调的sgd往往更好。

· cyclic learning rate和cosine learning rate学习率设置。参考一个gradual warmup+cosine: 地址。

· bs扩大k倍,lr也要对应扩大k倍。

· lr选择:lr的选择还是看效果,先用渐变lr,找到突变提升的点,这个lr是合适的,然后以此为基准设置变化学习率学习。

原则上,只要loss没有bug,基本上loss越低效果是越好的,所以要尽可能采用loss能够有效下降的学习率,避免过分震荡。(局部极小是个例外,可以考虑重启的SGD等,但是一般cosine lr够了) 原则:cos lr用于寻优和偷懒的最佳效果搜索;日常训练调参还是直接分阶固定学习率。

☉ 损失函数优化

· 使用exp、atan等函数可以将优化空间变得平滑且广域,收敛更好更快。

· 注意平衡不同item之间和item内的尺度,如wh和和dxdy预测的数值规模不一致(用liou来弥补)、cls存在类别不平衡等。

⊙ batch size

使用较大的bs可以更好地估计出最优的优化方向避免陷入局部极小,但是小的bs有时候会更准;累计梯度可以使得单卡也具有较大bs,但是bn估计会不准。注意的是,算法验证过拟合时,accumulate*bs不应该大于总样本数!否则收敛很慢。过拟合验证阶段直接使用bs=1收敛更快,但是大点的bs会更收敛平缓。极端情况:当模型收敛的比较平稳后,设置bs=1来慢慢进一步优化性能。

速度优化

apex混合精度训练。非常好用,几行代码就完事,速度提升几倍,精度稍有降低。

教程安装方法:

1. 不可直接pip install,因为有重名的。2. 不可直接setup install,那样只会编译python的,加速效果不佳):git clone https://github.com/NVIDIA/apexcd apexpip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./## 如果上面第三行编译失败,可以先导一下环境变量,再执行3export CUDA_HOME=/usr/local/cuda-10.0## 。

如果还是红字报错退出,可以退回到一个比较稳定的commit版本:1. 进入clone的apex目录下。2. 创建过去commit分支:git checkout -b f3a960f80244cf9e80558ab30f7f7e8cbf03c0a03. 继续刚才的步骤3安装即可4. 一堆warning不用管,看到Successfully installed apex-0.1的字样即可。

注意事项:

· 1080Ti以上可加速,以下不行

· 根据实际场景测试,如果没有提速或者不明显可以不用

· 查看是否使用半精度的方法:dtype方法,如: if a.dtype == torch.float16: xxx

· inference可能出现模型的torch.float16和target的torch.float32计算不兼容问题,使用half( )方法转换gt为半精度,如a=a.half( )

⊙ 验证和测试

测试集上检测可以查看模型的性能如何,针对效果进行改进;训练集上进行检测可以看是算法否有效、有无bug(如recall低,导致即使过拟合依然有漏检)。

⊙ 数据增强

增强+多尺度训练。可以辅助利用imgaug,使用方法见笔记。

⊙ 心得

单阶段指定学习(iou等筛选后)的anchor要保证适当多一点,不能像两阶段最终只有少数去回归,这样能更快收敛。(但是yolo只回归一个,所以很难学习)

本质:改变训练时正负样本的分布,缓解极端的样本不平衡问题(参考GHM论文的解释)。所以这种做法并不是唯一,可以通过loss的优化达到使用少量anchor也能学好。

文章来源:https://zhuanlan.zhihu.com/p/163256723

你可能感兴趣的:(深度学习,机器学习,人工智能)