机器学习笔记——梯度检查(Gradient Checking) ——差分法

原因

之间讲过的线性回归还是逻辑回归,都是用到了梯度下降法,这里有个问题需要拿出来考虑一下:
由于各种因素,导致你在程序中实现的算法会出现一些BUG,带着这些BUG算法也能实现使成本函数(Cost function)呈现出下降的趋势,但是,由于BUG的存在,导致你的算法最后实现的结果 出现较大的偏差,但是,你此时并不知道已经发生的问题。
举个栗子(可能不恰当,仅仅是帮助理解):在寻找全局最优解的过程中会有许多局部最优解,如果你对算法实现的过程不加检查,可能会使你陷入到局部最优化中而停止运算,而此时,你却并不知晓,你还想当然的以为,你的算法已经完成了!
那么,问题来了,有没有办法在算法运算的过程中的去检查梯度下降的过程是否符合数值计算中的梯度呢?
答案必须是:必须的必!
来看看:

实现方法

在实数范围内

如下图,在实数范围内,我们通过算法计算出了成本函数J(θ)在点 θ 处的梯度值,如图中蓝线所示,这条蓝线的斜率就是当前点的梯度值。那问题来了,如何检测?
机器学习笔记——梯度检查(Gradient Checking) ——差分法
看一下下图:
看红色的线,在点 θ 左右两侧分别以 ε 为间隔,取出 θ+ε 和 θ-ε 对应点的值 J(θ+ε) 和 J(θ-ε),然后将这两点连起来,如果 ε 足够小,那么,这条直线的斜率(Numerical estimation of gradient)就可以近似的认为是J(θ)的值,这在数学的角度是行得通的。
机器学习笔记——梯度检查(Gradient Checking) ——差分法
好了,通过这样的方法在运算过程检查梯度下降的趋势不是不和数值估计中的梯度值一致,来确保梯度下降的趋势呈收敛状态。

PS:注意,在实际使用中,为了减少不必要的麻烦,这里的 ε 的取值不能太小,否则会引起一些数值中的问题,所以,一般取值 ε 在10^-4左右即可

其实,这个过程就是差分算法。

差分算法

看一下百度百科对差分法的解释:
机器学习笔记——梯度检查(Gradient Checking) ——差分法
继续我们这里的过程,其实我们这里使用的是双侧差分,其实还有单侧差分:

机器学习笔记——梯度检查(Gradient Checking) ——差分法
图中,红色的推导过程就是双侧差分,蓝色的就是单侧差分。

好了,又学会一个数学名词:差分法,怎么样,是不是没有想象中的那么难,对吧?

我们继续最后一点:多维度中的差分法:

差分法在高纬度中使用

看一下下面的图,感觉有些难,其实并不难,只不过这些公式看的有些眼花而已。让来带你看看
机器学习笔记——梯度检查(Gradient Checking) ——差分法
这里的 θ 是在n维空间中,结合微分算法中的偏导数的算法,在微分中的偏导数的计算过程中,对每一个维度的θ做差分运算,其实就可以了。什么意思嘞?把多维的计算过程分解到每一维对应的实数空间里就可以了
这样就把高纬度算法的梯度监测过程实现了。

怎么样?是不是也没有那么难?

为什么要说这个问题?

神经网络中梯度检测的重要性

机器学习笔记——梯度检查(Gradient Checking) ——差分法
看一下,在神经网络中的三步曲中,很重要的反向传播中需要计算误差,这里注意:
机器学习笔记——梯度检查(Gradient Checking) ——差分法
后面的f’(y)其实就是求**函数在对应点的导数,这个导数其实就是梯度。看到这里是不是恍然大悟!
如果反向传播的过程中计算出来的梯度出现了较大的偏差,不难想象最后的结果一定不会是最优解,所以,在神经网络中要学会监测梯度是否是按照正确的趋势在收敛。

这里注意:
这个梯度检测的过程是非常耗费算力的,所以尽量在你认为有需要的位置做梯度监测,一旦人为梯度没有问题,就将监测过程关闭,而不是在整个过程中,这个尤其要注意。

OK! That is all !

PS:此学习笔记为学习斯坦福吴恩达机器学习视频笔记。