1

-rate*gradient + momentum*previous_delta - decay*rate*weightNeural Nets のコードをプロファイリングした後、既に勾配が与えられているネットワーク ( ) 内の各アークの重みの変化を計算する方法がボトルネック (55% のサンプルを含む)であることに気付きました。

これらの値を効率的に計算するためのトリックはありますか?

4

1 に答える 1

1

これは正常な動作です。各進化ステップで重みを解決するために反復プロセスを使用していると仮定しています (バックプロパゲーションなど?)。ニューロンの数が多く、トレーニング (バックテスト) アルゴリズムが短い場合、ニューラル ネットワークのトレーニング中に、このような重みの変更が計算時間の大部分を消費するのは普通のことです。

単純な XOR 問題などを使用してこの結果を得ましたか? その場合、より複雑な問題 (多次元配列でのパターン検出、画像処理など) を解決し始めると、それらの関数が計算時間のわずかな部分を消費し始めることに気付くでしょう。

プロファイリングを行う場合は、ニューラル ネットワークが設計された目的により近い問題をプロファイリングすることをお勧めします (XOR を解決したり、三目並べをしたりするために設計したわけではないと推測します)。のようなコードの最適化-rate*gradient + momentum*previous_delta - decay*rate*weightは多かれ少なかれ時間の無駄です。少なくともこれは私の経験です。

このコードが実際のアプリケーションで計算集約的であることがわかった場合は、構造を変更してこのコード行の実行回数を減らすことをお勧めします。ニューラル ネットワークの最適化は豊富な分野であり、そのような広範な質問から有益なアドバイスを提供することはおそらくできませんが、プログラムが異常に遅い場合、そのような低レベルで手を加えても大幅な改善が見られる可能性は低いと言えます。コード。ただし、私自身の経験から次のことを提案します。

  1. 並列化を検討してください。バックプロパゲーション手法で実装されているような多くの検索アルゴリズムは、収束を改善するための並列試行に適しています。重み調整は、特定のネットワークの計算需要に関して同じであるため、Open MP のstaticループを考えてください。
  2. 収束基準 (重みの調整を停止する前の臨界収束率) を変更して、これらの計算の実行を減らします。
  3. 逆伝播などの決定論的ソリューションの代替案を検討してください。これは、いずれにせよ、ローカル最適化の傾向がわずかに高くなります。ガウス突然変異を検討してください(すべてが等しいガウス突然変異であると、1) バックテストに比べて突然変異に費やされる時間が短縮されます 2) 収束時間が長くなり、3) エラー検索空間の極小値に引っかかる可能性が低くなります)

これは、私が技術的ではない質問と解釈したことに対する、技術的ではない回答であることに注意してください。

于 2013-09-29T01:11:49.623 に答える