博客摘录「 自动微分----pytorch中的梯度运算与反向传播函数(预备知识)5」2024年4月18日

Python控制流的梯度计算

使用自动微分的一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值。

def f(a):b = a * 2while b.norm() < 1000:b = b * 2if b.sum() > 0:c = belse:c = b * 100return c

让我们计算梯度。

a = torch.randn(size=(),requires_grad=True)                          #随机生成一个符合正态分布的小数d = f(a)                                                              #调用函数f,计算关于a的函数
d.backward()                                                          #调用反向传播函数

我们现在可以分析上面定义的 f 函数。 请注意,它在其输入 a 中是分段线性的。 换言之,对于任何 a  ,存在某个常量标量k,使得 f ( a ) = k a  ,其中 k的值取决于输入 a。 因此,我们可以用 d / a验证梯度是否正确。

a.grad, a.grad == d / a                                               #计算a的梯度
(tensor(1024.), tensor(True))

注:

在您给出的例子中,`f(a)` 是一个依赖于输入 `a` 的非线性函数,尽管对于某些特定的输入范围和操作,它的局部行为可能近似线性。由于涉及到的操作包括了基于张量 `b` 的范数判断循环条件以及基于 `b` 的和判断条件分支,所以整体函数不是简单的线性缩放关系。

- 当 `a` 被初始化为从正态分布中抽取的一个标量并要求梯度时,`a.grad` 初始时会被清零。
- 在调用 `f(a)` 后,函数首先将 `a` 乘以 2 存储到 `b`。
- 然后进入一个 `while` 循环,在循环内部不断将 `b` 乘以 2 直到其范数大于等于 1000。
- 接下来是一个条件判断:如果 `b` 的元素之和大于 0,则将 `c` 设置为 `b`;否则将 `c` 设置为 `b` 的 100 倍。
- 函数返回 `c`,并且因为 `a` 要求了梯度,调用 `d.backward()` 将会计算 `d` 关于 `a` 的梯度。

由于 `b` 的每一次更新都是通过乘以 2 实现的,而 `a` 的梯度可以通过链式法则追溯至 `b`,再进一步回溯至 `a`,最终 `a.grad` 应该是每次循环中梯度累积的结果。然而,在实际运行这段代码时,`a.grad` 是否恰好等于 `d / a` 并不保证,因为它取决于具体的 `a` 值和循环终止时 `b` 的状态。

实际情况中,上述代码无法直接得出 `a.grad == d / a` 的结论,因为函数 `f` 并不具备全局的线性性质。不过,您可以执行这段代码来观察 `a.grad` 的具体值,并尝试理解不同输入下梯度是如何随着循环和条件判断变化的。

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

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

相关文章

【2024年最新】NodeMCU-ESP8266刷AT固件教程——适用于esp-12E和esp-12F

硬件图片 原理图 0、工具打包下载 工具包 密码:keduo 1、工具及固件下载 固件下载地址&#xff1a; 欢迎 | 安信可科技 (ai-thinker.com) 下载以下固件&#xff1a; 直接下载地址&#xff1a;AT 固件&#xff08;固件号&#xff1a;0781&#xff09; 下载以下工具&#xf…

使用Nexus搭建npm私服库

优质博文&#xff1a;IT-BLOG-CN 【1】下载nexus http://www.sonatype.com/download-oss-sonatype解压到本地即可&#xff1b; 【2】打开nexus-3.2.0-01-win64\nexus-3.2.0-01\bin&#xff1b;打开cmd&#xff08;必须使用cmd&#xff09; 执行nexus.exe /run&#xff1b;需要使…

Oracle数据库从入门到精通系列之二十一:Oracle 19c数据库增加重做日志大小

Oracle数据库从入门到精通系列之二十一:Oracle 19c数据库增加重做日志大小 一、概述二、推荐配置三、实施步骤在此最佳实践中,我们增加了 Oracle 重做日志的大小以提高数据库性能。适当调整数据库重做日志的大小可以减少数据库中的等待事件,从而优化数据库系统。 一、概述 …

【LeetCode热题100】【链表】随机链表的复制

题目链接&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点&#xff0c;请你深拷贝这个链表 非常妙的思路&…

浏览器CSS兼容性问题解决方案整理

1、CSS Hack 使用 hacker 可以把浏览器分为3类&#xff1a;IE6&#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 Chrome ff Safari opera等&#xff09; &#xff08;1&#xff09;IE6认识的 hacker 是 下划线 _ 和星号 * &#xff08;2&#xff09;IE7和遨游认识的 hac…

LeetCode第53题:最大子数组和【python 5种算法】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析可视化:企业实战案例 题目描述 给定一个整数数组 n…

Tomcat弱口令及war包漏洞复现(保姆级教程)

1.环境搭建 靶机&#xff1a;Ubuntu 安装参考&#xff1a;安装Ubuntu详细教程_乌班图安装教程-CSDN博客 vulhub docker搭建tomcat漏洞环境 参考&#xff1a;vulhub docker靶场搭建-CSDN博客 工具&#xff1a;burpsuite 2.漏洞复现 2.1弱口令爆破 进入http://192.168.143…

Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.1 新增加一个RISC-V CPU(NARUTO-PI)

1. 概述 上一章节我们讲解了开源的QEMU 开发板怎么启动,从这章节开始,我们将会亲手去从无到有开发一个CPU,它包括CPU Core,Memory Device,Communication Controller和Device等等。 注意,本章节中调用的很多自定义宏都在include/hw/riscv/naruto.h文件,这里我就不展开说…

深入探索STM32高级定时器:TIM高级定时器的神奇应用

深入探索STM32高级定时器&#xff1a;TIM高级定时器的神奇应用 在STM32微控制器中&#xff0c;高级定时器&#xff08;TIM&#xff0c;Timer&#xff09;是一种功能强大、灵活多样的定时器模块&#xff0c;提供了更多的功能和配置选项&#xff0c;适用于各种复杂的定时和计时需…

分类神经网络2:ResNet模型复现

目录 ResNet网络架构 ResNet部分实现代码 ResNet网络架构 论文原址&#xff1a;https://arxiv.org/pdf/1512.03385.pdf 残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的&#xff0c;通过引入残差学习解决了深度网络训练中的退化问题&#xff…

IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

1. 同步阻塞IO 同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的&#xff0c;即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。 优点&#xff1a;简单易用 缺点&#xff1a;为每一次io请…

VScode远程连接虚拟机提示: 无法建立连接:XHR failed.问题解决方案

一问题描述 在vscode下载插件Remote-SSH远程连接虚拟机时提示无法建立连接 二.最大嫌疑原因&#xff1a; 我也是在网上找了许久&#xff0c;发现就是网络原因&#xff0c;具体不知&#xff0c;明明访问别的网页没问题&#xff0c;就是连不上&#xff0c;然后发现下载vscode的…

【电赛】自制模块2——偏置变幅器

一、理论基础 模电学习笔记——集成运算放大器https://mp.csdn.net/mp_blog/creation/editor/134449862 运放单双电源转换/运放单双电源供电详解https://mp.csdn.net/mp_blog/creation/editor/135884117 通过改变R4或R5的阻值改变正弦波的振幅。 根据公式 A表示放大倍数。 …

MAC上如何将某个目录制作成iso格式磁盘文件,iso文件本质是什么?以及挂载到ParallelDesktop中?(hdiutil makehybrid )

背景 ParallelsDesktop没有安装ParallelsTools的无法共享目录&#xff0c;可以通过ParallelsDesktop提供CD磁盘的方式共享进去 命令 # 准备文档 mkdir mytestdir cp xxx mytestdir# 生成iso hdiutil makehybrid -o output.iso mytestdir -iso -joliethdiutil是MAC提供的磁盘…

大白话!go语言中的指针、指针类型的方法接收器

go语言中的指针使用起来的比较简单。应用如下&#xff1a; 1.普通的对象取地址&#xff0c;获取对象值 符号&&#xff0c;取地址符&#xff0c;可以取变量的地址&#xff0c;或结构体对象的地址等。符号*&#xff0c;是从地址中取值&#xff08;根据栈中存储地址&#xf…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户&#xff0c;订单&#xff0c;物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …

【数据仓库工具箱】DW/BI系统的核心元素和基本要求

核心元素 DW/BI 环境划分为4个不同的&#xff0c;各具特色的组成部分。分别是&#xff1a;操作型源数据&#xff0c;ETL系统&#xff0c;数据展现和商业智能应用。 操作型源数据 记录的是操作型系统&#xff0c;用于获取业务事务。源数据关注的是处理性能和可用性。源系统一般…

Jmeter-非GUI模式下运行jmeter脚本-适用于服务器上持续集成测试

背景 大部分Jmeter脚本都是部署在Linux上运行&#xff0c;利用Jenkins做接口自动化&#xff0c;定时巡检任务。 执行命令 1.进入jmeter的目录&#xff0c;bin文件夹 cd C:\path\to\jmeter\bin2.运行脚本文件 jmeter -n -t D:\{脚本文件目录}\xxx.jmx -l D:\{脚本文件目录}…

信息系统项目管理师0061:架构设计(5信息系统工程—5.1软件工程—5.1.1架构设计)

第五章 信息系统工程 信息系统工程是用系统工程的原理、方法来指导信息系统建设与管理的一门工程技术学科,它是信息科学、管理科学、系统科学、计算机科学与通信技术相结合的综合性、交叉性、具有独特风格的应用学科。当前信息系统工程的主要任务是研究信息处理过程内在的规律…

76.最小覆盖子串

题目描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。注意&#xff1a;对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数…