返回

致敬 autograd:领略 PyTorch 的计算之美(上)

人工智能

序言:梯度与机器学习中的最优解

在机器学习中,优化是至关重要的。优化算法的本质是不断迭代,寻找使目标函数最小化的参数。为此,你需要计算目标函数的梯度,以便知道在每个迭代中应该如何更新参数以减少目标函数的值。

梯度是函数变化率的一个向量,它告诉你在每个方向上函数如何变化。在机器学习中,梯度用于计算损失函数相对于模型参数的偏导数。这些偏导数可以用来更新模型参数,以便减少损失函数的值。

Variable is Tensor

PyTorch 中的 Variable 类实际上是一个 Tensor,它封装了张量数据和梯度信息。在计算图中,Variable 代表张量数据在图中流动的路径。每个 Variable 都与一个梯度相关联,该梯度表示该 Variable 相对于计算图中前面的 Variable 的导数。

当你使用 PyTorch 的 autograd 模块构建计算图时,每个操作都会创建一个新的 Variable,该 Variable 包含该操作的输出张量以及相对于输入张量的梯度。当你在计算图中执行反向传播时,这些梯度会通过计算图回传,以便更新模型参数。

如何计算梯度

PyTorch 的 autograd 模块提供了多种方法来计算梯度。最常用的是 backward() 方法。当你在计算图中执行 backward() 方法时,梯度会通过计算图回传,并在每个 Variable 中累积。

例如,以下代码演示了如何使用 backward() 方法计算损失函数相对于模型参数的梯度:

import torch

# 定义模型
model = torch.nn.Linear(10, 1)

# 定义损失函数
loss_fn = torch.nn.MSELoss()

# 定义输入数据
input_data = torch.randn(10, 10)

# 定义目标数据
target_data = torch.randn(10, 1)

# 前向传播
output_data = model(input_data)

# 计算损失
loss = loss_fn(output_data, target_data)

# 反向传播
loss.backward()

# 获取梯度
grads = [param.grad for param in model.parameters()]

# 更新参数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.step()

在上面的代码中,backward() 方法会计算损失函数相对于模型参数的梯度,并将这些梯度累积在模型参数的 grad 属性中。然后,optimizer.step() 方法会使用这些梯度更新模型参数。

结语

PyTorch 的 autograd 模块为深度学习提供了强大而直观的计算工具。它允许你自动计算梯度,并在反向传播过程中轻松更新模型参数。在本文中,我们探讨了 autograd 的原理及其在机器学习中的应用,并通过一些示例代码来了解如何使用 autograd 构建和训练深度学习模型。

在下一篇文章中,我们将继续探讨 autograd 的其他功能,并介绍如何使用 autograd 来解决更复杂的机器学习问题。