機械学習ソフトウェアのコードは、多くの場合複雑で、やや混乱します。 バグを検出して除去することは、リソースを大量に消費するタスクです。 最も単純な直接接続ニューラルネットワークでさえ、ネットワークアーキテクチャ、重みの初期化、およびネットワーク最適化に対する真剣なアプローチが必要です。 小さな間違いは、不快な問題につながる可能性があります。
この記事では、ニューラルネットワークのデバッグアルゴリズムについて説明します。
Skillboxの推奨事項: ゼロからの 実践的な Python開発者 。
「Habr」の読者には、「Habr」プロモーションコードを使用してSkillboxコースに登録すると10,000ルーブルの割引があります。
アルゴリズムは5つのステージで構成されます。
- 簡単なスタート;
- 損失の確認;
- 中間結果と化合物の検証;
- パラメータの診断。
- 作業管理。
何かが他の人よりも興味深いと思われる場合は、これらのセクションに直接アクセスできます。
簡単スタート
複雑なアーキテクチャ、正則化、学習速度プランナーを備えたニューラルネットワークは、通常のネットワークよりもデビューが困難です。 項目自体はデバッグと間接的な関係があるため、ここでは少し注意が必要ですが、これは依然として重要な推奨事項です。
簡単なスタートは、単純化されたモデルを作成し、1つのデータセット(ポイント)でトレーニングすることです。
まず、単純化されたモデルを作成します
クイックスタートのために、単一の隠しレイヤーで小さなネットワークを作成し、すべてが正しく機能することを確認します。 次に、モデルを徐々に複雑にし、その構造のすべての新しい側面(追加のレイヤー、パラメーターなど)をチェックして、先に進みます。
単一のデータセット(ポイント)でモデルをトレーニングします
プロジェクトの健全性の簡単なテストとして、1つまたは2つのデータポイントを使用してトレーニングを行い、システムが正常に機能しているかどうかを確認できます。 ニューラルネットワークは、トレーニングと検証の100%の精度を示す必要があります。 そうでない場合は、モデルが小さすぎるか、すでにバグがあります。
すべてが順調であっても、先に進む前に1つ以上の時代の経過に備えてモデルを準備します。
損失見積
損失推定は、モデルのパフォーマンスを改善する主な方法です。 損失がタスクに対応すること、および損失関数が正しいスケールで評価されることを確認する必要があります。 複数のタイプの損失を使用する場合、それらがすべて同じ順序であり、正しくスケーリングされていることを確認してください。
最初の損失に注意することが重要です。 モデルがランダムな仮定で開始した場合、実際の結果が予想にどれだけ近いかを確認します。 Andrei Karpatiの研究は、次のことを示唆しています 。「少数のパラメーターで作業を開始するときに、期待どおりの結果が得られることを確認してください。 データ損失をすぐにチェックすることをお勧めします(正則化の度合いをゼロに設定して)。 たとえば、Softmax分類器を使用したCIFAR-10の場合、予想される拡散確率は各クラスで0.1(10個のクラスがあるため)であり、Softmaxの損失は正しいクラスの負の対数確率であるため、初期損失は2.302であると予想されます- ln(0.1)= 2.302。」
バイナリの例では、クラスごとに同様の計算が行われます。 たとえば、20%の0と80%の1というデータです。 予想される初期損失は、最大–0.2ln(0.5)–0.8ln(0.5)= 0.693147です。 結果が1より大きい場合、これはニューラルネットワークの重みが適切にバランスされていないか、データが正規化されていないことを示している可能性があります。
中間結果と接続の確認
ニューラルネットワークをデバッグするには、ネットワーク内のプロセスのダイナミクスと、個々の中間層が接続されているため、個々の中間層の役割を理解する必要があります。 よくある間違いは次のとおりです。
- 勾配更新の誤った式
- 重みの更新は適用されません。
- グラデーションの消失または爆発。
勾配値がゼロの場合、これはオプティマイザーでの学習速度が遅すぎるか、勾配を更新するための誤った式に遭遇したことを意味します。
さらに、各レイヤーのアクティベーション関数、重み、および更新の値を監視する必要があります。 たとえば、パラメーター更新の値(重みとオフセット) は1-e3である必要があります 。
ReLUニューロンが重みの大きな負のバイアス値を調べた後にゼロを出力すると、 「Dying ReLU」または「Disappearing Gradient Problem 」という現象が発生します。 これらのニューロンは、どのデータ場所でも再びアクティブになることはありません。
勾配テストを使用して、数値的アプローチを使用して勾配を近似することにより、これらのエラーを検出できます。 計算された勾配に近い場合、逆伝播は正しく実装されています。 グラデーションチェックを作成するには、これらの優れたCS231リソースと、このトピックに関するAndrew Ngaのチュートリアルをご覧ください。
ファイザン・シェイクは 、ニューラルネットワークを視覚化するための3つの主要な方法を指摘しています。
- 予備-訓練されたモデルの一般的な構造を示す簡単な方法。 これらには、ニューラルネットワークの個々のレイヤーのフォームまたはフィルターの出力と、各レイヤーのパラメーターが含まれます。
- アクティベーションに基づきます。 それらでは、個々のニューロンまたはニューロンのグループの活性化を解読して、それらの機能を理解します。
- 勾配ベース。 これらのメソッドは、モデルを学習するときに、重要度マップとクラスアクティベーションマップを含む、前後の通路から形成される勾配を操作する傾向があります。
ConXやTensorboardなど、個々のレイヤーのアクティブ化と接続を視覚化するための便利なツールがいくつかあります。
パラメータ診断
ニューラルネットワークには、相互作用する多くのパラメーターがあり、最適化を複雑にします。 実際、このセクションは専門家による活発な研究の主題であるため、以下の提案はアドバイスとしてのみ考慮されるべきであり、そこから構築することができます。
バッチサイズ—パケットサイズを誤差勾配の正確な推定値を取得するのに十分な大きさにしたいが、確率的勾配降下(SGD)がネットワークを合理化するのに十分に小さい場合 パッケージのサイズが小さいと、学習プロセスや将来のノイズにより、最適化が困難になるため、急速に収束します。 これについては、 ここで詳しく説明します 。
学習速度 -遅すぎると、収束が遅くなるか、ローカルの低域で立ち往生するリスクが生じます。 同時に、学習速度が速いと最適化に矛盾が生じます。これは、損失関数の狭い部分であると同時に深い部分を「ジャンプ」するリスクがあるためです。 ニューラルネットワークのトレーニング中に速度計画を使用して速度を下げてみてください。 CS231nには、この問題に関する大きなセクションがあります。
勾配クリッピング -最大値または制限ノルムでの逆伝播中のパラメーターの勾配のトリミング。 3番目の段落で発生する可能性のある爆発的な勾配の問題を解決するのに役立ちます。
バッチ正規化 -各レイヤーの入力データを正規化するために使用され、内部共変シフトの問題を解決できます。 DropoutとBatch Normaを併用する場合は、 この記事をご覧ください 。
確率的勾配降下(SGD) -運動量、適応学習速度、およびネステロフ法を使用するSGDにはいくつかの種類があります。 同時に、学習効率と一般化の両方の点で明確な利点のあるものはありません( 詳細はこちら )。
正則化 -一般化されたモデルを構築するために重要です。これは、モデルの複雑さや極端なパラメーター値に対するペナルティを追加するためです。 これは、変位を大幅に増やすことなく、モデルの分散を減らす方法です。 詳細はこちら 。
すべてを自分で評価するには、正規化を無効にして、データ損失の勾配を自分で確認する必要があります。
ドロップアウトは、ネットワークを合理化して輻輳を防ぐもう1つの方法です。 トレーニング中、特定の確率p(ハイパーパラメーター)でニューロンの活動を維持するか、反対の場合にゼロに設定することによってのみ損失が発生します。 その結果、ネットワークは各トレーニングパーティに対して異なるパラメータのサブセットを使用する必要があり、これにより支配的になる特定のパラメータの変更が削減されます。
重要:ドロップアウトとバッチの正規化の両方を使用する場合は、これらの操作の順序に注意するか、それらの共同使用にも注意してください。 これらはすべて活発に議論され、補足されています。 StackoverflowとArxivに関するこのトピックに関する 2つの重要な議論があります 。
作業管理
ワークフローと実験を文書化することです。 何も文書化しないと、たとえば、どのようなトレーニング速度やクラスの重みが使用されるかを忘れることがあります。 コントロールのおかげで、以前の実験を簡単に表示および再現できます。 これにより、重複する実験の数が減ります。
確かに、大量の作業が発生した場合、手動の文書化は困難な場合があります。 ここでは、Comet.mlなどのツールが役立ち、データセット、コード変更、実験履歴、およびモデルに関する主要な情報(ハイパーパラメーター、モデルパフォーマンスインジケーター、環境情報)を含む生産モデルを自動的に記録します。
ニューラルネットワークは小さな変化に非常に敏感である可能性があり、これによりモデルのパフォーマンスが低下します。 作業の追跡と文書化は、環境とモデリングを標準化するための最初のステップです。
この投稿が、ニューラルネットワークのデバッグを開始する出発点になることを願っています。
Skillboxの推奨事項:
- 2年間の実践コース「私はPRO Web開発者です。 」
- オンラインコース「C#Developer with 0」 。
- 実用的な年次コース「PHP開発者0からPRO」 。