我正在训练CNN . 我使用Googles预训练inceptionV3替换最后一层进行分类 . 在训练期间,我的交叉熵损失变得很多问题 . 在尝试了不同的事情(降低学习率,检查数据等)之后,事实证明 training batch size 太高了 .
将培训批量从100减少到60解决了这个问题 . 您能否解释为什么过高的批量大小会导致交叉熵损失功能出现这个问题?还有一种方法可以解决这个问题,以适应更高的批量大小(有一篇论文建议批量大小为200张图像以获得更好的准确度)?
我正在训练CNN . 我使用Googles预训练inceptionV3替换最后一层进行分类 . 在训练期间,我的交叉熵损失变得很多问题 . 在尝试了不同的事情(降低学习率,检查数据等)之后,事实证明 training batch size 太高了 .
将培训批量从100减少到60解决了这个问题 . 您能否解释为什么过高的批量大小会导致交叉熵损失功能出现这个问题?还有一种方法可以解决这个问题,以适应更高的批量大小(有一篇论文建议批量大小为200张图像以获得更好的准确度)?
1 回答
网络的较大权重(导致爆炸的梯度)在软最大层中产生倾斜的概率 . 例如, [0 1 0 0 0 ] 而不是 [0.1 0.6 0.1 0.1 0.1] . 因此,在交叉熵损失函数中产生数值不稳定的值 .
当y_ = 0时,cross_entropy变为无穷大(因为0 * log(0)),因此 nan .
权重变得越来越大的主要原因是 exploding gradient 问题 . 让我们考虑渐变更新,
∆wij = −η ∂Ei/ ∂wi
其中 η 是学习率, ∂Ei/∂wij 是损失w.r.t权重的部分推导 . 请注意, ∂Ei/ ∂wi 是小批量 B 的平均值 . 因此,渐变将取决于小批量大小 |B| 和学习率 η .
为了解决这个问题,您可以降低学习率 . 根据经验,最好将初始学习率设置为零,并且一次增加一个非常小的数字以观察损失 .
此外,减小小批量大小会导致随机梯度更新的方差增加 . 这有时有助于通过向渐变更新方向添加噪声来缓解 nan .