深度学习-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.0
    diff = numerical_diff(A, x)
    print(diff)

    x = Variable(np.array(2))  # y = x^2 在x = 0 的斜率= 4.0
    diff = 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.0
    diff = numerical_diff(A, x)
    print(diff)

    x = Variable(np.array(2))  # y = x^2 在x = 0 的斜率= 0.0
    diff = 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.mfbz.cn/a/670748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulhub中Jenkins CLI 接口任意文件读取漏洞复现(CVE-2024-23897)

Jenkins是一个开源的自动化服务器。 Jenkins使用[args4j](https://github.com/kohsuke/args4j)来解析命令行输入,并支持通过HTTP、Websocket等协议远程传入命令行参数。args4j中用户可以通过字符来加载任意文件,这导致攻击者可以通过该特性来读取服务器…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了,在这个充满童真和喜悦的时刻,蒙自源米线品牌以一颗童心,为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始,蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店,品尝…

Minio启动脚本-Windows版

MinIO 是一种高性能、S3 兼容的对象存储。 它专为大规模 AI/ML、数据湖和数据库工作负载而构建,并且它是由软件定义的存储。 不需要购买任何专有硬件,就可以在云上和普通硬件上拥有分布式对象存储。 MinIO拥有开源 GNU AGPL v3 和商业企业许可证的双重许可。 ——摘自…

集合类源码浅析のArrayList

源码分析路线图: 初级部分:ArrayList->LinkedList->Vector->HashMap(红黑树数据结构,如何翻转,变色,手写红黑树)->ConcurrentHashMap 中级部分:Spring->Spring MVC->Spring Boot->M…

一文彻底讲透 PyTorch

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

linux系统的vscode快捷键大全

多行注释快捷键:ctrl shift A 单行注释:ctrl K ctrl C 取消单行注释:ctrl K ctrl U

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司(下称中车时代电气)是中国中车旗下股份制企业,其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲,走好两条钢轨,走出两条钢轨。中车时代电气秉承“双…

抽象一个通用的配置冲突解决方案

最近的开发项目中遇到了一个关于配置冲突的解决和产品设计,一直以来都没有处理好。最近抽空整理了一下思路和设计,并做了抽象,后续的类似使用,可以做到直接复用。 思路和代码见:github地址:https://github…

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版

ESP-01S 使用 arduino 烧录程序

一、设置 arduino 编辑器 1、文件-首选项-附加开发版管理网址中添加 http://arduino.esp8266.com/stable/package_esp8266com_index.json 2、工具-开发板管理 搜索 8266 并下载 ) 3、工具-开发板 在 8266 里面选择 Generic ESP8266 Module 4、工具-端口 记得选择对应的端口 …

Pytorch的学习

1.基本数据:Tensor Tensor,即张量,是PyTorch中的基本操作对象,可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看,Tensor与NumPy的ndarrays非常类似,相互之间也可以自由转换,只不过Te…

简单的基于小波分解和独立分量分析的脑电信号降噪(Python)

脑电信号是一种典型的非平稳随机信号且存在一定的非高斯性和非线性。传统的分析处理方法是将脑电信号近似看做线性、准平稳、高斯分布的随机信号,这使得分析结果往往不能令人满意,实用性较差。现代的小波变换方法和独立分量分析方法的提出为有效地分析脑…

LeetCode---字符串

344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 代码示例: //时间复杂度: O(n) //空间…

职场思考-在行业坚守中实现个人增值(13)

滚石不生苔,转行不聚财 在自己工作几年后,职业竞争力会由专业能力向行业经验进行转化 如果你不具备足够的行业积累,即使在某个专业上有足够的能力,你也难以得到待遇或职位的提升,陷入高不成低不就的局面 掌握完成岗位工…

使用pikachu Xss后台出现的问题

在进行xss-x漏洞实验的时候,一直出现上述错误,查找了很多,终于找到问题所在 pikachu使用的数据库为同一个数据库,千万别被pkxss误导,以为pikachu还有一个数据库为pkxss,所以在配置的时候写下如下图的

Python知识点5---字符串的使用

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的字符串在使用上和其他语言的差别不大,常规操作都…

Nginx实战:nginx支持带下划线的header

nginx对header 的名字字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉,后端服务就获取不到该请求头。 为了支持header带下划线的参数,可以在http内或者server内设置如下参数…

FreeRTOS基础(七):临界段代码保护及调度器挂起与恢复

上一篇博客我们详细介绍了FreeRTOS是怎么管理中断的,其实,从本质上来讲就是将就是利用的BASEPRI这个寄存器,来屏蔽优先级低于某一个阈值的中断,当设置为0的时候,就是打开所有中断,所有中断都可以响应。这样…

【VMware虚拟机中ubuntu系列】—— 在虚拟机中使用本机摄像头的详细教程与常见问题分析及解决

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、虚拟机调用本机摄像头(1) 启动VMware USB 服务(2) 连接本机摄像头(3) 测试摄像头的连接 二、安装usb驱动二、运行usb_cam.launch时出现select timeout的报错…

希捷硬盘怎么恢复数据? 5 个免费希捷数据恢复软件

希捷已迅速成为全球最大的数字存储提供商。许多人选择并使用希捷外置硬盘来存储他们的媒体文件、学校或工作文件以及其他重要数据。有时,希捷硬盘中的数据会丢失。 如果您丢失了希捷硬盘上的数据,请不要惊慌。在专业的希捷数据恢复软件的帮助下&#xf…