02-05自动微分

2.5 自动微分

1. 一个简单的例子

import torch

x = torch.arange(4.0)
y = 2 * torch.dot(x, x)
y.backward()
x.grad

x.grad.zero_() # 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
y = x.sum()
y.backward()
x.grad

2. 分离计算

# y是作为x的函数计算的,而z则是作为y和x的函数计算的
x.grad.zero_()
y = x * x
u = y.detach() # 分离y来返回一个新变量u,该变量与y具有相同的值,但丢弃计算图中如何计算y的任何信息。换句话说,梯度不会向后流经u到x
z = u * x

z.sum().backward() # 计算z=u*x关于x的偏导数,同时将u作为常数处理,而不是计算z=x*x*x关于x的偏导数
x.grad == u

x.grad.zero_()
y.sum().backward()
x.grad == 2 * x
posted @ 2024-04-01 17:21  Hellofds  阅读(6)  评论(0编辑  收藏  举报