自动区分确实会导致截断错误(kinda)

2021-02-09 20:27:35

在这篇博客文章中,我将向您展示一个看起来确实确实会导致截断错误的情况,尽管这种情况可以说是对该规则的误解,因此,这篇博客文章将重点介绍为什么需要对规则进行仔细的解释。将激发为什么我们需要经常向我们的AD系统添加更多自定义敏感度规则(自定义基元)的原因,即使您仅需几个基本规则就可以进行任何广告。

我们将从实现简单的转发模式AD开始,该实现基于ChainRules文档中的ForwardDiffZero,但没有ChainRules支持,尽管这也是曾经可以想到的最简单的大多数库存标准实现。

struct Dual&lt ;:数字primal :: Float64局部:: Float64 end primal(d :: Dual)= d。原始部分(d :: Dual)= d。部分原始(d :: Number)= d部分(d :: Number)= 0.0函数Base.:+(a :: Union {Dual,T},b :: Union {Dual,T})其中T my_sin(x [1]),[π/ 3,])1-元素向量{Float64}:0.4999999963909433 julia>纳布拉(Nabla)。 (my_sin)(π/ 3)(0.4999999963909433,)朱莉娅> Yota。毕业(my_sin,π/ 3)[2] [1] 0.4999999963909433 julia>合子梯度(my_sin,π/ 3)(0.4999999963909433,)朱莉娅>追踪器。渐变(my_sin,π/ 3)(0.4999999963909432(跟踪),)朱莉娅>酵素。 autodiff(my_sin,有效(π/ 3))0.4999999963909432

好的,我刚刚尝试了7种基于完全不同实现的AD系统,这意味着Enzyme是在LLVM级别运行的反向模式,与ForwardDiff完全不同,ForwardDiff是上面编码的正向模式运算符重载AD的更成熟的版本。我的结果表示同意,最多为1个ULP。我认为最后一位数字的更改可能与加法顺序有关(IEEE浮点运算很时髦),但这是另一篇博文,因此我认为我们可以可靠地说当要求以π/ 3的my_sin导数时,AD系统将输出什么。

为什么AD似乎会出现截断错误?为什么my_sin的派生精度比my_cos差很多?

AD系统(正如您可能已经推测的那样)不会发生截断错误,它正好为我们提供了我们所要求的东西,这是my_sin的派生词。 my_sin是一个多项式,该多项式的导数为:

d_my_sin是cos的低次多项式逼近度,而不是my_cos,因此精度较低。此外,您可以看到虽然sin的n导数始终定义为sin(x + n *π/ 2),多项式近似项的导数不断下降.AD使它变得越来越平滑,直到它只是一个平坦的0。

这里的关键是地图不是地域,计算机上大多数非平凡的函数都是作为某种函数实现的,该函数近似于(地图)数学理想值(地域),自动微分会返回该映射的完全准确的导数。函数(地图)进行近似。此外,对概念的近似(例如d_my_sin)的精确导数不如对理想(例如my_cos)的(理想)导数的精确度和近似.AD中所做的工作没有截断错误;但是在某种意义上存在截断错误,因为我们现在使用的是我们自己编写的截短近似值。

那么怎么办呢?首先,你想做什么吗?也许逼近的导数更有用(有人告诉我某些最优控制问题就是这种情况),但是如果我们想解决它可以是的,答案是插入领域知识,直接告诉AD系统与理想导数的近似值。AD系统不知道它与近似值的关系,即使这样做,它也不知道。我不知道它的近似概念是什么。用自定义原语(即自定义敏感度规则)告诉它的方法。这就是Julia中的ChainRules项目所要解决的问题,它能够为更多事物添加自定义原语。

每个真实的AD系统都已经内置了一个用于罪恶的原语(这是我必须在上面定义自己的原因之一)。但是对于您估计的每个新颖系统,都不会拥有一个原语。用于根据微分方程解或其他迭代方法定义的事物。

大多数符号微分系统都有一个规则,就像内置的sin的自定义原语一样,它基本上必须做这样的事情-正向/反向AD系统可以像我们一样做并回落到+和*。但是,它肯定不会帮助您将符号AD应用于近似值,而这将恰好给出我们为上述d_sin导出的结果。

更有趣的是,符号差异很普遍的语言首先也具有有趣的功能表示形式,这确实为有趣的解决方案开辟了道路。一种适当的怪异语言可能使用的是sin的表示形式,它是一个无穷程度的延迟评估的多项式在这种情况下,有一个导数规则,用其系数生成函数的变化表示;也会返回一个懒惰的评估多项式。我不知道是否有人这样做;我怀疑它不能很好地泛化。此外,对于很多事情,您想通过迭代方法来解决系统问题,并且这些问题只适用于具体数字而不是懒惰的术语。尽管有一个很不错的解决方案,但我在这里没有真正的专业知识。通常,符号差异化存在将问题扩展到大问题的问题。

该页面由Lyndon White(又名oxinabox)维护。 页面主题基于Matt Graham的Midnight主题。