写在前面: 刚刚向老板大大提交了一份实验报告。把里面的调参经验拎出来备份一下。
作 者: 月牙眼的楼下小黑
联 系: zhanglf_tmac (Wechat)
声 明: 欢迎转载本文中的图片或文字,请说明出处
1. The influence of batch_size
要复现一篇 未开源 的论文, 文中 未给出 batchsize
的大小, 我以 128
为界,进行尝试,图1
是 batch_size = 32, 64 , 128, 200, 250
的 train_val loss
曲线:
不同大小的 batch_size
对网络 train_loss
和 val_loss
的最终收敛值影响甚微。但是收敛速度差异较大。注意,虽然 batchsize
越小,收敛位置越靠前,但是在实际工程应用中,batch_size
越小,在一个 epoch
中前传反传的次数越多,实际收敛时间反而延长。从实验结果看,batch_size
越大越好 , 但是 batch_size
越大,占用 gpu
资源越多,并且 论文中多次提到 gpu
资源受限。所以综合考虑收敛质量、收敛速度、实验条件, batch_size
选为 128
.
2. A STUPID MISTAKE
介绍一下后文中多次提到的两个术语:
-
离线 数据增强: 数据增强在整个训练开始前完成,比如水平翻转,数据集大小会扩增到原来的两倍。
-
在线 数据增强: 数据增强在训练过程中进行,在将一个
batch
的数据送入网络前, 在这个batch
上执行变换。
画了一个示意图,见图(a)
: 离线数据增强,(b)
在线数据增强。
这个星期我花了四整天的时间解决碰到的一个 “难题”:
一个简单的 离线数据增强(翻转)后,网络提前收敛在一个高 loss
的点, 如图 2
所示:
我凭 直觉 分析了一下几个原因,跑了 30
多个实验:
-
原因: 网络收敛在 鞍点, 策略: 减小
batchsize
, 结果: 没有解决,但是batch size
设得极小时(比如8
), 结果有改善。 -
原因: 数据增强的比例太高了,网络欠拟合了, 策略: 逐步降低增强比例, 结果:毫无卵用
-
原因: 增强样本和原始样本的学习顺序对网络优化有影响, 策略: 改为在线增强, 结果:毫无改进
-
原因: 网络的表达能力不够,loss 设计不够合理。
到了最后一步时,我已经准备动身去中区寻找师兄的帮助了。 但是我把数据增强函数设置为空函数体后再跑了一次实验, 发现结果依然不变!!! 我仔细查看代码,终于发现自己犯了一个愚蠢的错误:优化器选错了,我不知什么时候把原先的adam
换成了SGD
, 因为 adam
会动态调整 learning rate
, 所以我一直没有去调整这个learning rate
这个超参。事实上造成这种 假收敛的原因是: 网络在一个局部最小点来回震荡, 策略: 猛降 learning rate
。
3. Data augmentation
比较了多种数据增强方式对减轻网络过拟合的效果:
图4(a)复现结果:训练集Loss 曲线 图4(b): 复现结果:验证集 loss 曲线
4. Analysis
涉及 idea
, 略。
网友评论