ニューラル ネットワークのトレーニングのレシピ ブログ翻訳

Andrej Karpathyによるニューラル ネットワークのトレーニングのレシピ (karpathy.github.io)からの翻訳

プライマー

  1. 多くの場合、モデルのパラメーターが誤って構成されていたり、一部のコードが誤って記述されていたりしても、ニューラル ネットワークは正常にトレーニングおよび推論できますが、最終的には「黙って消滅」することしかできません。
  2. したがって、いわゆるプラグアンドプレイのトリックを信じるのではなく、ニューラル ネットワークの詳細に特別な注意を払う必要があります. 著者は、深層学習の成功に最も関連する資質は忍耐力と細部への注意力であると考えています.

ニューラル ネットワークのトレーニング プロセス

上記のステートメントに従って、著者は、ニューラル ネットワークをトレーニングするために従うべきいくつかのガイドラインを示します。

哲学的な考え方は、単純なものから複雑なものまで、仮定を立て、小さなステップごとに正確さを保証することです。これは、多数の複雑な未知数が必然的にエラーにつながり、デバッグに長い時間がかかるためです。

データにおける自然と人間の一体性

ニューラル ネットワークに関連するすべてのコードを破棄し、データをゼロから徹底的にチェックします。

  • データサンプルを閲覧する
  • データの分布とパターンを理解する

詳細については、次のことができます。

  • データの不均衡と偏りに注意する
  • 自分自身をデータを分類する分類器と考えてください。これは、後でモデル アーキテクチャを選択するのに役立ちます。たとえば、次のことを考慮してください。
    • ローカル機能で十分ですか? グローバルなコンテキスト機能が必要ですか?
    • データ間の差異がどの程度の大きさで、どのような形で現れるか
    • データの空間情報が重要かどうか、平均プーリングができるかどうか
    • データの詳細がどれほど重要であり、ダウンサンプリングに耐えられるかどうか
    • ラベルのノイズはどれくらいですか

ニューラル ネットワークによる予測が、サンプルで実際に観察されたものと一致しない場合 (注意を払うべきでない、または重要でない機能に焦点を当てるなど)、途中で問題が発生している可能性があります。

最後に、データ セット内のいくつかのもの (たとえば、ラベルのサイズ、注釈のサイズと数など) を計算、表示、検索、およびフィルター処理するための簡単なコードを記述し、いくつかの視覚的な操作を実行することもできます。データ内の外れ値を見つけます。

モデルでは、小さなものは大きなものを見る

完全なトレーニングと評価のフレームワークを確立し、一連の実験を通じてモデルの正確性を検証します。たとえば、いくつかの単純な小さなモデルをトレーニング用に選択し、損失、その他のメトリック (精度など)、およびモデルの予測出力を視覚化し、このプロセス中に一連のアブレーション実験を実行することもできます。 .

このプロセスのヒント:

  • 固定乱数シード: コードを 2 回実行しても同じ結果が得られるようにします。
  • できるだけ単純にしてください。たとえば、データ拡張を使用してはなりません (後で追加する可能性がありますが、今は追加しないでください)。
  • テスト セットの損失曲線を描画するときは、現在のバッチの損失を描画して平滑化するだけでなく、テスト セット全体を評価します。
  • 初期化時の損失値を確認します。ネットワーク層が正しく初期化されている場合、この時点での損失値は、ランダムに推測された損失値に近いはずです。
  • 正しい初期化: ネットワークの最後の層を初期化するときに、回帰の平均が 50 の場合、バイアスを 50 に初期化できます。データ サンプルのバランスが取れていない場合は、このバイアスを組み込むように初期化できます (たとえば、データが正の場合、負の比率が 1:10 の場合、ネットワークは予測確率を 0.1 に初期化します)。ネットワークは基本的に、最初の数回の反復でこれらの偏差のみを学習するためです。
  • 人間によるテスト結果をベースラインとして使用し、トレーニング中に人間が認識できる指標 (精度など) を監視します。または、1 つの方法は、サンプルごとに 2 つのラベルを生成することです。そのうちの 1 つは予測として使用され、もう 1 つはグラウンド トゥルースとして使用されます。
  • ゼロ入力ベースライン: 入力を 0 に変更します。これは、モデルが入力から情報を抽出することを学習したかどうかを判断できるように、入力サンプルよりも悪いはずです。
  • バッチのオーバーフィッティング: 少数のサンプルの一部をオーバーフィッティングすると、ネットワーク層とフィルターの数を増やすことで現時点で達成できる最小の損失 (できれば 0) を確認でき、ラベルと予測を 1 つのグラフ結果で視覚化して、完全に対応していることを確認してください
  • この段階ではおもちゃのモデルを使用しているため、データセットをアンダーフィットする可能性がありますが、この時点でモデルの容量を増やすことができ、理論的には損失を減らすことができます。
  • データがモデル (通常、コード y=model(x) の x) に入力される前に、入力データを視覚化します。これにより、データの前処理とデータ拡張の問題を見つけることができます。
  • 視覚的予測曲線: トレーニング プロセス中に、テスト データの固定部分を予測し続け、予測結果の動的な変化を観察し、ネットワークの不安定性または不適切な学習率設定の問題を見つけます。
  • データ転送の関係を取得するためのバックプロパゲーション: 深層学習コードは通常、複雑でベクトル化されており、多くのブロードキャスト操作 (ブロードキャスト) があります. 非常によくあるバグは、バッチ処理で次元が混乱することです (たとえば、間違った次のコードでビュー関数と転置または置換関数を使用すると、目に見えない問題が発生します)。この場合、ネットワークはエラーを報告せずにトレーニングを続行できますが、最終結果は完全に間違っています! デバッグ方法は、損失をサンプル i のすべての出力の合計として設定し、逆伝播を実行して、i 番目の入力で非ゼロの勾配が得られることを確認することです。
a=torch.Tensor([[1,2,3],[4,5,6]])
print(a.shape)
print(a[0,:])
print(a.view(3,2)[:,0])
print(a.permute(1,0)[:,0])
# 输出,两种改变维度的方法得到截然不同的结果
torch.Size([2, 3]) 
tensor([1., 2., 3.]) 
tensor([1., 3., 5.]) 
tensor([1., 2., 3.])
  • 特殊なケースからプロモートする: すべての機能を最初から満たすコードを書こうとするのではなく、特定の機能から始めて、その機能が正しく実装された後、徐々に他の機能に拡張することもできます。既存の機能が変わらないことを保証する

過剰適合

上記の 2 つの段階を完了すると、データ セットと完全なトレーニング + 評価プロセスを完全に理解できるので、次のステップは、適切なモデルを反復的にトレーニングすることです。

より良いモデルを見つけるには、次の 2 つのステップが役立ちます。まず、データをオーバーフィットできる十分な大きさのモデルを取得し (現時点ではトレーニングの損失のみに注目)、適切に調整します (現時点では、検証の損失に注目します)。

これらの 2 つの手順は、どのモデルでも低いエラー率を達成できない場合は、おそらく何かが間違っているか、構成が間違っているという前提に基づいています。

いくつかのヒントは次のとおりです。

  • アーキテクチャを選択する: あらゆる種類の付箋を使用しないでください。プロジェクトの初期段階では、最も単純な論文を見つけ、モデルを再現して良好なパフォーマンスを得るだけでよく、その後、いくつかの変更を加えてパフォーマンスをさらに向上させることができます。
  • Adam オプティマイザを自由に使用してください: ベースラインのトレーニングの初期段階では、Adam はハイパーパラメータにほとんど影響されないため、3e-4 の学習率で自由に Adam を使用してください。
  • 一度に 1 つのモジュールを複雑にする: 複雑なモジュールを 1 つずつ追加し、モデルのパフォーマンスが向上することを確認します。
  • デフォルトの学習率の減衰を信頼しない: 学習率の減衰には十分に注意してください。問題ごとに異なる減衰戦略を使用する必要があるだけでなく、スケジューラがエポック (またはステップ) に関連しているためです。データセットとバッチサイズのサイズは大きく異なります! これに注意しないと、スケジューラが学習率を途中で 0 に減らし、モデルの収束に影響を与える可能性があります。この機能を一時的に無効にすることを検討してください

正則化

この時点で、使用可能なモデルと適切なデータセットが既に存在します. この時点で、いくつかの正則化手法を検討することができ、トレーニングの精度は検証の精度と交換されます:

  • より多くのデータを取得する: 小さなデータセットを絞り出すために多くの時間を費やすことは非常に間違っています. データを増やすことは、ニューラルネットワークのパフォーマンスを保証するほとんど唯一の方法であり、上限はありません.
  • データの強化: 半分偽のデータまたは偽のデータを検討します. このステップでは, 想像力を使ってさまざまなデータの強化と拡張を行うことができます. 偽のデータの生成に関しては, 次のことを考慮することができます:
  • 事前トレーニング: 利用可能な場合、十分なデータがあっても事前トレーニング済みのネットワークを使用できます
  • 当初の意図を忘れないでください。教師あり学習を念頭に置いてください。教師なしの事前トレーニングに興奮しすぎないでください (この記事は疑わしいものです。結局のところ、19 年間のブログであり、著者は急速な発展を予測することはできません)。日を追うごとに、過去 2 年間の教師なし開発の割合)
  • より小さい次元を使用する: 誤った手がかりを含む可能性がある (オーバーフィッティングを引き起こす可能性がある) いくつかの特徴を削除します。低レベルの詳細が重要でない場合は、入力特徴をダウンサンプリングできます。
  • より小さなモデルを使用してみてください: 一部のドメイン関連の知識 (または事前の知識) を使用して、モデルの一部のパラメーターを削減したり、一部のレイヤーを削除したりできます。
  • バッチサイズの削減: バッチ ノルムを使用する場合、バッチ サイズが小さいほど、正則化がある程度強くなります。
  • ドロップアウトの追加: ドロップアウトはバッチ正規化では機能しないように見えるため、注意して使用する必要があります (このペーパーを参照してください)。
  • 重みの減衰: 重みの減衰のペナルティを増やします (学習率の減衰と混同しないように注意してください)
  • 早期終了: 検証損失に応じてモデルがオーバーフィットしそうになったらトレーニングを停止します
  • より大きなモデルを試す: 通常、早期終了と組み合わせた大規模モデルは、小規模モデルよりもはるかに優れたパフォーマンスを発揮します。

最後に、モデルの最初のレイヤーの重みを視覚化して、意味のある適切なエッジが得られるようにすることができます (画像の場合、他の入力はうまく機能していないようです)。

微調整

このセクションでは、データセット内のさまざまな構成とモデルを探索する方法について説明します。ヒントには次のようなものがあります。

  • ランダム グリッド検索: グリッド検索の使用は見栄えがしますが、時間がかかります。したがって、ニューラル ネットワークは一部のパラメーターに対して他のパラメーターよりもはるかに敏感であるため、ランダム検索を使用できます。
  • ハイパーパラメータの最適化:ベイジアンツールボックスを使用したり、時間がある限りパラメータを手動で調整したり、後輩や妹(ブシ)に投げたりすることができます

完璧な結末

最適な構成とハイパーパラメーターが見つかった後でも、パフォーマンスを向上させるためのいくつかのトリックがあります。

  • モデルの融合: どんな場合でも 2% (?) のパフォーマンス向上が保証されます
  • 落ち着いてトレーニングを続ける: 検証損失が安定する傾向にある場合は、トレーニングを停止する必要はありません. 1 か月のトレーニング後にモデルが SOTA になる可能性があります :)

要約する

要約する必要はありません。話は安いです、コードを見せてください。

おすすめ

転載: blog.csdn.net/weixin_43335465/article/details/129127496