训练loss不下降原因集合

本文分析了深度学习训练中遇到的loss异常情况,包括loss保持常数值和特定数值不变的问题,探讨了可能的原因,如数据异常、网络结构设计不当、训练超参数设置不当等,并提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rain loss与test loss结果分析

train loss 不断下降,test loss不断下降,说明网络仍在学习; 
train loss 不断下降,test loss趋于不变,说明网络过拟合; 
train loss 趋于不变,test loss不断下降,说明数据集100%有问题; 
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目; 
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

实例

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

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

2.loss保持0.69左右

采用VGG-16在做一个二分类问题,所以计算loss时等价与下面的公式: 

loss=−log(Pk==label)loss=−log(Pk==label)


loss=−log(Pk==label)loss=−log(Pk==label) 
当p=0.5时,loss正好为0.693147,也就是训练过程中,无论如何调节网络都不收敛。最初的网络配置文件卷积层的参数如下所示: 
这里写图片描述 
从VGG-16训练好的模型进行fine-tuning也不发生改变,当在网络中加入初始化参数和decay_mult以后再次训练网络开始收敛。 
这里写图片描述
但是具体是什么原因造成的,暂时还没有找到,难道是初始化参数的问题还是?

 

总结

loss一直不下降的原因有很多,可以从头到尾滤一遍: 1)数据的输入是否正常,data和label是否一致。 2)网络架构的选择,一般是越深越好,也分数据集。 并且用不用在大数据集上pre-train的参数也很重要的 3)loss 公式对不对。

相关博客推荐

Loss和神经网络训练介绍的比较完整,有1.梯度检验2.训练前检查,3.训练中监控4.首层可视化5.模型融合和优化等等等 
Facenet即triplet network模型训练,loss不收敛的问题?

### 模型训练中的Loss计算方法 在模型训练期间,损失函数(loss function)用于衡量预测值与真实标签之间的差异。对于同的任务类型,会选择同类型的损失函数来适应特定的需求。 - 对于分类问题,常用的损失函数有交叉熵损失(Cross Entropy Loss),其定义为: \[ L(y, \hat{y}) = -\sum_{i} y_i \log(\hat{y}_i) \] 这里 \(y\) 表示真实的概率分布向量,而 \(\hat{y}\) 则表示由模型产生的预测概率分布向量[^1]。 - 对于回归问题,则通常会使用均方误差作为损失度量标准: \[ MSE = \frac{1}{n}\sum^n_{i=1}(y_i-\hat{y}_i)^2 \] 其中 \(y_i\) 是实际观测到的目标变量值,\(\hat{y}_i\) 是对应的预测值,\(n\) 代表样本数量。 ### 如何优化Loss并提高模型表现 为了有效地减少损失值,在实践中可以采取多种策略来进行调优工作: #### 调整学习率 适当的学习速率可以帮助梯度下降算法更快更稳定地收敛至全局最小点或者局部极小区域附近。过高的学习速度可能导致震荡无法达到最优点;相反,太低则会使迭代次数过多浪费时间资源。因此找到合适范围内的初始学习率至关重要,并可根据情况动态调整这个参数。 #### 使用正则化技术防止过拟合 当网络结构复杂度过高时容易发生过拟合现象,即虽然能在训练集上取得很好的成绩但在测试集上的泛化能力较差。通过引入L1/L2范数惩罚项能够抑制权重过大从而缓解此状况的发生几率。具体形式如下所示: \[ L_2 = \lambda ||W||^2_2 \] \[ L_1 = \lambda ||W||_1 \] 这里的 \( W \) 表示待估计参数矩阵,\(\lambda\) 控制着正则化的强度大小。 #### 数据增强(Data Augmentation) 通过对原始输入图像施加随机变换操作比如旋转、缩放和平移等方式扩充现有数据集规模的同时也增加了多样性,有助于提升最终得到的结果质量。 ```python import torch.nn as nn criterion = nn.CrossEntropyLoss() # 定义交叉熵损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001) # 设置Adam优化器及其默认学习率为0.001 ``` #### 验证集监控 利用验证集合评估当前状态下所构建出来的神经元连接模式的好坏程度以便及时发现潜在的问题所在之处进而做出相应改进措施。如果连续多个epoch内val_loss再继续减小甚至有所回升的话就说明可能出现了欠拟合或者是其他异常情况需要引起重视。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值