📅  最后修改于: 2023-12-03 15:34:33.217000             🧑  作者: Mango
在机器学习中,损失函数是衡量模型预测输出与真实输出的差异的方法。通过最小化损失函数,我们可以得到最优的模型参数。梯度是这个过程中的重要概念之一,它是指损失函数对模型参数的偏导数。
在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的计算图机制使得程序员可以专注于模型的学习过程,非常符合实际工作的需要。