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

假设我们想最小化关于 稀疏自动编码之梯度检验 的函数 稀疏自动编码之梯度检验  . 对于这个例子,假设 稀疏自动编码之梯度检验,所以 稀疏自动编码之梯度检验. 在一维空间,梯度下降的一次迭代公式如下:

稀疏自动编码之梯度检验

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

回忆导数的定义:

稀疏自动编码之梯度检验

对于任意的 稀疏自动编码之梯度检验 ,可以用如下公式来从数值上近似导数值:

稀疏自动编码之梯度检验

在实践中,将  EPSILON 设定为一个极小的常数,如 稀疏自动编码之梯度检验.(虽然EPSILON可以取得极其小的值,如稀疏自动编码之梯度检验,但这样会导致数值舍入误差),通常稀疏自动编码之梯度检验就足够了。

现在,给定假设中计算 稀疏自动编码之梯度检验 的函数 稀疏自动编码之梯度检验 ,我们可以通过如下方式检验该函数的正确如否:

稀疏自动编码之梯度检验

 

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

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

 

假设我们编写了一个函数 稀疏自动编码之梯度检验 计算导数 稀疏自动编码之梯度检验,我们想要检验 稀疏自动编码之梯度检验 是否正确地计算出了导数值. 令稀疏自动编码之梯度检验,其中:

稀疏自动编码之梯度检验

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

稀疏自动编码之梯度检验

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

稀疏自动编码之梯度检验

这展示在

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

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

 

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

 

相关文章:

  • 2021-11-26
  • 2021-06-07
  • 2021-05-16
  • 2022-03-08
  • 2021-05-09
  • 2021-12-24
  • 2021-04-24
  • 2021-10-15
猜你喜欢
  • 2022-03-08
  • 2022-02-22
  • 2022-01-08
  • 2021-11-26
  • 2021-10-15
  • 2021-08-17
  • 2021-12-11
相关资源
相似解决方案