分析原因:

loss值在一段下降后突然激增,说明训练过程有细节上的问题,应该是在训练时,对权重和偏置的改变量过大所致。或者是在训练过程中,训练方法上有软逻辑错误。(比如大数据集下每跑一个数据进行一次权重偏置更新这种玄学问题)

检查训练软逻辑是否有错,尝试逐步减小learning rate,或者使用剃度裁剪或其他巧妙方法控制训练时梯度,避免梯度爆炸的问题。

这种loss值上下摆动的情况在时序处理类神经网络训练时时有发生,剃度裁剪是比较有效的方法。如果对此现象不加以遏制,有可能训练成功,但是在检验集上表现很差;或者梯度持续爆炸,loss摆动幅度增大,数据出现inf或nan,训练全部白费。

如果说loss值在一个上界和下界中间来回摆动,也是learning rate过大或者梯度有轻微爆炸情况的表现,这就像是你快到山谷底端,但是步子跨得很大,跳到对面了,然后又跳回来,如此反复。

1:训练的batch_size太小

1. 当数据量足够大的时候可以适当的减小batch_size,由于数据量太大,内存不够。但盲目减少会导致无法收敛,batch_size=1时为在线学习。

2. batch的选择,首先决定的是下降方向,如果数据集比较小,则完全可以采用全数据集的形式。这样做的好处有两点:

1)全数据集的方向能够更好的代表样本总体,确定其极值所在。

2)由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。

3. 增大batchsize的好处有三点:

1)内存的利用率提高了,大矩阵乘法的并行化效率提高。

2)跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快。

3)一定范围内,batchsize越大,其确定的下降方向就越准,引起训练震荡越小。

4. 盲目增大的坏处:

1)当数据集太大时,内存撑不住。

2)batchsize增大到一定的程度,其确定的下降方向已经基本不再变化。

1)batch数太小,而类别又比较多的时候,可能会导致loss函数震荡而不收敛,尤其是在你的网络比较复杂的时候。

2)随着batchsize增大,处理相同的数据量的速度越快。

3)随着batchsize增大,达到相同精度所需要的epoch数量越来越多。

4)由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。

5)过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。

6)具体的batch size的选取和训练集的样本数目相关

分析原因: 2:数据输入不对

1:数据输入不对包括数据的格式不是网络模型指定的格式,导致训练的时候网络学习的数据不是想要的; 此时会出现loss曲线震荡;

解决办法:检查数据输入格式,数据输入的路径;

batch的size设置的不能太大也不能太小,因此实际工程中最常用的就是mini-batch,一般size设置为几十或者几百。对于二阶优化算法,减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降,因此在使用二阶优化算法时,往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能。GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优