machine-learning - 训练期间nans的常见原因

标签 machine-learning neural-network deep-learning caffe gradient-descent

我注意到在训练过程中经常出现的是 NAN s 被介绍。

很多时候它似乎是由内积/全连接或卷积层中的权重引入的。

这是因为梯度计算正在爆炸吗?还是因为权重初始化(如果是这样,为什么权重初始化会有这个效果)?或者它可能是由输入数据的性质引起的?

这里的首要问题很简单:在训练期间发生 NAN 的最常见原因是什么? 其次,有哪些方法可以解决这个问题(以及它们为什么有效)?

最佳答案

我多次遇到这种现象。以下是我的观察:

渐变爆炸
原因:大梯度会使学习过程偏离轨道。
您应该期待什么:查看运行时日志,您应该查看每次迭代的损失值。你会注意到,每次迭代的损失开始显着增长,最终损失将太大而无法用浮点变量表示,它会变成 nan .
你能做什么:减少base_lr (在solver.prototxt 中)一个数量级(至少)。如果您有多个损失层,您应该检查日志以查看哪个层负责梯度爆炸并降低 loss_weight (在 train_val.prototxt 中)用于该特定层,而不是一般的 base_lr .

错误的学习率策略和参数
原因: caffe 无法计算有效的学习率并获得 'inf''nan'相反,这个无效率会乘以所有更新,从而使所有参数无效。
您应该期待什么:查看运行时日志,您应该看到学习率本身变为 'nan' ,例如:

... sgd_solver.cpp:106] Iteration 0, lr = -nan

你能做什么:在您的 'solver.prototxt' 中修复所有影响学习率的参数文件。
例如,如果您使用 lr_policy: "poly"你忘记定义 max_iter参数,你会得到 lr = nan ...
有关 caffe 中学习率的更多信息,请参阅 this thread .

故障损失函数
原因:有时,损失层中损失的计算会导致 nan s 出现。例如,喂食 InfogainLoss layer with non-normalized values ,使用带有错误的自定义损失层等。
您应该期待什么:查看运行时日志,您可能不会注意到任何异常:损失逐渐减少,突然nan出现。
你能做什么:看能否重现错误,将打印输出添加到损失层并调试错误。
例如:有一次我使用了一个损失,通过批次中标 checkout 现的频率将惩罚标准化。碰巧的是,如果其中一个训练标签根本没有出现在批次中 - 计算的损失产生 nan s。在这种情况下,使用足够大的批次(相对于集合中的标签数量)足以避免此错误。

输入错误
原因:你有一个输入 nan在里面!
您应该期待什么:一旦学习过程“命中”这个错误的输入 - 输出就会变成 nan .查看运行时日志,您可能不会注意到任何异常:损失逐渐减少,突然nan出现。
你能做什么:重新构建您的输入数据集 (lmdb/leveldn/hdf5...) 确保您的训练/验证集中没有错误的图像文件。对于调试,您可以构建一个简单的网络来读取输入层,在它上面有一个虚拟损失并贯穿所有输入:如果其中一个有问题,这个虚拟网络也应该产生 nan .

步幅大于 "Pooling" 中的内核大小层
出于某种原因,选择 stride > kernel_size池可能会导致 nan s。例如:
layer {
  name: "faulty_pooling"
  type: "Pooling"
  bottom: "x"
  top: "y"
  pooling_param {
    pool: AVE
    stride: 5
    kernel: 3
  }
}
结果与 nan s 在 y .
"BatchNorm" 中的不稳定性
据说在某些设置下"BatchNorm"层可能输出nan s 由于数值不稳定性。
issue在 bvlc/caffe 和 PR #5136 中提出正在尝试修复它。

最近才知道 debug_info 标志:设置 debug_info: true'solver.prototxt'将使 caffe print 在训练期间记录更多调试信息(包括梯度幅度和激活值):这些信息可以 help in spotting gradient blowups and other problems in the training process .

关于machine-learning - 训练期间nans的常见原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33962226/

相关文章:

python - 使用 Tensorflow Keras 将 CNN 与 LSTM 相结合

python - Keras LSTM 的多维输入 -(用于分类)

python - K.gradients(loss, input_img)[0] 返回 "None"。 (Keras CNN 可视化与 tensorflow 后端)

machine-learning - 基于小序列的后续序列预测

apache-spark - 推荐系统在生产中如何工作?

machine-learning - 关于随机森林,OOB 和 Logloss 误差有什么区别?

python - 神经网络终止规则

machine-learning - 句子相似度算法的探讨

python - 如何在 tensorflow 中的张量中执行项目分配?

python - 如何找到深度学习模型的大小?