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

【深度学习】自动微分——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.mrgr.cn/news/43295.html

相关文章:

  • 使用JavaScript写一个网页端的四则运算器
  • 3.JVM
  • AI 激活新势能,中小企业全媒体营销绽放无限可能
  • struct和C++的类
  • 关键字:static
  • 【RISCV指令集手册】向量扩展v1.0
  • 视频剪辑软件哪个好?四大视频剪辑软件揭秘
  • 瓶颈ing
  • MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
  • 什么是编译型语言,什么是解释性语言?java属于哪种?
  • 第3篇:Linux权限维持----应急响应之权限维持篇
  • 我的创作纪念日一年
  • qt 使用svg 图标的使用
  • 二叉树深度学习——将二叉搜索树转化为排序的双向链表
  • TypeScript面向对象 02
  • 特别节目————集训总结
  • AQS原理(AbstractQueuedSynchronizer)
  • 若依使用(二次开发)
  • 152. 乘积最大子数组
  • 国外电商系统开发-运维系统添加拓扑节点