一句话:提出可高效实现的并行 dual-numbers 反向 AD 技术,能对任务并行源程序生成任务并行导数计算。
双数式反向自动微分通过将每个标量值与一个反向传播函数配对,试图以简单方式实现反向 AD,但已有高阶语言正确性与复杂度分析基于定制操作语义,其高效实现尚不明确。本文借鉴线性因式分解,并结合函数式编程中可变数组等已知优化,将 dual-numbers 反向 AD 优化为具有正确复杂度、可在 Haskell 等标准函数式语言中高效实现的算法。作者给出可微分大部分 Haskell98 的实用实现,并首次将该技术扩展到任务并行源程序:无需为构造反向传播而串行化,而是直接生成任务并行的导数计算。
Abstract Where dual-numbers forward-mode automatic differentiation (AD) pairs each scalar value with its tangent value, dual-numbers reverse-mode AD attempts to achieve reverse AD using a similarly simple idea: by pairing each scalar value with a backpropagator function. Its correctness and efficiency on higher-order input languages have been analysed by Brunel, Mazza and Pagani, but this analysis used a custom operational semantics for which it is unclear whether it can be implemented efficiently. We take inspiration from their use of linear factoring to optimise dual-numbers reverse-mode AD to an algorithm that has the correct complexity and enjoys an efficient implementation in a standard functional language with support for mutable arrays, such as Haskell. Aside from the linear factoring ingredient, our optimisation steps consist of well-known ideas from the functional programming community. We demonstrate the use of our technique by providing a practical implementation that differentiates most of Haskell98. Where previous work on dual numbers reverse AD has required sequentialisation to construct the reverse pass, we demonstrate that we can apply our technique to task-parallel source programs and generate a task-parallel derivative computation.