我正在训练CNN。我使用Googles预训练的inceptionV3替换最后一层进行分类。在训练期间,我遇到了很多问题,我的交叉熵损失变成了纳。在尝试了不同的事情(降低学习率,检查数据等)之后,结果证明训练批量太大了。
将培训批量从100减少到60解决了这个问题。您能否解释为什么过高的批量大小会导致交叉熵损失功能出现这个问题?还有一种方法可以解决这个问题,以适应更高的批量大小(有一篇论文建议批量大小为200+图像以获得更好的准确性)?
网络的较大权重(导致爆炸的梯度)在软最大层中产生倾斜的概率。例如,[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。