ディープラーニングのこれらの落とし穴に遭遇したことがありますか?ニューラルネットワークのよくある落とし穴11選とその対処法

ディープラーニングのこれらの落とし穴に遭遇したことがありますか?ニューラルネットワークのよくある落とし穴11選とその対処法

ニューラルネットワークがうまく動作しない場合はどうすればいいでしょうか?この記事の著者は、データの前処理、正則化、学習率、活性化関数、ネットワークの重み設定など、ニューラルネットワークを構築するときに遭遇する可能性のある11の一般的な問題をリストし、解決策と理由の説明を提供しています。ディープラーニングの実践に役立つ資料です。

[[202726]]

ニューラル ネットワークが機能しない場合はどうすればよいでしょうか。ここでは、ニューラル ネットワークを構築するときに間違える可能性のあるすべての事柄と、それらを解決した自身の経験を著者がリストします。

  • データの正規化を忘れる
  • 結果を確認するのを忘れる
  • データの前処理を忘れる
  • 正規化の使用を忘れる
  • 使用されたバッチサイズが大きすぎます
  • 誤った学習率の使用
  • 最後の層で間違った活性化関数が使用されています
  • ネットワークに悪い勾配が含まれています
  • ネットワークの重みを誤って初期化する
  • 使用しているネットワークが深すぎます
  • 間違った数の隠れユニットを使用する
  • データの正規化を忘れる

問題の説明

ニューラル ネットワークを扱う場合、データを適切に正規化する方法を考えることが非常に重要です。これは変更できない手順です。慎重かつ正確に実行しないと、ネットワークが機能することはほぼ不可能になります。このステップはディープラーニングコミュニティでは非常に重要かつよく知られているため、論文で言及されることはほとんどなく、そのため初心者はこのステップで間違いを犯すことが多いのです。

どうすれば解決できるでしょうか?

一般的に、正規化とは、データから平均を減算し、それを分散で割ることを意味します。通常、これは各入力機能と出力機能ごとに個別に実行されますが、機能のグループを正規化したり、特定の機能に特に焦点を合わせたりする必要がある場合がよくあります。

なぜ?

データを正規化する必要がある主な理由は、ほとんどのニューラル ネットワーク パイプラインでは、入力データと出力データが標準偏差約 1、平均約 0 で分布していると想定しているためです。これらの仮定は、重みの初期化や活性化関数から、ネットワークのトレーニングに使用される最適化アルゴリズムに至るまで、ディープラーニングの文献に広く見られます。

また注意すべき点

トレーニングされていないニューラル ネットワークは通常、おおよそ -1 から 1 の範囲の値を出力します。他の範囲の値を出力したい場合(たとえば、RBG 画像は 0 ~ 255 の範囲のバイトとして保存されます)、問題が発生する可能性があります。トレーニングの開始時には、ネットワークは非常に不安定になります。これは、期待値がたとえば 255 の場合、ネットワークが -1 または 1 の値を生成するためです。これは、ニューラル ネットワークのトレーニングに使用されるほとんどの最適化アルゴリズムによって重大なエラーと見なされます。これにより、グラデーションが大きくなりすぎて、グラデーション爆発が発生する可能性があります。爆発しない場合は、ネットワークが最初に出力値を大まかに予想される範囲に減らすことを学習するため、トレーニングの最初の数段階は無駄になります。データを正規化すると(この場合は、値を 128 で割り、1 を引くだけです)、これらの問題は発生しません。

一般的に言えば、ニューラル ネットワーク内の特徴のサイズによってもその重要性が決まります。出力内の 1 つの機能のサイズが大きい場合、他の機能と比較して大きなエラーが発生します。同様に、入力内の大規模な特徴がネットワークを支配し、下流でより大きな変化をもたらします。したがって、ニューラル ネットワーク ライブラリの自動正規化を使用して、特徴ごとに平均値を盲目的に減算し、分散で割るだけでは不十分な場合がよくあります。通常 0.0 から 0.001 の範囲の入力機能があるかもしれません。この機能の範囲が非常に小さいのは、重要でない機能であるため (この場合は再スケールしない方がよい)、または他の機能と比較して単位が小さいため (この場合は再スケールする方がよい) でしょうか。同様に、範囲が非常に小さい機能には注意してください。分散は 0 に近いか 0 に等しいため、正規化すると NaN が不安定になります。これらの問題を慎重に検討することが重要です。つまり、それぞれの特徴が実際に何を表しているかを考慮し、「単位」を等しくすることですべての入力特徴を正規化するプロセスについて考えます。これは、このループで人々が本当に必要としているディープラーニングの数少ない側面の 1 つだと私は考えています。

結果を確認するのを忘れました。

問題の説明

ネットワークを数エポックにわたってトレーニングし、エラーが減少したことを確認しました。これで完了したということですか? 残念ながら、コードにはまだいくつかの問題があることはほぼ間違いありません。データの前処理、トレーニング コード、さらには推論にバグがある可能性があります。エラー率が下がったからといって、ネットワークが何か有用なことを学習しているということではありません。

どうすれば解決できるでしょうか?

プロセスの各段階でデータが正しいことを確認することが非常に重要です。多くの場合、結果を視覚化するための何らかの方法を見つける必要があります。画像データであれば非常に簡単で、アニメーションデータも問題なく視覚化できます。しかし、他の種類のデータの場合は、前処理、トレーニング、推論の各プロセスが正しいことを確認するために結果をチェックする方法を見つけ、結果を真実のデータと比較する必要があります。

なぜ?

従来のプログラミングとは異なり、機械学習システムはほとんどの場合、静かに失敗します。従来のプログラミングでは、エラーが発生したときにコンピューターがエラーをスローし、それをバグのチェックに戻るための信号として使用することに慣れています。残念ながら、このプロセスは機械学習ではうまく機能しないため、バグが発生したときや、戻ってコードをより徹底的にチェックする必要があるときを知るために、各段階で人間の目でプロセスを注意深くチェックする必要があります。

また注意すべき点

ネットワークが正常に動作しているかどうかを確認する方法は多数あります。アプローチの一部は、報告されたトレーニング エラーが何を意味するのかを正確に明確にすることです。トレーニング セットに適用されたネットワークの結果を視覚化します。ネットワークの結果は、実際のグラウンド トゥルースとどのように比較されますか? トレーニング中に 100 から 1 までのエラーが発生する可能性がありますが、エラーが 1 のままでも許容できない結果である場合、結果は依然として使用できません。ネットワークがトレーニング セットで機能する場合は、検証セットをチェックします。ネットワークは、これまで見たことのないデータでも機能しますか? 私のアドバイスは、最初からすべてを視覚化することに慣れることです。ネットワークが機能しないときだけ視覚化するのではなく、さまざまなニューラル ネットワーク アーキテクチャを試す前に、パイプライン全体を必ずチェックしてください。これは、さまざまな潜在的なアプローチを正確に評価する唯一の方法です。

データの前処理を忘れました

問題の説明

ほとんどのデータは扱いにくいものです。類似しているとわかっているデータでも、まったく異なる数値で表されていることがよくあります。キャラクターアニメーションを例に挙げると、モーションキャプチャスタジオの中心を基準としたキャラクターの関節の 3D 位置を使用してデータを表す場合、ある位置でアクションを実行したり、ある方向を向いたりすると、別の位置で同じアクションを実行したり、別の方向を向いたりする場合とはまったく異なる数値表現が生成される可能性があります。次に、類似のアクションが類似の数値表現を持つように、データを別の方法で表現する必要があります。たとえば、ローカル参照フレーム (キャラクターの質量の中心を基準とするフレームなど) で表現します。

どうすれば解決できるでしょうか?

特徴が何を表しているか考えてみましょう。類似のものを表すデータ ポイントが常に類似の数値表現を得るようにする簡単な変換はありますか? データをより自然に表すことができるローカル座標系 (おそらくより適切な色空間) が別の形式でありますか?

なぜ?

ニューラル ネットワークは、入力するデータについていくつかの基本的な仮定のみを立てます。その 1 つは、データが存在する空間が連続しているということです。つまり、その空間の大部分では、2 つのデータ ポイント間に少なくとも何らかの「混合」ポイントがあり、隣接する 2 つのデータ ポイントは、ある意味で「類似」したものを表します。データ空間に大きな不連続性があったり、同じものを表す大量の分離されたデータがあったりすると、学習タスクがより困難になります。

また注意すべき点

データ前処理のもう 1 つのアプローチは、必要なデータ バリエーションの組み合わせ爆発を減らすことです。たとえば、キャラクターアニメーションデータでトレーニングされたニューラルネットワークが、あらゆる位置とあらゆる方向で同じアクションの組み合わせを学習する必要がある場合、ネットワークの容量の多くが無駄になり、学習プロセスの多くが反復的になります。

正規化を忘れた

問題の説明

正規化 (通常はドロップアウト、ノイズ、または何らかの形のネットワークのランダム化) は、ニューラル ネットワークのトレーニングにおけるもう 1 つの不変の側面です。パラメータよりもデータの方がはるかに多い場合や、オーバーフィッティングは重要ではない場合、またはオーバーフィッティングは発生しないと思われる場合でも、ドロップアウトやその他の形式のノイズを追加する必要があります。

どうすれば解決できるでしょうか?

ニューラル ネットワークを正規化する最も基本的な方法は、ネットワークの各線形層 (畳み込み層または密層) の前にドロップアウトを追加することです。 0.75 や 0.9 などの中程度から高い保持確率から始めます。過剰適合の可能性を考慮して調整します。それでも過剰適合の可能性が低いと思われる場合は、保持確率を 0.99 などの非常に高い値に設定できます。

なぜ?

正規化は過剰適合を制御することだけではありません。トレーニング プロセスにいくつかの確率過程を導入することで、ある意味で損失パターンを「平滑化」していることになります。これにより、トレーニングが高速化され、データ内の外れ値に対処し、ネットワークの極端な重み構成を防ぐことができます。

また注意すべき点

データ拡張や他の種類のノイズも、ドロップアウトのような正規化の形式として使用できます。ドロップアウトは、複数のランダム サブネットワークの予測を順番に組み合わせる手法としてよく考えられていますが、トレーニング プロセス中に類似の入力データのさまざまなバリエーションを生成することで、トレーニング セットのサイズを動的に拡張する方法としてドロップアウトを考えることもできます。そして、過剰適合を回避し、ネットワークの精度を向上させる最善の方法は、ネットワークが見たことのないデータをさらに増やすことだということがわかっています。

使用されたバッチサイズが大きすぎます

問題の説明

バッチ サイズが大きすぎると、勾配降下法のランダム性が低下し、トレーニング中のネットワークの精度に悪影響を与える可能性があります。

どうすれば解決できるでしょうか?

トレーニング中に受け入れることができる最小のバッチ サイズを見つけます。トレーニング中に GPU の並列処理を最大化するバッチ サイズは、精度の点では最適ではない可能性があります。これは、ある時点で、バッチ サイズが大きくなると、同じ精度を達成するためにより多くのエポックが必要になるためです。 16、8、あるいは 1 といった非常に小さなバッチ サイズから始めることを恐れないでください。

なぜ?

バッチを小さくすると、重みの更新が不規則になり、よりランダムになります。これを行うと、2 つの大きな利点があります。まず、トレーニングが行き詰まっていた可能性のある局所的最小値から「抜け出す」のに役立ちます。次に、トレーニングを「より平坦な」最小値で終了させることができます。これは通常、より優れた一般化パフォーマンスを表します。

また注意すべき点

データ内の他の要素も、バッチ サイズと同じくらい効果的である場合があります。たとえば、画像を処理する場合、解像度を 2 倍にすると、バッチ サイズを 4 増やすのと同様の効果が得られる可能性があります。直感的に言えば、CNN では、各フィルターの重み更新は、入力画像のすべてのピクセルとバッチ内の各画像にわたって平均化されます。画像の解像度を 2 倍にすると、バッチ サイズを 4 倍に増やすのと同じように、平均で 4 倍以上のピクセルが生成されます。要約すると、各反復で最終的な勾配更新がどの程度平均化されるかを考慮し、悪影響と可能な限り多くの GPU 並列処理を活用することとのバランスを保つことが重要です。

学習率が不正確

問題の説明

学習率は、ネットワークのトレーニングの質に大きな影響を与える可能性があります。始めたばかりの場合は、一般的なディープラーニング フレームワークのさまざまなデフォルト オプションが原因で、学習率が正しく設定されていない可能性が高くなります。

どうすれば解決できるでしょうか?

グラデーションクリッピングをオフにします。トレーニング中にエラーが発生しない学習率の最高値を見つけます。次に、学習率をこれより少し低い値に設定します。これは、最適な学習率に非常に近くなる可能性があります。

なぜ?

多くのディープラーニング フレームワークでは、デフォルトでグラデーション クリッピングが有効になっています。このオプションは、各ステップで重みを可能な限り変更することにより、トレーニング中の過剰最適化を防ぎます。これは、データに多くの外れ値が含まれている場合に特に役立ちます。外れ値によって大きなエラーが発生し、勾配と重みの更新が大きくなる可能性があるためです。ただし、このオプションをデフォルトでオンにすると、ユーザーが最適な学習率を手動で見つけることが難しくなります。ディープラーニングを初めて学ぶ人の多くは、勾配クリッピングのために学習率を高く設定しすぎていることに気づきました。勾配クリッピングによって全体的なトレーニング動作が遅くなり、学習率の変更による影響が予測できなくなります。

また注意すべき点

データを正しくクリーンアップし、外れ値のほとんどを削除し、学習率を正しく設定した場合、実際には勾配クリッピングは必要ありません。グラデーション クリッピングをオフにした後、トレーニング エラーが時々急増することがわかった場合は、いつでもグラデーション クリッピングをオンに戻すことができます。ただし、トレーニング エラー率が高いということは、ほとんどの場合、データに何らかの異常があることを示しているということ、そしてクリッピングは一時的な解決策にすぎないということを覚えておくことが重要です。

最後の層で間違った活性化関数が使用されています

問題の説明

最終層でアクティベーション関数を使用すると、ネットワークが必要な値の全範囲を生成できない場合があります。最もよくある間違いは、最後のレイヤーで ReLU を使用することです。これにより、ネットワークは正の値のみを出力します。

どうすれば解決できるでしょうか?

回帰分析を行う場合、出力したい値の種類が正確にわかっている場合を除き、ほとんどの場合、最後のレイヤーでいかなる種類の活性化関数も使用しません。

なぜ?

データ値が実際に何を表しているのか、正規化後にどの範囲に該当するのかをもう一度考えてみましょう。おそらく、出力値は無制限の正または負の数値です。この場合、最終層でアクティベーション関数を使用しないでください。出力値が 0 から 1 の間の確率で構成されるなど、特定の範囲でのみ意味を持つ場合は、最終層でシグモイド活性化関数などの特定の活性化関数を使用する必要があります。

また注意すべき点

最終層で活性化関数を使用する場合、注意すべき点が多数あります。おそらく、システムが最終的に出力を [-1, 1] にクリップすることをご存知でしょう。このクリッピング プロセスを最終レイヤーのアクティベーションに追加すると、ネットワークのエラー関数が 1 より大きい値または -1 より小さい値にペナルティを課さなくなるため、意味があります。ただし、エラーがないということは、1 より大きい値または -1 より小さい値に対しても勾配がないことを意味します。そのため、場合によってはネットワークをトレーニングできなくなる可能性があります。あるいは、この活性化関数は範囲 [-1, 1] の値を出力するため、最後のレイヤーで tanh を使用することもできますが、この関数の勾配は 1 または -1 の近くで非常に小さくなり、-1 または 1 を生成するために重みが非常に大きくなる可能性があるため、これも問題を引き起こす可能性があります。一般的に言えば、安全を期して最後のレイヤーでは活性化関数を使用しない方がよいでしょう。時には賢すぎると裏目に出ることもあります。

ネットワークに悪い勾配がある

問題の説明

ReLU 活性化関数を使用するディープ ネットワークでは、悪い勾配によっていわゆる「デッド ニューロン」が発生することがよくあります。これにより、ネットワークのパフォーマンスに悪影響が及ぶ可能性があり、場合によっては完全にトレーニングできなくなることもあります。

どうすれば解決できるでしょうか?

複数のエポックを経てもトレーニング エラーが変化しない場合は、ReLU 活性化関数が使用され、すべてのニューロンが死んでいる可能性があります。リーキー ReLU や ELU などの別のアクティベーション関数に切り替えて、問題が解決するかどうかを確認してください。

なぜ?

ReLU活性化関数の勾配は、正の値の場合は1、負の値の場合は0になります。これは、入力が 0 未満の場合、入力の小さな変化は出力に影響を与えないためです。短期的には、正の値の勾配が大きいため、これは問題にならない可能性があります。ただし、レイヤーは互いに積み重ねることができ、負の重みによって、大きな正の勾配を持つ値が勾配がゼロの負の値に変換される可能性があります。多くの場合、入力が何であっても、一部またはすべての隠れユニットはコスト関数に対して勾配がゼロになります。この場合、重みをまったく更新できないため、ネットワークは「デッド」であると言えます。

また注意すべき点

勾配がゼロの操作 (クリッピング、丸め、最大/最小など) は、重みに関するコスト関数の導関数を計算するときに使用すると、不正な勾配を生成します。これらがシンボル図に現れると、予期しない問題を引き起こすことが多いので、十分に注意してください。

ネットワークの重みが正しく初期化されていません

問題の説明

ニューラル ネットワークの重みを正しく初期化しないと、ニューラル ネットワークがまったくトレーニングされない可能性が高くなります。ニューラル ネットワークの他の多くのコンポーネントには、重みの正しい初期化または標準化された初期化があり、重みをゼロに設定したり、独自のカスタム ランダム初期化を使用したりしても機能しません。

どうすれば解決できるでしょうか?

「he」、「lecun」、または「xavier」の重み初期化はすべて一般的な選択肢であり、ほとんどすべての場合に適切に機能します。 1 つだけ選択し (私のお気に入りは「lecun」です)、ニューラル ネットワークが動作したら、自由に実験してみてください。

なぜ?

「小さな乱数」を使用してニューラル ネットワークの重みを初期化できることはすでにご存知かもしれませんが、それほど簡単ではありません。上記の初期化はすべて、複雑で詳細な数学を使用して発見されており、それがなぜ最もよく使用されるのかを説明しています。さらに重要なのは、他のニューラル ネットワーク コンポーネントがこれらの初期化に基づいて構築され、それらを使用して経験的にテストされていることです。独自の初期化を使用すると、他の研究者の結果を再現することが難しくなる可能性があります。

また注意すべき点

他のレイヤーでも慎重な初期化が必要になる場合があります。ネットワーク バイアスはゼロに初期化されますが、他のより複雑なレイヤー (パラメーター活性化関数など) には独自の初期化が付属している場合があり、これを正しく行うことも同様に重要です。

ニューラルネットワークが深すぎる

問題の説明

より深い方が優れているのでしょうか? まあ、必ずしもそうとは限りません… ベンチマークを更新し、いくつかのタスクの精度を 1%、1% 向上させようと必死になっている場合、一般的にはより深いニューラル ネットワークの方が優れています。しかし、3 ~ 5 層しかない小さなネットワークで何も学習しない場合は、100 層でも同様に失敗するか、さらに悪い結果になることは間違いありません。

どうすれば解決できるでしょうか?

3 ~ 8 層の浅いニューラル ネットワークから始めます。ニューラル ネットワークが実行され、何かを学習した後でのみ、精度を向上させる方法を検討し、ネットワークを深めるようにしてください。

なぜ?

過去 10 年間のニューラル ネットワークの改善はすべて、より深いレベルのネットワークのパフォーマンスが向上するため、より小規模なネットワークにのみ適用される小さな基本的な変更でした。ネットワークが機能していない場合は、深度以外の問題である可能性が高くなります。

また注意すべき点

小さなネットワークから始めるということは、トレーニング、推論、さまざまな設計や設定の反復が速くなることも意味します。最初は、これらすべての要素が、いくつかの層を積み重ねるだけよりも、精度に大きな影響を与えます。

間違った数の隠れユニットを使用する

問題の説明

場合によっては、隠しユニットが多すぎたり少なすぎたりすると、ネットワークのトレーニングが困難になることがあります。隠れユニットが少なすぎると、必要なタスクを表現できない可能性があります。一方、隠れユニットが多すぎると、速度が遅くなり、トレーニングが困難になり、残留ノイズを除去するのが難しくなります。

どうすれば解決できるでしょうか?

256 〜 1024 個の隠しユニットから開始します。次に、同様のアプリの他の調査がどの程度使用されているかを確認し、それを参考にします。他の研究者があなたとはまったく異なる数値を使用している場合は、説明すべき特定の理由がある可能性があります。

なぜ?

隠れユニットの数を決める際には、ネットワークに情報を伝達するために必要と思われる真の値の最小数を考慮することが重要です。この数字を大きくした方がいいです。より冗長な表現を使用するネットワークの場合、ドロップアウトは役立ちます。分類を行う場合は、クラスの数を 5 ~ 10 倍使用できますが、回帰を行う場合は、入力変数または出力変数の数を 2 ~ 3 倍使用する必要がある場合があります。もちろん、これらすべては状況に大きく依存しており、簡単な自動ソリューションはありません。隠れユニットの数を決定するには、優れた直感を持つことが最も重要です。

また注意すべき点

実際には、隠れユニットの数は、他の要素と比較してニューラル ネットワークのパフォーマンスにほとんど影響を与えず、多くの場合、必要な隠れユニットの数を過大評価してもトレーニングが遅くなることがありません。ネットワークが動作し始めてもまだ心配な場合は、さまざまな数値を試して、ネットワークに最適な数値が見つかるまで精度を測定してください。

<<:  今後10年間で、人工知能とロボットは雇用に7つの影響を与える

>>:  AWS でディープラーニングを使用するための 10 個の Linux コマンド

ブログ    
ブログ    

推薦する

近年、「人工知能」が私たちの生活に静かに登場している

科学技術と産業技術の継続的な発展により、私たちの生活は大きく向上し、「人工知能」という言葉も徐々に私...

レッドハットのCEOがAIの取り組みとソースコードの混乱について語る

今年初めの Red Hat Summit で、Red Hat は OpenShift AI によるプ...

...

...

認知AIの台頭:2025年にAIは質的に飛躍する

[[441939]] AIの概念が初めて提唱されたのは1956年なので、60年以上の歴史があります。...

...

人工知能が防犯カメラの機能を強化している

今日、セキュリティという言葉を聞くと、それは通常、サイバーセキュリティ、特に人工知能に関するものにな...

ネイチャーが中国のAIの現状を分析。2030年に世界をリードできるか?

ネイチャー誌の最近の分析記事では、中国の人工知能研究は質の面で急速な進歩を遂げているが、影響力の大き...

App Storeのランキングアルゴリズムの変更、開発者は準備が必要

[[80451]]数日前、AppleのApp Storeの検索アルゴリズムが変わり始めたかもしれない...

...

ファーウェイ、セキュリティ業界を洞察から先見へと進化させる2019年スマートセキュリティ事業戦略を発表

[51CTO.comより引用] 2019年8月8日、ファーウェイの2019年スマートセキュリティビジ...

大規模製造企業におけるインテリジェントな意思決定シナリオの分析

1. 製造業の発展の現状まず、製造業企業の発展状況について紹介します。 1. 企業経営は直線的な発展...

...

Alibaba Cloud が Tongyi Qianwen 2.0 をリリース、パフォーマンスが加速して GPT-4 に追いつく

2023年杭州雲奇大会において、アリババクラウド最高技術責任者の周景仁氏は、数千億のパラメータを持つ...

Github が絶賛: モザイクテキスト = 無意味、AI があなたの思考をすべて見抜く、オープンソースに

「この写真をフォトショップで加工しましょう!」 「いいですよ、でもこの段落は検閲しないと面倒なことに...