ニューラル ネットワーク トレーニング中の非収束またはトレーニング失敗の理由

この記事では、データとラベル、モデル、およびトレーニング損失とテスト損失を通じてネットワークの現在の状態を分析する方法という 3 つの主要な側面から、ニューラル ネットワーク トレーニング中の非収束またはトレーニング失敗の理由をまとめます。

収束しないモデルに直面した場合は、まずトレーニング時間が十分であることを確認してください。トレーニングプロセス中、損失は減少し続けるわけではありませんが、正解率は向上し続けており、いくつかのショックが発生します。全体的な傾向が収束している限り。十分なトレーニング時間 (通常、数千、数万、または数十エポック) があるにもかかわらず収束しない場合は、それを解決するための措置を講じることを検討してください。

データとラベル

  1. データの前処理は実行されませんでした。データ分類のラベル付けは正確ですか? データはきれいですか?

  2. データは正規化されていませんでした。評価指標が異なると次元や次元単位が異なる場合が多いため、このような状況はデータ分析結果に影響を及ぼしますが、指標間の次元の影響を排除するには、データ指標間の比較可能性を解決するデータ標準化処理が必要です。元のデータがデータ標準化によって処理されると、すべての指標が同じ桁になるため、包括的な比較と評価に適しています。さらに、ほとんどのニューラル ネットワーク プロセスは、重みの初期化から活性化関数、トレーニングからトレーニング ネットワーク最適化アルゴリズムに至るまで、入力と出力が 0 付近に分散されることを前提としています。データから平均を減算し、分散を除去します。

  3. サンプル内の情報量が多すぎるため、ネットワークがサンプル空間全体に適合するには不十分です。サンプル数が少ない場合は、過剰適合の問題が発生するだけである可能性があります。トレーニング セットの損失が収束していることを確認しましたか? 検証セットが収束しないだけであれば、それはオーバーフィットを意味します。このとき、ドロップアウト、SGD、ミニバッチ数の増加、FC 層のノード数の削減など、さまざまなオーバーフィット防止策を検討する必要があります。 、勢い、微調整など。

  4. ラベルの設定が正しいかどうか。

モデル

  1. ネットワーク設定が無理です。非常に複雑な分類タスクを実行しても、非常に浅いネットワークのみを使用する場合、トレーニングの収束が困難になる可能性があります。適切なネットワークを選択するか、現在のネットワークをさらに強化する必要があります。一般に、ネットワークは深ければ深いほど優れています。最初は 3 ~ 8 層のネットワークを構築できます。ネットワークが適切に実装されたら、精度を向上させるためにより深いネットワークで実験することを検討できます。小規模なネットワークから開始するということは、トレーニングが高速であることを意味し、単により多くのレイヤーを積み重ねるのではなく、さまざまなパラメーターを設定してネットワークへの影響を観察することができます。

  2. 学習率が不適切で、大きすぎると非収束が発生し、小さすぎると収束が非常に遅くなります。学習率の設定が無理がある。新しいネットワークを自分でトレーニングする場合は、0.1 から試してみてください。損失が減少しない場合は、損失を減らし、10 で割って、0.01 で試してください。一般的に、0.01 で収束します。そうでない場合は、0.001 を使用してください。学習率の設定が大きすぎるため、発振しやすくなります。ただし、最初、特にトレーニングの開始時に学習率を小さすぎるように設定することはお勧めできません。最初は学習率を低く設定しすぎると損失が収束しません。私のアプローチは、0.1、0.08、0.06、0.05...と徐々に試していき、正常になるまで徐々に減らしていくことです。場合によっては学習率が低すぎて過小評価できない場合があります。モメンタムを増やすことも、ミニバッチ値があまり変動しないように適切に増加させる方法です。学習率を高く設定しすぎると、暴走する(損失が突然非常に大きくなる)という問題が発生します。これは初心者にとって最も一般的な状況です。ネットワークが実行中で、収束を監視しているときに、突然ネットワークが飛ぶのはなぜでしょうか? 最も考えられる理由は、活性化関数として relu を使用し、分類層の損失関数としてソフトマックスまたは exp を含む関数を使用していることです。特定のトレーニングが最後の層に渡されると、特定のノードが過活性化され (100 など)、exp(100)=Inf となり、オーバーフローが発生し、bp 以降のすべての重みが NAN になり、その後の重みは常に Keep NAN になります。だから損失は激しくなるだろう。lrを高く設定しすぎると逃げて二度と戻ってこない状況が発生します。この時点で、停止してレイヤーの重みをランダムに選択すると、それらはすべて NAN である可能性が非常に高くなります。この場合、二分法を使用して試すことをお勧めします。0.1~0.0001。モデルごとに、タスクごとに最適な lr が異なります。

  3. 隠れ層のニューロンの数が間違っています。場合によっては、使用するニューロンが多すぎたり少なすぎたりすると、ネットワークのトレーニングが困難になる可能性があります。ニューロンの数が少なすぎるとタスクを表現できなくなりますが、ニューロンの数が多すぎるとトレーニングが遅くなり、ネットワークが一部のノイズを除去することが困難になります。隠れ層のニューロンの数は 256 から 1024 まで設定でき、研究者が使用している数を参照することができます。彼らがこれとは大きく異なる数値を使用した場合、これがどのように機能するかを想像してください。隠れ層で使用するユニットの数を決定する前に、最も重要なことは、ネットワークを通じて情報を表現するために必要な実際の値の最小数を検討し、この数を徐々に増やすことです。回帰タスクを実行する場合は、入力変数または出力変数の 2 ~ 3 倍のニューロンを使用することを検討してください。実際、隠れユニットの数は通常、他の要素と比較してニューラル ネットワークのパフォーマンスに与える影響はかなり小さいです。そして多くの場合、必要な隠しユニットの数を増やすと、トレーニングが遅くなるだけです。

  4. ネットワークパラメータの初期化中にエラーが発生しました。ネットワークの重みが適切に初期化されていない場合、ネットワークはトレーニングできません。重みを初期化するために一般的に使用されるメソッドは、「he」、「lecun」、「xavier」です。実際のアプリケーションでは、これらのメソッドは非常に優れたパフォーマンスを発揮し、ネットワーク バイアスは通常 0 に初期化されます。最も適切なものを選択できます。タスクの初期化メソッド。

  5. 正規化はありません。 正則化は通常、ドロップアウト、ノイズの追加などです。データ量が大きい場合や、ネットワークがオーバーフィットする可能性が低いと思われる場合でも、ネットワークを正規化する必要があります。通常、ドロップアウトは 0.75 または 0.9 のパラメーターで開始され、ネットワークがオーバーフィットすると思われる可能性の程度に基づいてこのパラメーターを調整します。さらに、ネットワークがオーバーフィットしないことが確実な場合は、パラメーターを 0.99 に設定できます。正則化は過剰適合を防ぐだけでなく、この確率的プロセスにおいて、トレーニングを高速化するだけでなく、データ内の外れ値に対処し、ネットワークの極端な重み設定を防ぐのにも役立ちます。正則化の効果は、データの増幅にも適用できます。過学習を回避する最善の方法は、大量のトレーニング データを用意することです。

  6. バッチサイズが大きすぎます。バッチ サイズの設定が大きすぎると、勾配降下法のランダム性が低下するため、ネットワークの精度が低下します。さらに、同じ状況下では、バッチ サイズが大きくなるほど、通常、同じ精度を達成するためにより多くのトレーニング エポックが必要になります。16、8、さらには 1 など、より小さいバッチ サイズを試してみることもできます。バッチ サイズが小さいほど、1 エポックでより多くの重み更新を実行できます。ここでの利点は 2 つあり、1 つは極小点から飛び出すことができることです。2 番目の方がより優れた汎化パフォーマンスを示すことができます。

  7. 学習率が正しく設定されていません。多くの深層学習フレームワークでは、デフォルトで勾配クリッピングが有効になっており、勾配爆発問題を処理でき、非常に便利ですが、デフォルトで最適な学習率を見つけることも困難です。データを正しくクリーニングし、外れ値を削除し、正しい学習率を設定した場合は、勾配クリッピングを使用する必要はありません。また、場合によっては勾配爆発の問題が発生する場合がありますが、その場合は勾配クリッピングをオンにできます。ただし、この種の問題は通常、データに関する他の問題を示しており、グラデーション クリッピングは一時的な解決策にすぎません。ワオソフト アイオット http://143ai.com 

  8. 最後の層の活性化関数が間違っています。最後の層で間違ったアクティベーション関数を使用すると、ネットワークが期待した範囲値を出力できなくなります。最も一般的な間違いは、最後の層で Relu 関数を使用することであり、その出力には負の値がありません。回帰タスクを実行している場合、出力として期待される値がわかっていない限り、ほとんどの場合、活性化関数を使用する必要はありません。データ値が実際に何を表すか、および繰り込み後のその範囲がどのようになるかを想像してください。おそらく、制限のない正と負の数値が出力されます。この場合、最後の層は活性化関数を使用すべきではありません。出力値が特定の範囲内でのみ意味を持つ場合 (0 ~ 1 の範囲内の確率構成など)。その後、最後の層でシグモイド関数を使用できます。

  9. ネットワークの勾配が悪い。 いくつかのエポックでトレーニングを行ってもエラーが変わらない場合は、Relu を使用している可能性があります。活性化関数を Leaky Relu に置き換えてみることができます。Relu 活性化関数には、正の値の場合は 1 の勾配があり、負の値の場合は 0 の勾配があるためです。したがって、一部のネットワーク重みのコスト関数の傾きは 0 になります。この場合、ネットワークは更新できなくなっているため、ネットワークは「死んでいる」と言います。

列車損失や試験損失を通じてネットワークの現状を分析するにはどうすればよいでしょうか?

列車損失は減少し続け、テスト損失も減少し続けています。これは、ネットワークがまだ学習中であることを示しています。

列車損失は減少し続けますが、テスト損失は変化しない傾向があり、ネットワークが過剰適合していることを示しています。

トレーニング損失は変化しない傾向があり、テスト損失は減少し続けています。これは、データ セットに 100% 問題があることを示しています。

トレーニング損失は変化しない傾向があり、テスト損失も変化しない傾向があります。これは、学習がボトルネックに遭遇し、学習率またはバッチ数を減らす必要があることを示しています。

トレーニング損失が増加し続け、テスト損失も増加し続けています。これは、ネットワーク構造が適切に設計されておらず、トレーニング ハイパーパラメーターが適切に設定されておらず、データ セットがクリーンアップされていることを示しています。

おすすめ

転載: blog.csdn.net/qq_29788741/article/details/132240907