Skip to content

PyTorch - 术语

本章介绍理解和使用 PyTorch 至关重要的基本术语 terminologies 和概念 concepts。

PyTorch Tensor 是一种多维数组 multi-dimensional array,概念上类似于 NumPy 的 ndarray。然而,Tensor 具有关键优势:它们可以移动到 GPU 上进行加速计算,并且是 PyTorch 自动微分引擎 Autograd 的基础。

虽然 Tensor 和 NumPy 数组通常可以相互转换(例如,torch.from_numpy(),tensor.numpy()),但在 PyTorch 生态系统内构建和训练神经网络时,PyTorch Tensor 至关重要。它们支持一套丰富的操作,与 NumPy 非常相似。

Autograd 是 PyTorch 的自动微分 automatic differentiation 引擎。当 Tensor 的 requires_grad 属性设为 True 时,PyTorch 开始跟踪在其上执行的所有操作。这种跟踪动态地构建了一个计算图 computational graph。

在完成前向传播 forward pass(从输入到输出的计算)后,对标量输出(例如 损失 loss)调用 .backward() 会自动计算该标量相对于所有 requires_grad=True 并对此有贡献的 Tensor 的梯度 gradients。这些梯度累积在其 .grad 属性中。此机制是通过反向传播 backpropagation 训练神经网络的基础。

之前,PyTorch 使用 Variable 包装器 wrapper 围绕 Tensor 来进行 autograd。现在这已弃用 deprecated;Tensor 本身直接处理所有 requires_grad 和梯度跟踪功能。

PyTorch 以其使用动态计算图 dynamic computational graphs(也称为“define-by-run”,即“运行即定义”)而闻名。这意味着表示模型计算的图在代码执行时即时构建。这提供了极大的灵活性,特别是对于结构根据输入数据而变化的模型(例如,处理变长序列的 RNN,或条件计算)。

这与旧版 TensorFlow 等框架形成对比,后者主要使用静态图 static graphs(“define-then-run”,即“先定义后运行”),其中整个图在执行前预先定义。虽然 TensorFlow 2.x 现在也默认使用 eager execution(动态图),但 PyTorch 的设计理念始终围绕这种动态特性,这使得它对于重视灵活性和易于调试的 Python 程序员和研究人员非常直观。

torch.optim 包提供了用于训练神经网络的各种优化算法 optimization algorithms 的实现。一旦使用 .backward() 计算出梯度,就使用优化器 optimizer 来更新模型的参数(权重 weights 和偏差 biases)。

常用的优化器包括随机梯度下降 (SGD)、Adam、RMSprop 等。你使用模型的参数和学习率 learning rate 初始化一个优化器,然后在 loss.backward() 后调用 optimizer.step() 来应用更新。关键在于每次调用 loss.backward() 之前都要调用 optimizer.zero_grad(),以清除来自前一次迭代的旧梯度。

PyTorch 支持各种形式的并行计算 parallelism。torch.multiprocessing 是 PyTorch 对 Python multiprocessing 模块的封装 wrapper。它通常用于通过使用多个 CPU 核心并行准备数据批次,同时 GPU 忙于模型计算来加速数据加载(例如,通过 DataLoader 的 num_workers 参数)。

对于模型训练,PyTorch 提供了 torch.nn.DataParallel 用于在单机上进行简单的多 GPU 训练(通过在不同 GPU 上分配批次),以及 torch.nn.parallel.DistributedDataParallel 用于更高级、更高效的多机分布式训练。这些是构建在 PyTorch 核心 Tensor 和 Autograd 功能之上的更高级工具。