反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug 时。举例来说,索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练(for(i=1; i<=m; ++i) 被漏写为 for(i=1; i<m; ++i)),再比如忘记计算偏置项。这些错误会使你得到一个看似十分合理的结果(但实际上比正确代码的结果要差)。因此,仅从计算结果上来看,我们很难发现代码中有什么东西遗漏了。本节中,我们将介绍一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确。另外,使用本节所述求导检验方法,可以帮助你提升写正确代码的信心。

数学原理

考虑我们想要最小化以 θ\theta 为自变量的目标函数 J(θ)J(\theta)(θ\theta 可以为标量和可以为矢量,在 Numpy 的编程环境下,处理是一样的),迭代梯度更新公式为:

θ:=θ−αddθJ(θ)

\theta:=\theta-\alpha\frac{d}{d\:\theta}J(\theta)
我们不妨以 Sigmoid 函数为例,也即 f(z)=11+exp(−z)f(z)=\frac{1}{1+\exp(-z)},其导数形式为 f′(z)=g(z)=f(z)(1−f(z))f'(z)=g(z)=f(z)(1-f(z)),我们可轻易地编程实践,接着我们便可使用 θ:=θ−αddθJ(θ)\theta:=\theta-\alpha\frac d{d\:\theta}J(\theta)来实现梯度下降算法,那么我们如何知道 g(z)g(z)梯度的正确性呢。

回忆导数的数学定义:

ddθJ=limϵ→0J(θ+ϵ)−J(θ−ϵ)2ϵ

\frac{d}{d\:\theta}J=\lim_{\epsilon\rightarrow 0}\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}

由此我们可得梯度校验的数值校验公式:

g(θ)≈J(θ+ϵ)−J(θ−ϵ)2ϵ

g(\theta)\approx \frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}

这便是梯度检验的原理。在实际应用中,我们常将 ϵ\epsilon 设为一个很小的常量,比如 10−410^{-4} 数量级,我们不会将它设得太小,比如 10−2010^{-20},因为那将导致数值舍入误差。 事实上,上式两端值的接近程度取决于 JJ 的具体形式,但在假定 ϵ=10−4\epsilon=10^{-4} 的情况 下,通常会发现左右两端至少有四位有效数字是一致的(或者说精度至少在0.0001一级)。

编程实现

import numpy as npdef sigmoid(z):return 1./(1+np.exp(-z))
def sigmoid_prime(z):return sigmoid(z)*(1-sigmoid(z))
def check_gradient(f, x0, epsilon):return (f(x0+epsilon) - f(x0-epsilon))/2/epsilonif __name__ == '__main__':x0 = np.array([1, 2, 3])epsilon = 1e-4print(sigmoid_prime(x0))# [ 0.19661193  0.10499359  0.04517666]print(check_gradient(sigmoid, x0, epsilon))# [ 0.19661193  0.10499359  0.04517666]

References

[1] 梯度检验与高级优化

机器学习算法的调试 —— 梯度检验(Gradient Checking)相关推荐

  1. 【李宏毅机器学习】04:梯度下降Gradient Descent

    李宏毅机器学习04:梯度下降Gradient Descent 文章目录 李宏毅机器学习04:梯度下降Gradient Descent 一.梯度下降方法 二.梯度下降的改进方法 Tip 1: Tunin ...

  2. 深度学习笔记(十)—— 梯度检验[Gradient Checks]

      这是深度学习笔记第十篇,完整的笔记目录可以点击这里查看.      梯度检验就是将解析法(也就是用导数公式求解梯度)计算的梯度与用数值法(也就是通过导数定义求解梯度)计算的梯度进行对比,以检验解析 ...

  3. 机器学习实践指南(三)—— 算法的调试

    机器学习算法的调试 -- 梯度检验(Gradient Checking) (1)复杂的矩阵运算时,维度间的关系是否符合要求,动手推一下便知.

  4. 1.13 梯度检验-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.12 梯度的数值逼近 回到目录 1.14 关于梯度检验实现的注记 梯度检验 (Gradient Checking) 梯度检验帮我们节省了很多时间,也多次帮我发现backp ...

  5. 机器学习算法优缺点_用于机器学习的优化算法的优缺点

    机器学习算法优缺点 A deep-dive into Gradient Descent and other optimization algorithms 深入研究梯度下降和其他优化算法 Optimi ...

  6. 机器学习(3)——梯度下降

    例子 假设: 我们有一个代价函数,我们想要获得最小值. 首先定义两个参数值为0,然后改变两个参数值取减少代价函数的值 在梯度算法中,想象自己在红色山顶(最高处),每走一步想下降速度最快的地方移动,然后 ...

  7. 吴恩达机器学习笔记31-梯度检验(Gradient Checking)

    当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些 不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解. 为了避免这样的问题,我们采取一种叫做梯 ...

  8. 3. 机器学习中为什么需要梯度下降_梯度提升(Gradient Boosting)算法

    本文首发于我的微信公众号里,地址:梯度提升(Gradient Boosting)算法 本文禁止任何形式的转载. 我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI ...

  9. 机器学习算法系列(二十)-梯度提升决策树算法(Gradient Boosted Decision Trees / GBDT)

    阅读本文需要的背景知识点:自适应增强算法.泰勒公式.One-Hot编码.一丢丢编程知识 一.引言   前面一节我们学习了自适应增强算法(Adaptive Boosting / AdaBoost Alg ...

最新文章

  1. HDU 4267 A Simple Problem with Integers
  2. 电子设计竞赛电源题(4)-Buck与Boost电路
  3. linux shell date 1,linux shell date命令的坑(date 1 month ago 的诡异现象)
  4. MySQL使用裸设备
  5. 7.13. parallel - build and execute shell command lines from standard input in parallel
  6. YouTube-DNN优化原理推导
  7. linux 光纤网卡 软路由,请教关于配置双网卡软路由的问题
  8. 搜狗浏览器连接海康摄像头,无法显示画面
  9. 1.ESP32c3 移植lvgl核心组件教程
  10. 中国姓氏数据库 java_中国姓的数据库(sql版),下你妹CSDN,又不是你的资源要你妹积分!...
  11. pano2vr.exe下载
  12. 文件系统FAT32与NTFS
  13. K8S---多节点部署---基于单节点(5)
  14. Ubuntu系统清理工具
  15. 奇葩Bug频出,苹果AirPods Pro 2提醒用户换电池
  16. 量子计算机用什么传导信息,量子是如何传递信息的?
  17. 2022-2028中国有机蒙脱石市场现状研究分析与发展前景预测报告
  18. X 国王有一个地宫宝库-dfs
  19. 蒙特卡洛树搜索(MCTS)的实例代码
  20. 计算机文化基础自荐生考题,江苏省2005年普通高校“专转本”统一考试计算机基础试卷A卷...

热门文章

  1. html语言class,HTML DOM
  2. Eclipse IDE的安装与配置
  3. 为什么选择spark
  4. lambda表达式的语法精简
  5. php解析markdown前端渲染,Vuejs使用 vue-markdown 来渲染评论方法
  6. 计算机连接打印机用户数量修改,win7电脑中局域网限制每台打印机的使用成员数量的方法...
  7. 剑指offer面试题33. 二叉搜索树的后序遍历序列(二叉树)(递归)
  8. 选择列表中的列'sc.cno'无效,因为该列没有包含在聚合函数或者group by 字句中《SQL中的group by该怎么用?》
  9. 远程控制软件 mRemoteNG,管理多台虚拟机
  10. QTP自动化测试-点滴-步骤