import torch
x = torch.arange(4.0)
x.requires_grad_(True)
y=2*torch.dot(x,x)
y.backward()
print(x.grad)
首先创建了一个从0到3(包含)的浮点数张量x
,并将其requires_grad
属性设置为True
,表明我们打算对这个张量执行反向传播来计算梯度。
接着,计算y
,它是x
与自身的点积(内积),然后乘以2:
y = 2 * torch.dot(x, x)
torch.dot(x, x)
本质上是计算x
的每个元素与其自身一一对应相乘后求和,然后再将结果乘以2。假设x = [0, 1, 2, 3]
,则:
torch.dot(x, x)
=(0*0 + 1*1 + 2*2 + 3*3)
- 所以,
y = 2 * (0*0 + 1*1 + 2*2 + 3*3)
。
接下来,执行y.backward()
进行反向传播。因为y
是关于x
的标量输出,所以计算的是y
关于x
各元素的梯度。
对于y = 2 * x1^2 + 2 * x2^2 + 2 * x3^2 + 2 * x4^2
,对其求导得:
dy/dx1 = 4 * x1
dy/dx2 = 4 * x2
dy/dx3 = 4 * x3
dy/dx4 = 4 * x4
执行y.backward()
后,x.grad
将存储这些梯度,即x
各元素的四倍。对于给定的x
,其梯度将是[0., 4., 8., 12.]
。