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),本人在更改之后,一切回归正常

posted @   今夜无风  阅读(1324)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示