文章目录
2. train network
2.1 如何防止过拟合
过拟合主要有两个原因造成的,数据太少和模型太复杂。对于模型复杂,最简单暴力的做法就是减少网络的层数和神经元的个数,但是一般不是很提倡这种做法,是因为人为并不能很好掌控删减的程度,因此下面介绍几种高效的方法。
- 正则化与权重衰减。 L2正则化也就是权重衰减。
一般,Weight Decay=0.001。可以根据实际训练效果,做x10倍的上下调整。
另外,pytorch里通过设置优化器的weight_decay来进行权重衰减,貌似没有分母的n(因为优化器是没有办法得知训练集的样本大小的)。
- 数据增强(crop, resize, noise, rotate, flip and etc). 需要注意的是标签可能也需要随之变化,
- 提前终止。 当testset上的准确率(或loss等)有上升的趋势,立刻停止。
- dropout与BatchNormalization。 根据一些最新的研究论文,相比于fropout,更推荐使用BN。
需要注意的是,使用BN时batch size不能太小。一般可以选择32,再根据实际训练效果x2上调下调。
注意: PyTorch设置 Dropout 时,torch.nn.Dropout(keepProb = 0.5), 这里的 keepProb是指该层(layer)的神经元在每次迭代训练时会被丢弃(失活)的可能性。其他的如TF等参数的意义到底是失活概率还是不失活概率,还需查阅文档。
PS:根据本人目前浅薄经验, 数据增强是最有效的(因为无需参数的设定,只要增强了数据,基本上都会起到一定的防止过拟合效果)。
2.2 train loss与test loss结果分析
train loss 不断下降,test loss不断下降,说明网络仍在学习;
train loss 不断下降,test loss趋于不变,说明网络过拟合;
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
2.3 解决神经网络训练时train loss不下降的问题
训练集Loss不下降,说明欠拟合。
总结的如下解决方案:
- 正则化过度,**开始训练时可以考虑一个小的正则化系数。**过拟合后,再根据训练情况进行调整。
- 选择合适的损失函数。损失函数相当于模型拟合程度的一个评价指标,如果损失函数选取不当,导致学习难度过大,就容易欠拟合。考虑降低损失函数的学习难度。
- 选择合适的优化器和学习速率。我们需要手动调整学习率,首先选择一个合适的初始学习率,当训练不动之后,稍微降低学习率,然后再训练一段时间,这时候基本上就完全收敛了。
- 训练时间不足
- 神经网络的拟合能力不够。增加神经网络的层数。
具体参考原文链接:
如何解决神经网络训练时loss不下降的问题
深度学习:欠拟合问题的几种解决方案
2.4 学习率设置与更新
2.5 为不同网络层设置不同的学习率
2.6 L1 Loss与L2 Loss的对比与选取
L1 Loss:
- 以稳定速率收敛
- 对输入数据中的离群点不敏感
- 不光滑,存在不可导点
L2 Loss:
- 随着误差的减小,梯度也在减小,这有利于收敛,即使使用固定的学习速率,也能较快的收敛到最小值。
- 对离群点敏感
- 光滑,处处可导
smooth L1 Loss:
- 当与 ground truth 差别过大(存在离群点)时,梯度值不至于过大而跑飞;
- 当与 ground truth 差别很小时,梯度值足够小,较快收敛到最小值。
L1与L2 Loss的选择:
对于大多数CNN网络,我们一般是使用L2-loss而不是L1-loss,因为L2-loss的收敛速度要比L1-loss要快得多。
如果数据离群点较多,可以考虑使用L1 Loss.