Skip to content

在 PyTorch 里,梯度的计算是通过 自动求导机制(autograd) 实现的,底层用的是反向传播(Backpropagation)链式法则

1. 数学原理

假设我们有一个简单的线性神经网络(单层):

y=Wx+b

损失函数 L(比如均方误差)为:

L=frac12(yt)2

其中 t 是目标值。

梯度计算的核心是 链式法则

fracpartialLpartialW=fracpartialLpartialycdotfracpartialypartialW

如果更复杂的网络:

xtoh1toh2todotstoL

梯度公式会通过链式法则分解:

fracpartialLpartialx=fracpartialLpartialhncdotfracpartialhnpartialhn1cdotsfracpartialh1partialx

2. PyTorch 的计算方式

PyTorch 在做前向计算时,会构建一张计算图(Computational Graph)

  • 每个张量(tensor)会记录它是怎么计算来的(operation)
  • 如果 tensor.requires_grad=True,PyTorch 会在计算图里为它保留求导信息
  • 反向传播时 .backward() 会沿着图反向计算梯度

3. 例子

我们用一个最简单的例子看看 PyTorch 如何算梯度:

python
import torch

# 创建输入,要求梯度
x = torch.tensor(2.0, requires_grad=True)

# 定义一个简单的计算 y = x^2
y = x ** 2

# 反向传播
y.backward()

# 查看梯度 dy/dx = 2x = 4
print(x.grad)  # tensor(4.)

过程:

  1. 前向:y=x2
  2. 求导:fracdydx=2x
  3. x=2,梯度是 4
  4. PyTorch 自动完成了求导

4. 稍微复杂一点(链式法则验证)

python
x = torch.tensor(3.0, requires_grad=True)

# y = (2x + 1)^2
y = (2*x + 1)**2

y.backward()
print(x.grad)

手动计算:

y=(2x+1)2fracdydx=2(2x+1)cdot2=4(2x+1)

x=3

fracdydx=4cdot(7)=28

PyTorch 输出也是 tensor(28.)


5. 神经网络里的梯度

在神经网络中:

  • 前向传播计算 y=f(x;W)

  • 计算损失 L(y,t)

  • 调用 loss.backward() 自动计算每个参数 WfracpartialLpartialW

  • 优化器(SGD、Adam)用梯度更新参数:

    python
    W = W - lr * W.grad

📌 总结

  • PyTorch 梯度计算用的是自动求导(autograd)
  • 底层原理是链式法则 + 反向传播
  • 每个 tensor 如果 requires_grad=True 就会在计算图里跟踪运算步骤
  • .backward() 会自动沿计算图反向求导并把结果存到 .grad