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

详解Pytorch:张量自动微分

张量自动微分(Automatic Differentiation, AD) 是 PyTorch 的核心功能之一,它允许我们自动计算张量的梯度。自动微分在深度学习中非常重要,因为神经网络的训练依赖于梯度下降法,而梯度下降法需要计算损失函数对模型参数的梯度。


自动微分的基本概念

  1. 什么是自动微分?

    • 自动微分是一种计算函数导数(梯度)的技术。
    • 它通过构建计算图(Computation Graph)来跟踪张量的操作,并在反向传播时自动计算梯度。
  2. 为什么需要自动微分?

    • 在深度学习中,模型的参数通常通过梯度下降法进行优化。
    • 手动计算梯度非常繁琐且容易出错,尤其是对于复杂的模型。
    • 自动微分可以高效且准确地计算梯度。
  3. 计算图(Computation Graph)

    • 计算图是 PyTorch 自动微分的基础。
    • 每个张量操作(如加法、乘法)都会在计算图中创建一个节点。
    • 计算图记录了张量之间的依赖关系,使得反向传播时可以自动计算梯度。

自动微分的实现

在 PyTorch 中,自动微分通过以下步骤实现:

  1. 设置 requires_grad=True

    • 将张量的 requires_grad 属性设置为 True,表示需要计算该张量的梯度。
    x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
    
  2. 定义计算图

    • 对张量进行操作时,PyTorch 会自动构建计算图。
    y = x * 2
    z = y.sum()
    
  3. 反向传播

    • 调用 .backward() 方法,自动计算梯度。
    z.backward()
    
  4. 获取梯度

    • 通过 .grad 属性获取张量的梯度。
    print(x.grad)  # 输出: tensor([2., 2., 2.])
    

示例:自动微分的基本用法

以下是一个简单的示例,展示如何使用 PyTorch 进行自动微分:

import torch

# 创建一个需要计算梯度的张量
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# 定义计算图
y = x * 2  # y = [2, 4, 6]
z = y.sum()  # z = 2 + 4 + 6 = 12

# 反向传播,计算梯度
z.backward()

# 获取梯度
print(x.grad)  # 输出: tensor([2., 2., 2.])

自动微分的详细步骤

1. 前向传播
  • 在前向传播过程中,PyTorch 会记录所有张量操作,并构建计算图。
  • 例如:
    x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
    y = x * 2
    z = y.sum()
    
2. 反向传播
  • 在反向传播过程中,PyTorch 会从输出张量开始,沿着计算图反向传播梯度。
  • 例如:
    z.backward()
    
3. 梯度计算
  • 对于每个需要计算梯度的张量,PyTorch 会计算其梯度并存储在 .grad 属性中。
  • 例如:
    print(x.grad)  # 输出: tensor([2., 2., 2.])
    

自动微分的应用场景

  1. 神经网络的训练

    • 在神经网络中,自动微分用于计算损失函数对模型参数的梯度。
    • 例如:
      # 定义模型
      model = torch.nn.Linear(10, 1)
      optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
      
      # 前向传播
      output = model(input)
      loss = torch.nn.functional.mse_loss(output, target)
      
      # 反向传播
      loss.backward()
      
      # 更新参数
      optimizer.step()
      
  2. 自定义函数的梯度计算

    • 自动微分可以用于计算任意函数的梯度。
    • 例如:
      def my_function(x):
          return x ** 2 + 3 * x + 1
      
      x = torch.tensor(2.0, requires_grad=True)
      y = my_function(x)
      y.backward()
      print(x.grad)  # 输出: tensor(7.)
      

注意事项

  1. 梯度累积

    • 每次调用 .backward() 时,梯度会累积到 .grad 属性中。
    • 如果需要清除梯度,可以调用 .zero_grad() 方法。
    x.grad.zero_()
    
  2. 非标量输出

    • 如果输出是一个非标量张量(如向量或矩阵),需要为 .backward() 提供一个 gradient 参数。
    x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
    y = x * 2
    y.backward(torch.tensor([1.0, 1.0, 1.0]))  # 提供梯度
    print(x.grad)  # 输出: tensor([2., 2., 2.])
    
  3. 禁用梯度计算

    • 在某些情况下(如推理阶段),可以禁用梯度计算以提高性能。
    with torch.no_grad():
        y = x * 2
    

总结

  • 自动微分 是 PyTorch 的核心功能,用于自动计算张量的梯度。
  • 通过设置 requires_grad=True,PyTorch 会跟踪张量操作并构建计算图。
  • 调用 .backward() 方法可以自动计算梯度,并通过 .grad 属性获取梯度。
  • 自动微分在神经网络的训练和自定义函数的梯度计算中非常有用。

http://www.kler.cn/a/566968.html

相关文章:

  • word中把latex公式快速转换为word公式
  • 【Mark】记录用宝塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加载失败问题
  • ML.NET库学习019:使用 ML.NET 创建 GitHub 问题标签分类器
  • 奔图Pantum M7165DN黑白激光打印一体机报数据清除中…维修
  • 农作物叶子病害检测数据集VOC+YOLO格式5169张29类别
  • HTTP协议和HTTPS协议
  • 山石-Ultrasonic-好久不见45
  • 【计算机网络】常见tcp/udp对应的应用层协议,端口
  • 2025年4月1日-2日AutoCable 中国汽车线束线缆及连接技术创新峰会即将开幕
  • Apache DolphinScheduler系列3-任务配置经验分享
  • 模型优化之强化学习(RL)与监督微调(SFT)的区别和联系
  • 【多模态】Magma多模态AI Agent
  • 黑马Java面试教程_P5_微服务
  • 用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
  • [Lc双指针_2] 盛水最多的容器 | 有效三角形的个数 | 和为S的两个数字
  • Spring Boot 消息队列(以RabbitMQ为例)
  • Java注释/JDK开发工具生成API/关键字、标识符规范
  • 企业级本地知识库部署指南(Windows优化版)
  • 什么是 Prompt?——一篇详细的介绍
  • FloodFill 算法(典型算法思想)—— OJ例题算法解析思路