在训练网络的时候,常常会出现loss出现非常明显的剧烈抖动情况,虽然大多数情况可以继续训练下去,但是实际上还是预示着问题存在。而且,有不同维度的问题,这也需要不同的解决方法,但是具体究竟是哪一种,还得具体情况具体分析。
-
是否找到合适的loss函数
:在深度学习里面,不同的loss针对的任务是有不同的,有些loss函数比较通用例如L1/L2等,而如perceptual loss则比较适合在图像恢复/生成领域的任务上。当loss出现问题的适合,想一想,是不是loss设置的有问题,别人在此领域的任务的方法是否也使用和你一样的loss。
-
batch size是否合适
:batch size的问题一般是较大会有比较好的效果,一是更快收敛,二是可以躲过一些局部最优点。但是也不是一味地增加batch size就好,太大的batch size 容易陷入sharp minima,泛化性不好。较小的batch size可能会使得网络有明显的震荡。
-
是否使用合适的激活函数
:一般来说,都几乎使用RELU作为全局激活函数,尽可能少的使用sigmoid激活函数(激活范围太小),容易造成梯度弥散、消失
-
学习率
:学习率太大,一步前进的路程太长,会出现来回震荡的情况,但是学习率太小,收敛速度会比较慢。
-
是否选择合适的优化算法
:一般来说,我都使用Adam作为优化器(默认参数)。如果经过仔细调整的SGD算法性能可能更好,但是时间上不太允许这样做。
-
**通过提前终止确定最优模型:**在训练的过程中,可能会出现训练到最后的精度竟然还不如前面的epoch高,那么可以直接终止训练,然后将之前的model作为best model,之后使用这个model即可
-
Regularization(正则化)
:通过正则化进行约束,一般的方法可以通过优化器的权重衰减方法,即训练到后期,通过衰减因子使权重的梯度下降越来越缓慢。或者BN、Dropout以及L1/L2
-
调整网络结构
:一句话,你的网络结构出了问题,是错误的,没有科学性的
-
增加训练数据量
:数据集太小太少,且没有进行数据增强,就可能导致过拟合
参考来自:
https://www.cnblogs.com/Mrzhang3389/p/10164241.html
前言在训练网络的时候,常常会出现loss出现非常明显的剧烈抖动情况,虽然大多数情况可以继续训练下去,但是实际上还是预示着问题存在。而且,有不同维度的问题,这也需要不同的解决方法,但是具体究竟是哪一种,还得具体情况具体分析。无过拟合是否找到合适的loss函数:在深度学习里面,不同的loss针对的任务是有不同的,有些loss函数比较通用例如L1/L2等,而如perceptual loss则比较适合在图像恢复/生成领域的任务上。当loss出现问题的适合,想一想,是不是loss设置的有问题,别人在此领域的任
用LSTM做时间序列预测时发现训练刚开始时
loss
(MSE)下降很快,accuracy(调整R方)上升也很快,但到后面
loss
总体上下降变慢,并且时有波动,accuracy甚至会经常出现负值,然后又回弹至正值。经查阅资料和反复调试,发现是batch size太小的问题,原来的batch size是2,现在改成4
batch size为2时
loss
的变化如下
batch size 为4时
loss
的变化如下,虽然也有波动,比如在910epoch左右
loss
冲到了0.06,但总体上比batch size稳定
可以看到虽然还没学习多少,但是我的val_
loss
已经开始出现了
震荡
的情况。但总体趋势还是在下降说明还有学习的空间。
loss
和val_
loss
的变化趋势反映的情况如下,可供参考:
loss
下降,val_
loss
下降:训练网络正常,最好情况。
loss
下降,val_
loss
稳定:网络过拟合化,可以使用正则化和Max pooling。
loss
稳定,val_
loss
下降:数据集有严重问题,建议重新选择。
loss
稳定,val_
loss
稳定:学习过程遇到瓶颈,需要减小学习率或批量数目,可以减少学习率。
表现:训练过程中
loss
值一直
震荡
,没有下降趋势
原因一:梯度消失;多因为网络深度过深,接近输入层的参数 梯度过小; 解决方法:调整网络,激活函数relu,batch normal等
原因二:训练数据分布不均匀;这种情况对训练数据shuffle即可
原因三:学习率过大或者过小;过大就会在
loss
最小处周围
震荡
,通常一开始会有一定下降;过小就是收敛太慢
tensorflow
2中可以直接打出每个step的梯度值,便于发现问题
Batch Gradient Descent:全量处理
Mini-Batch Gradient Descent:处理部分数据
Stochastic Gradient Descent:每次只取一个数据训练
import numpy as np
import torch
x = np.random.random(size=(100, 8))
linear = torch.nn.Linear(in_features=8, out_features=1)
sigmoid = torch.nn.Sigmoid()
Low-light images enhancement/暗光/低光/微光增强系列:Attention-guided Low-light Image Enhancement(详解)
10056