码迷,mamicode.com
首页 > 其他好文 > 详细

稀疏自动编码之梯度检验

时间:2014-10-13 12:46:39      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   使用   ar   for   sp   art   

众所周知,反向传播算法很难调试和得到正确结果,特别是在执行过程中存在许多细小难以察觉的错误。这里介绍一种方法来确定代码中导数的计算是否正确。使用这里所述求导检验方法,可以帮助提升写正确代码的信心。

假设我们想最小化关于 bubuko.com,布布扣 的函数 bubuko.com,布布扣  . 对于这个例子,假设 bubuko.com,布布扣,所以 bubuko.com,布布扣. 在一维空间,梯度下降的一次迭代公式如下:

bubuko.com,布布扣

假设我们已经实现了某个函数 bubuko.com,布布扣 去计算 bubuko.com,布布扣,那么梯度下降时参数更新就可以这样:bubuko.com,布布扣. 该如何检验我们编写的函数 bubuko.com,布布扣 是正确的呢?

回忆导数的定义:

bubuko.com,布布扣

对于任意的 bubuko.com,布布扣 ,可以用如下公式来从数值上近似导数值:

bubuko.com,布布扣

在实践中,将  EPSILON 设定为一个极小的常数,如 bubuko.com,布布扣.(虽然EPSILON可以取得极其小的值,如bubuko.com,布布扣,但这样会导致数值舍入误差),通常bubuko.com,布布扣就足够了。

现在,给定假设中计算 bubuko.com,布布扣 的函数 bubuko.com,布布扣 ,我们可以通过如下方式检验该函数的正确如否:

bubuko.com,布布扣

 

到底这两个值接近到什么样的一个程度才算正确呢?要取决于 bubuko.com,布布扣 的具体形似。但是假定 bubuko.com,布布扣, 通常我们会发现上述式子左右两边的值至少有4位有效数字是一样的(甚至更多)。

现在,考虑 bubuko.com,布布扣,即参数是一个向量而不是一个实数(所以需要学习出 bubuko.com,布布扣 个参数),且bubuko.com,布布扣. 在我们的神经网络例子中使用符号bubuko.com,布布扣, 所以我们可以想象把这许多参数 bubuko.com,布布扣  全部装进一个很长的向量 bubuko.com,布布扣. 现在,就把导数检验过程泛化到 bubuko.com,布布扣 是向量的情况。

 

假设我们编写了一个函数 bubuko.com,布布扣 计算导数 bubuko.com,布布扣,我们想要检验 bubuko.com,布布扣 是否正确地计算出了导数值. 令bubuko.com,布布扣,其中:

bubuko.com,布布扣

是第 bubuko.com,布布扣 个基向量(维数与 bubuko.com,布布扣 一样,只有第 bubuko.com,布布扣 个元素为1,其他位置元素全部为0).所以对于 bubuko.com,布布扣,除了第 bubuko.com,布布扣 个元素比bubuko.com,布布扣的第 bubuko.com,布布扣 个元素多加了EPSILON,其他元素完全一样。类似地有:bubuko.com,布布扣.然后就可以通过检查下面式子的正确与否来检验 bubuko.com,布布扣 的正确性:

bubuko.com,布布扣

 当用反向传播去训练神经网络时, 正确执行的算法可以得到:

bubuko.com,布布扣

这展示在

稀疏自动编码之反向传播算法(BP)

的梯度下降伪代码中.通常用上面的方法计算出 bubuko.com,布布扣 的导数值,通过它检验我们程序中 bubuko.com,布布扣 和 bubuko.com,布布扣 是否确实计算出了我们想要的到数值。

 

 学习来源:http://deeplearning.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization

 

稀疏自动编码之梯度检验

标签:style   blog   http   io   使用   ar   for   sp   art   

原文地址:http://www.cnblogs.com/90zeng/p/Gradient_checking.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!