使用PyTorch的自动求导功能 计算雅可比矩阵(细节)

一、雅可比矩阵的定义:

雅可比矩阵是对多元函数的导数进行梯度扩展的一种矩阵表示。对于一个具有m个输入和n个输出的函数,雅可比矩阵的大小为n×m。雅可比矩阵中的每个元素表示了输出分量相对于输入分量的偏导数。

二、什么是自动求导?

自动求导是PyTorch的一项重要功能。 在计算过程中,PyTorch会为每个参与计算的张量建立一个计算图,用于记录计算过程中涉及的操作和张量之间的依赖关系,基于这个计算图,PyTorch可以根据链式法则自动计算函数的导数。

三、使用PyTorch的自动求导计算雅可比矩阵:

PyTorch的自动求导功能非常简单,只需要在需要求导的张量上调用.requires_grad_()方法。接下来,定义一个函数,该函数将需要计算雅可比矩阵的张量作为参数,并通过函数调用的方式计算该张量关于其他张量的偏导数。以下是一个示例:

import torch

def calculate_jacobian(x, y):
    J = torch.zeros(y.size()[0], x.size()[0]) # 创建全零矩阵J,用于储存Jacobi矩阵,形状为(y的大小, x的大小),y在前,x在后,是因为Jacobi矩阵的定义,行数等于f的元素个数
    grad_y = torch.zeros(y.size()) # 创建一个与 y 相同大小的全零向量,用于存储y的梯度
    for i in range(y.size()[0]): # 遍历 y 的每个元素
        grad_y.zero_() # 将 grad_y 清零
        grad_y[i] = 1 # 再将grad_y的第i个元素设置为1,表示计算y中第i个元素的偏导数
        x_grads = torch.autograd.grad(y, x, grad_outputs=grad_y, retain_graph=True, create_graph=True)[0]
        # 使用torch.autograd.grad函数计算y关于x的偏导数
        # grad_outputs参数用于指定计算过程中输出张量的梯度,默认为None,即所有输出的梯度都为1;
        # retain_graph参数用于指定是否保留计算图,默认为False,即计算完一次偏导数后计算图将被释放;True表示保留计算图以便后续计算;
        # create_graph参数用于指定是否创建一个计算图,用于计算二阶偏导数;True表示允许构建新的计算图以便梯度的梯度计算
        J[i] = x_grads # 将计算得到的梯度x_grads存储到雅可比矩阵的第i行
    return J

x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x**2
J = calculate_jacobian(x, y)
print(J)

运行结果:

该输出实际上表示的是:

注:

1.如何理解代码中 y.size()[0]

在 PyTorch 中,y.size() 返回的是张量 y 的尺寸(shape),即一个包含张量每个维度大小的元组;y.size()[0] 则取这个元组的第一个元素,表示张量 y 的第一个维度的大小。具体来说,假设 y 是一个张量,它的形状为 (m, n),则:

  • y.size() 返回 (m, n)
  • y.size()[0] 返回 m,即张量 y 的第一个维度的大小;

四、参考资料:

1. PyTorch 使用PyTorch的自动求导功能高效地计算雅可比矩阵|极客笔记 (deepinout.com)

2. PyTorch 使用PyTorch的自动微分为高效计算雅可比矩阵|极客教程 (geek-docs.com)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值