2. train network

2.1 如何防止过拟合

过拟合主要有两个原因造成的,数据太少和模型太复杂。对于模型复杂,最简单暴力的做法就是减少网络的层数和神经元的个数,但是一般不是很提倡这种做法,是因为人为并不能很好掌控删减的程度,因此下面介绍几种高效的方法。

  1. 正则化与权重衰减。 L2正则化也就是权重衰减。

一般,Weight Decay=0.001。可以根据实际训练效果,做x10倍的上下调整。

另外,pytorch里通过设置优化器的weight_decay来进行权重衰减,貌似没有分母的n(因为优化器是没有办法得知训练集的样本大小的)。
神经网络训练的一些技巧和方法
神经网络训练的一些技巧和方法

  1. 数据增强(crop, resize, noise, rotate, flip and etc). 需要注意的是标签可能也需要随之变化,
  2. 提前终止。 当testset上的准确率(或loss等)有上升的趋势,立刻停止。
  3. 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不下降,说明欠拟合
总结的如下解决方案:

  1. 正则化过度,**开始训练时可以考虑一个小的正则化系数。**过拟合后,再根据训练情况进行调整。
  2. 选择合适的损失函数。损失函数相当于模型拟合程度的一个评价指标,如果损失函数选取不当,导致学习难度过大,就容易欠拟合。考虑降低损失函数的学习难度。
  3. 选择合适的优化器和学习速率。我们需要手动调整学习率,首先选择一个合适的初始学习率,当训练不动之后,稍微降低学习率,然后再训练一段时间,这时候基本上就完全收敛了。
  4. 训练时间不足
  5. 神经网络的拟合能力不够。增加神经网络的层数。

具体参考原文链接:
如何解决神经网络训练时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.

相关文章:

  • 2021-07-20
  • 2021-11-23
  • 2021-05-23
  • 2021-08-31
  • 2021-06-21
  • 2021-05-12
猜你喜欢
  • 2021-04-18
  • 2021-11-07
  • 2021-09-27
  • 2021-05-18
  • 2021-06-13
  • 2021-11-14
相关资源
相似解决方案