←上一篇 ↓↑ 下一篇→
1.12 梯度的数值逼近 回到目录 1.14 关于梯度检验实现的注记

梯度检验 (Gradient Checking)

梯度检验帮我们节省了很多时间,也多次帮我发现backprop实施过程中的bug,接下来,我们看看如何利用它来调试或检验backprop的实施是否正确。

假设你的网络中含有下列参数, w[1]w^{[1]}w[1] 和 b[1]b^{[1]}b[1] …… w[l]w^{[l]}w[l] 和 b[l]b^{[l]}b[l] ,为了执行梯度检验,首先要做的就是,把所有参数转换成一个巨大的向量数据,你要做的就是把矩阵 www 转换成一个向量,把所有 www 矩阵转换成向量之后,做连接运算,得到一个巨型向量 θ\thetaθ ,该向量表示为参数 θ\thetaθ ,代价函数 JJJ 是所有 www 和 bbb 的函数,现在你得到了一个 θ\thetaθ 的代价函数 JJJ (即 J(θ)J(\theta)J(θ) )。接着,你得到与 www 和 bbb 顺序相同的数据,你同样可以把 dw[1]dw^{[1]}dw[1] 和 db[1]db^{[1]}db[1] …… dw[l]dw^{[l]}dw[l] 和 db[l]db^{[l]}db[l] 转换成一个新的向量,用它们来初始化大向量 dθd\thetadθ,它与 θ\thetaθ 具有相同维度。

同样的,把 dw[1]dw^{[1]}dw[1] 转换成矩阵, db[1]db^{[1]}db[1] 已经是一个向量了,直到把 dw[l]dw^{[l]}dw[l] 转换成矩阵,这样所有的 dwdwdw 都已经是矩阵,注意 dw[1]dw^{[1]}dw[1] 与 w[1]w^{[1]}w[1] 具有相同维度, db[1]db^{[1]}db[1] 与 b[1]b^{[1]}b[1] 具有相同维度。经过相同的转换和连接运算操作之后,你可以把所有导数转换成一个大向量 dθd\thetadθ ,它与 θ\thetaθ 具有相同维度,现在的问题是 dθd\thetadθ 和代价函数 JJJ 的梯度或坡度有什么关系?

这就是实施梯度检验的过程,英语里通常简称为“grad check”,首先,我们要清楚 JJJ 是超参数 θ\thetaθ 的一个函数,你也可以将 JJJ 函数展开为 J(θ1,θ2,θ3,⋯)J(\theta_1,\theta_2,\theta_3,\cdots)J(θ1​,θ2​,θ3​,⋯) ,不论超级参数向量 θ\thetaθ 的维度是多少,为了实施梯度检验,你要做的就是循环执行,从而对每个 iii 也就是对每个 θ\thetaθ 组成元素计算 dθapprox[i]d\theta_{approx}[i]dθapprox​[i] 的值,我使用双边误差,也就是

dθapprox[i]=J(θ1,θ2,θ3,⋯,θi+ϵ,⋯)−J(θ1,θ2,θ3,⋯,θi−ϵ,⋯)2ϵd\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,\theta_3,\cdots,\theta_i+\epsilon,\cdots)-J(\theta_1,\theta_2,\theta_3,\cdots,\theta_i-\epsilon,\cdots)}{2\epsilon}dθapprox​[i]=2ϵJ(θ1​,θ2​,θ3​,⋯,θi​+ϵ,⋯)−J(θ1​,θ2​,θ3​,⋯,θi​−ϵ,⋯)​

只对 θi\theta_iθi​ 增加 ϵ\epsilonϵ ,其它项保持不变,因为我们使用的是双边误差,对另一边做同样的操作,只不过是减去 ϵ\epsilonϵ , θ\thetaθ 其它项全都保持不变。

从上节课中我们了解到这个值( dθapprox[i]d\theta_{approx}[i]dθapprox​[i] )应该逼近 dθ[i]=∂J∂θid\theta[i]=\frac{\partial J}{\partial \theta_i}dθ[i]=∂θi​∂J​ , dθ[i]d\theta[i]dθ[i] 是代价函数的偏导数,然后你需要对 iii 的每个值都执行这个运算,最后得到两个向量,得到 dθd\thetadθ 的逼近值 dθapproxd\theta_{approx}dθapprox​ ,它与 dθd\thetadθ 具有相同维度,它们两个与 θ\thetaθ 具有相同维度,你要做的就是验证这些向量是否彼此接近。

具体来说,如何定义两个向量是否真的接近彼此?我一般做下列运算,计算这两个向量的距离, dθappprox[i]−dθ[i]d\theta_{appprox}[i]-d\theta[i]dθappprox​[i]−dθ[i] 的欧几里得范数,注意这里( ∣∣dθapprox−dθ∣∣2||d\theta_{approx}-d\theta||_2∣∣dθapprox​−dθ∣∣2​ )没有平方,它是误差平方之和,然后求平方根,得到欧式距离,然后用向量长度归一化,使用向量长度的欧几里得范数。分母只是用于预防这些向量太小或太大,分母使得这个方程式变成比率,我们实际执行这个方程式, ϵ\epsilonϵ 可能为 10−710^{-7}10−7 ,使用这个取值范围内的 ϵ\epsilonϵ ,如果你发现计算方程式得到的值为 10−710^{-7}10−7 或更小,这就很好,这就意味着导数逼近很有可能是正确的,它的值非常小。

如果它的值在 10−510^{-5}10−5 范围内,我就要小心了,也许这个值没问题,但我会再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug

如果左边这个方程式结果是 10−310^{-3}10−3 ,我就会担心是否存在bug,计算结果应该比小 10−310^{-3}10−3 很多,如果比 10−310^{-3}10−3 大很多,我就会很担心,担心是否存在bug。这时应该仔细检查所有 θ\thetaθ 项,看是否有一个具体的 iii 值,使得 dθappprox[i]d\theta_{appprox}[i]dθappprox​[i] 与 dθ[i]d\theta[i]dθ[i] 大不相同,并用它来追踪一些求导计算是否正确,经过一些调试,最终结果会是这种非常小的值(10−710^{-7}10−7),那么,你的实施可能是正确的。

在实施神经网络时,我经常需要执行forepropbackprop,然后我可能发现这个梯度检验有一个相对较大的值,我会怀疑存在bug,然后开始调试,调试,调试,调试一段时间后,我得到一个很小的梯度检验值,现在我可以很自信的说,神经网络实施是正确的。

现在你已经了解了梯度检验的工作原理,它帮助我在神经网络实施中发现了很多bug,希望它对你也有所帮助。

课程PPT




←上一篇 ↓↑ 下一篇→
1.12 梯度的数值逼近 回到目录 1.14 关于梯度检验实现的注记

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

  1. 吴恩达deeplearning.ai系列课程笔记+编程作业(6)第二课 改善深层神经网络-第二周:优化算法 (Optimization algorithms)

    第二门课 改善深层神经网络:超参数调试.正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and ...

  2. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  3. 1.14 梯度检验应用的注意事项-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.13 梯度检验 回到目录 1.15 总结 梯度检验应用的注意事项 (Gradient Checking Implementation Notes) 这节课,分享一些关于如 ...

  4. 1.12 梯度的数值逼近-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.11 神经网络的权重初始化 回到目录 1.13 梯度检验 梯度的数值逼近 (Numerical Approximation of Gradients) 在实施backpr ...

  5. 0.0 目录-深度学习第二课《改善神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  6. 1.8 其他正则化方法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 理解 Dropout 回到目录 1.9 归一化输入 其他正则化方法 (Other Regularization Methods) 除了 L2L2L2 正则化和随机失活 ...

  7. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

  8. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  9. 0.0 目录-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

最新文章

  1. html em px的不同,CSS:区别 px、em、rem
  2. Vue_(组件通讯)非父子关系组件通信
  3. 用JAVA制作微型操作系统4月23日情况
  4. flask jinja2 mysql_flask/jinja2 SSTI注入学习
  5. 初学Android,字符串,数字,尺寸,数组资源(十二)
  6. python 遍历对象_python js对象的遍历
  7. mysql配置文件结构_MariaDB/MySQL配置文件my.cnf解读
  8. 【HDU - 2516 】取石子游戏 (Fibonacci博弈)
  9. NYOJ 1023 还是回文(DP,花最少费用形成回文串)
  10. 19个很有用的 JavaScript 库
  11. TextView settextcolor 无效解决方案
  12. 国内服务器 显示国外ip,国外ip访问国内服务器地址
  13. 盘点开发者喜欢用的浏览器,最后这一款值得拥有
  14. 产品选型“神器” TIA Selection Tools 之选择 S7-1500T 全程详解
  15. GHOSTXPSP3电脑爱好者V9.9美化修正版
  16. 免费好用的 Apple 工具(Windows 适用)
  17. CentOS 8 安装tc流量控制工具
  18. scp传输 ssh: connect to host port 22: Connection refused终极解决 vps
  19. 使用 gfortran 编译 CALPUFF
  20. 激活windows10系统提示错误代码0x800705b4怎么解决

热门文章

  1. 网站使用QQ登录问题小结
  2. JavaScript巧用对象的引用解决三级联动
  3. 性能测试-Jmeter
  4. dev机上数据库中批量生成table
  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 防止脱库、防止篡改数据...
  6. Ajax.net实现loading登陆的效果
  7. 附加到IIS进程调试页面
  8. VS 断点无法调试学习总结
  9. 图解用Wireshark进行Http协议分析
  10. 说说报表工具的无编码定制能力