📜  PyTorch的梯度(1)

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

PyTorch的梯度介绍

在机器学习中,损失函数是衡量模型预测输出与真实输出的差异的方法。通过最小化损失函数,我们可以得到最优的模型参数。梯度是这个过程中的重要概念之一,它是指损失函数对模型参数的偏导数。

在PyTorch中,使用自动求导技术来计算梯度。这样可以大大减少计算梯度的麻烦,使程序员可以专注于模型的学习过程。

计算梯度
定义变量

PyTorch中,需要使用特殊的张量类型来计算梯度,称之为可导张量。需要将requires_grad设置为True才能开始计算梯度。

import torch

x = torch.tensor([1., 2., 3.], requires_grad=True)
定义计算图

计算图是一个由张量和操作组成的图形。每个操作都是张量的一个函数(例如,加法,乘法,平均值等)。PyTorch通过计算图来跟踪每个张量之间的依赖关系,并计算每个张量的梯度。

y = x.sum()
计算梯度

通过调用计算图根节点(这里是y)的backward方法,可以计算相应的梯度。梯度会累积在每个张量的.grad属性中。

y.backward()
查看梯度
print(x.grad)

输出结果:

tensor([1., 1., 1.])
避免梯度累积

在实际应用中,可能需要对不同的损失函数进行计算,如果不清空梯度,则会导致梯度累积,影响梯度计算的正确性。可以调用.zero_()方法来清空梯度。

x.grad.zero_()
计算高阶梯度

经过上面的介绍,我们已经知道如何计算一阶梯度。在某些情况下,需要计算高阶梯度(即hessian矩阵)。PyTorch通过调用.backward()方法的create_graph参数来标记需要保留梯度的张量,然后可以计算高阶梯度。

x = torch.tensor([1., 2., 3.], requires_grad=True)
y = x.sum()
z = y**2
z.backward(create_graph=True)
print(x.grad)
print(x.grad.grad)

输出结果:

tensor([ 8.,  8.,  8.])
tensor([[ 2.,  2.,  2.],
        [ 2.,  2.,  2.],
        [ 2.,  2.,  2.]])
使用梯度计算实现模型训练

通过上面的介绍,我们已经知道如何使用PyTorch计算梯度。下面是一个使用梯度计算来实现模型训练的简单示例:

import torch.nn as nn
import torch.optim as optim

# 定义模型
model = nn.Linear(3, 1)
criterion = nn.MSELoss()  # 定义损失函数
optimizer = optim.SGD(model.parameters(), lr=0.001)  # 定义优化器

# 训练模型
for i in range(100):
    x = torch.rand(10, 3)
    y = torch.rand(10, 1)
    y_pred = model(x)
    loss = criterion(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
总结

PyTorch的梯度计算使用自动求导技术,非常方便地计算了张量相关的一阶和高阶梯度。PyTorch的计算图机制使得程序员可以专注于模型的学习过程,非常符合实际工作的需要。