Press "Enter" to skip to content

模型训练时loss震荡严重的几个解决方案

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

一、问题描述

 

如题。

 

二、解决方案

 

2.1 输入数据有误

数据集太少
输入数据为经过标准化:没有经过正则化处理的数据可能存在异常点,或者数据的量纲不一致。可以采用min_max归一化或者z-score标准化
没有选择合理的数据增强没有经过合理的数据增强可能导致训练的时候网络学习的数据不是想要的最佳形式; 此时会出现loss曲线震荡;需要对数据进行特征分析,找到最佳数据增强方法。图像方向的数据增强方式一般有:
旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;
翻转变换(flip): 沿着水平或者垂直方向翻转图像;
缩放变换(zoom): 按照一定的比例放大或者缩小图像;
平移变换(shift): 在图像平面上对图像以一定方式进行平移;可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;
颜色变换(color): 在训练集像素值的RGB颜色空间进行PCA, 得到RGB空间的3个主方向向量,3个特征值,

2.2 batch_size较小

 

batch数太小,并且label较多或者label的目标较少时,会导致loss函数震荡而不收敛,尤其是网络比较复杂时。

 

调大batch_size对网络训练的影响

 

优点:

内存的利用率提高了,大矩阵乘法的并行化效率提高;
跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快;
一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小;
batchsize增大,处理相同的数据量的速度越快;

缺点

内存消耗严重,面临显卡内存不足问题;
训练速度慢,loss不容易收敛;
batch_size过大导致网络收敛到局部最优点,loss下降不再明显;
batchsize增大,达到相同精度所需要的epoch数量越来越多;

2.3 Loss函数设计不合理

 

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

 

2.4 激活函数选用不合理

 

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

 

2.5 学习率太大

 

一step前进的路程太长,会出现来回震荡的情况,但是学习率太小,收敛速度会比较慢;

 

2.6 优化算法不合理

 

一般来说使用Adam作为优化器的默认参数。但有些情况下经过仔细调整的SGD算法性能可能更好

 

2.7 正则化(Regularization)

 

通过正则化进行约束,一般的方法可以通过优化器的权重衰减方法,即训练到后期,通过衰减因子使权重的梯度下降越来越缓慢。或者BN、Dropout以及L1/L2

 

2.8 网络结构有问题

 

检查网络结构代码,是否有细节上的错误

 

Reference

 

[1] https://zhuanlan.zhihu.com/p/481038077

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。