一、原文出处
2.5.2. 非标量变量的反向传播
当
y
不是标量时,向量y
关于向量x
的导数的最自然解释是一个矩阵。 对于高阶和高维的y
和x
,求导的结果可以是一个高阶张量。然而,虽然这些更奇特的对象确实出现在高级机器学习中(包括深度学习中), 但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。 这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。
# x:tensor([0., 1., 2., 3.])
# 对非标量调用backward需要传入一个gradient参数,该参数指定微分函数关于self的梯度。
# 本例只想求偏导数的和,所以传递一个1的梯度是合适的
x.grad.zero_()
y = x * x
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
x.grad
二、解释
上述x.grad求出梯度是:
tensor([0., 2., 4., 6.])y.sum() = x1*x1 + x2*x2 + x3*x3 + x4*x4
分别对上述变量xi求偏导数,结果是tensor([2*x1, 2*x2, 2*x3, 2*x4])
故由x的初始值可知最终结果为tensor([0., 2., 4., 6.])
如有错误欢迎大佬指出~