torch.autograd提供了实现自动计算任意标量值函数的类别核函数,需要手动修改现有代码(需要重新定义需要计算梯度Tensor,加上关键词requires_grad=True)。本文更新于2019.06.12。
文章目录
torch.autograd.backward

torch.autograd.grad

局部梯度计算失效(Locally disabling gradient computation)
torch.autograd.no_grad

torch.autograd.enable_grad

torch.autograd.set_grad_enabled(mode)

In-place张量操作
在autograd中支持原位操作是很难的,PyTorch也不建议大家在大多数情况下使用这些操作。autograd的缓冲区冻结和再利用策略使其非常高效,因此极少数情况下才会为了减少内存使用而进行原位操作。除非任务内存消耗非常巨大,否则绝不要使用它们。
In-place正确性检查
所有张量都会跟踪发生在其上面的原位操作,如果检查到某个张量被保存下来用于某个函数的反向传播,但是后面它又被原位修改了,再反向传播开始的时候就会报错。这也确保了,如果你调用了原位函数而没有看见错误的情况下,所有梯度的计算应该都是正确的。
Variable(弃用)

Variable API已经被弃用了,即在调用tensor的autograd中,不再必需Variables。Autograd自动支持requires_grad为真的张量。下面给出了具体的修改:
Variable(tensor)和Variable(tensor, requires_grad仍在使用,但是其返回Tensor而不是Variable。var.data与tensor.data是同一个东西。- 诸如
var.backward()、var.detach()、var.register_hook()等操作现在都被移到张量上,方法名称相同。
此外,用户也可以利用创建requires_grad=True的张量来调用factory methods, 比如torch.randn()、torch.zeros()、torch.ones等,用法类似:
autograd_tensor = torch.randn((2,3,4),requires_grad=True)
Tensor autograd functions
torch.Tesnor

backward

detach

detach_

grad

is_leaf

register_hook

requires_grad

retain_grad

Function

backward

forward

Numerical gradient checking
torch.autograd.gradcheck


torch.autograd.gradgradcheck


Profiler(分析工具)
autograd包含了一个分析器,可以观察模型中不同操作子的损失(CPU和GPU上的)。目前有两种实现模式:只支持CPU的profile和基于nvprof的(CPU和GPU上都注册了)emit_nvtx。
torch.autograd.profiler.profile

export_chrome_trace

key_averages

self_cpu_times_total

table

total_average

torch.autograd.profiler.emit_vntx

前向-反向相关
在查看用Nividia Visual Profiler中的emit_nvtx创建的profile时,将反向传播操作和左营的前向传播操作联系起来有时是很困难的。为了使这个任务更容易,emit_nvtx通过级联数字信息来排序其生成物。
在正向传播过程中,每个函数范围用seq=<N>装饰,每增加一个反向函数目标就给反向传播存储一个。因此,seq-<N>标注关系每个前向传播的函数范围,从而告诉用户一个反向传播的目标是否是由前向传播函数创建的。反向传播目标接收个数为N的序列。在反向传播过程中,top-level…


双反向

torch.autograd.profiler.load_nvprof

Anomaly detection(异常检测)
torch.autograd.detect_anomaly



torch.autograd.set_detect_anomaly

更多内容,欢迎加入星球讨论。


本文深入探讨PyTorch的自动微分模块torch.autograd,解析如何在神经网络训练中自动计算梯度,包括局部梯度计算的启用与禁用、原位张量操作的正确性检查及Variable API的弃用等内容。

被折叠的 条评论
为什么被折叠?



