自动微分
1. 什么是自动微分?
自动微分
是深度学习中一个核心的概念,它允许我们高效地计算函数的导数。相较于数值微分和符号微分,自动微分能够在计算图中精确地得到导数,并且计算效率高。
在 PyTorch 中,自动微分是通过 torch.autograd
模块实现的。
2. PyTorch 中的张量和梯度
在 PyTorch 中,张量
是基本的数据结构,它与 NumPy 数组非常相似,但有额外的功能,比如支持 GPU 加速和自动微分。
当你创建一个张量时,可以通过设置 requires_grad=True
来指示 PyTorch 需要计算该张量的梯度。
1 | import torch |
3. 前向传播与计算图
在进行前向传播时,PyTorch 会根据张量的操作创建一个 计算图
。每个操作(如加法、乘法)都会记录在计算图中,以便后续的反向传播计算梯度。
1 | # 定义一个简单的计算 |
4. 反向传播
一旦得到了结果,就可以通过调用 .backward()
方法来执行反向传播,从而计算要求张量的梯度。
1 | # 执行反向传播 |
在上面的情况下,y = x^2 + 3x + 1
的导数是 2*x + 3
。当 x=2
时,导数 dy/dx
的值为 2*2 + 3 = 7
。
5. 多个参数的梯度计算
当模型有多个参数时,自动微分依然可以方便地计算梯度。例如,考虑两个张量:
1 | # 创建两个张量 |
进行反向传播后,可以分别获取 a
和 b
的梯度:
1 | # 执行反向传播 |
6. 清空梯度
在训练神经网络时,每次反向传播都会累加梯度,因此在每次优化步骤之前,需清空梯度。使用 optimizer.zero_grad()
来清空模型参数的梯度。
1 | # 假设我们在使用一个优化器 |
7. 取消梯度跟踪
在某些情况下,我们不希望 PyTorch 跟踪梯度,这可以通过 torch.no_grad()
或者使用 with torch.no_grad():
上下文管理器来实现,常用于推断阶段。
1 | with torch.no_grad(): |
8. 示例:简单的线性回归
下面是一个使用 PyTorch 自动微分进行线性回归的简化示例。
1 | import torch |
在这个示例中,我们进行了线性回归的训练,通过自动微分计算梯度并更新参数。
9. 总结
自动微分
是使用 PyTorch
进行深度学习的重要工具,它简化了复杂的梯度计算过程,使得研究者和开发者能够集中精力构建和训练模型。掌握自动微分是深入理解和使用 PyTorch 的基础。