一个是向量另外一个是标量,求导之后还是向量;
一个是向量硬外一个是向量,求导之后变为矩阵。
BP算法
由此可见反向很耗费资源,因为需要储存中间结果
import torch
x = torch.arange(4.0)
x
→ tensor([0., 1., 2., 3.])
//在我们计算 y 关于 x 的梯度之前,我们需要一个地方来存储梯度。
重要的是,我们不会在每次对一个参数求导时都分配新的内存。
因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。
x.requires_grad_(True)
# 等价于x=torch.arange(4.0,requires_grad=True)
# require_grad_()方法的主要使用场景是告诉自动梯度机制开始记录追踪这个张量tensor的操作.
如果张量tensor的属性requires_grad=False(因为这个张量是从DataLoader中获得到的,或者这个张量需要
预处理或初始化),该张量执行tensor.requires_grad_()方法将会让自动梯度autograd开始跟踪并记录这个
张量上的运算操作.
x.grad
- x.requires_grad_(True) # 等价于x=torch.arange(4.0,requires_grad=True)
是因为担心更新相同的参数会重新分配内存。
所以这段代码的本质就是告诉电脑需要一个地方来储存梯度 -
y = 2 * torch.dot(x, x) y →tensor(28., grad_fn=<MulBackward0>) #告诉y是从x计算过来的
y.backward() #求导
x.grad #访问导数
→tensor([ 0., 4., 8., 12.])
-
在默认情况下,PyTorch会累积梯度,我们需要清除之前的值 x.grad.zero_() #下划线_表示重写内容,相当于把所有的梯度都用0代替 y = x.sum() y.backward() x.grad