30
Automatic Differentiation (or Differentiable Programming) Atılım Güneş Baydin National University of Ireland Maynooth Joint work with Barak Pearlmutter Alan Turing Institute, February , 6

Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Automatic Differentiation(or Differentiable Programming)

Atılım Güneş BaydinNational University of Ireland Maynooth

Joint work with Barak PearlmutterAlan Turing Institute, February 5, 2016

Page 2: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

A brief introduction to ADMy ongoing work

1/17

Page 3: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Vision

Functional programming languages withdeeply embedded,general-purpose

differentiation capability, i.e., automatic differentiation (AD) in afunctional framework

We started calling this differentiable programmingChristopher Olah’s blog post (September 3, 2015)http://colah.github.io/posts/2015-09-NN-Types-FP/

2/17

Page 4: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Vision

Functional programming languages withdeeply embedded,general-purpose

differentiation capability, i.e., automatic differentiation (AD) in afunctional frameworkWe started calling this differentiable programmingChristopher Olah’s blog post (September 3, 2015)http://colah.github.io/posts/2015-09-NN-Types-FP/

2/17

Page 5: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

The AD fieldAD is an active research areahttp://www.autodiff.org/

Traditional application domains of AD in industry and academia(Corliss et al., 2002; Griewank & Walther, 2008) includeComputational fluiddynamicsAtmospheric chemistryEngineering designoptimizationComputational finance

3/17

Page 6: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

AD in probabilistic programming(Wingate, Goodman, Stuhlmüller, Siskind. “Nonstandard interpretationsof probabilistic programs for efficient inference.” 2011)

Hamiltonian Monte Carlo (Neal, 1994)http://diffsharp.github.io/DiffSharp/examples-hamiltonianmontecarlo.html

No-U-Turn sampler (Hoffman & Gelman, 2011)Riemannian manifold HMC (Girolami & Calderhead, 2011)Optimization-based inference

Stan (Carpenter et al., 2015)http://mc-stan.org/

4/17

Page 7: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

What is AD?Many machine learning frameworks (Theano, Torch, Tensorflow,CNTK) handle derivatives for you

You build models by defining computational graphs→ (constrained) symbolic language→ highly limited control-flow (e.g., Theano’s scan)The framework handles backpropagation→ you don’t have to code derivatives(unless adding new modules)Because derivatives are “automatic”, some call it“autodiff” or “automatic differentiation”

This is NOT the traditional meaning of automatic differentiation(AD) (Griewank & Walther, 2008)Because “automatic” is a generic (and bad) term,algorithmic differentiation is a better name

5/17

Page 8: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

What is AD?Many machine learning frameworks (Theano, Torch, Tensorflow,CNTK) handle derivatives for you

You build models by defining computational graphs→ (constrained) symbolic language→ highly limited control-flow (e.g., Theano’s scan)The framework handles backpropagation→ you don’t have to code derivatives(unless adding new modules)Because derivatives are “automatic”, some call it“autodiff” or “automatic differentiation”

This is NOT the traditional meaning of automatic differentiation(AD) (Griewank & Walther, 2008)Because “automatic” is a generic (and bad) term,algorithmic differentiation is a better name

5/17

Page 9: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

What is AD?Many machine learning frameworks (Theano, Torch, Tensorflow,CNTK) handle derivatives for you

You build models by defining computational graphs→ (constrained) symbolic language→ highly limited control-flow (e.g., Theano’s scan)The framework handles backpropagation→ you don’t have to code derivatives(unless adding new modules)Because derivatives are “automatic”, some call it“autodiff” or “automatic differentiation”

This is NOT the traditional meaning of automatic differentiation(AD) (Griewank & Walther, 2008)Because “automatic” is a generic (and bad) term,algorithmic differentiation is a better name

5/17

Page 10: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

What is AD?AD does not use symbolic graphsGives numeric code that computesthe function AND its derivatives at a given point

f(a, b):c = a * bd = sin creturn d

f'(a, a', b, b'):(c, c') = (a*b, a'*b + a*b')(d, d') = (sin c, c' * cos c)return (d, d')

Derivatives propagated at the elementary operation level,as a side effect, at the same time when the function itself iscomputed→ Prevents the “expression swell” of symbolic derivativesFull expressive capability of the host language→ Including conditionals, looping, branching

6/17

Page 11: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesAll numeric evaluations are sequences of elementary operations:a “trace,” also called a “Wengert list” (Wengert, 1964)f(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2

b = 3

c = a * b = 6

d = log c = 1.791

return 1.791

(primal)

a = 2a’ = 1b = 3b’ = 0c = a * b = 6c’ = a’ * b + a * b’ = 3d = log c = 1.791d’ = c’ * (1 / c) = 0.5return 1.791, 0.5

(tangent)i.e., a Jacobian-vector product Jf (1,0)|(2,3) = ∂

∂a f(a, b)∣∣(2,3) = 0.5

This is called the forward (tangent) mode of AD

7/17

Page 12: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesAll numeric evaluations are sequences of elementary operations:a “trace,” also called a “Wengert list” (Wengert, 1964)f(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2

b = 3

c = a * b = 6

d = log c = 1.791

return 1.791

(primal)

a = 2a’ = 1b = 3b’ = 0c = a * b = 6c’ = a’ * b + a * b’ = 3d = log c = 1.791d’ = c’ * (1 / c) = 0.5return 1.791, 0.5

(tangent)i.e., a Jacobian-vector product Jf (1,0)|(2,3) = ∂

∂a f(a, b)∣∣(2,3) = 0.5

This is called the forward (tangent) mode of AD

7/17

Page 13: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesAll numeric evaluations are sequences of elementary operations:a “trace,” also called a “Wengert list” (Wengert, 1964)f(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2

b = 3

c = a * b = 6

d = log c = 1.791

return 1.791

(primal)

a = 2a’ = 1b = 3b’ = 0c = a * b = 6c’ = a’ * b + a * b’ = 3d = log c = 1.791d’ = c’ * (1 / c) = 0.5return 1.791, 0.5

(tangent)i.e., a Jacobian-vector product Jf (1,0)|(2,3) = ∂

∂a f(a, b)∣∣(2,3) = 0.5

This is called the forward (tangent) mode of AD

7/17

Page 14: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesAll numeric evaluations are sequences of elementary operations:a “trace,” also called a “Wengert list” (Wengert, 1964)f(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2

b = 3

c = a * b = 6

d = log c = 1.791

return 1.791

(primal)

a = 2a’ = 1b = 3b’ = 0c = a * b = 6c’ = a’ * b + a * b’ = 3d = log c = 1.791d’ = c’ * (1 / c) = 0.5return 1.791, 0.5

(tangent)

i.e., a Jacobian-vector product Jf (1,0)|(2,3) = ∂∂a f(a, b)

∣∣(2,3) = 0.5

This is called the forward (tangent) mode of AD

7/17

Page 15: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesAll numeric evaluations are sequences of elementary operations:a “trace,” also called a “Wengert list” (Wengert, 1964)f(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2

b = 3

c = a * b = 6

d = log c = 1.791

return 1.791

(primal)

a = 2a’ = 1b = 3b’ = 0c = a * b = 6c’ = a’ * b + a * b’ = 3d = log c = 1.791d’ = c’ * (1 / c) = 0.5return 1.791, 0.5

(tangent)i.e., a Jacobian-vector product Jf (1,0)|(2,3) = ∂

∂a f(a, b)∣∣(2,3) = 0.5

This is called the forward (tangent) mode of AD7/17

Page 16: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesf(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2b = 3c = a * b = 6d = log c = 1.791return 1.791

(primal)

a = 2b = 3c = a * b = 6d = log c = 1.791d’ = 1c’ = d’ * (1 / c) = 0.166b’ = c’ * a = 0.333a’ = c’ * b = 0.5return 1.791, 0.5, 0.333

(adjoint)i.e., a transposed Jacobian-vector productJTf (1)∣∣(2,3) = ∇f|(2,3) = (0.5,0.333)

This is called the reverse (adjoint) mode of ADBackpropagation is just a special case of the reverse mode:code a neural network objective computation, apply reverse AD

8/17

Page 17: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesf(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2b = 3c = a * b = 6d = log c = 1.791return 1.791

(primal)

a = 2b = 3c = a * b = 6d = log c = 1.791d’ = 1c’ = d’ * (1 / c) = 0.166b’ = c’ * a = 0.333a’ = c’ * b = 0.5return 1.791, 0.5, 0.333

(adjoint)i.e., a transposed Jacobian-vector productJTf (1)∣∣(2,3) = ∇f|(2,3) = (0.5,0.333)

This is called the reverse (adjoint) mode of ADBackpropagation is just a special case of the reverse mode:code a neural network objective computation, apply reverse AD

8/17

Page 18: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesf(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2b = 3c = a * b = 6d = log c = 1.791return 1.791

(primal)

a = 2b = 3c = a * b = 6d = log c = 1.791d’ = 1c’ = d’ * (1 / c) = 0.166b’ = c’ * a = 0.333a’ = c’ * b = 0.5return 1.791, 0.5, 0.333

(adjoint)

i.e., a transposed Jacobian-vector productJTf (1)∣∣(2,3) = ∇f|(2,3) = (0.5,0.333)

This is called the reverse (adjoint) mode of ADBackpropagation is just a special case of the reverse mode:code a neural network objective computation, apply reverse AD

8/17

Page 19: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Function evaluation tracesf(a, b):

c = a * bif c > 0

d = log celse

d = sin creturn d

f(2, 3)

a = 2b = 3c = a * b = 6d = log c = 1.791return 1.791

(primal)

a = 2b = 3c = a * b = 6d = log c = 1.791d’ = 1c’ = d’ * (1 / c) = 0.166b’ = c’ * a = 0.333a’ = c’ * b = 0.5return 1.791, 0.5, 0.333

(adjoint)i.e., a transposed Jacobian-vector productJTf (1)∣∣(2,3) = ∇f|(2,3) = (0.5,0.333)

This is called the reverse (adjoint) mode of ADBackpropagation is just a special case of the reverse mode:code a neural network objective computation, apply reverse AD

8/17

Page 20: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

AD in a functional frameworkAD has been around since the 1960s(Wengert, 1964; Speelpenning, 1980; Griewank, 1989)The foundations for AD in a functional framework(Siskind & Pearlmutter, 2008; Pearlmutter & Siskind, 2008)With research implementations

R6RS-ADhttps://github.com/qobi/R6RS-AD

Stalingradhttp://www.bcl.hamilton.ie/~qobi/stalingrad/

Alexey Radul’s DVLhttps://github.com/axch/dysvunctional-language

Recently, my DiffSharp libraryhttp://diffsharp.github.io/DiffSharp/

9/17

Page 21: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

AD in a functional framework“Generalized AD as a first-class function in an augmentedλ-calculus” (Pearlmutter & Siskind, 2008)Forward, reverse, and any nested combination thereof,instantiated according to usage scenarioNested lambda expressions with free-variable references

min (λx . (f x) + min (λy . g x y))(min: gradient descent)

Must handle “perturbation confusion” (Manzyuk et al., 2012)D (λx . x× (D (λy . x+ y) 1)) 1

ddx

(x(

ddyx+ y

)∣∣∣∣y=1

)∣∣∣∣∣x=1

?= 1

10/17

Page 22: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

AD in a functional framework“Generalized AD as a first-class function in an augmentedλ-calculus” (Pearlmutter & Siskind, 2008)Forward, reverse, and any nested combination thereof,instantiated according to usage scenarioNested lambda expressions with free-variable references

min (λx . (f x) + min (λy . g x y))(min: gradient descent)

Must handle “perturbation confusion” (Manzyuk et al., 2012)D (λx . x× (D (λy . x+ y) 1)) 1

ddx

(x(

ddyx+ y

)∣∣∣∣y=1

)∣∣∣∣∣x=1

?= 1

10/17

Page 23: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

DiffSharphttp://diffsharp.github.io/DiffSharp/

implemented in F#generalizes functional AD to high-performancelinear algebra primitivesarbitrary nesting of forward/reverse ADa comprehensive higher-order APIgradients, Hessians, Jacobians, directionalderivatives, matrix-free Hessian- andJacobian-vector productsF#’s “code quotations” (Syme, 2006) has greatpotential for deeply embeddingtransformation-based AD

11/17

Page 24: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

DiffSharpHigher-order differentiation APIOp. Value Type signature AD Num. Sym.

f : R → R diff f ′ (R → R) → R → R X, F A Xdiff’ (f, f ′) (R → R) → R → (R× R) X, F A Xdiff2 f ′′ (R → R) → R → R X, F A Xdiff2’ (f, f ′′) (R → R) → R → (R× R) X, F A Xdiff2’’ (f, f ′, f ′′) (R → R) → R → (R× R× R) X, F A Xdiffn f(n) N → (R → R) → R → R X, F Xdiffn’ (f, f(n)) N → (R → R) → R → (R× R) X, F X

f : Rn → R grad ∇f (Rn → R) → Rn → Rn X, R A Xgrad’ (f,∇f) (Rn → R) → Rn → (R× Rn) X, R A Xgradv ∇f · v (Rn → R) → Rn → Rn → R X, F Agradv’ (f,∇f · v) (Rn → R) → Rn → Rn → (R× R) X, F Ahessian Hf (Rn → R) → Rn → Rn×n X, R-F A Xhessian’ (f,Hf ) (Rn → R) → Rn → (R× Rn×n) X, R-F A Xhessianv Hfv (Rn → R) → Rn → Rn → Rn X, F-R Ahessianv’ (f,Hfv) (Rn → R) → Rn → Rn → (R× Rn) X, F-R Agradhessian (∇f,Hf ) (Rn → R) → Rn → (Rn × Rn×n) X, R-F A Xgradhessian’ (f,∇f,Hf ) (Rn → R) → Rn → (R× Rn × Rn×n) X, R-F A Xgradhessianv (∇f · v,Hfv) (Rn → R) → Rn → Rn → (R× Rn) X, F-R Agradhessianv’ (f,∇f · v,Hfv) (Rn → R) → Rn → Rn → (R× R× Rn) X, F-R Alaplacian tr(Hf ) (Rn → R) → Rn → R X, R-F A Xlaplacian’ (f, tr(Hf )) (Rn → R) → Rn → (R× R) X, R-F A X

f : Rn → Rm jacobian Jf (Rn → Rm) → Rn → Rm×n X, F/R A Xjacobian’ (f ,Jf ) (Rn → Rm) → Rn → (Rm × Rm×n) X, F/R A Xjacobianv Jfv (Rn → Rm) → Rn → Rn → Rm X, F Ajacobianv’ (f ,Jfv) (Rn → Rm) → Rn → Rn → (Rm × Rm) X, F AjacobianT JT

f (Rn → Rm) → Rn → Rn×m X, F/R A XjacobianT’ (f ,JT

f ) (Rn → Rm) → Rn → (Rm × Rn×m) X, F/R A XjacobianTv JT

f v (Rn → Rm) → Rn → Rm → Rn X, RjacobianTv’ (f ,JT

f v) (Rn → Rm) → Rn → Rm → (Rm × Rn) X, RjacobianTv’’ (f ,JT

f (·)) (Rn → Rm) → Rn → (Rm × (Rm → Rn)) X, Rcurl ∇× f (R3 → R3) → R3 → R3 X, F A Xcurl’ (f ,∇× f) (R3 → R3) → R3 → (R3 × R3) X, F A Xdiv ∇ · f (Rn → Rn) → Rn → R X, F A Xdiv’ (f ,∇ · f) (Rn → Rn) → Rn → (Rn × R) X, F A Xcurldiv (∇× f ,∇ · f) (R3 → R3) → R3 → (R3 × R) X, F A Xcurldiv’ (f ,∇× f ,∇ · f) (R3 → R3) → R3 → (R3 × R3 × R) X, F A X 12/17

Page 25: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

DiffSharpMatrix operationshttp://diffsharp.github.io/DiffSharp/api-overview.html

High-performance OpenBLAS backend by default,currently working on a CUDA-based GPU backendSupport for 64- and 32-bit floats (faster on many systems)Benchmarking toolhttp://diffsharp.github.io/DiffSharp/benchmarks.html

A growing collection of tutorials: gradient-based optimizationalgorithms, clustering, Hamiltonian Monte Carlo, neural networks,inverse kinematics

13/17

Page 26: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Hypehttp://hypelib.github.io/Hype/

An experimental library for “compositional machine learningand hyperparameter optimization”, built on DiffSharpA robust optimization core

highly configurable functional modulesSGD, conjugate gradient, Nesterov, AdaGrad, RMSProp,Newton’s methodUse nested AD for gradient-based hyperparameteroptimization (Maclaurin et al., 2015)

14/17

Page 27: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

HypeExtracts from Hype neural network code,freely use F# and higher-order functions, don’t think aboutgradients or backpropagationhttps://github.com/hypelib/Hype/blob/master/src/Hype/Neural.fs

15/17

Page 28: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

HypeDerivatives are instantiated within the optimization code

16/17

Page 29: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Hamiltonian Monte Carlo with DiffSharpTry it on your system: http://diffsharp.github.io/DiffSharp/examples-hamiltonianmontecarlo.html

17/17

Page 30: Automatic Differentiation (or Differentiable Programming)gunes/assets/pdf/slides-baydin-ad-atipp16.pdf · Vision Functional programming languages with deeply embedded, general-purpose

Thank You!References• Baydin AG, Pearlmutter BA, Radul AA, Siskind JM (Submitted) Automatic differentiation in machine learning: a survey [arXiv:1502.05767]• Baydin AG, Pearlmutter BA, Siskind JM (Submitted) DiffSharp: automatic differentiation library [arXiv:1511.07727]• Carpenter B, Hoffman MD, Brubaker M, Lee D, Li P, Betancourt M (2015) The Stan math library: reverse-mode automatic differentiation in C++. [arXiv:1509.07164]• Griewank A, Walther A (2008) Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation. Society for Industrial and Applied Mathematics,Philadelphia [DOI 10.1137/1.9780898717761]• Maclaurin D, David D, Adams RP (2015) Gradient-based Hyperparameter Optimization through Reversible Learning [arXiv:1502.03492]• Manzyuk O, Pearlmutter BA, Radul AA, Rush DR, Siskind JM (2012) Confusion of tagged perturbations in forward automatic differentiation of higher-order functions[arXiv:1211.4892]• Pearlmutter BA, Siskind JM (2008) Reverse-mode AD in a functional framework: Lambda the ultimate backpropagator. ACM TOPLAS 30(2):7 [DOI10.1145/1330017.1330018]• Siskind JM, Pearlmutter BA (2008) Nesting forward-mode AD in a functional framework. Higher Order and Symbolic Computation 21(4):361–76 [DOI10.1007/s10990-008-9037-1]• Syme D (2006) Leveraging .NET meta-programming components from F#: integrated queries and interoperable heterogeneous execution. 2006 Workshop on ML.ACM.• Wengert R (1964) A simple automatic derivative evaluation program. Communications of the ACM 7:463–4