在 PyTorch 里,梯度的计算是通过 自动求导机制(autograd) 实现的,底层用的是反向传播(Backpropagation) 和 链式法则。
1. 数学原理
假设我们有一个简单的线性神经网络(单层):
损失函数
其中
梯度计算的核心是 链式法则:
如果更复杂的网络:
梯度公式会通过链式法则分解:
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.)
过程:
- 前向:
- 求导:
- 当
,梯度是 - 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)
手动计算:
当
PyTorch 输出也是 tensor(28.)
。
5. 神经网络里的梯度
在神经网络中:
前向传播计算
计算损失
调用
loss.backward()
自动计算每个参数的 优化器(SGD、Adam)用梯度更新参数:
pythonW = W - lr * W.grad
📌 总结:
- PyTorch 梯度计算用的是自动求导(autograd)
- 底层原理是链式法则 + 反向传播
- 每个
tensor
如果requires_grad=True
就会在计算图里跟踪运算步骤 .backward()
会自动沿计算图反向求导并把结果存到.grad