畳み込みニューラルネットワークの「修理工」のための「マニュアル」

畳み込みニューラルネットワークの「修理工」のための「マニュアル」

[[242145]]

ビッグデータダイジェスト制作

編集者: Luo Ran、Xue Qing、Aileen

この記事の主な内容は、著者自身の経験といくつかのオンライン リソース (最も有名なスタンフォード大学の CS231n コース ノートなど) に基づいており、畳み込みニューラル ネットワークをデバッグしてパフォーマンスを向上させる方法について説明しています。

この記事では、主にディープニューラルネットワークアーキテクチャにおける教師あり学習手法に焦点を当てています。このガイドは Python 3.6 に基づいており、TensorFlow (TF) を使用していますが、言語に依存しないガイドとしても使用できます。

畳み込みニューラル ネットワークをトレーニングして評価すると、評価結果が予想よりも悪かったとします。

以下は、トラブルシューティングとパフォーマンスの改善の手順を段階的に示します。最初の部分は、トラブルシューティングを行う前に必須の事項とベストプラクティスです。後続の各セクションのタイトルは、そのセクションで取り上げられている質問に対応しています。

まず「より一般的な」問題を取り上げ、それぞれの見出しの下で「最も簡単に実装できる」解決策を優先します。

トラブルシューティングの前に...

以下は、ディープラーニング アルゴリズムを作成する際に従うべきベスト プラクティスです。このトピックに関する優れたリソースとしては、CS231n コース ノートと Bengio のレビュー ペーパーがあります。

  • スタンフォードの CS231n コースノート: http://cs231n.github.io/
  • Bengio のレビュー論文: https://arxiv.org/pdf/1206.5533v2.pdf

1. 適切なログ記録と意味のある変数名を使用します。 TF では、さまざまな変数を名前で追跡し、TF の視覚化ツール TensorBoard で計算グラフを表示できます。

最も重要なことは、step_number、accuracy、loss、learning_rate などの関連する値をいくつかのトレーニング ステップごとに必ず記録することです。該当する場合は、より具体的なメトリックを追加します (例: 画像セグメンテーション タスクの mean_intersection_over_union (別名 mean_iou))。その後、トレーニング手順に基づいて損失曲線をプロットできます。

翻訳者注: IoU は、予測ウィンドウとラベル付きウィンドウ間の交差と和の比率です。

2. ネットワーク接続が正しいことを確認します。 TensorBoard またはその他のデバッグ手法を使用して、計算グラフ内の各操作の入力と出力が正確であることを確認し、データとラベルがネットワークに供給される前に適切に前処理され、一致していることも確認します。

3. データ拡張技術を実装します。これはすべてのケースに当てはまるわけではありませんが、画像を扱う場合、単純なデータ拡張手法 (ミラーリング、回転、ランダムな切り取りとスケーリング、ノイズの追加、弾性変形など) を適用すると、パフォーマンスが大幅に向上することがよくあります。そして、TF にはこれらの操作のほとんどに対応する関数が組み込まれており、非常に良心的です。

4. すべてのレイヤーに対して重みの初期化と正規化を使用します。重みを同じ値に初期化しないでください。さらに悪いことに、0 に初期化しないでください。そうすると、対称性や勾配消失の潜在的な問題が発生し、ほとんどの場合、ひどい結果につながります。一般に、重みの初期化に問題がある場合は、ネットワークにバッチ正規化レイヤーを追加することを検討してください。

BN論文リンク: https://arxiv.org/abs/1502.03167.

5. 正規化項が損失関数内の他の項を「圧倒」しないようにします。正規化をオフにして、「損失」の大きさの順序を調べ、正規化項を適切に調整します。正規化の強度が増すにつれて損失も増加することを確認してください。

6. 小さなデータセットにオーバーフィットしてみます。正規化/ドロップアウト/データ拡張をオフにし、トレーニング セットの小さなサブセットを使用して、ニューラル ネットワークを数エポックトレーニングします。損失ゼロを達成できることを確認してください。そうでない場合は、何か問題がある可能性があります。

場合によっては、損失を 0 に減らすことが特に困難です。たとえば、画像セマンティックセグメンテーションでは、損失にソフトマックスロジットと各ピクセルのグラウンドトゥルースラベル間のクロスエントロピーが含まれる場合、それを 0 に減らすのは非常に難しい可能性があります。ただし、ソフトマックス化されたロジットの argmax を取得し、それをグラウンド トゥルース ラベルと比較することによって計算された、100% に近い精度を達成するように努める必要があります。

翻訳者注: 機械学習において、「グラウンド トゥルース」という用語は、教師あり学習手法におけるトレーニング セットの分類の精度を指し、単に正しくラベル付けされたデータを意味します。

7. 上記の小さなデータセットをオーバーフィットしながら適切な学習率を見つけます。以下は Bengio の論文からの抜粋です。最適な学習率は通常、トレーニング エラーを増大させない最大学習率に近いものです。学習率を設定するためのヒューリスティックを導くことができる 1 つの観察は、たとえば、大きな学習率から始めて、トレーニング エラーが発散する場合は、発散が見られなくなるまで最大学習率を 3 で割って再度試すことです。

8. 勾配チェックを実行します。計算グラフでカスタム操作 (つまり、組み込みの TF 操作ではない操作) を使用している場合、勾配チェックは特に重要です。次のリンクには、勾配チェックの実装に関するヒントがいくつか記載されています。

勾配チェック: http://cs231n.github.io/neural-networks-3/

損失額が改善しない場合は…

数エポックにわたってトレーニングを行っても損失が改善されない、または損失がさらに大きくなる場合は、次の手順を検討する必要があります。

1. 適切な損失関数を使用しており、正しいテンソルを最適化していることを確認します。一般的な損失関数のリストはここで入手できます。

https://en.wikipedia.org/wiki/分類損失関数

2. 適切なオプティマイザーを使用します。一般的に使用されるオプティマイザーのリストはここにあります。

https://keras.io/optimizers/

3. 変数が実際にトレーニングされていることを確認します。これを確認するには、TensorBoard のヒストグラムを確認するか、いくつかの異なるトレーニングインスタンスで各テンソルのノルム (L1 または L∞) を計算し、それらのテンソルの名前を出力するスクリプトを作成します。

変数が期待どおりにトレーニングされない場合は、次の記事を参照してください。

https://gist.github.com/zeyademam/0f60821a0d36ea44eef496633b4430fc#変数なしトレーニング

4. 初期学習率を調整し、適切な学習率スケジュールを実装することが、おそらく最も効果的な「修正」です。損失が悪化している場合は、初期学習率が大きすぎる可能性があります。一方、損失がほとんど変化しない場合は、初期学習率が小さすぎる可能性があります。いずれにしても、有効な初期学習率を決定したら、学習率の減衰を実行する必要があります。 ADAM のようなオプティマイザーは学習率の減衰を内部的に実装しますが、これらの学習率の更新は通常遅いため、オプティマイザーの上に独自の学習率スケジュールを実装することをお勧めします。

5. 過剰適合がないことを確認します。過剰適合を実現する方法と、それを回避する方法があります。損失とトレーニング エポックをプロットします。曲線が放物線のように見える場合は、おそらく過剰適合していることになります。

こちらの記事を参照してください:

https://gist.github.com/zeyademam/0f60821a0d36ea44eef496633b4430fc#オーバーフィッティング

変数がトレーニングされていない場合...

上記のように TensorBoard のヒストグラムを使用するか、いくつかの異なるトレーニングインスタンスで各テンソルのノルムを計算し、それらのテンソルの名前を出力するスクリプトを作成します。変数が期待どおりにトレーニングされない場合は、次のようになります。

1. TF がそれをトレーニング可能な変数として認識していることを確認します。詳細については、TF GraphKeys をご覧ください。

https://www.tensorflow.org/api_docs/python/tf/GraphKeys

2. グラデーションの広がりが発生していないことを確認します。下流変数 (出力に近い変数) は正常にトレーニングされるが、上流変数 (入力に近い変数) はほとんど変化しない場合は、勾配消失の問題が発生している可能性があります。

以下の記事を参照してください。

https://gist.github.com/zeyademam/0f60821a0d36ea44eef496633b4430fc#消失爆発勾配

3. ReLus がまだ「放電中」であることを確認します。ニューロン電圧のほとんどがゼロに「クランプ」されている場合は、重みの初期化戦略を見直し、それほど積極的ではない学習率スケジュールを使用して、正規化(重みの減衰)を減らしてみてください。

翻訳者注: ReLu (線形整流関数) は、整流線形ユニットとも呼ばれ、人工ニューラル ネットワークでよく使用される活性化関数です。

消失/爆発グラデーション…

1. より優れた重み初期化戦略の使用を検討します。これは、トレーニングの開始時に勾配の更新が非常に小さい場合に特に重要です。

2. 活性化関数の変更を検討します。 ReLus を使用している場合は、リークのある ReLu または MaxOut アクティベーション関数に置き換えることを検討してください。シグモイド活性化関数は完全に避け、tanh は使用しないでください。

3. 再帰型ニューラル ネットワークを使用する場合は、LSTM の使用を検討してください。

詳細については、次の記事を参照してください。

https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b

過剰適合…

オーバーフィッティングとは、ネットワークがトレーニング データを「記憶」することです。ネットワークのトレーニング セットと検証セットの精度に大きな差がある場合は、過剰適合している可能性があります。

トレーニング/検証精度のセクションについては、こちらを参照してください: http://cs231n.github.io/neural-networks-3/

1. データ拡張技術を実装する。この記事の最初のセクション「トラブルシューティングの前に」までスクロールして戻ることができます。

2. ランダムドロップアウトを実装します。ドロップアウトとは、トレーニング中の各ステップでいくつかのニューロンをランダムに無視することを指します。これにより、これらのニューロンの寄与はフォワードパス中に削除され、バックプロパゲーション中に更新されません。

詳細については、以下をご覧ください。

https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/

3. 正規化を追加します。

4. バッチ正規化を実装します。

詳細については、こちらをご覧ください:https://arxiv.org/abs/1502.03167

5. 検証セットに基づいて早期停止を実装します。ネットワークのトレーニング期間が長すぎるため、過剰適合する可能性があります。早期に停止すると、この問題を解消できます。

こちらを参照してください:

https://en.wikipedia.org/wiki/Early_stopping#検証ベースの早期停止

6. それでも問題が解決しない場合は、より小規模なネットワークを使用します。これは本当に最後の手段であるべきであり、実際、このコースの配布資料ではこの方法について注意が払われています。

他に何をデバッグできますか...

1. 加重損失関数の使用を検討します。たとえば、画像セマンティックセグメンテーションでは、ニューラル ネットワークが入力画像内の各ピクセルを分類します。一部のクラスは他のクラスに比べて発生頻度が低い場合があります。その場合、まれなクラスに重み付けすると、mean_iou メトリックが改善される可能性があります。

2. ネットワーク アーキテクチャを変更します。以前のネットワークが深すぎたり、浅すぎたりする可能性があります。

3. アンサンブル モデルの使用を検討します。

4. 最大プーリング層と平均プーリング層をストライド畳み込みに置き換えます。

5. 徹底的なハイパーパラメータ検索を実行します。

6. 乱数シードを変更します。

7. それでもダメなら、さらにデータを探します。

関連レポート: https://gist.github.com/zeyademam/0f60821a0d36ea44eef496633b4430fc

[この記事は51CTOコラムBig Data Digest、WeChatパブリックアカウント「Big Data Digest(id: BigDataDigest)」のオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  機械学習 = 「新しいボトルに入った古いワイン」の統計?いいえ!

>>:  コレクション | データアナリストがよく使用する機械学習アルゴリズム 10 個!

ブログ    

推薦する

RLHF が LLM トレーニングの鍵となるのはなぜですか? AI専門家が5つの代替案を検討し、Llama 2のフィードバックメカニズムのアップグレードを説明

ChatGPTが主導する大規模言語モデルの時代において、避けては通れないトピックが「人間のフィードバ...

「新世代人工知能倫理規定」が発表:人工知能のライフサイクル全体に統合し、データプライバシーのセキュリティとアルゴリズムの倫理に重点を置く

9月26日、国家新世代人工知能ガバナンス専門委員会は「新世代人工知能倫理規範」(以下、「規範」という...

自動車業界における 5G の登場は、車両のインターネットと自動運転の普及にどのように役立つのでしょうか?

5G技術は大規模に導入されつつあり、車両ネットワークや自動運転に大きな影響を与えるでしょう。今年2...

Meituと中国科学技術大学が共同で顔面修復法DiffBFRを提案

ブラインド フェイス リストレーション (BFR) は、低品質の顔画像から高品質の顔画像を復元するこ...

...

...

AIが「迷惑メール」をフィルタリングし、ユーザーが価値あるメールを素早く見つけられるようにする

現在、世界中で毎日送信される 3,000 億通の電子メールのうち、少なくとも半分はスパムです。電子メ...

AI主導のサプライチェーンが業界の変革を加速させる方法

アラブ首長国連邦(UAE)の企業がほぼ全面的にクラウドに移行する前に、政府はすでに大規模なデジタル変...

AIがいかにして驚異的なコードフローチャートを正確に生成するか

みなさんこんにちは、私はムチュアンですAI がなければ、コードを読み、自分の理解に基づいて XMin...

私の国は、5G、人工知能、自動運転で目覚ましい成果を上げ、革新的な国の仲間入りを果たしました。

世界の潮流は力強く前進しています。科学研究​​と探究のペースを止めれば、井戸の中で空を眺め、満足して...

知っておくべきディープラーニングの10の一般的な手法

[[244014]]過去 10 年間で、機械学習への関心は爆発的に高まりました。ほぼ毎日、さまざまな...

強化学習の専門家 Sergey Levine: スケーラブルな自己教師あり学習の基盤としての強化学習

[[438887]]現在、機械学習システムは、コンピュータービジョン、音声認識、自然言語処理など、多...

人工知能がサイバー防御を強化

ビッグデータと高性能コンピューティング リソースにアクセスすることで、企業は新しい人工知能ツールと機...

AI搭載マシンが製造業の産業自動化を加速させる方法

今日、人工知能と機械学習は製造業界における変化の重要な原動力となっています。人工知能と機械学習により...