深度学习笔记:1.12 梯度的数值逼近 | 1.13 梯度检验 | 1.14 梯度检验实施小tip

        这三小节实质上是在讲如何确保back prop正确实施,即进行back prop时,对参数求导过程是否准确。首先‘1.12 梯度的数值逼近’讲通过怎样的方法,我们可以得到对求导结果一个很好的逼近;‘1.13 梯度检验’告诉我们有了1.12中提出的方法,我们可以使用这个方法去检验参数求导过程是否准确,即检验back prop是否正确实施;‘1.14 梯度检验小tip’则是告诉我们在实际情况中使用梯度检验时的一些经验和点子。

1.12   梯度的数值逼近

首先介绍通过怎样的方法,我们可以得到对求导结果一个很好的逼近。如下图所示:

其实学过微积分的我们都知道,对于可导的函数,要求函数在某点的导数时,我们可以利用求导公式直接对函数求导,得到导数公式之后带入该点坐标即可得到函数在该点的导数值,除此之外,我们还可以利用导数的定义去求解函数在某一点的导数值。其实这里梯度检验的思想就是利用这两种求导思想去检验求导过程是否准确。

为了介绍这个逼近的方法,这里举个例子,如上图所示,假设我们的函数是F(x)=x^3(x等同于图中theta,便于打字),函数图像如上图左下角所示。采用直接求导的方法,我们利用微积分的知识,可以得到其一阶导为3x^2,且函数在x=1处的导数为3,那如果不求导,而是使用一种逼近方法呢?

如上图所示,我们在x=1附近找一个距离1很近的点,比如1.01,然后利用导数的定义去逼近导数在该点的值,为什么说逼近呢?因为如果我们使用导数的定义去求解,倒数的定义是取sigma趋近于0的极限值,而这里我们是令sigma为具体的值,比如这里为0.01,所以这时我们只能说是选用具体的sigma的值去逼近真正的导数值,这也是梯度数值逼近的意思。

如上图,当我们取sigma=0.01时,导数逼近的误差为0.0301,不算太小。接下来我们看另一种逼近的形式,如下图所示:

同样一个例子,接下来我们使用另一种逼近形式,如上图式子,我们取x=1的左右两点,而不仅仅是左侧或右侧一个点,sigma也选取同样的0.01,发现了什么?这样计算出来的梯度逼近误差远远小于上一种情况(单边误差)。为了便于观察,我们可以将绿三角画的更大一些,你会发现,双边误差对应的三角形斜边倾斜程度相比单边误差对应的情况更接近于中间点的斜率,直观上我们可以感受得到,而实际计算结果也确实如此。

通过比较,我们发现,单边逼近误差为0.03,而双边逼近误差为0.0001,单边逼近误差是双边逼近误差的300倍,量级已有很大不同。

但实际上从导数定义的这两种形式我们也可以的得出结论,如上图最底部两个式子所示,当使用双边逼近方法时,通过泰勒三级展开,当sigma趋近于0时,逼近误差是sigma^2的同阶无穷小,相当于这时逼近误差为k倍的sigma^2。而当使用单边逼近方法时,通过泰勒二级展开,我们可以得到逼近误差是sigma的同阶无穷小,即逼近误差为k*sigma。误差的量级区别一下就出来了,当sigma=0.01时,单边逼近误差为0.01的倍数,而双边逼近误差为0.0001的倍数,预测准确性可想而知。所以这里逼近梯度我们使用第二种形式。

1.13    梯度检验

逼近梯度的形式找到了,我们就可以进行梯度检验了。梯度检验帮助节省时间以及发现backprop实施过程中的bug,我们用它来调试和检查backprop实施是否正确。如下图所示:

在进行梯度检验之前,我们先做好准备工作,那就是把矩阵W向量化,b本来就是向量,然后把所有层已经向量过的W和b连接在一起(concatenate),成为一个大向量,我们称之为J(theta),然后对通过back-prop过程得到的W和b求导的结果也做同样的变换,接下来我们就要开始做检验了,即验证d(theta)是否真的是J(theta)的梯度呢?

梯度检验(Gradient checking),也称Grad check,检验过程如上图所示。先前我们已经将参数向量化为一个巨大的向量,然后我们使用双边逼近的形式去对每一个参数求解梯度(保持其他参数不变),得到在这一次迭代过程中,所有参数的梯度,这是通过双边逼近的形式得到的梯度。为了检验backprop实施是否正确,我们要将backprop的结果与双边逼近得到的结果相比较。

那么该怎么比较(check)呢?

可以使用欧氏距离。因为我们主要是要比较两个向量的对应分量的差别,这个可以用对应分量差的平方和的开方(欧氏距离)来刻画。但是我们不希望得到一个具体的刻画差异的值,而是希望得到一个比率,这也便于我们得到一个标准的梯度检验的要求。

为什么这样说呢?其实我们可以这样想,假设刚开始的迭代,参数的梯度很大,而随着不断迭代直至收敛,参数的梯度逐渐趋近于0,即越来越小,这个过程中,分子(欧氏距离)是跟梯度的值有关的,随着迭代次数的增加,也会减小。那在迭代过程中,我们只利用分子就没有一个固定标准去判断梯度检验的效果,而加上一个分母,将梯度的平方和考虑进去,大值比大值,小值比小值,我们就可以得到一个比率,同样也可以得到一个确定的标准去衡量梯度检验的效果。

假设我们的sigma在这里取10的-7次方,那么如果这个比率约为10的-7次方,我就可以认为这次的梯度检验没有问题,如果这个比率为10的-5次方,这时我就要稍微考虑一下是哪里出了错,就需要把参数向量的每个分量的梯度计算一下,来看一下是哪个分量的梯度计算错误导致了这样的结果,如果这个比率为10的-3次方,那么结果就更严重了,更加需要把参数向量的每个分量的梯度计算一下来看是哪个计算错误。

1.14    梯度检验实施小tip

在这里我们介绍一些梯度检验实际使用过程中的一些经验总结,如下图所示:

首先,不要使用梯度检验去训练,即不要使用梯度检验方法去计算梯度,因为这样做太慢了,在训练过程中,我们还是使用backprop去计算参数梯度,而使用梯度检验去调试,去检验backprop的过程是否准确。

其次,如果我们在使用梯度检验过程中,发现backprop过程出现了问题,如我们在1.13中假设的那样,这时我们就需要对所有的参数进行计算,以判断造成计算偏差的来源在哪里,它可能是在求解b出现问题,也可能是在求解某一层的W出现问题,梯度检验可以帮助我们确定发生问题的范围,以帮助我们调试。

别忘了正则化,如上图所示,如果我们添加了二范数正则化,在使用backprop计算参数梯度时,不要忘记梯度的形式已经发生了变化,要记得加上正则化部分,同理,在进行梯度检验时,也要记得目标函数J的形式已经发生了变化。

注意,如果我们使用了drop-out正则化,梯度检验就不可用了。为什么呢?因为我们知道drop-out是按照一定的保留概率随机保留一些节点,因为它的随机性,目标函数J的形式变得非常不明确,这时我们便无法再用梯度检验去检验backprop。如果非要使用drop-out且又想检验backprop,我们可以先将保留概率设为1,即保留全部节点,然后用梯度检验来检验backprop过程,如果没有问题,我们再改变保留概率的值来应用drop-out。

最后,介绍一种特别少见的情况。在刚开始初始化W和b时,W和b的值都还很小,这时backprop过程没有问题,但随着迭代过程的进行,W和b的值变得越来越大时,backprop过程可能会出现问题,且可能梯度差距越来越大。要避免这种情况,我们需要多进行几次梯度检验,比如在刚开始初始化权重时进行一次检验,在迭代一段时间之后,再使用梯度检验去验证backprop过程。

版权声明:尊重博主原创文章,转载请注明出处https://blog.csdn.net/kkkkkiko/article/details/81214824

猜你喜欢

转载自blog.csdn.net/kkkkkiko/article/details/81214824