-rate*gradient + momentum*previous_delta - decay*rate*weight
Neural Nets のコードをプロファイリングした後、既に勾配が与えられているネットワーク ( ) 内の各アークの重みの変化を計算する方法がボトルネック (55% のサンプルを含む)であることに気付きました。
これらの値を効率的に計算するためのトリックはありますか?
-rate*gradient + momentum*previous_delta - decay*rate*weight
Neural Nets のコードをプロファイリングした後、既に勾配が与えられているネットワーク ( ) 内の各アークの重みの変化を計算する方法がボトルネック (55% のサンプルを含む)であることに気付きました。
これらの値を効率的に計算するためのトリックはありますか?
これは正常な動作です。各進化ステップで重みを解決するために反復プロセスを使用していると仮定しています (バックプロパゲーションなど?)。ニューロンの数が多く、トレーニング (バックテスト) アルゴリズムが短い場合、ニューラル ネットワークのトレーニング中に、このような重みの変更が計算時間の大部分を消費するのは普通のことです。
単純な XOR 問題などを使用してこの結果を得ましたか? その場合、より複雑な問題 (多次元配列でのパターン検出、画像処理など) を解決し始めると、それらの関数が計算時間のわずかな部分を消費し始めることに気付くでしょう。
プロファイリングを行う場合は、ニューラル ネットワークが設計された目的により近い問題をプロファイリングすることをお勧めします (XOR を解決したり、三目並べをしたりするために設計したわけではないと推測します)。のようなコードの最適化-rate*gradient + momentum*previous_delta - decay*rate*weight
は多かれ少なかれ時間の無駄です。少なくともこれは私の経験です。
このコードが実際のアプリケーションで計算集約的であることがわかった場合は、構造を変更してこのコード行の実行回数を減らすことをお勧めします。ニューラル ネットワークの最適化は豊富な分野であり、そのような広範な質問から有益なアドバイスを提供することはおそらくできませんが、プログラムが異常に遅い場合、そのような低レベルで手を加えても大幅な改善が見られる可能性は低いと言えます。コード。ただし、私自身の経験から次のことを提案します。
static
ループを考えてください。これは、私が技術的ではない質問と解釈したことに対する、技術的ではない回答であることに注意してください。