📜  PyTorch 中的雅可比矩阵(1)

📅  最后修改于: 2023-12-03 15:04:42.756000             🧑  作者: Mango

PyTorch 中的雅可比矩阵

在机器学习和深度学习中,雅可比矩阵(Jacobian Matrix)在求解导数或梯度时经常出现。在 PyTorch 中,我们可以使用自动微分的方式计算出雅可比矩阵。

什么是雅可比矩阵?

雅可比矩阵是一个 $m \times n$ 的矩阵,其中每个元素是 $y$ 向量的 $i$ 维分量对 $x$ 向量的 $j$ 维分量的偏导数,表示为:

$$ J_{i,j} = \frac{\partial{y_i}}{\partial{x_j}} $$

在 PyTorch 中计算雅可比矩阵

在 PyTorch 中,我们可以对一个向量或矩阵上执行一系列的操作(比如加减乘除、取指数和对数、计算三角函数等),然后使用.backward()函数自动生成导数。为了计算雅可比矩阵,我们可以调用autograd.functional.jacobian函数。

autograd.functional.jacobian函数的使用方法如下:

import torch

x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = torch.tensor([4.0, 5.0], requires_grad=True)

def f(x, y):
    return torch.stack([y[0] * torch.sin(x[0] + x[1]), 
                        y[0] * torch.cos(x[2]),
                        x[2] * y[1]])

jacobian = torch.autograd.functional.jacobian(f, (x, y))

print(jacobian)

上述代码定义了一个函数 f,它接受两个张量 xyf的输出是一个张量,其中每个元素都是对应输入的一个函数值。在上述代码中,我们使用了torch.stack函数将这些函数值堆叠起来并返回一个张量。

接下来,我们使用 autograd.functional.jacobian 函数来计算 $f$ 在 $(x,y)$ 处的雅可比矩阵。该函数接受两个参数,分别是函数和输入张量的元组。

最后,我们打印出雅可比矩阵的结果:

tensor([[[ 3.8818e-01,  9.1355e-01,  0.0000e+00],
         [-1.5517e-01, -3.6432e-01,  0.0000e+00]],

        [[-6.7755e+00, -1.5900e+01,  0.0000e+00],
         [-2.0237e+00, -4.7503e+00,  0.0000e+00]],

        [[ 0.0000e+00,  0.0000e+00,  5.0000e+00],
         [ 0.0000e+00,  0.0000e+00, -3.0000e+00]]],
       grad_fn=<StackBackward>)

从输出可以看出,jacobian 张量的维度为 $3 \times 2 \times 3$,表示有 3 行和 2 列,每个元素对应一个 $f$ 的分量对输入 $(x,y)$ 的一个分量的偏导数。

总结

在 PyTorch 中计算雅可比矩阵非常简单。使用 autograd.functional.jacobian 函数,我们可以快速准确地计算一个多变量函数在输入张量处的雅可比矩阵。这对于求解各种机器学习和深度学习问题,比如优化、梯度下降等等都非常有帮助。