吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14

本文主要是介绍吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)
    • 第一周:深度学习的 实践层面 (Practical aspects of Deep Learning)
      • 1.13 梯度检验(Gradient checking)

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

第一周:深度学习的 实践层面 (Practical aspects of Deep Learning)

1.13 梯度检验(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],为了执行梯度检验,首先要做的就是,把所有参数转换成一个巨大的向量数据,你要做的就是把矩阵𝑊转换成一个向量,把所有𝑊矩阵转换成向量之后,做连接运算,得到一个巨型向量𝜃,该向量表示为参数𝜃,代价函数𝐽是所有𝑊和𝑏的函数,现在你得到了一个𝜃的代价函数𝐽(即𝐽(𝜃))。接着,你得到与𝑊和𝑏顺序相同的数据,你同样可以把 d W [ 1 ] dW^{[1]} dW[1] d b [ 1 ] db^{[1]} db[1]…… d W [ l ] dW^{[l]} dW[l] d b [ l ] db^{[l]} db[l]转换成一个新的向量,用它们来初始化大向量𝑑𝜃,它与𝜃具有相同维度。

同样的,把 d W [ 1 ] dW^{[1]} dW[1]转换成矩阵, d b [ 1 ] db^{[1]} db[1]已经是一个向量了,直到把 d W [ l ] dW^{[l]} dW[l]转换成矩阵,这样所有的𝑑𝑊都已经是矩阵,注意 d W [ 1 ] dW^{[1]} dW[1] W [ 1 ] W^{[1]} W[1]具有相同维度, d b [ 1 ] db^{[1]} db[1] b [ 1 ] b^{[1]} b[1]具有相同维度。经过相同的转换和连接运算操作之后,你可以把所有导数转换成一个大向量𝑑𝜃,它与𝜃具有相同维度,现在的问题是𝑑𝜃和代价函数𝐽的梯度或坡度有什么关系?
在这里插入图片描述
这就是实施梯度检验的过程,英语里通常简称为“grad check”,首先,我们要清楚𝐽是超参数𝜃的一个函数,你也可以将𝐽函数展开为𝐽(𝜃1, 𝜃2, 𝜃3, … … ),不论超级参数向量𝜃的维度是多少,为了实施梯度检验,你要做的就是循环执行,从而对每个𝑖也就是对每个𝜃组成元素计算𝑑𝜃approx[𝑖]的值,我使用双边误差,也就是
d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , . . . . . . θ i + ε , . . . ) − J ( θ 1 , θ 2 , . . . . . . θ i − ε , . . . ) 2 ε dθ_{approx}[i] =\frac{J(θ_1,θ_2,......θ_i+ε,...) - J(θ_1,θ_2,......θ_i-ε,...)}{2ε} dθapprox[i]=2εJ(θ1,θ2,......θi+ε,...)J(θ1,θ2,......θiε,...)

只对 θ i θ_i θi增加𝜀,其它项保持不变,因为我们使用的是双边误差,对另一边做同样的操作,只不过是减去𝜀,𝜃其它项全都保持不变。
在这里插入图片描述
从上节课中我们了解到这个值( d θ a p p r o x [ i ] dθ_{approx}[i] dθapprox[i])应该逼近𝑑𝜃[𝑖]=𝜕𝐽/𝜕𝜃𝑖,𝑑𝜃[𝑖]是代价函数的偏导数,然后你需要对𝑖的每个值都执行这个运算,最后得到两个向量,得到𝑑𝜃的逼近值 d θ a p p r o x dθ_{approx} dθapprox,它与𝑑𝜃具有相同维度,它们两个与𝜃具有相同维度,你要做的就是验证这些向量是否彼此接近。

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

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

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

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

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

这篇关于吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968081

相关文章

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析