神经网络的学习(数值微分)

数值微分

梯度法使用梯度的信息决定前进的方向。本节将介绍梯度是什么、有什
么性质等内容。在这之前,我们先来介绍一下导数。

导数

假如你是全程马拉松选手,在开始的10 分钟内跑了2 千米。如果要计算
此时的奔跑速度,则为2/10 = 0.2[千米/ 分]。也就是说,你以1 分钟前进0.2
千米的速度(变化)奔跑。

在这个马拉松的例子中,我们计算了“奔跑的距离”相对于“时间”发生
了多大变化。不过,这个10 分钟跑2 千米的计算方式,严格地讲,计算的是
10 分钟内的平均速度。而导数表示的是某个瞬间的变化量。因此,将10 分
钟这一时间段尽可能地缩短,比如计算前1 分钟奔跑的距离、前1 秒钟奔跑
的距离、前0.1 秒钟奔跑的距离……这样就可以获得某个瞬间的变化量(某个
瞬时速度)。

综上,导数就是表示某个瞬间的变化量。它可以定义成下面的式子。
df(x)dx=lim⁡h→0f(x+h)−f(x)h \frac{df(x)}{dx} = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}dxdf(x)=h0limhf(x+h)f(x)
式(4.4)表示的是函数的导数。左边的符号表示df(x)dx\frac{df(x)}{dx}dxdf(x)关于x 的导
数,即f(x)f(x)fx相对于x的变化程度。式(4.4)表示的导数的含义是,x的“微小
变化”将导致函数f(x)f(x)fx的值在多大程度上发生变化。其中,表示微小变化的
h无限趋近0,表示为$\lim_{h \to 0} $。

接下来,我们参考式(4.4),来实现求函数的导数的程序。如果直接实
现式(4.4)的话,向h 中赋入一个微小值,就可以计算出来了。比如,下面
的实现如何?

# 不好的实现示例 def numerical_diff(f, x): h = 10e-50 return (f(x+h) - f(x)) / h

函数numerical_diff(f, x) 的名称来源于数值微分A 的英文numerical
differentiation。这个函数有两个参数,即“函数f”和“传给函数f的参数x”。
乍一看这个实现没有问题,但是实际上这段代码有两处需要改进的地方。

在上面的实现中,因为想把尽可能小的值赋给h(可以话,想让h无限接
近0),所以h使用了10e−5010e-5010e50(有50 个连续的0 的“0.00 . . . 1”)这个微小值。但
是,这样反而产生了舍入误差(rounding error)。所谓舍入误差,是指因省
略小数的精细部分的数值(比如,小数点第8 位以后的数值)而造成最终的计
算结果上的误差。比如,在Python中,舍入误差可如下表示。

>>>np.float32(1e-50)0.0

如上所示,如果用float32类型(32 位的浮点数)来表示1e-50,就会变成
0.0,无法正确表示出来。也就是说,使用过小的值会造成计算机出现计算
上的问题。这是第一个需要改进的地方,即将微小值h改为10−410^{−4}104。使用10−410^{−4}104
就可以得到正确的结果。

第二个需要改进的地方与函数f的差分有关。虽然上述实现中计算了函
数f在x+hx+hx+h和x之间的差分,但是必须注意到,这个计算从一开始就有误差。
如图4-5 所示,“真的导数”对应函数在x处的斜率(称为切线),但上述实现
中计算的导数对应的是(x+h)(x + h)(x+h)和x之间的斜率。因此,真的导数(真的切线)
和上述实现中得到的导数的值在严格意义上并不一致。这个差异的出现是因
为h不可能无限接近0。

如图4-5 所示,数值微分含有误差。为了减小这个误差,我们可以计算
函数f 在(x+h)(x + h)(x+h)(x−h)(x − h)(xh)之间的差分。因为这种计算方法以x 为中心,计
算它左右两边的差分,所以也称为中心差分(而(x+h)(x + h)(x+h)和x之间的差分称为
前向差分)。下面,我们基于上述两个要改进的点来实现数值微分(数值梯度)。

defnumerical_diff(f,x):h=1e-4# 0.0001return(f(x+h)-f(x-h))/(2*h)

如上所示,利用微小的差分求导数的过程称为数值微分(numerical
differentiation)。而基于数学式的推导求导数的过程,则用“解析
性”(analytic)一词,称为“解析性求解”或者“解析性求导”。比如,
y=x2y = x^{2}y=x2的导数,可以通过dydx\frac{dy}{dx}dxdy解析性地求解出来。因此,当x = 2时,
y的导数为4。解析性求导得到的导数是不含误差的“真的导数”。

数值微分的例子

现在我们试着用上述的数值微分对简单函数进行求导。先来看一个由下
式表示的2 次函数。
y=0.01x2+0.1x y=0.01x^2+0.1xy=0.01x2+0.1x

用Python来实现式(4.5),如下所示。

deffunction_1(x):return0.01*x**2+0.1*x

接下来,我们来绘制这个函数的图像。画图所用的代码如下,生成的图
像如图4-6 所示。

importnumpyasnpimportmatplotlib.pylabasplt x=np.arange(0.0,20.0,0.1)# 以0.1为单位,从0到20的数组xy=function_1(x)plt.xlabel("x")plt.ylabel("f(x)")plt.plot(x,y)plt.show()

>>>numerical_diff(function_1,5)0.1999999999990898>>>numerical_diff(function_1,10)0.2999999999986347

这里计算的导数是f(x) 相对于x 的变化量,对应函数的斜率。另外,
$
y=0.01x^2+0.1x
$ 的解析解是df(x)dx=0.02x+0.1\frac{df(x)}{dx}=0.02x+0.1dxdf(x)=0.02x+0.1。因此,在x = 5 和
x = 10 处,“真的导数”分别为0.2 和0.3。和上面的结果相比,我们发现虽然
严格意义上它们并不一致,但误差非常小。实际上,误差小到基本上可以认
为它们是相等的。

现在,我们用上面的数值微分的值作为斜率,画一条直线。结果如图4-7
所示,可以确认这些直线确实对应函数的切线(源代码在ch04/gradient_1d.
py中)。

偏导数

接下来,我们看一下式(4.6) 表示的函数。虽然它只是一个计算参数的
平方和的简单函数,但是请注意和上例不同的是,这里有两个变量。
f(x0,x1)=x02+x12 f ( x _ { 0 } , x _ { 1 } ) = x _ { 0 } ^ { 2 } + x _ { 1 } ^ { 2 }f(x0,x1)=x02+x12

这个式子可以用Python来实现,如下所示。

deffunction_2(x):returnx[0]**2+x[1]**2# 或者return np.sum(x**2)

这里,我们假定向参数输入了一个NumPy数组。函数的内部实现比较
简单,先计算NumPy数组中各个元素的平方,再求它们的和(np.sum(x**2)
也可以实现同样的处理)。我们来画一下这个函数的图像。结果如图4-8 所示,
是一个三维图像。

现在我们来求式(4.6)的导数。这里需要注意的是,式(4.6)有两个变量,
所以有必要区分对哪个变量求导数,即对x0 和x1 两个变量中的哪一个求导数。
另外,我们把这里讨论的有多个变量的函数的导数称为偏导数。用数学式表
示的话,可以写成$
\frac{\partial f}{\partial x_0}, \quad \frac{\partial f}{\partial x_1}
$。
怎么求偏导数呢?我们先试着解一下下面两个关于偏导数的问题。

问题1:求x0 = 3, x1 = 4 时,关于x0 的偏导数∂f∂x0\frac{\partial f}{\partial x_0}x0f

>>>deffunction_tmp1(x0):...returnx0*x0+4.0**2.0...>>>numerical_diff(function_tmp1,3.0)6.00000000000378

问题2:求x0 = 3, x1 = 4 时,关于x1 的偏导数∂f∂x1\frac{\partial f}{\partial x_1}x1f

>>>deffunction_tmp2(x1):...return3.0**2.0+x1*x1...>>>numerical_diff(function_tmp2,4.0)7.999999999999119

在这些问题中,我们定义了一个只有一个变量的函数,并对这个函数进
行了求导。例如,问题1 中,我们定义了一个固定x1 = 4 的新函数,然后对
只有变量x0 的函数应用了求数值微分的函数。从上面的计算结果可知,问题
1 的答案是6.00000000000378,问题2 的答案是7.999999999999119,和解析
解的导数基本一致。

像这样,偏导数和单变量的导数一样,都是求某个地方的斜率。不过,
偏导数需要将多个变量中的某一个变量定为目标变量,并将其他变量固定为
某个值。在上例的代码中,为了将目标变量以外的变量固定到某些特定的值
上,我们定义了新函数。然后,对新定义的函数应用了之前的求数值微分的
函数,得到偏导数。

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

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

相关文章

深度学习毕设选题推荐:基于python-CNN卷积神经网络对大白菜是否腐烂识别基于python 对大白菜是否腐烂识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

基于大数据Hadoop+机器学习预测算法+Echarts的用户信用评估系统的设计与实现(精品源码+精品论文+上万数据集+答辩PPT)

博主介绍:CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…

计算机毕设java高校二手商城系统 基于Java技术的高校二手交易平台设计与实现 Java环境下高校二手交易系统开发与应用

计算机毕设java高校二手商城系统78mg59 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,高校二手交易市场逐渐成为学生群体中不可或缺的一部…

Kanass一文快速上手,如何快速导入Jira、Mantis数据

本文将介绍如何快速导入Atlassian Jira与Mantis数据,以实现快速迁移切换。 1、Kanass的安装配置 1.1 安装 下载 点此下载 安装 以centos为例,将Linux下的centos安装包下载,并使用rpm命令安装kanass。 sudo rpm -ivh tiklab-kanass-1.2.…

计算机毕设Java基于MVC的社区党建信息系统的设计与实现 基于Java技术的社区党建信息管理平台的设计与开发 Java环境下社区党建信息系统的构建与实现

计算机毕设Java基于MVC的社区党建信息系统的设计与实现rh9169 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,计算机技术已经渗透到社会的各…

AI人脸隐私卫士应用场景:从个人到企业的解决方案

AI人脸隐私卫士应用场景:从个人到企业的解决方案 1. 引言:AI驱动的隐私保护新范式 随着智能手机和社交平台的普及,图像数据已成为日常沟通的重要载体。然而,在分享照片时,无意中暴露他人面部信息的风险也随之增加——…

1.1 揭秘AI大模型:普通人如何抓住这波技术红利?

1.1 揭秘AI大模型:普通人如何抓住这波技术红利? 引言:我们正处在AI变革的时代 如果你经常刷社交媒体,一定看到过各种关于AI的新闻:某某公司发布了新的大模型,某位网红用AI生成了惊人的作品,或者某个工作岗位因为AI而面临挑战。那么,什么是大模型?它真的会改变我们的…

(183页PPT)某省市场营销MPR+LTC流程规划方案(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/AI_data_cloud/89525616 资料解读:某省市场营销 MPRLTC 流程规划方案 P183 详细资料请看本解读文章的最后内容 本方案聚焦某省市场营销场景&am…

Kanass一文快速上手,如何进行缺陷管理

上一篇文章主要介绍了如何进行Kanass任务管理,本文将介绍在事项模块中如何创建、管理、跟踪缺陷。1、添加缺陷进入kanass项目,页面会自动定位到事项页面。点击添加事项->缺陷,填写缺陷标题与描述,选择缺陷类型等信息属性说明属…

Service Mesh虚拟线程深度实践(虚拟线程性能飞跃指南)

第一章:Service Mesh虚拟线程深度实践(虚拟线程性能飞跃指南)在现代微服务架构中,Service Mesh 通过解耦通信逻辑显著提升了系统的可观测性与可靠性。随着高并发场景的普及,传统线程模型因资源消耗大、上下文切换频繁等…

测试语音助手可访问性:交互设计的核心挑战与系统性解决方案

——面向软件测试工程师的深度指南 一、语音交互可访问性测试的行业意义 随着全球数字无障碍立法加速(如欧盟EAA法案、美国Section 508),语音助手可访问性已成为合规刚需。测试从业者需超越基础功能验证,深入交互设计层&#xff…

自监督学习医疗数据标注效率翻倍

📝 博客主页:Jax的CSDN主页 自监督学习:医疗数据标注效率翻倍的破局之道目录自监督学习:医疗数据标注效率翻倍的破局之道 目录 引言:医疗AI的“数据瓶颈” 第一部分:医疗数据标注的痛点与自监督学习的机遇 …

2026 网络安全转行全攻略:行业前景、岗位工作内容与薪资水平大揭秘

如果你计划在2026年转行到网络安全领域,以下是一些建议,可以帮助你顺利过渡并打下坚实的基础 1、薪资情况 初级职位(0-3年经验) 薪资范围:大约 8k-15k/月(根据地区、公司规模和工作内容有所不同&#xff…

收藏!2026年程序员必备:AI大模型实战课,突破薪资瓶颈提升核心竞争力

文章指出2026年AI大模型已成为程序员职场基本要求,掌握该技术薪资比传统开发高40%,优秀者年薪可达50W。《AI大模型实战课》采用技术原理实战应用模式,适合有编程基础的IT从业者,帮助快速掌握LangChain等AI工程框架,提升…

‌政府网站可访问性测试专业实践指南:面向软件测试从业者的实战框架

一、核心标准依据:中国GB/T 37668-2019的强制性要求‌ 中国政府网站的可访问性测试必须以《GB/T 37668-2019 信息技术 互联网内容无障碍可访问性技术要求与测试方法》为唯一法定技术基准。该标准等同采用WCAG 2.0,并融合本土化适配,明确要求…

AI人脸隐私卫士如何避免重复打码?缓存机制设计解析

AI人脸隐私卫士如何避免重复打码?缓存机制设计解析 1. 背景与问题提出 在数字影像日益普及的今天,个人隐私保护成为不可忽视的技术命题。尤其是在社交媒体、公共展示或数据共享场景中,人脸信息极易被滥用。为此,AI 人脸隐私卫士…

‌工具对比:新兴框架评测

Playwright 已成为企业级自动化测试的首选,Cypress 适合前端深度协作团队,Selenium 仍存于legacy系统,PyTest 为单元与API测试基石‌在2025年的软件测试领域,自动化框架的选型已从“能否跑通”转向“能否稳定、高效、智能地支撑持…

基于大数据Hadoop+Spark的电力分析可视化平台的设计与实现(精品源码+精品论文+上万数据集+答辩PPT)

博主介绍:CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…

输入产品的定价与销量,分析价格弹性,生成创新的价格促销策略。

这是一个极具商业价值的项目构想。下面我将为你提供一个完整的、基于Python的“价格弹性分析与创新促销策略生成器”程序,并包含你要求的所有部分。1. 项目概述项目名称: PriceGenius - 价格弹性分析与创新促销策略生成器项目目标: 本程序旨在…

‌测试游戏可访问性:控制器适配策略

控制器适配的核心价值‌ 在当今游戏产业中,可访问性(Accessibility)已成为用户体验的基石,而控制器适配是其核心组成部分。作为软件测试从业者,我们的职责是确保游戏在各种输入设备上无缝运行,包括键盘、鼠…