Javaでニューラルネットワークをプログラムし、現在、バックプロパゲーションアルゴリズムに取り組んでいます。
ウェイトのバッチ更新により、オンラインのウェイト更新ではなく、より安定した勾配検索が行われることを読みました。
テストとして、_x = [0..99]
_やy = f(x)
などの100ポイントの時系列関数を作成しました。テスト用に、1つの入力と1つの出力、および10個のニューロンを持つ2つの隠れ層を持つニューラルネットワークを作成しました。私が苦労しているのは、この問題に取り組むときのバックプロパゲーションアルゴリズムの学習率です。
100個の入力ポイントがあるので、各ノードの重みの変化_dw_{ij}
_を計算すると、実際には合計になります。
_dw_{ij} = dw_{ij,1} + dw_{ij,2} + ... + dw_{ij,p}
_
ここで、この場合は_p = 100
_です。
これで、重みの更新が非常に大きくなるため、エラーE
が跳ね返り、最小値を見つけるのが困難になります。適切な動作を得る唯一の方法は、学習率y
を_0.7 / p^2
_のようなものに設定したときでした。
サンプルの量に基づいて学習率を設定するための一般的なルールはありますか?
http://francky.me/faqai.php#otherFAQs :
件名:バックプロパゲーションにはどの学習率を使用する必要がありますか?
標準のバックプロパゲーションでは、学習率が低すぎると、ネットワークの学習が非常に遅くなります。学習率が高すぎると、重みと目的関数が発散するため、学習はまったく行われません。線形モデルのように目的関数が2次関数である場合、ヘッセ行列から適切な学習率を計算できます(Bertsekas and Tsitsiklis、1996)。隠れユニットを持つ典型的なフィードフォワードNNのように、目的関数に多くのローカルおよびグローバル最適化がある場合、ヘッセ行列も劇的に変化するため、最適学習率はトレーニングプロセス中に劇的に変化することがよくあります。一定の学習率を使用してNNをトレーニングしようとすることは、通常、多くの試行錯誤を必要とする退屈なプロセスです。学習率と運動量の選択がいくつかの非常に単純なネットワークで数値条件とどのように相互作用するかの例については、 ftp://ftp.sas.com/pub/neural/illcond/illcond.html を参照してください。
バッチトレーニングでは、一定の学習率を使用する必要はありません。実際、はるかに効率的で信頼性が高く、便利なバッチトレーニングアルゴリズムが存在するため、標準のバックプロパゲーションを使用する理由はまったくありません(「バックプロパゲーションとは」のQuickpropとRPROP、および「共役とは何か」で説明した多数のトレーニングアルゴリズムを参照してください。勾配、Levenberg-Marquardtなど?」)。
バックプロパゲーションの他の多くの変種が発明されました。ほとんどの場合、標準のバックプロパゲーションと同じ理論上の欠陥があります。重みの変化の大きさ(ステップサイズ)は、勾配の大きさの関数であってはなりません。重み空間の一部の領域では、勾配が小さく、大きなステップサイズが必要です。これは、ランダムな重みが小さいネットワークを初期化するときに発生します。重み空間の他の領域では、勾配が小さく、小さなステップサイズが必要です。これは、極小値に近いときに発生します。同様に、大きな勾配は、小さなステップまたは大きなステップのいずれかを必要とする場合があります。多くのアルゴリズムは学習率を適応させようとしますが、学習率に勾配を掛けて重みの変化を計算するアルゴリズムは、勾配が急激に変化したときに不安定な動作を引き起こす可能性があります。 QuickpropとRPROPの大きな利点は、勾配の大きさにこのように過度に依存しないことです。従来の最適化アルゴリズムは、勾配だけでなく、2次導関数または直線探索(またはそれらの組み合わせ)も使用して、適切なステップサイズを取得します。
インクリメンタルトレーニングでは、トレーニング中に学習率を自動的に調整するアルゴリズムを作成することははるかに困難です。 NNの文献にはさまざまな提案がありますが、それらのほとんどは機能しません。これらの提案のいくつかに関する問題は、残念ながら解決策を提供していないDarken and Moody(1992)によって説明されています。いくつかの有望な結果は、学習率ではなく勢いを適応させるLeCun、Simard、およびPearlmutter(1993)、およびOrr and Leen(1997)によって提供されています。 「反復平均化」または「ポリアック平均化」(Kushnerand Yin 1997)と呼ばれる確率的近似の変形もあり、重み値の移動平均を維持することによって理論的に最適な収束率を提供します。私はこれらの方法について個人的な経験はありません。インクリメンタルトレーニングで学習率や勢いを自動的に設定するこれらの方法やその他の方法が実際にさまざまなNNアプリケーションで機能するという確かな証拠がある場合は、FAQメンテナ(saswss @ unx.sas.com)。
参照:
クレジット:
簡単な解決策は、バッチを合計するのではなく、バッチの平均重量を取得することです。このようにして、さらに別のパラメーターを最適化することを心配することなく、0.7の学習率(またはお好みの他の値)を使用できます。
バッチ更新と学習率に関するさらに興味深い情報は、 Wilson(2003)によるこの記事 にあります。