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

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

[[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 個!

推薦する

AIoT: IoTと人工知能の完璧な組み合わせ

産業用 IoT を企業の神経系と考えてください。これは、生産工場のあらゆる場所から貴重な情報を収集し...

百度、検索エンジンアルゴリズムを調整して微博コンテンツのインデックスを強化

情報筋によると、検索エンジンの百度は先週、検索アルゴリズムを調整し、微博のコンテンツのインデックスを...

150億のパラメータを持つ、史上最大のビジュアルモデル「V-MoE」の全コードをGoogleがオープンソース化

昨年 6 月に Google Brain チームが発表した 43 ページの論文「Scaling Vi...

ボストン・ダイナミクスのロボット犬「スポット」が新たなスキルを獲得:縄跳びや服拾い

海外メディアCNETによると、ボストン・ダイナミクスのロボット犬「スポット」はすでにダンス、鉱山探索...

NYU のポスドクが、arXiv に 30 分遅れて論文を提出したというだけで ACL に拒否されたのですか?学者たちは憤慨し、ACLに二度と投票しないと誓う

ACL は国民を怒らせた!今朝、この投稿のせいで AI コミュニティ全体が騒然となった——ニューヨー...

2.7B は Llama 2 70B に勝てる、Microsoft は「小さな言語モデル」を提供! 96台のA100が14日間でPhi-2を訓練し、Google Gemini nanoを圧倒

大きなモデルの髪は、本当にどんどんカールしてきています! 11月に、OpenAIはまずGPTを使用し...

AIは脳スキャンだけであなたの政治的思想を予測できる

人工知能は、脳内の機能的接続のスキャンを分析するだけで、人の政治的イデオロギーを予測することができま...

2022 年のデータサイエンス、AI、機械学習の 5 つのトレンド

[[443145]] [51CTO.com クイック翻訳] 2022 年が近づくにつれ、人々は 20...

機械学習はどのように機能するのでしょうか? Googleはこの小さな実験で、

機械学習に関しては、それに関するプロジェクトを 1 つまたは 2 つ聞いたことがあるかもしれません。...

コンピュータービジョンはビジネスにどのような変化をもたらすのでしょうか?

コンピューター ビジョンは企業に新たな希望をもたらし、良いスタートが始まったばかりです。視覚入力を視...

AI、ブロックチェーン、ロボット:テクノロジーは仕事の未来をどのように変えるのでしょうか?

編集者注:人工知能、ブロックチェーン、ロボットなどの破壊的な新技術が継続的に発展する中、人々はそれら...

人工知能はモバイルインターネットデバイスを変えようとしている

安価な高速インターネット、安全なクラウド ストレージ、モバイル ソリューション、低コストのデバイスの...

危険な顔認識:「尊厳を保たなければ」私たちは裸になる

[[276736]] AI顔変換ソフトウェアZAOの人気により、顔データアプリケーションのパンドラの...

農業用トラクターと自動運転技術が出会うとき

ラスベガスで開催された2022年コンシューマーエレクトロニクスショー(CES)で、ジョンディアは、ジ...