写在前面: 刚刚向老板大大提交了一份实验报告。把里面的调参经验拎出来备份一下。
作 者: 月牙眼的楼下小黑
联 系: zhanglf_tmac (Wechat)
声 明: 欢迎转载本文中的图片或文字,请说明出处
1. The influence of batch_size
要复现一篇 未开源 的论文, 文中 未给出 batchsize的大小, 我以 128 为界,进行尝试,图1 是 batch_size = 32, 64 , 128, 200, 250 的 train_val loss 曲线:
图1 : batch_size 对网络训练的影响
不同大小的 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)在线数据增强。
(a)off_line data agumentation training 示意图(本人绘制)
(b)on_line data agumentation training示意图(本人绘制)
这个星期我花了四整天的时间解决碰到的一个 “难题”:
一个简单的 离线数据增强(翻转)后,网络提前收敛在一个高 loss 的点, 如图 2 所示:
图2: 我捣鼓了四天的 “问题”: 一个简单的离线数据增强(翻转)后,网络收敛在高loss点(可以形象地称之为高原点)
我凭 直觉 分析了一下几个原因,跑了 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, 略。











网友评论