神经网络_训练loss不下降原因集合

一,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不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

https://zhuanlan.zhihu.com/p/136786657

如何解决神经网络训练时loss不下降的问题
https://blog.ailemon.net/2019/02/26/solution-to-loss-doesnt-drop-in-nn-train/

二,训练过程中的梯度检验

使用相对误差做比较,这是实际工程中需要提到的另外一点,在我们得到数值梯度和解析梯度之后,我们如何去比较两者?第一反应是作差对吧,或者顶多求一个平方。但是用绝对值是不可靠的,假如两个梯度的绝对值都在1.0左右,那么我们可以认为1e-4这样一个差值是非常小的,但是如果两个梯度本身就是1e-4级别的,那这个差值就相当大了。所以我们考虑相对误差:

加max项的原因很简单:整体形式变得简单和对称。再提个小醒,别忘了避开分母中两项都为0的情况。OK,对于相对误差而言:
相对误差>1e-2意味着你的实现肯定是有问题的
1e-2>相对误差>1e-4,你会有点担心
1e-4>相对误差,基本是OK的,但是要注意极端情况(使用tanh或者softmax时候出现kinks)那还是太大
1e-7>相对误差,放心大胆使用
哦,对对,还有一点,随着神经网络层数增多,相对误差是会增大的。这意味着,对于10层的神经网络,其实相对误差也许在1e-2级别就已经是可以正常使用的了。

使用双精度浮点数。如果你使用单精度浮点数计算,那你的实现可能一点问题都没有,但是相对误差却很大。实际工程中出现过,从单精度切到双精度,相对误差立马从1e-2降到1e-8的情况。

三,训练过程中的监控

开始训练之后,我们可以通过监控一些指标来了解训练的状态。我们还记得有一些参数是我们认为敲定的,比如学习率,比如正则化系数。

损失/loss随每轮完整迭代后的变化
下面这幅图表明了不同的学习率下,我们每轮完整迭代(这里的一轮完整迭代指的是所有的样本都被过了一遍,因为随机梯度下降中batch size的大小设定可能不同,因此我们不选每次mini-batch迭代为周期)过后的loss应该呈现的变化状况:
在这里插入图片描述
合适的学习率可以保证每轮完整训练之后,loss都减小,且能在一段时间后降到一个较小的程度。太小的学习率下loss减小的速度很慢,如果太激进,设置太高的学习率,开始的loss减小速度非常可观,可是到了某个程度之后就不再下降了,在离最低点一段距离的地方反复,无法下降了。下图是实际训练CIFAR-10的时候,loss的变化情况:
在这里插入图片描述
大家可能会注意到上图的曲线有一些上下跳动,不稳定,这和随机梯度下降时候设定的batch size有关系。batch size非常小的情况下,会出现很大程度的不稳定,如果batch size设定大一些,会相对稳定一点。

然后我们需要跟踪一下训练集和验证集上的准确度状况,以判断分类器所处的状态(过拟合程度如何):
在这里插入图片描述
随着时间推进,训练集和验证集上的准确度都会上升,如果训练集上的准确度到达一定程度后,两者之间的差值比较大,那就要注意一下,可能是过拟合现象,如果差值不大,那说明模型状况良好。

https://blog.csdn.net/u011534057/article/details/51452564

四,Keras的BN层能彻底解决过拟合问题吗?

解决方法:

  1. 扩大数据集,方法很多不管是加更多的新图还是数据增强;
  2. 早停策略,减少epoch,或者提前终止迭代可以有效的控制权值参数的大小,从而降低模型的复杂度;
  3. 权值衰减,在神经网络模型中,可使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值;
  4. 保留验证数据集,对训练成果进行验证; 获取额外数据进行交叉验证; 正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数;
  5. 权值共享,最常见的就是在卷积神经网络中,权值共享的目的旨在减小模型中的参数,同时还能较少计算量,在循环神经网络中也用到了权值共享。
  6. 增加噪声,这也是深度学习中的一种避免过拟合的方法,添加噪声的途径有很多,可以在输入数据上添加,增大数据的多样性,可以在权值上添加噪声,这种方法类似于L2正则化。
  7. Batch Normalization。BM算法会将每一层的输入值做归一化处理,并且会重构归一化处理之后的数据,确保数据的分布不会发生变化。而且有很多变种,比如Layerr Normalization,在RNN或者Transformer中用的比较多。上面的几种方法都是操作在一个模型上,通过改变模型的复杂度来控制过拟合。 另一种可行的方法是结合多种模型来控制过拟合。
  8. Bagging和Boostin,Bagging和Boosting是机器学习中的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性。
  9. Dropout,是深度学习中最常用的控制过拟合的方法,主要用在全连接层处。Dropout方法是在一定的概率上(通常设置为0.5,原因是此时随机生成的网络结构最多)隐式的去除网络中的神经元。

https://www.cnblogs.com/jiangxinyang/p/9281107.html

四,总结

  • 用一部分的数据测试你梯度计算是否正确,注意提到的注意点。 检查你的初始权重是否合理,在关掉正则化项的系统里,是否可以取得100%的准确度。
  • 在训练过程中,对损失函数结果做记录,以及训练集和交叉验证集上的准确度。
  • 最常见的权重更新方式是SGD+Momentum,推荐试试RMSProp自适应学习率更新算法。 随着时间推进要用不同的方式去衰减学习率。
  • 用交叉验证等去搜索和找到最合适的超参数。 记得也做做模型融合的工作,对结果有帮助。
  • 8
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keras是一个非常流行的深度学习框架,许多人使用它来构建和训练深度学习模型。在训练模型时,我们通常关注其中的两个指标:loss和accuracy。前者表示训练集上的误差,后者表示模型在验证集上的准确率。然而,在训练模型时,我们可能会遇到一些问题,其中一个比较常见的问题就是val_loss下降。 val_loss指的是模型在验证集上的误差,如果它不断增加,那么说明我们的模型过拟合了。过拟合指的是模型在训练集上表现良好,但是在验证集上表现较差的情况。这种情况通常是由于模型过于复杂,过度拟合了训练集,无法泛化到新的数据上。 解决val_loss下降的方法是多种多样的。以下是一些可能有用的方法: 1. 增加数据量:可能过拟合的一个原因是我们的数据太少。我们可以通过采集更多的数据来解决这个问题。 2. 增加正则化:正则化是一种低模型复杂度的方法。我们可以在模型中添加一些约束,如L1或L2正则化,来避免过拟合。 3. 采用更简单的模型:如果我们的模型太复杂了,我们可以采用更简单的模型来解决过拟合问题。 4. 重新调整超参数:有时候,我们可能会调整模型的一些参数,如学习率或batch size,来优化模型的性能。 总之,当我们遇到val_loss下降的时候,我们需要认真分析模型,找出可能的原因,并采取相应的措施来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值