赞
踩
在训练机器学习模型的时候,有时候我们会发现训练着训练着,loss 变成了 NaN。造成这种现象的原因有很多种,我寻找了一些资料,一并总结如下。
梯度爆炸问题(就是,很大!很大!的梯度!)很可能是出现 nan 的罪魁祸首之一,1" [1] 给出了四种解决梯度爆炸问题的方法:
pir [1] 表示还有一种方法很不错,就是限制所有的梯度不大于 1,在Keras
中可以给optimizer
设置clipnorm=1
参数来实现这一操作。
除了梯度爆炸问题,数据集自身的问题也很有可能导致出现 NaN。网友们大多表示,如果数据中包含无穷大(例如-inf
或inf
)的值,或者NaN
值,你的 loss 就可能会变成 NaN。所以,检查一下数据集中的数值吧!
# numpy
print(np.any(np.isnan(dataset)))
# pandas
dataset.dropna()
网友 jingzhao3200 [2] 分享了另外一种方法:把batch_size
设为
1
1
1,然后看看到底是哪个样本出了问题。
此外,还要注意,保证数据不会被除以零,或者出现log(0)
这种情况,等等等等 [3] 。
网友 Arnav [1] 表示,如果在你的网络中的某一层的输出中,有着很多很多的零,那么反向传播算法就不会更新这些点的权值(因为零的导数还是零)。这个问题也被称为Dying ReLU。使用 LeakyReLU 激活函数就可以解决这个问题,以Keras
为例:
model.Sequential([
keras.layers.Dense(3197747),
keras.layers.LeakyReLU(alpha=0.12),
])
网友 eng-tsmith [2] 表示,如果epoch
中最后一个batch
的大小不够batch_size
的时候,可能会导致这个问题。当他丢掉最后一个batch
之后,nan 问题就消失了:
np.floor(dataset_size/batch_size)
这是一个很有趣的问题 [5],深度学习框架经常会遇到数值不稳定,这似乎不应该归类到BUG
,解决之道就仁者见仁智者见智了。
rmsprop
或者adam
,而不是sgd
model.add(BatchNormalization())
问题解决了吗?欢迎留言分享你的经验和建议!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。