深度学习训练时loss不变的可能原因

一、训练背景

  1. 模型采用简单的四层linear以及Relu、Sigmoid,实现二分类问题
  2. loss采用的是交叉熵和Focal loss(测试Focal loss性能)
  3. 优化方式采用的是Adam+StepLR

二、LOSS不变的原因

1. 背景:训练集和测试集的loss都不变了或者训练集的loss完全不变(是严格的不变了)

在这里插入图片描述

2.loss不变的处理办法
1. 首先参考网上的策略

-1. 数据本身的问题:可以尝试使用其他的数据处理方法,例如归一化或者规范化等(不能没有,不能全靠Adam呀)
-2. 初始化权重问题:这个的话我使用的是Pytorch,然后model里面有默认的初始化方法(而且都相对较为合适),列入我使用的Linear层默认的初始化方法就是He 初始化了。
-3. 学习率过大:这个问题暂时我还没有想出来,学习率过大不是应该会导致振荡嘛(欢迎讨论)?

2. 自己实践摸索

-1. 由于loss函数书写的问题:
这个参考上一个博文,我使用的是Focal loss 和自己写的交叉熵,由于在训练过程中sigmoid的存在,出现了饱和的现象,导致了loss的不变;
具体原因如下:由于自己写的loss,然后训练过程中出现了Nan(loss函数中的log导致的问题),所以我就使用torch.clamp对loss的输入值的最大最小值进行了限制。这种强制clamp的方法十分不合适(torch中自带的交叉熵函数就对着一点儿处理的很好,参见上一篇博文),最后发现是由于自己数据没有进行归一化导致。
其次是一般不需要质疑Relu+sigmoid的正确性,这是常规的网络设置方式,不要想着Relu在大于零时递增导致sigmoid饱和。
-2. 由于Adam和StepLR的参数设置导致的(初始学习率、更新次数和更新幅度)
总的原因就是学习率设置过小所致:初始学习率(lr)过小或者更新次数(step_size)过小或者gamma过小(参数位置如下所示)在这里插入图片描述

你可能感兴趣的:(Pytorch,深度学习,pytorch)