深度学习笔记(十)—— 梯度检验[Gradient Checks]

  这是深度学习笔记第十篇,完整的笔记目录可以点击这里查看。
  
  梯度检验就是将解析法(也就是用导数公式求解梯度)计算的梯度与用数值法(也就是通过导数定义求解梯度)计算的梯度进行对比,以检验解析法公式的正确性。因为数值法是通过导数定义进行求解,当步长h设置的足够小时,就可以求得较为精确的梯度值,准确性较高,但是存在求解速度慢的缺点。相反,解析法直接按照给定的公式计算梯度就可以了,但是当问题比较复杂时,公式往往难以求出,而且容易出错。于是,就有了梯度检验这个过程了。

1. Use the centered formula

  在用数值法计算梯度的时候,使用第二个式子的计算结果会比第一个式子好。
在这里插入图片描述
在这里插入图片描述

2. Use relative error for the comparison

  在对比两种方法求解的梯度误差时,应计算相对误差。
在这里插入图片描述
  在实践中:

  • 相对误差>1e-2 通常意味着年计算的梯度可能是错误的
  • 1e-2>相对误差>1e-4 的结果不是很理想
  • 相对误差<1e-4 在有kinks(第5点会讲到kinks是指什么)时这个结果通常是可以的。但如果没有kinks(例如使用非线性tanh和softmax),则1e-4过高。
  • 1e-7及以下 则表明结果理想

3. Use double precision

  使用双精度可以确保计算结果更准确。

4. Stick around active range of floating point

  在计算或显示结果时,保持数值在浮点数的精度范围内,才能获得正确结果。如果结果非常小(eg. 1e-12),则考虑将其乘以一定的常数(eg. 1e12)。结果在1.0数量级上最佳。更多信息参考链接。

5. Kinks in the objective

  kinks是指目标函数的不可微部分,比如由ReLU(max(0,x))或SVM损失函数、Maxout神经元等函数引入。 在梯度检验过程中要注意的一个不准确的来源就是kinks。解决kinks问题的一个方法是在梯度检验时只使用少量的数据点(Use only few datapoints)进行计算。用很少的数据点进行计算也可以让你的梯度检验更快更有效。

6. Be careful with the step size h

  检验时h不一定是越小越好。因为当h非常小时,就有可能会遇到数值精度的问题。在刚开始进行检验的时候,取h为1e-4到1e-6之间进行测试将更容易得到正确的检验结果。更多信息参考维基百科。

7. Gradcheck during a “characteristic” mode of operation

  梯度检验是在参数空间中的一个特定(通常是随机的)单点执行的。即使梯度检验在那一点上成功,也不能立即确定梯度是否被正确地全局执行。

8. Don’t let the regularization overwhelm the data

  通常情况下,损失函数是数据损失和正则化损失的总和。需要注意的一个危险是正则化损失可能会压盖(overwhelm)数据损失,在这种情况下,梯度将主要来自正则化项(通常具有更简单的梯度表达式)。这可能会掩盖数据损失梯度的错误实现。因此,建议先关闭正则化并单独检查数据损失,然后再独立检查正则化项。执行后者的一种方法是hake代码以消除数据损失的贡献。另一种方法是增加正则化的强度,以确保其效果在梯度检查中不可忽略,这样就能检测到不正确的实现。

9. Remember to turn off dropout/augmentations

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

10. Check only few dimensions

  实践中,梯度的大小可以达到百万个参数。在这些情况下,只检验梯度的部分维度并假设其他尺寸是正确的才是可行的。要注意的一个问题是确保为每个单独的参数检查几个维度。在一些应用中,为了方便起见,人们把参数组合成一个大的参数向量。例如,在这些情况下,偏差(bias)只能从整个向量中占用少量参数,因此重要的是不要随机采样,而是要考虑到这一点,并检查所有参数是否获得正确的梯度。



*本博客翻译总结自CS231n课程作业网站,该网站需要才能访问。

你可能感兴趣的:(CS231n课程笔记,深度学习,神经网络,机器学习,人工智能)