Python pytorch如何计算简单函数的导数?

Python pytorch如何计算简单函数的导数?,python,pytorch,autodiff,Python,Pytorch,Autodiff,当我们讨论Pytork中的自微分时,通常会根据张量的公式给出一个张量的图形结构,Pytork将通过使用链规则跟踪图形树来计算梯度。但是,我想知道叶节点会发生什么?pytorch是用解析导数硬编码一整套基本函数,还是用数值方法计算梯度?一个简单的例子: 导入火炬 def f(x): 返回x**2 x=火炬。张量([1.0],需要_grad=True) y=f(x) y、 向后() 打印(x.grad)#2.0 在本例中,pytorch是通过$$(x^2)'=2x=2*1=2$$计算导数,还是以类

当我们讨论Pytork中的自微分时,通常会根据张量的公式给出一个张量的图形结构,Pytork将通过使用链规则跟踪图形树来计算梯度。但是,我想知道叶节点会发生什么?pytorch是用解析导数硬编码一整套基本函数,还是用数值方法计算梯度?一个简单的例子:

导入火炬
def f(x):
返回x**2
x=火炬。张量([1.0],需要_grad=True)
y=f(x)
y、 向后()
打印(x.grad)#2.0
在本例中,pytorch是通过$$(x^2)'=2x=2*1=2$$计算导数,还是以类似于$$(1.00001^2-1^2)/(1.000001-1)~2$$的方式计算导数

谢谢

有关确切答案,请参见本节,特别是第2.1节或图2

简而言之,PyTorch有一系列基本函数及其导数的表达式。因此,在您的案例(y=xx)中所做的是计算$$y'=2x$$


你提到的数值方法叫做数值微分或有限差分,它是导数的近似值。但这不是Pytork所做的。

第一个。请参阅
autograd
(pytorch的自动差异化后端)。我一直想通过这些和这些,还有这个…你提到的第二种方法对于更深层次的网络可能不是一个好主意,因为你会遇到大量的浮点错误,我认为这类似于消失梯度问题,但更糟糕。因此,pytorch的开发人员必须硬编码许多简单函数的导数?对于
f(x)=x**2
,您可以使用规则。像Maple(甚至)这样的CA允许您对函数R->R^n进行符号微分。你是怎么做的?你会使用你记忆的规则表吗?或者你用ε和delta的复杂参数?(我想知道如果情况也能处理这些……)对于RoM-S> R^ n,AutoDIFF处理,我们也可以有一个。这里,可能是因为性能原因而在C++中硬编码的。