自動差別化に関して、ソースコード変換(STC)は演算子オーバーロード(OO)よりも効率的ですか?


12

時空間プロセスのベイジアンモデルに取り組んでおり、対数確率のモデルとモデルパラメーターに関する勾配を必要とする非Uターンサンプラー(NUTS)を使用しています。もっと簡潔に言えば、統計分布、クロネッカー積、指数、比、if-elseステートメントなどを含むかなり複雑な対数確率関数、それを提供する必要があり、NUTSに勾配があります。いくつかのパッケージ(Stanおよび JuliaのMCMC)は、オペレーターのオーバーロード(私の知る限り)を使用して、勾配を自動的に取得します。fRnR

おそらくソースコード変換の自動差分ツールを使用して独自の勾配関数を作成できた場合、パフォーマンスが向上しますか?

回答:


9

ソースからソースへの変換は、パフォーマンスの観点からゴールドスタンダードと見なされます。オブジェクト指向のアプローチは、オブジェクト指向パッケージがより多くあり、パフォーマンスが重大な欠点として言及されていないという点で、ほぼ同じように思えます。使用している言語に適したOOライブラリが見つかった場合、まずそれを使用し、次にソースからソースへの変換が絶対に必要かどうか、そしてニーズを満たすツールが存在するかどうかを後で見つけます。自動微分で生成された導関数の一般的なコストは、物事をコンテキストに入れるために、関数評価の約3〜5倍です。

ソースからソースへの変換を使用するよりも、演算子のオーバーロードを使用して自動差別化ツールを実装する方が簡単であるため、より多くのオブジェクト指向パッケージがあります。ソースからソースへのトランスレーターを実装することは、コンパイラーを記述することと同等です。ソースコードを解析してトークン化し、変換ルールを結果の式ツリーに適用する必要があります。アンドレアス・グリーワンクの著書「Evaluating Derivatives:Principles and Techniques of Algorithmic Differentiation、Second Edition」では、トレードオフについて詳しく説明しています。


Geoffに感謝します。これは、特に典型的なコストの見積もりに非常に役立ちます。
マシューエメット

1

勾配計算には、ADのリバースモードを使用します。これには、どちらの場合でもオペランドスタックを構築する必要があります。OOバージョンでは、操作スタックも構築する必要があります。これは、コードの逆トラバーサルで解釈する必要があります。ソース変換されたコードは、逆順の操作をコンパイルされる追加のソースコードとして書き出します。コード内にオペレーションインタープリターを配置するオーバーヘッドは大きくなる可能性があります。Tapenadeが生成したコードとAdol-Cには、Tapenadeに有利な比較があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.