Keras模型训练过程中loss为Nan情况分析与处理
作者:互联网
情景:
推荐召回模型训练,开始的几个epoch损失正常下降,在到某个epoch下loss突然为nan,但模型仍在继续training,最终在模型预测时,结果都为零。
查阅相关资料,可能的原因如下:
1)训练集中可能出现为NAN的特征;
2)自定义loss函数中,会存在分母为零的异常,可以加入微小的长度以保持其稳定性;
3)超参的设置不合理,如优化器、学习率等,个人感觉learning rate影响较大,可以设置为自适应lr以延缓loss为nan的情况;层数太多或学习率太高梯度下降时造成dead neuron
4)可能设置了过多的BatchNorm层,可以查看该层的输出是否有nan数据;由于训练数据会导致移动均值和方差为nan,产生适得其反效果
建议解决方案:
1)查看数据异常
在CPU模型下运行,看看出错信息,使用GPU做计算不会报此类具体的错误,非常重要!
2)NaN具有传递性
训练的时候,如果某个地方炸了或者发生了除零错,在设备上是不会触发中断的。这个时候如果污染了你的参数,会导致一部分或者全部参数数值变成NaN。然后后面的batch就全是NaN了,然后这组模型的网络权重参数就废了。
3)初始化设置不合理
文本在embedding操作时,使用了默认参数进行初始,
tf.keras.layers.Embedding( input_dim, output_dim, embeddings_initializer="uniform", embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None, **kwargs )
可以尝试调整embeddings_initializer参数,embeddings_initializer=keras.initializers.TruncatedNormal(stddev=0.02),本人在更改之后,一切回归正常
标签:loss,None,embeddings,Keras,Nan,模型,nan,NaN 来源: https://www.cnblogs.com/demo-deng/p/16394532.html