一、AutoGrad(自动微分)
对于y=2xTx关于列向量x求导。
import torch
x.torch.arange(4.0)
x.requires_grad(True)
# 等价于x=torch.arange(4.0,requires_grad=True)
x.grad #默认为None
一:x.requires_grad(True)
当我们创建一个张量(tensor)的时候,如果没有特殊指定,那么这个张量一般是不会做求导的,当我们需要对这个张量进行求导的时候,就会用参数requires_grad=True去做一个标记。让计算机知道这个张量需要进行求导。
而我们知道,在张量的计算过程中,如果所有的输入中有一个输入需要求导,那么这个输出就需要求导(链式求导法则的传递性,方便反向链式用于梯度下降以及正向求导过程)。
那么什么时候不需要求导呢?有且仅有当所有的输入都不需要求导的时候,那么这个输出结果就不需要求导了。(最简单的例子就是y=wTx+b,当x需要求导的时候,那么显然由链式求导法则有y也需要求导。)
那么这里又涉及到了一个叶子节点的问题,我们知道当张量需要求导的时候,pytorch会构建一个计算图(有向无环图DAG,包含两种节点,张量节点和操作节点)。那么叶子节点就是计算图中的起始节点。
叶子节点是那些由用户自己创建的张量,而不是通过计算得到的,他的参数requires_grad会默认为False。
1.所有requires_grad属性为false的节点都会被认为是叶子节点。
2.如果一个tensor的requires_grad=True。但是这个tensor是用户自己创建的那么它仍然是叶子结点。
>>> a = torch.rand(10, requires_grad=True)
>>> a.is_leaf
True
#虽然a的requires_grad属性为True,但是该tensor是用户调用rand自行创建的
>>> b = torch.rand(10, requires_grad=False)
>>> b.is_leaf
True
# requires_grad属性为False,故为叶子结点
>>> c = torch.rand(10, requires_grad=True) + 2
>>> c.is_leaf
False
# c是计算结果,计算结果不是叶子节点
>>> b=torch.rand(10,requires_grad=False) + 2
>>> b.is_leaf
True
# 虽然b是计算结果,但是他的requries_grad属性为False,故它还是叶子节点
在进行反向传播求导的时候,pytorch会从叶子节点开始进行计算梯度,根据各节点之间的依赖关系去跟随链式计算其他各节点的梯度。
二、is_leaf
当一个张量tensor的is_leaf属性为False的时候,说明这个张量是一个叶子节点。
叶子节点的作用:
当requires_grad=True的时候,pytorch会自动计算运算过程,缓存中间的运算参数,为Autograd做准备。
但当一个tensor的is_leaf和requires_grad都为True的时候,才能获得这个张量节点的导数值。
所有requires_grad
为False的张量都是叶子节点。
三、Autograd的机制
x.data: 存了tensor的data,即保存着张量的数值;
x.grad: 当计算梯度的时候,会在此保存该张量对应情况下的梯度值;
x.grad_fn:指向用于backward的函数的节点(None表示不存在导数,否则会指明导数);
x.is_leaf 判断是否是叶节点;
x.requires_grad:如果是设为True,那么在做backward时候将作为反馈的一部分参与backwards运算,如果为False则不参加backwards运算;
简介:
1.tensor
torch.tensor 是这个包的核心类,若设置他的属性requires_grad为True,那么它将追踪对于该张量的所有操作,当完成计算之后可以通过调用.backword(),来自动计算所有梯度,而这个张量的所有梯度将会自动累加到.grad属性中保存。