深度学习-04-数值的微分


深度学习-04-数值的微分

本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。

当前笔记内容主要为:步骤4 数值的微分 章节的相关理解。

书籍总共分为5个阶段,每个阶段分很多步骤,最终是一步一步实现一个深度学习框架。例如前两个阶段为:

第 1 阶段共包括 10 个步骤 。 在这个阶段,将创建自动微分的机制
第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数


1.什么是导数


经过上面几节的学习及开发,我们已经有了变量 Variable,函数Function,复合函数的定义,接下来我们学习导数及微分。
先复习高数以及高中的导数,然后实现一种数值微分的方法来求导,最后我们实现一种替代数值微分的更高效算法-反向传播算法。

什么是导数
导数是微积分中的一个基本概念,它描述了函数在某一点的变化率。更准确地说,导数是函数在该点附近的变化量与自变量变化量之比的极限。

导函数定义

导函数是函数的导数在自变量取值范围内所形成的函数。换句话说,导函数就是将导数的概念推广到整个定义域,形成一个新的函数。
更精确定义:设函数 
𝑓(𝑥)在定义域D内可导,则其导函数 𝑓′(𝑥)是一个定义在 𝐷上的函数,其对应于 𝑥的函数值为 𝑓(𝑥)在 𝑥 处的导数。    
    

2.数值微分的实现


由于计算机不能处理极限值,所以我们在计算极限时都是采用的逼近的方法,例如设定 h = 0.0001(1e-4) 这种非常小的数值来计算导数,可想而知这种方法是一种近似的方法。这种方法包括误差。解决方法之一就是使用中心差分近似。中心差分近似不是使用f(x)与 f(x+h) 而是使用f(x-h) 与f(x+h) 的差。
 

前向差分近似:x,x+h 两点的斜率,f(x) ,f(x+h)
中心差分近似: x-h,x+h 两点的斜率,f(x-h), f(x+h)


相关定理已经证明结论有(使用泰勒展开式进行证明),中心差分近似相比前向差分近似实际产生的误差更小。

代码实现如下:

import numpy as np
from step01 import *
from step02_1 import *def numerical_diff(f,x,eps=1e-4):x0 = Variable(x.data -eps)x1 = Variable(x.data +eps)y0= f(x0)y1 = f(x1)return (y1.data -y0.data)/(2*eps)

验证y=x^2 在x =0, x=2 处的斜率


if __name__ == '__main__':A = Square()x = Variable(np.array(0))  # y = x^2 在x = 0 的斜率= 0.0diff = numerical_diff(A, x)print(diff)x = Variable(np.array(2))  # y = x^2 在x = 0 的斜率= 4.0diff = numerical_diff(A, x)print(diff)

输出结果

C:\Python\Python39-32\python.exe D:/pyworkspace/dezero-01/step04.py
0.0
4.000000000004

3.复合函数的导数

我们考虑复合函数求导,我们看下函数y= (exp(x^2))^2的导数怎么计算dy/dx ,代码

def f(x):A = Square()B = Exp()C = Square()return C(B(A(x)))# 使用 
# 复合函数求导
x = Variable(np.array(0.5))
dy = numerical_diff(f, x)
print(dy)

执行结果:

3.2974426293330694


上面的代码,由于在python的特点,函数Function 也是对象,所以可以传递给其函数。上述结果说明,在x=0.5 处,x变化一点点,就会导致 y 变化3.297倍,这就是斜率,变化率。

现在我们已经成功实现了"自动"求导 。 只要用代码来定义要完成的计 算(例子函数 f) ,程序就会自动求山导数。使用此方法,要函数可微,无论复杂的函数都可以计算出来。但是数值微分计算存在一定的问题。


4.数值微分存在的问题

首先,数值微分结果存在误差(主要为精度丢失)。多数case 下,误差很小,有些case 误差很大。中心差分近似计算方法计算的是同数量级直之间的差,但是由于精度丢失,会出现计算结果出现位数减少的情况。


举例:
    1.234 - 1.233 = 0.001 有效位数为1位
本来可能是 1.234 - 1.233... = 0.001434... 之类的结果。误差也会发生在数值微分差值计算中。

其次,数值微分一个严重的问题是,计算成本高。在求多个变量是,程序需要计算每个变量的导数。有些神经网络包括几百万个参数以上变量,通过数值微分计算不现实。
解决上面问题,我们需要 反向传播。

数值微分可以轻松实现,并能计算出大体正确的数值。 而反向传播是一 种复杂的算法,实现时容易出现 bug。

可以使用数值微分法计算处的结果检验反向传播的实现是否正确。这种方法叫做 梯度检验(gradient checking)

下一节,我们介绍反向传播算法相关理论及实现。


5.项目代码
'''
step03.py
函数的连续调用'''import numpy as np
from step01 import *
from step02_1 import *
from step03 import *def numerical_diff(f,x,eps=1e-4):x0 = Variable(x.data -eps)x1 = Variable(x.data +eps)y0= f(x0)y1 = f(x1)return (y1.data -y0.data)/(2*eps)def f(x):A = Square()B = Exp()C = Square()return C(B(A(x)))if __name__ == '__main__':A = Square()x = Variable(np.array(0))  # y = x^2 在x = 0 的斜率= 0.0diff = numerical_diff(A, x)print(diff)x = Variable(np.array(2))  # y = x^2 在x = 0 的斜率= 0.0diff = numerical_diff(A, x)print(diff)# 复合函数求导x = Variable(np.array(0.5))dy = numerical_diff(f, x)print(dy)

输出结果:

C:\Python39-32\python.exe D:/pyworkspace/dezero-01/step04.py
0.0
4.000000000004
3.2974426293330694

我们可以看到 y=x^2 平方函数在x=0 处的导数是0,通过高中数学知识,我们知道此结果是正确的。

6.总结

本节介绍数值微分概念及计算,以及分析了数值微分的缺点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

所有人都可以做的副业兼职,短剧推广,1天挣几百,附详细方法!

自从上次向大家介绍了短剧掘金项目以来,便陆续收到了众多朋友的询问:现在是否还能加入短剧掘金的大军?答案是肯定的。目前,无论是各大视频平台还是其他渠道,短剧掘金项目都呈现出蓬勃发展的态势。而且,相关…

SSM高校社团管理系统-计算机毕业设计源码86128

目 录 摘要 1 绪论 1.1研究背景与意义 1.2开发现状 1.3研究方法 1.4 ssm框架介绍 1.5论文结构与章节安排 2 高校社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分…

QT实现动态翻译切换

1、实现QT动态中英文切换效果 效果如下: 2、原理 因为软件本身就是中文版,所以只需准备一个英文版的翻译即可,,那就是将所有需要翻译的地方用tr包裹,然后首先执行lupdate更新一下,接着用qt的翻译软件 Qt Linguist打开ts文件进行翻译,然后保存,最后使用 lrelease发布一…

位运算专题

常见位运算总结: 1. 基础位运算 << 左移 >> 右移 ~ 按位取反 & 按位与 口诀: 有0则0 | 按位或 口诀: 有1则1 ^ 异或 口诀:相同为0,相异为1 / 无进位相加 2. 位运算的优先级 做题时, 能加括号就加括号, 无需管优先级如何 3. 给一个二进制数n, 确定…

为什么总是卡在验证真人这里无法通过验证?

最近总是在浏览某些网站的时候卡在这个“确认你是真人”的验证页面&#xff0c;无法通过真人验证&#xff0c;这是怎么回事儿&#xff1f;如何解决呢&#xff1f; 首先&#xff0c;出现这个“确认您是真人”的验证一般都是这个网站使用了 CloudFlare 的安全防护 WAF 规则才会出…

Ray Tracing in one Weekend But on CUDA

Ray Tracing in one Weekend But on CUDA 环境说明项目代码项目内容思路实现方法效果 环境说明 代码运行在Visual Studio 2019环境&#xff0c;显卡为NVIDIA GeForce GTX 1650&#xff0c;CUDA版本为11.6&#xff0c;cuDNN版本为8.4.0。具体配置方式见CUDA C/C 从入门到入土 第…

洛谷P2370yyy2015c01 的 U 盘

传送门——P2370 yyy2015c01 的 U 盘 题解&#xff1a;题目意思很好理解&#xff0c;就是说&#xff0c;当能够达到预期的U盘的最小接口&#xff08;接口越大&#xff0c;能传递的文件越大&#xff09;&#xff0c;然后我们就需要先看题目了&#xff0c;有n个文件&#xff0c;每…

【数据结构(邓俊辉)学习笔记】图02——搜索

文章目录 0. 概述1. 广度优先搜索1.1 策略1.2 实现1.3 可能情况1.4 实例1.5 多联通1.6 复杂度1.7 最短路径 2. 深度优先搜索2.1 算法2.2 框架2.3 细节2.4 无向边2.5 有向边2.6 多可达域2.7 嵌套引理 3 遍历算法的应用 0. 概述 此前已经介绍过图的基本概念以及它在计算机中的表…

vector实现后半部分

一.迭代器失效 1.定义 指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处 erase的迭代器失效 2.原因&#xff1a; 1.有的编译器实现erase会缩容拷贝 2.删除最后一个后&#xff0c;其指向无效元素 VS中不允许再次使用erase完的迭代器&#xff0c;为了让编写的代码移植…

Spring系列-SpringMvc父子容器启动原理解析

1、Spring整合SpringMVC 特性&#xff1a; 说到Spring整合SpringMVC唯一的体现就是父子容器&#xff1a; 通常我们会设置父容器&#xff08;Spring&#xff09;管理Service、Dao层的Bean, 子容器(SpringMVC)管理Controller的Bean .子容器可以访问父容器的Bean, 父容器无法访…

LLM——深入探索 ChatGPT在代码解释方面的应用研究

1.概述 OpenAI在自然语言处理&#xff08;NLP&#xff09;的征途上取得了令人瞩目的进展&#xff0c;这一切得益于大型语言模型&#xff08;LLM&#xff09;的诞生与成长。这些先进的模型不仅是技术创新的典范&#xff0c;更是驱动着如GitHub Copilot编程助手和Bing搜索引擎等广…

搭建大型分布式服务(三十九)SpringBoot 整合多个kafka数据源-支持Aware模式

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

计算一个3x3矩阵对角线和其它两条线的元素之和

计算一个3x3矩阵对角线和其它两条线的元素之和 #include <stdio.h> int main () { int d0,b0,s,i,j; int a[3][3]{1,2,3,4,5,6,7,8,9}; for(i0,j2;i<3;i,j--) dda[i][i]a[i][j]; for(i0,j0;i<3;) {bba[i][j]a[i][j2]; ii2;} sdb; printf("d%d\nb%d\ns%d\n&qu…

5.25.12 数字组织病理学的自我监督对比学习

无监督学习可以弥补标记数据集的稀缺性。 无监督学习的一个有前途的子类是自监督学习&#xff0c;其目的是使用原始输入作为学习信号来学习显著特征。在这项工作中&#xff0c;我们解决了在没有任何监督的情况下学习领域特定特征的问题&#xff0c;以提高数字组织病理学界感兴…

R语言探索与分析-美国房价及其影响因素分析

一、选题背景 以多元线性回归统计模型为基础&#xff0c;用R语言对美国部分地区房价数据进行建模预测&#xff0c;进而探究提高多元回 归线性模型精度的方法。先对数据进行探索性预处理&#xff0c;随后设置虚拟变量并建模得出预测结果&#xff0c;再使用方差膨胀因子对 多重共…

使用Landsat的NDVI和NDWI阈值法土地分类

目录 分类效果源代码分类效果 创建一个包含多个层的影像合成:水体(NDWI > 0.5),植被(NDVI > 0.2),阴影区域的裸地(bare2但不包括bare1),和其他裸地(bare1)。然后,使用mosaic()方法合并这些层,并用clip(hh)方法裁剪到研究区域的范围。 源代码 var hh = ee.…

基于Java的零食管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的进步&#xff0c;以及网络的普及&#xff0c;都为人们的生活提供了极大的方便。因此&#xff0c;在管理”三姆”宿舍在线零食商店时&#xff0c;与现代的网络联系起来是非常必要的&#xff0c;本次设计的系统在研发过程中应用到了Java技术&#xff0c;这在一定…

第一人称射击游戏:反恐精英(CS1.6) 支持win版和mac版下载

枪战老玩家还记得这款史诗巨作吗&#xff1f;Macz为广大游戏玩家倾情推出反恐精英(CS1.6) for Mac&#xff0c;CS1.6官方下载是由著名游戏《半条命》的其中一个游戏模组(MOD)衍生而成的游戏。逼真的画面&#xff0c;震撼的音效&#xff0c;3D的视角&#xff0c;多样的操作融合而…

LeetCode - 贪心(Greedy)算法集合(Python)[分配问题|区间问题]

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/139242199 贪心算法&#xff0c;是在每一步选择中&#xff0c;都采取当前状态下&#xff0c;最好或最优&#xff08;即最有利&#xff09;的选择&…

光猫、路由器的路由模式、桥接模式、拨号上网

下面提到的路由器都是家用路由器 一、联网条件 1.每台电脑、路由器、光猫想要上网&#xff0c;都必须有ip地址。 2.电脑获取ip 可以设置静态ip 或 向DHCP服务器(集成在路由器上) 请求ip 电话线上网时期&#xff0c;猫只负责模拟信号和数字信号的转换&#xff0c;电脑需要使…