13

私が見たHaskellで最も近い関連の実装は、http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.htmlの転送モードです。

最も近い関連研究は、http: //www.bcl.hamilton.ie/~qobi/stalingrad/にあるSchemeに関連する別の関数型言語のリバースモードのようです。

Haskellのリバースモードは、Haskellのネストされたデータ並列処理を使用して、数値の大幅な最適化を大幅に高速化できることを期待して、多くのタスクの聖杯のようなものだと思います。

4

4 に答える 4

56

この質問に答えて、Haskellでリバースモードの自動微分を処理するために、 adという名前のパッケージをHackageにアップロードしました。

内部的には、AndyGillのKansasLavaのトリックを利用して、バックプロパゲーションの目的で記録したテープの共有を観察し、タイプレベルのブランディングを使用して感度の混乱を防ぎます。

APIをBarakPearlmutterとJeffreyMarkSiskindのfadパッケージのAPIに比較的近づけようとしましたが、一般性のために、あちこちでいくつかの小さな調整を行うことに抵抗できませんでした。

残りの未実装の流行コンビネータを調べて完成させ、リバースモードADタワーを構築するための優れた方法を見つけ、基本的な微積分の記憶を台無しにしないことを検証し、使用するための優れたAPIを提供する必要があります。それ以外の場合は順方向モードのADプログラムでローカル逆方向モードのチェックポイントを取得するこのアプローチですが、これまでのところ状況がどのように進んでいるかに非常に満足しています。

于 2010-05-16T04:39:53.267 に答える
5

フォワードモードのAD実装はたくさんありますが(モノイドライブラリにも1つあります!)、すべてのHaskellのリバースモードADは手に負えないようです。

悲しいことに、PearlmutterとSiskindはラムダ計算の翻訳を提供しますが、任意のHaskellラムダに対して実行できるものにはマッピングされません。適切なイントロスペクションプロパティが得られず、翻訳で型の形状が変化する方法が与えられます。モナド、矢印、またはその他の制御構造にパックされやすいものはありません。

私はPearlmutterとの一連の電子メール交換を介してそれを試しましたが、最終的に私が得ることができた最高のものは、Haskell自体のソリューションではなく、Haskellの小さなEDSL用のリバースモードADソリューションでした。

于 2010-04-30T15:16:17.797 に答える
2

私が知っていることではありません。一部の Haskellの 人々 が自動微分に 興味を持っていることは知っていますが、いくつかの簡単な掘り下げでは、逆モードについて言及している短い傍白にすぎません。私がしたのと同じ資料をすでに見つけていると思います。

fadまた、あなたが見つけたパッケージとスターリングラードプロジェクトは、実際には同じ2 の作業であり、少なくともPearlmutter教授がhaskell-cafeメーリングリストに投稿していることにも注意してください。彼の仕事について直接彼に連絡することを検討することをお勧めします。彼が進行中の何かを持っているか、リバースモードADを実装しようとしているときに深刻な障害にぶつかる可能性があります。

申し訳ありませんが、これ以上便利なものは見つかりませんでした。他の誰かがさらに掘り下げたい場合は、少なくとも上記のリンクが出発点です。

于 2010-04-30T15:16:06.317 に答える
2

私は前向きがHaskellに行く方法だと思います。エドワードが指摘したように、任意の関数でリバースモードを実行することはできません。しかし、あなたは特定の制約された機能でそれを行うことができるはずだと答えました。そして、前述の制約は、フォワードモードに容易につながる可能性があります。例えば。関数がある場合:

foo :: Num a => a -> a -> a

次にa、微分可能なタイプでインスタンス化できるためfoo、フォワードモードで微分できます。

非常に洗練されたフォワードモードの自動微分については、Hackageのベクトル空間ライブラリを参照してください。最初は使い方がよくわからないかもしれません。それについての論文、コナル・エリオットによる美しい差別化を読んでください。

于 2010-05-01T00:22:55.603 に答える