autograd

autograd反向自动微分系统(reverse automatic differentiation system)。从概念上讲,autograd 会生成一个图形,记录在执行操作时创建数据的所有操作,并提供一个有向无环图,其叶子是输入张量,根是输出张量。通过从根到叶跟踪此图可以由链式法则自动计算梯度
在内部,autograd将这个图表示为一个Function对象图(实际上是表达式),它可以被apply()以计算图的结果。前向传递时,进行autograd的同时会执行所请求的计算,并构建一个图形来表示计算梯度的函数。当前向传递完成后,我们在后向传递中评估该图以计算梯度。

requires_grad

requires_grad是Tensor的一个属性,用于说明当前量是否需要在计算中保留对应的梯度信息

  • 在前向传递期间,只有在输入张量至少有一个需要grad时,才会将操作记录在后向图中。
  • 在后向传递(.backward())期间,只有具有requires_grad=True的叶子节点才会将梯度累积到.grad场中。

pytorch中,叶子节点用来进行优化的变量,所以只有在requires_grad=True的时候才有讨论的意义。只有生成的张量才能是叶子节点,只要经过了运算,就不是叶子节点了。
要冻结模型的某些部分,只需应用.requires_grad_(False)到不想更新的参数即可。

grad_fn

grad_fn:指向一个Function对象,这个Function用来反向传播计算输入的梯度。

PyTorch会自动追踪和记录对与张量的所有操作,当计算完成后调用**.backward()**方法自动计算梯度并且将计算结果保存到grad属性中。

在张量进行操作后,grad_fn就会被赋予一个新的函数,这个函数引用了一个创建了这个Tensor类的Function对象。
Tensor和Function互相连接生成了一个非循环图,它记录并且编码了完整的计算历史
每个张量都有一个.grad_fn属性,如果这个张量是用户手动创建的,那么这个张量的grad_fnNone