自动微分(反向传播)的数学原理 + PyTorch 的梯度计算逻辑

部署运行你感兴趣的模型镜像

例:下列x.grad的值是如何计算的?

>>> x = torch.arange(4.0)
>>> x
tensor([0., 1., 2., 3.])
>>> x.requires_grad_(True)
tensor([0., 1., 2., 3.], requires_grad=True)
>>> x.grad
>>> y = 2 * torch.dot(x, x)
>>> y
tensor(28., grad_fn=<MulBackward0>)
>>> y.backward()
>>> x.grad
tensor([ 0.,  4.,  8., 12.])

解析:

要理解 x.grad 的计算结果,核心是自动微分(反向传播)的数学原理 + PyTorch的梯度计算逻辑,下面分步骤拆解:

步骤1:明确变量关系与数学表达式

首先梳理代码中的变量定义:

  • x 是张量 [0., 1., 2., 3.],且开启了梯度追踪(requires_grad=True);
  • y = 2 * torch.dot(x, x)torch.dot(x, x) 是向量内积(点积),数学上等价于 x02+x12+x22+x32x_0^2 + x_1^2 + x_2^2 + x_3^2x02+x12+x22+x32,因此:
    y=2×(x02+x12+x22+x32) y = 2 \times (x_0^2 + x_1^2 + x_2^2 + x_3^2) y=2×(x02+x12+x22+x32)

步骤2:梯度的数学定义(偏导数)

x.grad 存储的是 y 对 x 每个元素的偏导数∂y∂xi\frac{\partial y}{\partial x_i}xiy),这是反向传播的核心。

先对 yyy 求关于 xix_ixi 的偏导数:
∂y∂xi=∂∂xi[2×(x02+x12+x22+x32)]=2×2xi=4xi \frac{\partial y}{\partial x_i} = \frac{\partial}{\partial x_i} \left[ 2 \times (x_0^2 + x_1^2 + x_2^2 + x_3^2) \right] = 2 \times 2x_i = 4x_i xiy=xi[2×(x02+x12+x22+x32)]=2×2xi=4xi

步骤3:代入x的具体值计算梯度

根据上面的偏导数公式 ∂y∂xi=4xi\frac{\partial y}{\partial x_i} = 4x_ixiy=4xi,代入 xxx 的每个元素:

xix_ixi∂y∂xi=4xi\frac{\partial y}{\partial x_i} = 4x_ixiy=4xi对应 x.grad 结果
x0=0x_0=0x0=04×0=04 \times 0 = 04×0=00.0
x1=1x_1=1x1=14×1=44 \times 1 = 44×1=44.0
x2=2x_2=2x2=24×2=84 \times 2 = 84×2=88.0
x3=3x_3=3x3=34×3=124 \times 3 = 124×3=1212.0

最终得到 x.grad = tensor([0., 4., 8., 12.]),和代码运行结果完全一致。

补充:PyTorch的计算逻辑验证

  1. torch.dot(x, x) 的梯度:
    点积 x⋅x=∑i=03xi2x \cdot x = \sum_{i=0}^3 x_i^2xx=i=03xi2,其对 xix_ixi 的偏导数是 2xi2x_i2xi
  2. 乘以系数2后的梯度:
    y=2×(x⋅x)y = 2 \times (x \cdot x)y=2×(xx),根据导数的“常数倍法则”,梯度也会乘以2,即 2×2xi=4xi2 \times 2x_i = 4x_i2×2xi=4xi
  3. y.backward() 的作用:
    触发反向传播,从 y 开始,沿着计算图(MulBackward0DotBackward)回溯,将每个 xix_ixi 的梯度计算结果存入 x.grad

关键总结

x.grad 的值本质是标量 y 对张量 x 每个元素的偏导数,计算过程遵循基本的微分法则(幂函数求导、常数倍法则),PyTorch只是自动完成了这一数学计算并将结果存入 x.grad 属性中。

您可能感兴趣的与本文相关的镜像

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值