深度学习 -- 梯度计算及上下文控制

深度学习 – 梯度计算及上下文控制

文章目录

  • 深度学习 -- 梯度计算及上下文控制
  • 一,自动微分
    • 1.1 基础概念
    • 1.2 计算梯度
      • 1.2.1 计算标量梯度
      • 1.2.2 计算向量梯度
      • 1.2.3 多标量梯度计算
      • 1.2.4 多向量梯度计算
  • 二,梯度上下文控制
    • 2.1 控制梯度计算
    • 2.2 累计梯度
    • 2.3 梯度清零
  • 三,案例一----求函数最小值
  • 四,案例二----函数参数求解


一,自动微分

自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。

1.1 基础概念

  1. 张量

    Torch中一切皆为张量,属性requires_grad决定是否对其进行梯度计算。默认是 False,如需计算梯度则设置为True。

  2. 计算图

    torch.autograd通过创建一个动态计算图来跟踪张量的操作,每个张量是计算图中的一个节点,节点之间的操作构成图的边。

    在 PyTorch 中,当张量的 requires_grad=True 时,PyTorch 会自动跟踪与该张量相关的所有操作,并构建计算图。每个操作都会生成一个新的张量,并记录其依赖关系。当设置为 True 时,表示该张量在计算图中需要参与梯度计算,即在反向传播(Backpropagation)过程中会自动计算其梯度;当设置为 False 时,不会计算梯度。

  • 计算依赖图
    在这里插入图片描述
    叶子结点判断方式
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)  # 叶子节点
y = x ** 2  # 非叶子节点(通过计算生成)
z = y.sum()print(x.is_leaf)  # True
print(y.is_leaf)  # False
print(z.is_leaf)  # False

1.2 计算梯度

使用tensor.backward()方法执行反向传播,从而计算张量的梯度

1.2.1 计算标量梯度

import torchdef test01():x= torch.tensor(1.0,requires_grad=True)# requires_grad=True表示需要求导y=x**2# 操作张量y.backward() #计算梯度,也就是反向传播print(x.grad) # 打印梯度if __name__ == '__main__':test01()

1.2.2 计算向量梯度

def test002():# 1. 创建张量:必须为浮点类型x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)y = x ** 2loss = y.mean()loss.backward()print(x.grad)if __name__ == "__main__":test002()

调用 loss.backward() 从输出节点 loss 开始,沿着计算图反向传播,计算每个节点的梯度。

损失函数loss=mean(y)=1n∑i=1nyiloss=mean(y)=\frac{1}{n}∑_{i=1}^ny_iloss=mean(y)=n1i=1nyi,其中 n=3。

对于每个 yiy_iyi,其梯度为 ∂loss∂yi=1n=13\frac{∂loss}{∂y_i}=\frac{1}{n}=\frac13yiloss=n1=31

对于每个 xix_ixi,其梯度为:
∂loss∂xi=∂loss∂yi×∂yi∂xi=13×2xi=2xi3\frac{∂loss}{∂x_i}=\frac{∂loss}{∂y_i}×\frac{∂y_i}{∂x_i}=\frac1{3}×2x_i=\frac{2x_i}3 xiloss=yiloss×xiyi=31×2xi=32xi
所以,x.grad 的值为:[2×1.03,2×2.03,2×3.03]=[23,43,2]≈[0.6667,1.3333,2.0000][\frac{2×1.0}3, \frac{2×2.0}3, \frac{2×3.0}3]=[\frac23,\frac43,2]≈[0.6667,1.3333,2.0000][32×1.0,32×2.0,32×3.0]=[32,34,2][0.6667,1.3333,2.0000]

1.2.3 多标量梯度计算

#多标量梯度计算
def test03():x1= torch.tensor(1.0,requires_grad=True)x2=torch.tensor(3.0,requires_grad=True)y=x1**2+x2*7z=y.sum()z.backward()print(x1.grad,x2.grad)if __name__ == '__main__':test03()

1.2.4 多向量梯度计算

# 多向量梯度计算
def test04():x1 = torch.tensor([1.0, 2.0], requires_grad=True)x2 = torch.tensor([3.0, 4.0], requires_grad=True)y = x1 ** 2 + x2 * 7z = y.sum()z.backward()print(x1.grad, x2.grad)if __name__ == '__main__':test04()

二,梯度上下文控制

梯度计算的上下文控制和设置对于管理计算图、内存消耗、以及计算效率至关重要。下面我们学习下Torch中与梯度计算相关的一些主要设置方式。

2.1 控制梯度计算

简单的运算不需要梯度

import torchdef test01():x=torch.tensor(11.5,requires_grad=True)print(x.requires_grad)# Truey=x**2print(y.requires_grad)# Truewith torch.no_grad():z=x**2print(z.requires_grad)#使用装饰器@torch.no_grad()def test():return x**2y=test()print(y.requires_grad)if __name__ == '__main__':test01()

2.2 累计梯度

默认情况下,当我们重复对一个自变量进行梯度计算时,梯度是累加的

import torchdef test002():x = torch.tensor([1.0, 2.0, 5.3], requires_grad=True)# 2. 累计梯度:每次计算都会累计梯度for i in range(3):y = x**2 + 2 * x + 7z = y.mean()z.backward()print(x.grad)if __name__ == "__main__":test002()

2.3 梯度清零

大多数情况下是不需要梯度累加的

#梯度清零
def test002():x = torch.tensor([1.0, 2.0, 5.3], requires_grad=True)# 2. 累计梯度:每次计算都会累计梯度for i in range(3):y = x**2 + 2 * x + 7z = y.mean()# 2.1 反向传播之前先对梯度进行清零if x.grad is not None:x.grad.zero_()z.backward()print(x.grad)if __name__ == "__main__":test002()

三,案例一----求函数最小值

import torch
from matplotlib import pyplot as plt
import numpy as npdef test01():x = np.linspace(-10, 10, 100)y = x ** 2plt.plot(x, y)plt.show()def test02():# 初始化自变量Xx = torch.tensor([3.0], requires_grad=True, dtype=torch.float)# 迭代轮次epochs = 50# 学习率lr = 0.1list = []for i in range(epochs):# 计算函数表达式y = x ** 2# 梯度清零if x.grad is not None:x.grad.zero_()# 反向传播y.backward()with torch.no_grad():x -= lr * x.gradprint('epoch:', i, 'x:', x.item(), 'y:', y.item())list.append((x.item(), y.item()))# 散点图,观察收敛效果x_list = [l[0] for l in list]y_list = [l[1] for l in list]plt.scatter(x=x_list, y=y_list)plt.show()if __name__ == "__main__":test01()test02()

四,案例二----函数参数求解

import torchdef test02():x = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float)y = torch.tensor([3, 5, 7, 9, 11], dtype=torch.float)a = torch.tensor([1.0], dtype=torch.float, requires_grad=True)b = torch.tensor([1.0], dtype=torch.float, requires_grad=True)lr = 0.05epochs = 1000for epoch in range(epochs):y_pred = a * x + bloss = ((y_pred - y) ** 2).mean()if a.grad is not None:a.grad.zero_()if b.grad is not None:b.grad.zero_()loss.backward()with torch.no_grad():a -= lr * a.gradb -= lr * b.gradif (epoch + 1) % 100 == 0:print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}')print(f'a: {a.item():.4f}, b: {b.item():.4f}')if __name__ == '__main__':test02()

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

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

相关文章

Redisson RLocalCachedMap 核心参数详解

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)

你是否曾梦想在虚拟世界中自由翱翔,像海豚一样在海洋自由穿梭,或者像宇航员一样在宇宙中尽情探索?今天,我们就来聊聊如何在Unity中使用Rigidbody来实现角色移动。 废话不多说,走,让我们马上来一探究竟&…

Vue接口平台学习十一——业务流测试

效果图及简单说明 与之前的用例列表相似布局,也分左右,左边用于显示测试流程的名称,右边用于显示流程相关信息。 左侧点击添加,直接增加一个新的业务流。 右侧是点击的业务流详情,展示名称,名称的编辑保存&…

碳化硅缺陷分类与原因

01一、碳化硅晶体材料中的缺陷到底是什么?碳化硅晶体材料中的缺陷是指在晶体生长、加工或使用过程中出现的不完美结构。这些缺陷可能表现为晶体内部的裂纹、表面的凹坑、原子排列的错误等。虽然缺陷看起来微不足道,但它们却可能对晶体的电学、热学和机械…

Jenkins 实现项目的构建和发布

作者:小凯 沉淀、分享、成长,让自己和他人都能有所收获! 本文的宗旨在于通过简单干净实践的方式教会读者,如何在 Docker 中部署 Jenkins,并通过 Jenkins 完成对项目的打包构建并在 Docker 容器中部署。 Jenkins 的主要…

Django接口自动化平台实现(三)

3.2 后台 admin 添加数据 1)注册模型类到 admin: 1 from django.contrib import admin2 from . import models3 4 5 class ProjectAdmin(admin.ModelAdmin):6 list_display ("id", "name", "proj_owner", "tes…

CentOS 7 配置环境变量常见的4种方式

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

k8s:手动创建PV,解决postgis数据库本地永久存储

1.离线环境CPU:Hygon C86 7285 32-core Processor 操作系统:麒麟操作系统 containerd:1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey:3.1.10 Harbor:2.13.1 Postgis:17-3.52创建StorageClass2.1创建 apiVersion: storage.k8s.io/v1kin…

谷歌浏览器Chrome的多用户配置文件功能

谷歌浏览器Chrome的多用户配置文件功能允许在同一设备上创建多个独立账户,每个账户拥有完全隔离的浏览数据(如书签、历史记录、扩展、Cookies等),非常适合工作/生活账户分离、家庭共享或临时多账号登录场景。 如何使用Chrome的多用户配置文件功能? 一、创建与切换用户 1.…

傲软录屏 专业高清录屏软件 ApowerREC Pro 下载与保姆级安装教程!!

小编今天分享一款强大的电脑屏幕录像软件 傲软录屏 ApowerREC,能够帮助用户录制中电脑桌面屏幕上的所有内容,包括画面和声音,支持全屏录制、区域录制、画中画以及摄像头录制等多种视频录制模式,此外,还支持计划任务录制…

【计算机网络】MAC地址与IP地址:网络通信的双重身份标识

在计算机网络领域,MAC地址与IP地址是两个核心概念,它们共同构成了数据传输的基础。理解二者的区别与联系,对于网络配置、故障排查及安全管理至关重要。 一、基本概念 1. MAC地址(物理地址) 定义:固化在网络…

如何用keepAlive实现标签页缓存

什么是KeepAlive首先,要明确所说的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。TCP的KeepAliveTCP…

数据库隔离级别

隔离级别决定了事务之间的可见性规则,直接影响数据库的并发性能和数据一致性。SQL 标准定义了 4 种隔离级别,从低到高依次为:读未提交→读已提交→可重复读→串行化。隔离级别越高,对并发问题的解决能力越强,但对性能的…

基于Python flask的电影数据分析及可视化系统的设计与实现,可视化内容很丰富

摘要:基于Python的电影数据分析及可视化系统是一个应用于电影市场的数据分析平台,旨在为广大电影爱好者提供更准确、更详细、更实用的电影数据。数据分析部分主要是对来自猫眼电影网站上的数据进行清洗、分类处理、存储等步骤,数据可视化则是…

TCP通讯开发注意事项及常见问题解析

文章目录一、TCP协议特性与开发挑战二、粘包与拆包问题深度解析1. 成因原理2. 典型场景与实例验证3. 系统化解决方案接收方每次读取10字节2. 丢包检测与验证工具3. 工程化解决方案四、连接管理关键实践1. 超时机制设计2. TIME_WAIT状态优化3. 异常处理最佳实践五、高性能TCP开发…

2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 | 珂学家

前言 题解 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 汇总 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 感觉这个T1特别有意思,非典型题,着重推演下结论。 T2是一道玄学题,但是涉及一些优化技巧…

《计算机“十万个为什么”》之 MQ

《计算机“十万个为什么”》之 MQ 📨 欢迎来到消息队列的奇妙世界! 在这篇文章中,我们将探索 MQ 的奥秘,从基础概念到实际应用,让你彻底搞懂这个分布式系统中不可或缺的重要组件!🚀 作者&#x…

Django母婴商城项目实践(七)- 首页数据业务视图

7、首页数据业务视图 1、介绍 视图(View)是Django的MTV架构模式的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面或其他类型文档中显示。 也可以理解为视图是MVC架构里面的C部分(控制器),主要处理功能和业务上的逻辑。我们习惯使用视图函数处理HTTP请求,…

android 12 的 aidl for HAL 开发示例

说明:aidl for HAL 这种机制,可以自动生成java代码,app调用可以获取中间过程的jar包,结合反射调用 ServiceManager.getService 方法,直接获取 HAL 服务,不再需要费力在framework层添加代码,方便…

网络安全渗透攻击案例实战:某公司内网为目标的渗透测试全过程

目录一、案例背景二、目标分析(信息收集阶段)🌐 外部信息搜集🧠 指纹识别和端口扫描三、攻击流程(渗透测试全过程)🎯 步骤1:Web漏洞利用 —— 泛微OA远程命令执行漏洞(CV…