バックプロパゲーション ニューラル ネットワークのトレーニングにマルチスレッドを適用するにはどうすればよいですか?
-
11-09-2019 - |
質問
大学のプロジェクトで、クレジット カード取引が不正であるかどうかを分類できるニューラル ネットワークを作成しています。バックプロパゲーションを使ってトレーニングしています。これをJavaで書いています。私のコンピューターはクアッドコア i7 なので、マルチスレッドを適用したいと考えています。トレーニングに何時間も費やし、ほとんどのコアがアイドル状態になるのはイライラします。
しかし、バックプロパゲーションにマルチスレッドを適用するにはどうすればよいでしょうか?Backprop は、ネットワークを通じてエラーを逆方向に調整することで機能します。1 つのレイヤーを完了してから、もう 1 つのレイヤーを続行する必要があります。マルチコア バックドロップを実行するようにプログラムを変更する方法はありますか?
解決
まず第一には、バックプロパゲーションを使用しないでください。他の多くのオプションがそこにあります。私がしようとしてRPROP(弾力性の伝播)をお勧めします。それはあなたのバックプロパゲーションアルゴリズムへの変更の大きさではありません。あなたは学習率や勢いを指定する必要はありません。その本当にほとんどあなたは、ニューラルネットワーク内のすべての接続のための率を学び、個々の変数を持っているかのように。
バックプロパゲーションにマルチスレッドを適用するとして。私はこのトピックに関する記事を書いています。
http://www.heatonresearch.com/encog/mprop/compare.html の
は、基本的に私は、スレッドの数を作成し、各スレッドが近等しい量を有するように、トレーニングデータを分割します。私は、各スレッドに勾配を計算していますし、それらを減らすステップで加算されます。勾配が重みに適用されているどのように使用され、伝播学習アルゴリズムに依存するが、重量の更新がクリティカルセクションで行われます。
あなたが重みよりもかなり多くの学習サンプルを持っている場合、コードはクリティカルセクションの重み更新よりもマルチスレッドの勾配計算で多くの時間を費やしています。
私は、上記のリンクでのパフォーマンスの結果の一部を提供しています。それは本当に物事をスピードアップするん!
他のヒント
Java でより多くの CPU コアを使用するには、コードを変更せずに JVM のオプションをさらに試すことができます。
- -サーバ
- -d64
- -XX:-UseParallelGC
およびその他のオプション http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp