文章来源 | 极链AI云(性价比最高的共享算力平台,助力你的技术成长~首次注册可获免费100小时GPU使用时长!官网地址:https://cloud.videojj.com/)
作者 | Chaser【极链AI云技术原创奖励计划】千元云币券获得者
原文地址 | 调参心得 ( 官网论坛)已获授权
什么时候加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也能学好。
想要认识更多深度学习小伙伴,交流更多技术问题,欢迎关注公众号“极链AI云”(为你提供性价比最高的共享算力平台,官网地址:https://cloud.videojj.com/)