计算图(Computation Graph)是现代深度学习框架如PyTorch和TensorFlow等的核心,其为高效自动求导算法——反向传播(Back Propogation)提供了理论支持。
一、自动求导(Autograd)
Autograd 是反向传播(Back propagation)中运用的自动微分系统。 从概念上来说,autograd 会记录一张有向无环图(Directed acyclic graph),这张图在所有创建新数据的操作被执行时记录下这些操作。图的叶子(leaves)是输入张量,根(root)是输出张量。 通过从根到叶追踪这张图,可以使用链式法则自动计算梯度。
在内部,这张有向无环图的结点都是Function
对象(实际上是表达式),可以通过apply()
来计算对图求值的结果。在正向传播中,Autograd 在计算正向传播结果的同时,构建了这张由Function
组成的有向无环图来以便进行反向传播(torch.Tensor
的.grad_fn
属性就是这张图的入口点)。在正向传播计算完成以后,我们就可以追踪这张图来执行反向传播,计算出梯度。
需要注意是,Autograd在每一次迭代中都会从头创建这章计算图,这也正是可以对任意Python控制流进行梯度计算的原因。图的整体形状和大小在每次迭代中都可以被更改。此外,在训练之前不要对所有可能的路径进行编码,每次迭代中实际运行的部分就是纳入梯度计算的部分。
二、.detach().numpy()
在PyTorch中,当使用autograd跟踪张量的操作历史时,有时需要从计算图中分离张量以进行进一步的计算。在这种情况下,可以使用detach()方法来创建一个新的张量,返回一个新的tensor,新的tensor和原tensor共享数据内存(修改一个tensor的值,另外一个也会改变),但不再与计算图相关联,不涉及梯度计算。
在从tensor转换成为numpy的时候,如果转换前面的tensor在计算图里面(requires_grad = True),那么这个时候只能先进行detach操作才能转换成为numpy。