問題タブ [automatic-differentiation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Numeric.AD - スコープをエスケープする型変数
Haskell で非線形制御の問題に自動微分を使用しようとしていますが、動作させるのに問題があります。私は基本的にcost
、初期状態を考慮して最適化する必要がある関数を持っています。タイプは次のとおりです。
これにより、次のエラー メッセージが表示されます。
エラーを正しく理解しているかどうかさえわかりません。の型ref
とが への最初の引数のスコープ内にある にplant
アクセスする必要があるということですか?s
gradientDescent
これを機能させることは可能ですか?解決策を探しているときに、問題を最小限の例に減らしてみたところ、次の定義で同様のエラー メッセージが生成されることがわかりました。
optimize = gradientDescent
エラーが発生しないため、これは奇妙に思えます。
c++ - ハミルトン力学ベースの物理エンジン
ハミルトン力学に基づく物理エンジンを実装しようとしています。など、いくつかの問題に直面しています。
- H関数を微分する
- ルンゲ・クッタ法を効率的に使用するために H 関数の偏導関数を部分的に評価する
関数を構造体として表現することにしました (構造体として表現された関数の部分評価)。
ただし、C++ テンプレートのコードを標準の C++ コードと組み合わせるのは困難です。さらに、構造体関数の評価には、対応する標準関数よりも少なくとも 2 倍の時間がかかるようです。
そこで、私は Stackoverflow コミュニティに、私のアプローチを維持するべきか、変更するべきかを尋ねます。
編集
g++ を使用し、コマンド ラインからコンパイルします。
g++ -std=c++14 -IC:\Hudba\include Stin.cpp Tma.cpp -LC:\Hudba\lib -lglfw3 -lglew32 -lglu32 -lopengl32 -lkernel32 -luser32 -lgdi32 -lws2_32.
構造体関数を部分的に評価するには、コンパイル時に不明な値の配列を渡す必要がありますが、これはテンプレートでは不可能です。
performance - あまりにも多くのガベージを作成するリスト関数を最適化します (スタック オーバーフローではありません)。
Haskell 関数があり、プログラムのすべての割り当ての 50% 以上が発生し、実行時間の 60% が GC に費やされています。小さなスタック ( -K10K
) で実行しているので、スタック オーバーフローはありませんが、少ない割り当てでこの関数を高速化することはできますか?
ここでの目標は、行列とベクトルの積を計算することです。hmatrix
たとえば、これはad
自動微分パッケージを使用するより大きな関数の一部であるため、使用できません。したがって、のリストを使用する必要がありますNum
。実行時に、Numeric.AD
モジュールを使用すると、型がScalar Double
.
基本的に、行列をループし、ベクトルの最後に到達するまでアキュムレータを乗算および加算し、結果を格納してから、ベクトルを再び再起動し続けます。quickcheck
hmatrix の行列/ベクトル積と同じ結果が得られることを確認するテストがあります。
foldl
、などで試しました。関数を高速化するものは何も試していません (また、スペース リークの原因となるfoldr
ものもあります)。foldr
プロファイリングを使用して実行すると、この関数がほとんどの時間と割り当てが費やされる場所であるという事実に加えて、パッケージからのデータ型でCells
ある作成される負荷があることがわかります。Cells
ad
実行する簡単なテスト:
私のマシンでは、GC が 47% の時間ビジーであることがわかります。
何か案は?
automatic-differentiation - 高階自動微分の理解
最近、機械学習の目的で自分自身の基本的なリバース モード ADを完成させたばかりなので、この分野について学びたいと思っていますが、より高次の方法で難しい壁にぶつかっています。
基本的なリバース AD は美しくシンプルで理解しやすいですが、より高度な内容は抽象的すぎて技術的すぎて、インターネット上で適切な説明を見つけることができませんでした (実際、理解するのにかなりの時間がかかりました)。基本的なリバース AD も存在します。)
基本的に、微積分のコンテキストで二次導関数を取得する方法は理解していますが、逆 AD グラフを変換して二次導関数を取得する方法がわかりません。
edge_pushingのようなアルゴリズムでは、これらの破線の接続は何を意味するのでしょうか?
ライブラリ DiffSharp を調査したところ、ヘッセ行列の計算に正逆微分のようなものを使用していることに気付きました。実行中、デバッガーを介して、実際に1回の実行で順方向と逆方向のステップが混在していることを実際に確認しました。そのメカニズムの背後にある原則は何ですか?
DiffSharp は、ヤコビアン ベクトル積を使用して、変数ごとにヘッシアンを計算します。これは、R^m -> R^n マッピングです。元のグラフからそれを取得するにはどうすればよいですか? 逆 AD は R -> R^n マッピングですが、余分な次元はどこから来るのですか?
最後に、ネストされた AD はどのように機能しますか?
python-2.7 - 勾配の計算における Theano の効率性/インテリジェント性はどの程度ですか?
5 つの隠れ層を持つ人工ニューラル ネットワークがあるとします。ここでは、バイアス、使用される活性化関数、データの種類など、ニューラル ネットワーク モデルの詳細については忘れてください。もちろん、活性化関数は微分可能です。
以下は、シンボリック微分を使用して、レイヤーの重みに対する目的関数の勾配を計算します。
このように、w1に関する勾配を計算するには、w2、w3、w4、および w5 に関する勾配を最初に計算する必要があります。同様に、w2に関する勾配を計算するには、 w3、w4、および w5 に関する勾配を最初に計算する必要があります。
ただし、次のコードでも、各重み行列に対する勾配を計算できます。
パフォーマンスの点で、これら 2 つの方法に違いはありますか? Theano は、2 番目の方法を使用して勾配を再計算することを回避するのに十分なほどインテリジェントですか? インテリジェントとは、w3_grad を計算することを意味します。Theano は、[できれば] w_output_grad、w5_grad、および w4_grad を再計算する代わりに、事前に計算された勾配を使用する必要があります。