训练神经网络:由于批量大小导致 Nan 的数学原因

Geg*_*ind 3 nan neural-network tensorflow

我正在训练一个 CNN。我使用谷歌预训练的inceptionV3,并替换了最后一层进行分类。在训练过程中,我遇到了很多问题,我的交叉熵损失变成了nan。尝试不同的事情(降低学习率、检查数据等)后,结果证明训练批量太高了。

将训练批次大小从 100 减少到 60 解决了这个问题。您能否解释为什么批次大小太高会导致交叉熵损失函数出现此问题?还有没有办法克服这个问题来处理更高的批量大小(有一篇论文建议批量大小为 200 多个图像以获得更好的准确性)?

Nip*_*hne 5

网络的较大权重(导致梯度爆炸)会在软最大层中产生偏斜的概率。例如,[0 1 0 0 0 ]而不是[0.1 0.6 0.1 0.1 0.1]。因此,在交叉熵损失函数中产生数值不稳定的值。

cross_entropy = -tf.reduce_sum(y_*tf.log(y_))
Run Code Online (Sandbox Code Playgroud)

当 y_ = 0 时, cross_entropy 变为无穷大(因为 0*log(0)),因此变为nan

权重越来越大的主要原因是梯度爆炸问题。让我们考虑梯度更新,

?wij = ?? ?Ei/?wi

在哪里是学习率,?Ei/?wij是损失 wrt 权重的部分推导。请注意,?Ei/?wi是小批量B的平均值。因此,梯度将取决于小批量大小|B| 和学习率.

为了解决这个问题,你可以降低学习率。根据经验,最好将初始学习率设置为零并一次增加一个非常小的数字以观察损失。

此外,减少小批量会导致随机梯度更新的方差增加。这有时有助于通过向梯度更新方向添加噪声来减轻nan