pytorch的backward函数用法

首先看一个简单的程式:

import torch

x = torch.tensor([3, 2], dtype=torch.float32, requires_grad=True)
y = x ** 2
out = y.mean()

out.backward()
print(x.grad)

输出的结果是:tensor([3., 2.])

为什么是这个呢?简单的求导一下就容易理解了。

\large \frac{\partial out}{\partial y_i} = 1/2 ,\qquad \frac{\partial y_i}{\partial x_i} = 2*x_i,\qquad \frac{\partial out}{\partial x_i} = x_i

所以,按照这样一个思路求导下来的结果,out对x的梯度,就是x的值。

backward还可以传一个参数。

在上面的程式中,默认传的是1,也就是相当于:

out.backward(torch.tensor(1.))

那么要是换成别的数,会有什么变化呢?

加入换成2.5,变成这样:

out.backward(torch.tensor(2.5))

输出的结果就变成了:tensor([7.5000, 5.0000])

可以大胆的猜测一下,就是原始的结果乘了2.5倍。也确实是这样,换成其他数值也是一样的效果。

这里这个参数就相当于loss的权重了,会对求导的结果乘上这样一个权重。

这里还体现不出这个参数的用处,稍微改一下程式:

import torch

x = torch.tensor([3, 2], dtype=torch.float32, requires_grad=True)
out = x ** 2

out.backward()
print(x.grad)

大胆的猜测一下结果会是什么?还是tensor([3., 2.])么?

不会了,因为这个程序会报错!

如果结果是一个标量(即它包含一个元素的数据),则不需要为 backward() 指定任何参数,但是如果它有更多的元素,则需要指定一个 gradient 参数,该参数是形状匹配的张量。

这里的out应该是tensor([9., 4.], grad_fn=),按照我们第一次的程式的思路,其实可以传入一个:

torch.tensor([0.5, 0.5])

即:

out.backward(torch.tensor([0.5, 0.5]))

就相当于对out做了一次 mean() 操作,结果就会和第一个程式一样。

这里的[0.5, 0.5]就相当于是对两个loss分别进行了加权,因为可能不同值的梯度对结果影响程度不同,所以pytorch设置了这样一个参数接口,没有设置为全是1的固定值。

你可能感兴趣的:(pytroch)