loss不收敛主要有以下两种情况,一种是lo ss一直在震荡,一种是loss下降一点后不再下降到理想水平,而验证集上的表现保持不变。

首先排查方法:

1.保持需要的batchsize不变;
2.查看是否有梯度回传,查看代码如下:

for name, parms in model.named_parameters():
	print('-->name:', name, '-->grad_requirs:', parms.requires_grad, '--weight', torch.mean(parms.data), ' -->grad_value:', torch.mean(parms.grad))

主要有以下几个原因:

1.1、learning rate设大了会带来跑飞(loss突然一直很大)的问题

这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢?可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么exp(100)=Inf,发生溢出,bp后所有的weight会变成NAN,然后从此之后weight就会一直保持NAN,于是loss就飞起来辣。我的depth estimation相关项目的loss曲线,如下:

可以看出跑飞了,(幸lr设的并不是非常大所以又拉了回来)。如果lr设的过大会出现跑飞再也回不来的情况。这时候你停一下随便挑一个层的weights看一看,很有可能都是NAN了。对于这种情况建议用二分法尝试。0.1~0.0001.不同模型不同任务最优的lr都不一样。1.

1.2、数据库太小一般不会带来不收敛的问题

只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题,你看下你的training set上的loss收敛了吗?如果只是validate set上不收敛那就说明overfitting了,这时候就要考虑各种anti-overfit的trick了,比如dropout,SGD,增大minibatch的数量,减少fc层的节点数量,momentum,finetune等。

1.3、尽量用小模型

如果数据太少尽量缩小模型复杂度。考虑减少层数或者减少kernel number。

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

相关链接:以下两个链接必须看一下

参考链接1 神经网络训练与注意点

2、Loss 函数不收敛

下面,这段在使用caffe的时候遇到了两个问题都是在训练的过程中loss基本保持常数值,特此记录一下。

2.1、loss等于87.33不变

loss等于87.33这个问题是在对Inception-V3网络不管是fine-tuning还是train的时候遇到的,无论网络迭代多少次,网络的loss一直保持恒定。

查阅相关资料以后发现是由于loss的最大值由FLT_MIN计算得到,FLT_MIN是1.17549435e−38F​1.17549435e−38F​其对应的自然对数正好是 -87.3356 ,这也就对应上了loss保持87.3356了。

这说明softmax在计算的过程中得到了概率值出现了零,由于softmax是用指数函数计算的,指数函数的值都是大于0的,所以应该是计算过程中出现了float溢出的异常,也就是出现了inf,nan等异常值导致softmax输出为0.

当softmax之前的feature值过大时,由于softmax先求指数,会超出float的数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变成0.然后求loss就出现了87.3356的情况。

  1. 由于softmax输入的feature由两部分计算得到:一部分是输入数据,另一部分是各层的权值等组成
  2. 减小初始化权重,以使得softmax的输入feature处于一个比较小的范围
  3. 降低学习率,这样可以减小权重的波动范围
  4. 如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变得很大(注意将batch_norm_param中的use_global_stats设置为false )。
  5. 观察数据中是否有异常样本或异常label导致数据读取异常
  6. 本文遇到的情况采用降低学习率的方法,learning rate设置为0.01或者原来loss的1/51/5或者1/101/10。

3、原因解决方法总结

训练网络的时候loss一直居高不下或者准确度时高时低,震荡趋势

首先你要保证训练的次数够多,不要以为一百两百次就会一直loss下降或者准确率一直提高,会有一点震荡的。只要总体收敛就行。若训练次数够多(一般上千次,上万次,或者几十个epoch)没收敛,则试试下面方法:

无过拟合情况

3.1、数据和标签---标签错乱

数据分类标注是否准确?数据是否干净?数据的输入是否正常,data和label是否一致(标签错乱)?

数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题

3.2、学习率设定不合理

选择合适的优化器和学习速率。我们需要手动调整学习率,首先选择一个合适的初始学习率,当训练不动之后,稍微降低学习率,然后再训练一段时间,这时候基本上就完全收敛了

在自己训练新网络时,可以从0.1开始尝试,如果loss不下降,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。不过刚刚开始不建议把学习率设置过小,尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试,从0.1,0.08,0.06,0.05 ......逐渐减小直到正常为止,

有的时候候学习率太低走不出低谷,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。

3.3、 Batch size对模型训练有什么影响?其大小是怎么选取的?

一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小

batch size的问题一般是较大会有比较好的效果,一是更快收敛,二是可以躲过一些局部最优点。batch size增大,处理相同的数据量速度加快,越大的 batch size 使下降方向越准确,震荡越小;但是也不是一味地增加batch size就好,太大的batch size 容易陷入局部最优的情况,泛化性不好。较小的 bath size 引入的随机性更大,难以达到收敛,但是可能不会陷入局部最优,另一方面,当 类别较多时,可能会使得网络有明显的震荡,所以 ,Batch size过小会使Loss曲线振荡的比较大。

因此基于上述两种情况,batch size要调试到合适的数值;过大的batchsize会让网络收敛到不好的局部最优点;过小的batchsize训练速度慢,训练不收敛; 具体的batch size需要根据训练集数据内容和数量进行调试 。大小一般按照2的次幂规律选择,这是为了硬件计算效率考虑的。

3.4、网络设定不合理

网络架构的选择,一般是越深越好,也分数据集。 并且用不用在大数据集上pre-train的参数也很重要的。

如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛,换网络换网络换网络,重要的事情说三遍,或者也可以尝试加深当前网络。神经网络的拟合能力不够。增加神经网络的层数。

3.5、是否使用合适的activation function

一般来说,都几乎使用RELU作为全局activation function,尽可能少的使用sigmoid activation function(output范围太小),容易造成梯度弥散、消失

3.6、是否选择合适的优化算法

一般来说,我都使用Adam作为优化器(默认参数)。如果经过仔细调整的SGD算法性能可能更好,但是时间上不太允许这样做。

3.7、选择合适的损失函数

损失函数相当于模型拟合程度的一个评价指标,如果损失函数选取不当,导致学习难度过大,就容易欠拟合。考虑降低损失函数的学习难度。

在深度学习里面,不同的loss针对的任务是有不同的,有些loss函数比较通用例如L1/L2等,而如perceptual loss则比较适合在图像恢复/生成领域的任务上。当loss出现问题的适合,想一想,是不是loss设置的有问题,别人在此领域的任务的方法是否也使用和你一样的loss。

3.8、数据 归一化

神经网络中对数据进行归一化是不可忽略的步骤,网络能不能正常工作,还得看你有没有做归一化,一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化

3.9、正则化过度

正则化过度,开始训练时可以考虑一个小的正则化系数。过拟合后,再根据训练情况进行调整。

3.10、 样本不均衡你会怎么处理(重采样/Focal loss)

样本不均衡的方法无非有两种,一种是增强训练数据,另外一种是采用focal loss。

过拟合情况

  1. 通过提前终止确定最优模型 :在训练的过程中,可能会出现训练到最后的精度竟然还不如前面的epoch高,那么可以直接终止训练,然后将之前的model作为best model,之后使用这个model即可
  2. Regularization(正则化) :通过正则化进行约束,一般的方法可以通过优化器的权重衰减方法,即训练到后期,通过衰减因子使权重的梯度下降越来越缓慢。或者BN、Dropout以及L1/L2
  3. 调整网络结构 :一句话,你的网络结构出了问题,是错误的,没有科学性的
  4. 增加训练数据量 :数据集太小太少,且没有进行数据增强,就可能导致过拟合
一、模型不收敛主要有以下几个原因:1、learning rate设大了会带来跑飞(loss突然一直很大)的问题 这个是新手最常见的情况——为啥网络跑着跑着看着要收敛了结果突然飞了呢?可能性最大的原因是你用了relu作为激活函数的同时使用了softmax或者带有exp的函数做分类层的loss函数。当某一次训练传到最后一层的时候,某一节点激活过度(比如100),那么exp(100)=Inf,发生溢出,bp后所有的weight会变成NAN,然后从此之后weight就会一直保持NAN,于是loss... 在训练网络的时候,常常会出现 loss 出现非常明显的 剧烈 抖动 情况,虽然大多数情况可以继续训练下去,但是实际上还是预示着 问题 存在。而且,有不同维度的 问题 ,这也需要不同的解决方法,但是具体究竟是哪一种,还得具体情况具体分析。 是否找到合适的 loss 函数:在 深度学习 里面,不同的 loss 针对的任务是有不同的,有些 loss 函数比较通用例如L1/L2等,而如perceptual loss 则比较适合在图像恢复/生成领域的任务上。当 loss 出现 问题 的适合,想一想,是不是 loss 设置的有 问题 ,别人在此领域的任
新手小白在机器学习中用梯度 下降 法实现逻辑回归的时候,发现损失值 loss 一直将不下来,上下浮动,如下图所示: 后来尝试了很多改进方法都不对,我一直都在尝试更改学习模型的迭代次数,学习速率,但是忽略了数据集本身的 问题 ,我采用的数据集特征较多且每个特征值下对应的数据值浮动较大,导致了梯度 下降 法实现过程中求解最优解的速度很慢。而且精度也不高,在做了数据归一化之后,损失值如下: 由于迭代次数较小,所以损失值的曲线弯的不明显,但很显然,在做了数据归一化之后,损失值 收敛 了。这也显示了数据归一化在数据处理中的重要性,下
表现:训练过程中 loss 值一直 震荡 ,没有 下降 趋势 原因一:梯度消失;多因为网络深度过深,接近输入层的参数 梯度过小; 解决方法:调整网络,激活函数relu,batch normal等 原因二:训练数据分布不均匀;这种情况对训练数据shuffle即可 原因三:学习率过大或者过小;过大就会在 loss 最小处周围 震荡 ,通常一开始会有一定 下降 ;过小就是 收敛 太慢 tensorflow2中可以直接打出每个step的梯度值,便于发现 问题
文章目录前言训练集 loss 下降 1.模型结构和特征工程存在 问题 2.权重初始化方案有 问题 3.正则化过度4.选择合适的激活函数,损失函数5.选择合适的优化器和学习速率6.训练时间不足7.模型训练遇到瓶颈8.batch size过大9.数据集未打乱10.数据集有 问题 11.未进行归一化12.特征工程中对数据特征的选取有 问题 验证集 loss 下降 1.适当的正则化和降维2.适当降低模型规模3.获取更多的数据集4.对数据集做扰动和扩增测试集 loss 下降 1.应用场景有 问题 2.噪声 问题 当我们训练一个 神经网络 模型的时候
(2)没有对数据进行归一化。 不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。 大部分 神经网络 流程都假设输入输出是在0附近的分布,从权值初始化到激活函数、从训
train loss 不断 下降 ,test loss 不断 下降 ,说明网络仍在学习; train loss 不断 下降 ,test loss 趋于不变,说明网络过拟合; train loss 趋于不变,test loss 不断 下降 ,说明数据集100%有 问题 ; train loss 趋于不变,test loss 趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目; train loss 不断上升,test loss 不断上升,说明网络结构设计不当,训练超参数设置不当,数 模型结构 问题 。当模型结构不好、规模小时,模型对数据的拟合能力不足。 训练时间 问题 。不同的模型有不同的计算量,当需要的计算量很大时,耗时也会很大 权重初始化 问题 。常用的初始化方案有全零初始化、正态分布初始化和均匀分布初始化等,合适的初始化方案很重要,之前提到过 神经网络 初始化为0可能会带来的影响 正则化 问题 。L1、L2以及Dropout是为了防止过拟合的,当训练集 loss 下不来时,就要考虑一下是不是正则化过度,导致模型欠拟合了。正则化相关可参考正则化之L1 & L2
法师大人: 你好,我有点不太明白3.5中所提到的“训练集和验证集是两个截然不同的分布”是什么意思。我的代码就出现了这样的问题,在val的时候网络输出nan,当然按照下面的方式修改也成果解决了,但是我还是不太理解造成这个问题的原因。 我的训练集和验证集是我自己人工划分的,这会造成这样的问题吗? Pytorch 中 expand和repeat xzacrhh: b1两行三列,写成三行两列 表情包