我很好奇想知道,PyTorch是如何在张量上跟踪操作的(在.requires_grad
被设置为True
之后),以及它是如何后来自动计算梯度的。请帮助我理解autograd
背后的原理。谢谢。
回答:
这是一个很好的问题!一般来说,自动微分(AutoDiff
)的思想是基于多变量链式法则,即。
这意味着你可以通过一个“代理”变量y来表达x相对于z的导数;实际上,这允许你将几乎任何操作分解为一系列更简单(或原子)的操作,这些操作随后可以“链接”在一起。
现在,像Autograd
这样的AutoDiff
包所做的事情,就是简单地存储这种原子操作块的导数,例如除法、乘法等。然后,在运行时,你提供的前向传递公式(由多个这样的块组成)可以很容易地转换为精确的导数。同样,如果你认为AutoDiff没有完全按你的意愿工作,你也可以为自己的操作提供导数。
AutoDiff相对于像有限差分这样的导数近似方法的优势在于,这是一个精确的解决方案。
如果你对其内部工作原理更感兴趣,我强烈推荐AutoDidact项目,该项目旨在简化自动微分器的内部结构,因为通常还涉及大量的代码优化。此外,我参加的一个讲座的幻灯片对理解也非常有帮助。