[关闭]
@songying 2018-12-31T15:48:20.000000Z 字数 1333 阅读 1070

深度学习 -- 梯度检验

deep-learning


前言

梯度下降算法应该都有所了解,该方法无论是在传统机器学习方法还是如今大热的深度学习方法中都应用广泛。但是思考一下:对于一个函数而言,如何计算它的梯度呢? 通常来说有两种方式:

  • 求导计算(analytic gradient)
  • 数值计算 ( numerical gradient)

求导计算出来的固然是准确解,但是它一定是我们要的梯度吗? 于是你需要给自己的梯度加层保护。

为什么需要梯度检验?

参考:梯度检验与高级优化

实际中,反向传播算法并不像想象中的那么简单,通常都要通过多次调试才能得到正确的结果,尤其是你程序中有许多难以发现的bug时,有时,这些bug会使你得到看似合理的结果但实际上比正确代码的结果要差)。因此,但从计算结果上来看,我们很难发现代码中有什么东西遗漏了。

这就是我们需要梯度检验的原因。

用数值计算给你的梯度上个锁

这里我们先假设我们要最小化以 为自变量的目标函数 。 那么根据梯度下降有:


再假设我们已经用代码实现了计算 的函数 , 那么我们首先就要验证一下,我们对该函数的实现到底对还是不对,这里就是梯度检验的价值所在。

如果依稀记得高等数学的话,有这么一个公式:


这样我们就能近似的算出当前的导数,我们通常将 设置成一个很小的常量,但是也不会设置的太小,如果太小会导致数值舍入误差。

此时我们需要比较近似值与准确值之间的大小来判断你的求导函数是否正确。

以上就是梯度检验的基本思想

引申一下

思考一下,我们为什么要使用: 而不使用

不妨假设 , 这样我们可以得出 , 而 ,很明显,第一个公式比第二个公式的准确度要高很多。

关于梯度检验的一些小提示

参考:吴恩达第一周: 1.14

1. 不要在训练的时候使用梯度检验,只在debug的时候使用

如果在每次训练中我们都要对梯度进行检验,会极大的增大计算量,完全没有必要。

2. 如果梯度检验失败,要检查所有项

3. 小心正则化项

4. 不要与 dropout 一起使用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注