当前位置: 首页 > article >正文

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

论文

[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.kler.cn/news/338877.html

相关文章:

  • C++ 语言特性08 - 非静态成员的初始化
  • vmstat命令:系统性能监控
  • 期权懂|期权交易涨跌幅限制会随时调整吗?
  • Linux聊天集群开发之环境准备
  • 【C语言】数据在内存中的存储(万字解析)
  • Spring Boot 学习之路 -- Thymeleaf 模板引擎
  • 美国游戏产业的政府监管
  • 在spring boot项目中使用Spring Security的BCryptPasswordEncoder类进行相同密码不同密文的加密和验证
  • 【MySQL 09】表的内外连接
  • AMD模块化规范详解
  • 笔记整理—linux进程部分(8)线程与进程
  • RNN经典案例——构建人名分类器
  • 使用欧拉安装ceph分布式存储,ceph的集群安装、添加主机集群和删除主机、添加osd硬盘和手动添加硬盘为osd和移除osd。
  • 蜂鸣器 ,耳机区别, 有缘蜂鸣器,无缘蜂鸣器
  • Protobuf简介
  • 《贪吃蛇小游戏 1.0》源码
  • PHP变量(第④篇)
  • Java后端--设计模式基础
  • Redis数据库与GO(二):list,set
  • Vue3中Watch的同步和异步