Haskellの自動微分ライブラリad https://hackage.haskell.org/package/ad の実装をちゃんと理解してなかったのだけど、 ちょっと気になりだして勉強中。

目的としては、ad は良くできてて便利なんだけど、スカラ成分単位で微分を考えてしまっているのと、Traversableによる抽象化のせいで unboxed な Vector をそのまま食わせたりできない点で、用途によっては性能的に厳しくて、それを何とか出来ないかな、という妄想。

あと、高階微分に関して、Chainerとかの最近の深層学習フレームワークと比較してどう違うのか、という興味も。

で、見てみると、forward mode は想像通りの実装。 reverse mode は Wengert list を使ってると書いてあって、これをちゃんと知らなかったのだけど、ググって見つかった http://www.cs.cmu.edu/~wcohen/10-605/notes/autodiff.pdf が分かりやすかった。 その上で Numeric.AD.Internal.Reverse https://hackage.haskell.org/package/ad-4.3.4/docs/Numeric-AD-Internal-Reverse.html のソースを読んだら大体理解できて、これは良く練られてるなぁ、と感心した。