如何在具有批量归一化的神经网络中执行梯度检查?

人工智能 神经网络 Python 梯度下降 批量标准化 梯度检查
2021-11-06 02:00:41

我已经使用 python 和 numpy 实现了一个神经网络(NN),仅用于学习目的。我已经对学习率、动量和 L1/L2 正则化进行了编码,并通过梯度检查检查了实现。

几天前,我使用原始论文提供的公式实现了批量标准化。然而,与学习/动量/正则化相比,批量归一化过程在拟合预测阶段表现不同——这两者都是梯度检查所必需的。当我们拟合网络时,批量归一化计算每个批次的平均值并估计在我们想要预测某事时要使用的总体平均值。

以类似的方式,我知道我们可能不会在具有dropout的神经网络中执行梯度检查,因为 dropout 在拟合期间会将一些梯度变为零,并且在预测期间不会应用

我们可以通过批量归一化在 NN 中执行梯度检查吗?如果是这样,怎么做?

2个回答

只要您通过修复随机种子来修复随机性,您应该能够进行梯度检查,在 python 上您可能想查看 numpy.random.seed。

来自http://cs231n.github.io/neural-networks-3/#ensemble

在执行梯度检查时,请记住关闭网络中的任何非确定性影响,例如 dropout、随机数据增强等。否则这些会在估计数值梯度时明显引入巨大的错误。关闭这些效果的缺点是您不会对它们进行梯度检查(例如,可能是 dropout 没有正确反向传播)。因此,更好的解决方案可能是在评估 (f(x+h)) 和 (f(xh)) 之前以及在评估解析梯度时强制使用特定的随机种子。

这个来自斯坦福的链接是迄今为止我遇到的关于梯度检查的最佳资源:

http://cs231n.github.io/neural-networks-3/

我相信它会对你有很大帮助。

专业提示:确保使用“中心/中心差”公式进行导数计算,并使用“相对误差”(非绝对)来比较两个梯度。