- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在训练 CNN。我使用谷歌预训练 inceptionV3用替换的最后一层进行分类。在训练期间,我遇到了很多问题,我的交叉熵损失变成了nan。在尝试不同的事情(降低学习率、检查数据等)后,结果是训练批量大小 太高了。
将训练批量大小从 100 减少到 60 解决了这个问题。您能否提供一个解释,为什么过大的批量大小会导致交叉熵损失函数出现此问题?还有一种方法可以解决这个问题以处理更大的批处理大小(有一篇论文建议批处理大小为 200+ 图像以获得更好的准确性)?
最佳答案
网络的较大权重(导致梯度爆炸)会在 soft max 层中产生偏斜概率。例如,[0 1 0 0 0 ] 而不是 [0.1 0.6 0.1 0.1 0.1]。因此,在交叉熵损失函数中产生数值不稳定的值。
cross_entropy = -tf.reduce_sum(y_*tf.log(y_))
当 y_ = 0 时,cross_entropy 变为无穷大(因为 0*log(0)),因此 nan。
权重越来越大的主要原因是梯度爆炸问题。让我们考虑梯度更新,
Δwij = −η ∂Ei/∂wi
其中 η 是学习率,∂Ei/∂wij 是损失 w.r.t 权重的偏导数。请注意,∂Ei/∂wi 是小批量 B 的平均值。因此,梯度将取决于小批量大小 |B| 和学习率 η。
为了解决这个问题,可以降低学习率。根据经验,最好将初始学习率设置为零并一次增加非常小的数字以观察损失。
此外,减小小批量会导致随机梯度更新的方差增加。这有时有助于通过向梯度更新方向添加噪声来减轻 nan。
关于tensorflow - 训练神经网络 : Mathematical reason for Nan due to batch size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49044910/
我是一名优秀的程序员,十分优秀!