Skip to content

Theano - 共享变量

现代深度学习框架 - 参数和状态

Section titled “现代深度学习框架 - 参数和状态”

在深度学习中,模型包含需要在训练期间更新并在不同的函数调用或训练批次之间保持持久的参数(通常称为权重和偏置)。例如,训练神经网络时,权重矩阵会根据计算出的梯度进行迭代调整。这些参数在整个训练过程中必须是可访问和可修改的。

现代框架如 PyTorch 和 TensorFlow 提供了高效处理这种状态的机制。与较旧的 Theano 库中特定的“共享变量”构造不同,参数通常表示为张量(Tensor),并被特别标记为需要计算梯度。这些框架还自动处理将这些张量移动到加速器(如 GPU)上(如果可用),显著加速计算。

在 PyTorch 中,可学习参数通常是 torch.nn.Parameter 的实例,它是 torch.Tensor 的子类。当作为属性赋值给 torch.nn.Module 时,它们会自动注册为模型参数并跟踪梯度计算。

或者,你可以创建一个标准张量,并在创建时使用 requires_grad=True 参数显式声明它需要梯度。这对于自动微分(autograd)至关重要。

import torch
# 创建一个代表参数(例如权重)的张量
# requires_grad=True 表示在反向传播期间我们需要计算此张量的梯度
W = torch.tensor([0.1, 0.25, 0.15, 0.3], requires_grad=True)
# 对于模型中的参数,通常更推荐使用 torch.nn.Parameter:
# W_param = torch.nn.Parameter(torch.tensor([0.1, 0.25, 0.15, 0.3]))

你可以使用张量的 .data 属性直接访问其数据。修改张量的数据可以原地完成。在训练期间,参数更新通常由优化器(如 SGD 或 Adam)处理,优化器根据计算出的梯度修改参数。

import torch
# 初始参数张量
W = torch.tensor([0.1, 0.25, 0.15, 0.3], requires_grad=True)
print("Original W:", W)
print("Original W data:", W.data)
# 检查梯度状态
print("Requires gradient?", W.requires_grad)
# 原地修改张量的数据
new_values = torch.tensor([0.5, 0.2, 0.4, 0.2])
with torch.no_grad(): # 手动更新时禁用梯度跟踪
W.data[:] = new_values
print("\nSetting new values (0.5, 0.2, 0.4, 0.2)")
print("After modification W:", W)
print("After modification W data:", W.data)
# 注意:在典型的训练循环中,更新是通过优化器完成的:
# optimizer.step() # 这会根据 W.grad 更新 W

torch.no_grad() 上下文管理器在此处用于执行手动、原地的更新时暂时禁用梯度计算。这阻止了这些操作被 autograd 引擎跟踪,这通常是直接参数操作(在标准优化步骤之外)所期望的。

现代框架使得利用 GPU 变得容易。在 PyTorch 中,你可以使用 .to() 方法将张量(包括参数)移动到特定设备(如启用 CUDA 的 GPU)。

# 检查 CUDA(GPU 支持)是否可用
if torch.cuda.is_available():
device = torch.device("cuda")
else:
device = torch.device("cpu")
print(f"Using device: {device}")
# 将张量 W 移动到选定的设备
W_gpu = W.to(device)
print("W 所在的设备:", W_gpu.device)
# 涉及 W_gpu 的操作现在将在 GPU 上运行(如果可用)

与硬件加速器的无缝集成是现代深度学习库的关键优势,它使得在海量数据集上训练大型模型成为可能。