Autograd
AutoGrad简介

前言
没人能理解超过3维的张量空间
To deal with hyper-planes in a 14-dimensional space, visualize a 3-D space and say ‘fourteen’ to yourself very loudly. Everyone does it —Geoffrey Hinton
注意要点:
1.只有浮点数才能进行梯度传播

修改一下后

从概念上讲,autograd记录一个图,记录在您执行操作时创建数据的所有操作,从而为您提供一个有向无环图,其叶是输入张量,根是输出张量。通过从根到叶跟踪这个图,您可以使用链式法则自动计算梯度。
动态图长得啥样子?

重点解释

2.pytorch不允许tenosr 对 tensor 求导
求导时都是 标量 对 Tensor进行求导。因此如果根节点是向量,就需要配个权重,然后求和变成标量,然后再反向传播梯度。
3. pytroch中会对叶子节点和require_grad=True的节点存储.grad
假设计算图如下

反向传播

绿色是叶子节点
is_leaf is True and requires_grad == True 条件下
才会存储.grad
也可以自己定制:


require_grad
每个张量都有一个flag:requires_grad,允许从梯度计算中具体的排除某些子图,并可以提高效率。
输入变量中,只要有存在requires_grad = True的情况,那么输出变量的requires_grad 标志就为 True
>>> x = torch.randn(5, 5) # requires_grad=False by default 默认为 false
>>> y = torch.randn(5, 5) # requires_grad=False by default 默认为 false
>>> z = torch.randn((5, 5), requires_grad=True)
>>> a = x + y
>>> a.requires_grad
False
>>> b = a + z
>>> b.requires_grad
True

requires_grad的具体用处(模型中)
model.parameters()返回的是生成器generator
>>> model.parameters()
<generator object Module.parameters at 0x000001FC903EA728>
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
param.requires_grad = False
# Replace the last fully-connected layer替换最后一层全连接层
# Parameters of newly constructed modules have requires_grad=True by default 整个新的模型仍然是requires_grad = True
model.fc = nn.Linear(512, 100)
# Optimize only the classifier 优化器更新分类器参数
optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
注意param是一种class

param具体啥样?


还有个named_parameters()方法
list(model.named_parameters())

另外例子:
>>> bn = torch.nn.BatchNorm1d(3, track_running_stats=True)
>>> list(bn.named_parameters())
[('weight', Parameter containing: tensor([1., 1., 1.], requires_grad=True)),
('bias', Parameter containing: tensor([0., 0., 0.], requires_grad=True))]
>>> list(bn.named_buffers())
[('running_mean', tensor([0., 0., 0.])),
('running_var', tensor([1., 1., 1.])),
('num_batches_tracked', tensor(0))]
>>> bn.state_dict()
OrderedDict([('weight', tensor([1., 1., 1.])),
('bias', tensor([0., 0., 0.])),
('running_mean', tensor([0., 0., 0.])),
('running_var', tensor([1., 1., 1.])),
('num_batches_tracked', tensor(0))])
state_dict()得到的是OrderedDict顺序字典
model.state_dict()

有哪些方法?
dir(param)

如何自定义函数,以及前向后向传播?
1 exp函数

2 linear function

3 ReLu

重要一点是,图是在每次 迭代 时重新创建,这正是允许使用任意Python控制流语句的原因.
AutoGrad尽量不要使用inplace的操作



本文深入探讨了PyTorch的自动求导机制AutoGrad,包括其工作原理、关键特性及注意事项,例如浮点数的梯度传播、动态计算图的创建等,并介绍了如何在模型训练中利用AutoGrad提升效率。
1300





