AD 是计算机代码每一行的符号区分。但更有用的是,因为它为您提供了另一个计算机代码,您不必自己重新编码导数。
如果您有一些奇特的函数,其导数对于您使用的 AD 工具来说是未知的,那么它当然不能给您答案。
如果你有一个显式的函数,那么符号差异总是可以完成的,但是如果你有一个复杂的表达式,就会变得笨拙/繁琐/容易出错,就像其他人在上面给出的例子一样。
不连续函数也将通过单边导数由 AD 微分。
例如f(x)=max(x,0)可以在代码中实现为
f(x)={0xx≤0x>0
然后 AD 将给出导数为
f′(x)={01x≤0x>0
因此,即使代码中存在分支,也可以写下一个潜在的符号导数。
一个更复杂的例子是一个隐式函数
F(x,a)=0,y=G(x)
在哪里F被实现为计算机代码。在这里,您可能无法写出明确的公式dy/da? 因为没有明确的公式x=x(a). 甚至 AD 也不能在这里给你导数,因为它不知道函数x=x(a). 在实践中,我们得到一个近似值x说xh通过应用一些牛顿方法。
xh=F−1h(a),yh=G(xh)
在哪里F−1h表示牛顿法。现在AD可以工作了,但它背后还有一个象征性的衍生物,但这是你自己不想写下来的东西。