训练时 loss 为 NaN

前言

在训练机器学习模型的时候,有时候我们会发现训练着训练着,loss 变成了 NaN。造成这种现象的原因有很多种,我寻找了一些资料,一并总结如下。

梯度爆炸问题

梯度爆炸问题(就是,很大!很大!的梯度!)很可能是出现 nan 的罪魁祸首之一,1" [1] 给出了四种解决梯度爆炸问题的方法:

  1. 对训练集的输出(label)使用分位标准化(quantile normalizing);
    这可以抑制过大的输出。
  2. 为模型增加正则化(regularization)技巧,例如 L1、L2 正则化等;
  3. 减小模型的规模(尽管可能会损害模型最后的效果);
  4. 增大 batch 的大小。

pir [1] 表示还有一种方法很不错,就是限制所有的梯度不大于 1,在Keras中可以给optimizer设置clipnorm=1参数来实现这一操作。

数据问题

除了梯度爆炸问题,数据集自身的问题也很有可能导致出现 NaN。网友们大多表示,如果数据中包含无穷大(例如-infinf)的值,或者NaN值,你的 loss 就可能会变成 NaN。所以,检查一下数据集中的数值吧!

# numpy
print(np.any(np.isnan(dataset)))

# pandas
dataset.dropna()

网友 jingzhao3200 [2] 分享了另外一种方法:把batch_size设为 1 1 ,然后看看到底是哪个样本出了问题。

此外,还要注意,保证数据不会被除以零,或者出现log(0)这种情况,等等等等 [3] 。

使用 LeakyReLU

网友 Arnav [1] 表示,如果在你的网络中的某一层的输出中,有着很多很多的零,那么反向传播算法就不会更新这些点的权值(因为零的导数还是零)。这个问题也被称为Dying ReLU。使用 LeakyReLU 激活函数就可以解决这个问题,以Keras为例:

model.Sequential([
	keras.layers.Dense(3197747), 
	keras.layers.LeakyReLU(alpha=0.12), 
])

丢掉最后一个 batch

网友 eng-tsmith [2] 表示,如果epoch中最后一个batch的大小不够batch_size的时候,可能会导致这个问题。当他丢掉最后一个batch之后,nan 问题就消失了:

np.floor(dataset_size/batch_size)

数值不稳定问题(Numerical instability)

这是一个很有趣的问题 [5],深度学习框架经常会遇到数值不稳定,这似乎不应该归类到BUG,解决之道就仁者见仁智者见智了。

其他方法

  • 使用其他的 loss 函数
  • 减少网络层的大小(例如 128 -> 64)
  • 减少 batch 的大小
  • 使用rmsprop或者adam,而不是sgd
  • 仔细地检查数据集!看看有没有任何异常数据
  • 使用model.add(BatchNormalization())
  • 类(classes)的数量与标签(label)的数量不一致
  • 网友 Kerri [4] 表示梯度消失很可能也是原因之一

结语

问题解决了吗?欢迎留言分享你的经验和建议!

Reference

  1. NaN loss when training regression network. (June 19, 2019). Retrieved from https://stackoverflow.com/questions/37232782/nan-loss-when-training-regression-network
  2. NAN loss for regression while training. (June 19, 2019). Retrieved from https://github.com/keras-team/keras/issues/2134
  3. Deep-Learning Nan loss reasons. (June 19, 2019). Retrieved from https://stackoverflow.com/questions/40050397/deep-learning-nan-loss-reasons
  4. Kerri. (March 24, 2019). tf.keras loss becomes NaN. Retrieved from https://stackoverflow.com/questions/55328966/tf-keras-loss-becomes-nan
  5. Cost function turning into nan after a certain number of iterations. (June 19, 2019). Retrieved fromhttps://stats.stackexchange.com/questions/325451/cost-function-turning-into-nan-after-a-certain-number-of-iterations
发布了40 篇原创文章 · 获赞 84 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/xovee/article/details/92762035
今日推荐