过去的一周是“人工智障,深度算命”的一周

写在前面: 刚刚向老板大大提交了一份实验报告。把里面的调参经验拎出来备份一下。


作 者: 月牙眼的楼下小黑
联 系: zhanglf_tmac (Wechat)
声 明: 欢迎转载本文中的图片或文字,请说明出处


1. The influence of batch_size

要复现一篇 未开源 的论文, 文中 未给出 batchsize的大小, 我以 128 为界,进行尝试,图1batch_size = 32, 64 , 128, 200, 250train_val loss 曲线:

过去的一周是“人工智障,深度算命”的一周_第1张图片
图1 : batch_size 对网络训练的影响

不同大小的 batch_size对网络 train_lossval_loss 的最终收敛值影响甚微。但是收敛速度差异较大。注意,虽然 batchsize 越小,收敛位置越靠前,但是在实际工程应用中,batch_size 越小,在一个 epoch 中前传反传的次数越多,实际收敛时间反而延长。从实验结果看,batch_size越大越好 , 但是 batch_size 越大,占用 gpu资源越多,并且 论文中多次提到 gpu资源受限。所以综合考虑收敛质量、收敛速度、实验条件, batch_size 选为 128.

2. A STUPID MISTAKE

介绍一下后文中多次提到的两个术语:

  • 离线 数据增强: 数据增强在整个训练开始前完成,比如水平翻转,数据集大小会扩增到原来的两倍。

  • 在线 数据增强: 数据增强在训练过程中进行,在将一个batch的数据送入网络前, 在这个batch上执行变换。

画了一个示意图,见图(a): 离线数据增强,(b)在线数据增强。

过去的一周是“人工智障,深度算命”的一周_第2张图片
(a)off_line data agumentation training 示意图(本人绘制)
过去的一周是“人工智障,深度算命”的一周_第3张图片
(b)on_line data agumentation training示意图(本人绘制)

这个星期我花了四整天的时间解决碰到的一个 “难题”:

一个简单的 离线数据增强(翻转)后,网络提前收敛在一个高 loss 的点, 如图 2 所示:

过去的一周是“人工智障,深度算命”的一周_第4张图片
图2: 我捣鼓了四天的 “问题”: 一个简单的离线数据增强(翻转)后,网络收敛在高loss点(可以形象地称之为高原点)

我凭 直觉 分析了一下几个原因,跑了 30 多个实验:

  • 原因: 网络收敛在 鞍点, 策略: 减小 batchsize结果: 没有解决,但是 batch size 设得极小时(比如 8), 结果有改善。

  • 原因: 数据增强的比例太高了,网络欠拟合了, 策略: 逐步降低增强比例, 结果:毫无卵用

  • 原因: 增强样本和原始样本的学习顺序对网络优化有影响, 策略: 改为在线增强, 结果:毫无改进

  • 原因: 网络的表达能力不够,loss 设计不够合理。

到了最后一步时,我已经准备动身去中区寻找师兄的帮助了。 但是我把数据增强函数设置为空函数体后再跑了一次实验, 发现结果依然不变!!! 我仔细查看代码,终于发现自己犯了一个愚蠢的错误:优化器选错了,我不知什么时候把原先的adam换成了SGD, 因为 adam 会动态调整 learning rate, 所以我一直没有去调整这个learning rate这个超参。事实上造成这种 假收敛的原因是: 网络在一个局部最小点来回震荡, 策略: 猛降 learning rate

3. Data augmentation

比较了多种数据增强方式对减轻网络过拟合的效果:


过去的一周是“人工智障,深度算命”的一周_第5张图片
图4(a)复现结果:训练集Loss 曲线
过去的一周是“人工智障,深度算命”的一周_第6张图片
图4(b): 复现结果:验证集 loss 曲线

4. Analysis

涉及 idea, 略。

你可能感兴趣的:(过去的一周是“人工智障,深度算命”的一周)