我是靠谱客的博主 单身信封,最近开发中收集的这篇文章主要介绍模型训练中——模型不收敛或训练失败的原因,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

训练过程中模型不收敛,应该怎么做,原因有哪些?

  • 分以下几步走:
    (1)要保证训练的次数够多,若训练次数够多没收敛,则进行(2)
    (2)考虑采取措施解决

一、数据与标签

(1)没有对数据进行预处理。

  • 数据分类标注是否准确?数据是否干净?

(2)没有对数据进行归一化。

  • 不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。
  • 大部分神经网络流程都假设输入输出是在0附近的分布,从权值初始化到激活函数、从训练到训练网络的优化算法。将数据减去均值并除去方差。

(3)样本的信息量太大导致网络不足以fit住整个样本空间。

  • 看下training set上的loss收敛了吗?如果只是validate set上不收敛那就说明overfitting了,这时候就要考虑各种anti-overfit的trick了,比如dropout,SGD,增大minibatch的数量,减少fc层的节点数量,momentum,finetune等。

(4)标签的设置是否正确。

(5)忘记检查输出结果。

  • 问题当你开始训练你的网络几个 epoch 后,发现误差在减小了。这表示成功训练网络了吗?很不幸这并不是,这说明你的代码中很可能还有一些问题,可能是在数据预处理、训练代码或者推理部分有问题。仅仅因为误差在减小并不意味着你的网络正在学习有用的信息。
  • 原因:与传统的编程不同,在机器学习中可能会存在一些除变成语法以外的问题,这些问题是很隐晦的,所以我们应该非常小心检查的通过人眼来观察每个阶段的处理过程,这样当一个错误已经产生的时候,我们可以及时发现并且可以更彻底的检查代码。
  • 解决办法:在管道的每个阶段检查数据是否正确是非常重要的。通常这意味着找到一些方法使结果形象化。如果你有图像数据,那么很容易,动画数据也可以可视化,没有太多的麻烦。
  • 如果你有一些更奇特的东西,必须找到一种方法来检查它,以确保它在预处理、训练和推理管道的每个阶段看起来都是正确的,并将其与地面真实数据进行比较。
  • 有许多方法可以检查你的网络是否正常工作。其中一部分是找出报告的训练错误的真正含义。可视化应用于训练集数据的输出结果,可以观察到网络的输出结果和真实标签的对比
  • 在训练的时候,可能会看到误差从 1.0 到 0.01,但如果 0.01仍然是一个不可接受的结果,那么输出结果仍可能无法使用。如果它在训练集上是有用的,那请在验证集上检查它,看看它仍然适用于以前从未见过的数据吗?
  • 建议从一开始就习惯于可视化一切,不要只在网络不收敛的时候才开始,并且确保在开始尝试不同的神经网络结构之前,已经准备了通完最终用户的完整管道,并一路进行完整的检查。这是准确评估许多潜在不同方法的唯一方法。

二、模型

(1)网络设定不合理。

  • 如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛。应当选择合适的网络,或者尝试加深当前网络。
  • 注意:网络不是越深越好,开始可以搭建一个3~8层的网络,当这个网络实现的不错时,你可以考虑实验更深的网络来提升精确度。
  • 应从小网络开始训练意味着更快,并且可以设置不同参数观察对网络的影响而不是简单的堆叠更多层。

(2)Learning rate不合适,如果太大,会造成不收敛,如果太小,会造成收敛速度非常慢。

  • 在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。
  • 注意:刚刚开始不建议把学习率设置过小,尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。可逐渐尝试,从0.1,0.08,0.06,0.05 …逐渐减小直到正常为止。
  • 新手典型问题:learning rate设大了会带来跑飞(loss突然一直很大)的问题。这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢?可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么exp(100)=Inf,发生溢出,bp后所有的weight会变成NAN,然后从此之后weight就会一直保持NAN,于是loss就飞起来辣。
  • 解决:随便挑一个层的weights看一看,很有可能都是NAN了。此时可使用二分法尝试。0.1~0.0001。不同模型不同任务最优的lr都不一样。

(3)隐层神经元数量错误。

  • 在一些情况下使用过多或过少的神经元数量都会使得网络很难训练。太少的神经元数量没有能力来表达任务,而太多的神经元数量会导致训练缓慢,并且网络很难清除一些噪声。
  • 解决方法:隐层神经元数量可以从256 到1024中间开始设置,然后可以看看研究人员使用的数字,可以用作参考。如果他们使用的数字与这个大不相同,那么可以想象一下这其中的原理。在决定使用隐层的单元数量之前,最为关键的是考虑你需要通过这个网络表达信息的实际值的最少数量,然后再慢慢增加这个数字。
  • 具体任务:如果你做回归任务可以考虑使用的神经元数量为输入或输出变量的2到3倍。
  • 与其他因素相比:隐藏单元的数量通常对于神经网络的性能影响相当小。并且在很多情况下,增大所需要隐藏单元的数量仅仅是减慢了训练速度。

(4)错误初始化网络参数。

  • 如果没有正确初始化网络权重,那么网络将不能训练。通常使用的比较多的初始化权重的方法有‘he’,’lecun’,’xavier’在实际应用中这些方法有非常好的性能而网络偏差通常初始化为0,你可以选择一个最适合你任务的初始化方式。

(5)没有正则化

  • 正则化典型的就是dropout、加噪声等。即使数据量很大或者你觉得网络不可能出现过拟合,但是对网络进行正则化还是很有必要的。
  • 最好加上:dropout 通常从设定参数为0.75或0.9开始,根据你认为网络出现过拟合的可能性来调整这个参数。另外,如果你确定这个网络不会出现过拟合,那么可以将参数设定为0.99。正则化不仅仅可以防止过拟合,并且在这个随机过程中,能够加快训练速度以及帮助处理数据中的异常值并防止网络的极端权重配置。
  • 对数据扩增也能够实现正则化的效果,最好的避免过拟合的方法就是有大量的训练数据。

(6)Batch Size 过大。

  • Batch size 设置的过大会降低网络的准确度,因为它降低了梯度下降的随机性。
  • 另外,在相同情况下batch size 越大,要达到相同的精确度通常需要训练更多的epoch
  • 我们可以尝试一些较小的batch size 如 16 ,8 甚至是1。使用较小的batch size 那么一个epoch就可以进行更多次的权值更新。
  • 这里有两个好处,第一,可以跳出局部最小点。其二可以表现出更好的泛化性能。

(7)学习率设的不对。

  • 许多深度学习的框架默认开启了gradient clipping ,这个可以处理gradient explosion问题,这个是非常有用的,但是在默认情况下它也很难找到最佳学习率。
  • 如果你正确的清理了数据,删除了异常值,以及设定了正确的学习率,那么可以不需要使用gradient clipping,偶尔你也会遇到gradient explosion问题,那么你可以开启gradient clipping。
  • 但是,出现这种问题一般情况下表明数据有其它问题,而gradient clipping只是一个临时的解决方案。

(8)最后一层的激活函数用的不对。

  • 在最后一层使用错误的激活函数会导致网络最终不能输出你期望的范围值,最常见的错误就是最后一层使用Relu函数,其输出无负值。
  • 如果是做回归任务,大多数情况下不需要使用激活函数,除非你知道你所期望的值作为输出。
  • 想象一下你的数据值实际代表了什么,以及再归一化之后它们的范围是多少,最有可能的情况是输出没有边界的正数和负数。在这种情况下,最后一层不应该使用激活函数。
  • 如果你的输出值只能在某个范围内有意义,如0~1范围内的概率组成。那么最后一层可以使用sigmoid函数。

(9)网络存在坏梯度。

  • 如果你训练了几个epoch误差没有改变,那可能是你使用了Relu,可以尝试将激活函数换成leaky Relu。
  • 因为Relu激活函数对正值的梯度为1,负值的梯度为0。
  • 因此会出现某些网络权值的成本函数的斜率为0,在这种情况下我们说网络是“dead”,因为网络已经不能更新。

如何通过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/285601835
参考:https://zhuanlan.zhihu.com/p/369716572

最后

以上就是单身信封为你收集整理的模型训练中——模型不收敛或训练失败的原因的全部内容,希望文章能够帮你解决模型训练中——模型不收敛或训练失败的原因所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部