【深度学习】自动微分——Autodiff or Autograd?

ops/2024/10/22 7:47:25/

论文

[1].CSC321 Lecture 10: Automatic Differentiation
[2].Automatic Differentiation in Machine Learning:a Survey

关键点总结:

  1. 雅可比矩阵:对于多变量函数 y ⃗ = f ( x ⃗ ) \vec{y} = f(\vec{x}) y =f(x ),其梯度矩阵(即雅可比矩阵) J J J 的每个元素表示为:
    J i j = ∂ y i ∂ x j J_{ij} = \frac{\partial y_i}{\partial x_j} Jij=xjyi

  2. 链式法则:在计算复合函数的梯度时,通过链式法则可以将中间变量的梯度与最终输出的梯度结合起来。例如,若 l = g ( y ⃗ ) l = g(\vec{y}) l=g(y ) 是标量函数,其梯度 v v v 为:
    v = ( ∂ l ∂ y 1 , ⋯ , ∂ l ∂ y m ) v = \left(\frac{\partial l}{\partial y_1}, \cdots, \frac{\partial l}{\partial y_m}\right) v=(y1l,,yml)
    l l l 关于 x ⃗ \vec{x} x 的梯度可以通过计算 v v v J J J 的乘积得到:
    v J = ( ∂ l ∂ x 1 , ⋯ , ∂ l ∂ x n ) v J = \left(\frac{\partial l}{\partial x_1}, \cdots, \frac{\partial l}{\partial x_n}\right) vJ=(x1l,,xnl)

  3. 梯度累加:在 PyTorch 中,梯度在反向传播过程中是累加的。每次调用 .backward() 方法时,计算的梯度会累加到张量的 .grad 属性中。因此,为了避免梯度累积导致计算错误,通常需要在每次反向传播之前手动将梯度清零,常用的方法是使用 optimizer.zero_grad() 或者 tensor.grad.zero_()
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

示例代码:

import torch# 定义一个简单的多变量函数
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = torch.cat([x ** 2, x ** 3], dim=0)# 定义一个标量函数
l = y.sum()# 计算梯度
l.backward()# 查看梯度
print(x.grad)# 梯度清零
x.grad.zero_()

总结:

  • torch.autograd 通过自动计算雅可比矩阵的乘积来实现反向传播。
  • 每次反向传播后,梯度会累加,因此需要手动清零以避免梯度累积问题。
  • 这种方法使得深度学习模型的训练过程更加高效和简洁。

http://www.ppmy.cn/ops/124189.html

相关文章

Llama-3.2-3B-Instruct PyTorch模型微调最佳实践

1 引言 Meta Llama 3.2多语言大型语言模型集合(LM)是一个1B和3B大小(文本输入/文本输出)的预训练和指令微调模型集合。Llama 3.2指令调整的纯文本模型针对多语言对话用例进行了优化,包括智能检索和总结任务。它们在常…

如何将uniapp项目首次提交到指定git仓库

在移动应用开发领域,uniapp凭借其跨平台的优势,已经成为许多开发者的首选框架。创建一个uniapp项目后,将代码提交到版本控制仓库是项目管理的第一步。本文将详细介绍如何将uniapp项目首次提交到指定的Git仓库。 准备工作 在开始之前&#x…

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读:通过ChatGPT与Python的结合,数据分析流程得到了极大的优化和提升,从数据获取、清洗、代码生成到智能分析和可视化展示,每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率,还降低了技术门槛&#xff…

PigGo的安装配置

TyporaPigGo的使用 1、下载PigGo 1.1、先打开Typora的偏好设置 1.2 下载PigGo app 1.3 下载Setup-xxx.exe版本 1.4安装成功后打开PigGo 2、配置PigGo 1、安装gitee-uploader插件 2、 PicGo设置 ​ ​ 3、图床设置 3.1配置SM.MS 3.1.1 登录sm,生成秘钥 如果没有注册&…

nacos多数据源插件介绍以及使用

概述 在微服务架构中,服务配置的集中管理和动态调整是至关重要的。Nacos 提供了配置管理和服务发现的功能,其中配置管理支持动态数据源的切换,增强了其在复杂环境中的适用性。默认情况下,Nacos 支持 MySQL 和Derby,但…

openpnp - juki吸嘴尺寸

文章目录 openpnp - juki吸嘴尺寸概述笔记吸嘴可以对应的最小元件尺寸END openpnp - juki吸嘴尺寸 概述 在网上买的juki吸嘴的商品页面,并没有具体的吸嘴尺寸。 现在贴片时,要根据吸嘴外径大小来决定具体元件要用哪种吸嘴,先自己量一下。 …

常见的内网渗透思路及方法(包含示例)

内网渗透是指在企业或组织的内部网络中进行安全测试,以发现和利用网络中的安全漏洞。 以下是一些常见的内网渗透思路和方法,包含具体示例: 1. 信息收集 1.1 网络扫描 目的:识别内网中的活跃主机和开放端口。 工具:…

Golang | Leetcode Golang题解之第457题环形数组是否存在循环

题目: 题解: func circularArrayLoop(nums []int) bool {n : len(nums)next : func(cur int) int {return ((curnums[cur])%n n) % n // 保证返回值在 [0,n) 中}for i, num : range nums {if num 0 {continue}slow, fast : i, next(i)// 判断非零且方…