神经网络模型不收敛原因、解决办法

目录

  • 0.可能原因汇总
  • 1.检查
    • 1.1.确保:数据干净、标注正确
    • 1.2.样本的信息量太大
    • 1.3.数据预处理
    • 1.4.确保:归一化、标准化
    • 1.5.确保:数据Shuffle
    • 1.6.确保输出层的激活函数正确
    • 1.7.确保:y与loss是搭配的
  • 2.模型优化
    • 2.1.网络设定不合理
    • 2.2.正确初始化权重
    • 2.3.减小learning rate
    • 2.4.增大batchsize
    • 2.5.ReLU激活函数导致坏梯度
    • 2.6.数据正则化
  • 参考

理论上,只要训练样本足够多,神经网络可以拟合原始数据分布。

0.可能原因汇总

  • 没有对数据进行归一化
  • 忘记检查输入和输出
  • 没有对数据进行预处理
  • 没有对数据正则化
  • 使用过大的样本
  • 使用不正确的学习率
  • 在输出层使用错误的激活函数
  • 网络中包含坏梯度
  • 初始化权重错误
  • 过深的网络
  • 隐藏单元数量错误

1.检查

1.1.确保:数据干净、标注正确

如:检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。

1.2.样本的信息量太大

  • 数据越多越好。
  • 数据库太小一般不会带来不收敛的问题。样本少只可能带来过拟合的问题。训练误差收敛、验证误差不收敛,就是过拟合了。进行anti-overfit的方法:Dropout,增加minibatch数量,减少Fully-connect层的节点数,SGD,momentum,finetune等。
  • 样本的信息量太大,导致网络不足以拟合整个样本空间,会导致不收敛。使用太大的训练样本可能会对网络在训练过程中的准确性造成负面影响,这是由于大样本会破坏梯度下降的随机性
  • 有文章说,改变图片大小可以解决收敛问题。

1.3.数据预处理

这个有点没懂。https://zhuanlan.zhihu.com/p/36369878

1.4.确保:归一化、标准化

归一化:把数值压缩到0~1,比如减去最小值,再除以最大值与最小值之差。
标准化:压缩到一个分布, 比如每列减去该列的均值,然后每列除以该列的标准差,获得标准正态分布。

不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

1.5.确保:数据Shuffle

数据不打乱,网络极有可能拟合前面几个batch的样本分布。

1.6.确保输出层的激活函数正确

在最后一层使用激活函数时,无法产生所需全部范围的值。假使使用Relu这类限制范围的函数,神经网络便只会训练得到正值。

1.7.确保:y与loss是搭配的

注意:具体的API定义。
如:分类模型的交叉熵cross entropy。在pytorch中,target是类别,不需要one-hot,模型输出是logit,不需要softmax。在keras和TensorFlow中,需要softmax。

2.模型优化

2.1.网络设定不合理

  1. 数据量少时降低模型复杂度,如减少层数、减少kernel number。
  2. 复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛。因此,可以加深当前网络。

2.2.正确初始化权重

2.3.减小learning rate

常用:0.1~0.0001
不同模型、不同任务,最优的学习率lr都不一样。

 学习率可从0.1逐步减小。
 有的时候候学习率太低走不出局部最小值,把冲量momentum提高也是一种方法,同时适当提高mini-batch值,使其波动不大。
 学习率设置小一点,在跑飞(下图Epoch=2300时)的情况下,有可能拉回来。

跑飞:网络都要收敛了,突然loss增大且不降下去了。

神经网络模型不收敛原因、解决办法_第1张图片

用ReLU作为激活函数的同时,
(1)分类层使用了softmax
(2)损失函数为带有exp的函数
有上述两种情况之一时,当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么 e x p ( 100 ) = I n f exp(100)=Inf exp(100)=Inf,发生溢出。此时,BP后所有的weight会变成NAN。而且,此后,weight就会一直保持NAN,于是loss就跑飞了。
大神试验

2.4.增大batchsize

震荡比较大时,可以增大batchsize。

2.5.ReLU激活函数导致坏梯度

尝试切换到leaky ReLU或ELU。

2.6.数据正则化

 正则化通常以dropout层添加噪声、或网络随机过程的某种形式进行。
 基本方法是在网络层之间添加dropout,设置从中到高的训练概率。例如0.75或0.9。如果你仍然认为不太可能出现过拟合,可以将此参数设置为较高的值例如0.99。

参考

https://www.jianshu.com/p/7dda0094164c
https://blog.csdn.net/rosefun96/article/details/78873226
https://blog.csdn.net/qq_32571391/article/details/86647001
https://blog.csdn.net/comway_Li/article/details/81878400
https://zhuanlan.zhihu.com/p/36369878

你可能感兴趣的:(#,deep_learning,深度学习,神经网络,机器学习,人工智能)