素晴らしい:テスラの AI ディレクターであり、リー・フェイフェイの弟子であるカルパシーの 33 のニューラル ネットワーク「錬金術」テクニック

素晴らしい:テスラの AI ディレクターであり、リー・フェイフェイの弟子であるカルパシーの 33 のニューラル ネットワーク「錬金術」テクニック

Andrej Karpathy は、ディープラーニング コンピューター ビジョン、生成モデル、強化学習の分野の研究者です。博士課程在学中、彼は李菲菲の指導を受けた。博士課程在学中、私は Google で 2 回インターンシップを行い、YouTube 動画の大規模な特徴学習を研究しました。また、2015 年には DeepMind でインターンシップを行い、深層強化学習を研究しました。卒業後、カルパシー氏はOpenAIの研究科学者となり、その後2017年6月に人工知能および自動運転ビジョン担当ディレクターとしてテスラに入社した。

彼が本日公開したブログは、ディープラーニング研究者にとって非常に明確な洞察を提供しており、Twitter で大きな注目を集めています。

1. ニューラル ネットワークのトレーニングは簡単だと誰が言ったのでしょうか?

多くの人は、ニューラル ネットワークのトレーニングを始めるのは簡単だと考えています。多数のライブラリやフレームワークが、30 行のコードでデータの問題を解決できると主張しています。そのため、ニューラル ネットワークのトレーニングは非常にシンプルで、さまざまなモジュールをプラグ アンド プレイで使用してディープ モデルを構築できるという (誤った) 印象を誰もが持っています。

単純なモデリング プロセスは通常、次のようになります。

  1. > > >   your_data = # ここにあなたの素晴らしいデータセットを入力してください
  2. > > >   model = SuperCrossValidator (SuperDuper.fit, your_data, ResNet50, SGDOptimizer) # ここで世界を征服する

これらのライブラリと例は、クリーンな API と抽象化が利用できることが多い、使い慣れた標準ソフトウェアとモジュールを思い起こさせます。

たとえば、Request ライブラリの使用方法は次のとおりです。

  1. > > >   r =リクエスト.get('https://api.github.com/user', auth =('user', 'pass'))
  2. > > > r.ステータスコード200

すごいですね! これらのライブラリやフレームワークの開発者は、ユーザーのクエリ文字列、URL、GET/POST リクエスト、HTTP 接続などを理解するという大きな負担を担っており、複雑さは数行のコードの背後に隠されています。これは私たちがよく知っていて期待していることです。

しかし、ニューラル ネットワークは異なります。既成のテクノロジではありません。私は2016年に書いたブログ記事でこの点を指摘しようとしましたが、今では状況はさらに悪化しているようです。

Backprop + SGD は魔法ではないので、ネットワークを実行することはできません。バッチ正規化では、ネットワークの収束を魔法のように速くすることはできません。RNN では、テキストを直接処理する魔法はありません。問題を強化学習として定式化できるからといって、そうすべきだと決めつけないでください。テクノロジーがどのように機能するかを理解せずにそれを使い続けると、失敗する可能性が高くなります。

2. 背後で機能しないニューラルネットワーク

コードを壊したり、誤って構成したりすると、通常は何らかの例外が発生します。文字列があるべき場所に整数を挿入した、インポートが失敗した、キーワードが存在しない... さらに、デバッグを容易にするために、機能の単体テストを作成することがほとんどです。

これはほんの始まりに過ぎません。ニューラル ネットワークをトレーニングする場合、すべてのコードの構文が正しいが、トレーニング全体が正しくない可能性があります。おそらく問題は(構文ではなく)ロジックにあり、ユニットテストでは見つけるのが難しいのでしょう。

たとえば、勾配ではなく損失をクリッピングしようとすると、トレーニング中に外れ値が無視されますが、構文や次元などのエラーは検出されません。または、正規化の強度、学習率、減衰率、モデル サイズなどを間違って設定した場合、運が良ければネットワークはエラーを報告しますが、ほとんどの場合、トレーニングは継続され、静かに悪化していきます...

したがって、ニューラル ネットワークをトレーニングするための「高速かつ激しい」アプローチは役に立たず、困難を招くだけです。さて、これらの経験的な困難は、ニューラル ネットワークを適切に動作させるための障害であり、困難を軽減するには、ネットワークをより慎重かつ徹底的にデバッグする必要があり、すべてを理解するには多くの視覚化が必要です。

私の経験では、ディープラーニングで成功するための重要な要素は、忍耐と細部への注意です。

解決方法

これら 2 つの事実に基づいて、私はニューラル ネットワークを新しい問題に適用するための特定のプロセスを開発しました。このプロセスでは、忍耐と細部への注意という上記の 2 つの原則を重視します。

具体的には、単純なものから複雑なものへと構築し、各ステップで何が起こるかについて正確な仮定を立て、実験を使用して仮定を検証したり、問題が見つかるまで調査したりします。私たちは、多くの「テストされていない」複雑さが一度に導入され、決して発見されないバグや誤った構成につながるのを防ぐよう努めています。ニューラル ネットワークをトレーニングしているようにコード化する場合は、非常に小さい学習率を使用して推測し、各反復後にテスト セット全体を評価する必要があります。

1. データを整理する

ニューラル ネットワークをトレーニングするときはコードに触れず、まずデータを徹底的にチェックしてください。このステップは非常に重要です。私は何千ものサンプルを調べ、その分布を理解し、パターンを探すことに多くの時間を費やすのが好きです。幸いなことに、人間の脳はこの点では非常に優れています。あるケースでは、データ内に重複した例が見つかり、別のケースでは、破損した画像/ラベルが見つかりました。データの不均衡や偏りを探します。私は通常、データ分類プロセスにも注意を払います。これにより、最終的に探索するアーキテクチャが明らかになります。たとえば、ローカルな特徴だけで十分でしょうか、それともグローバルなコンテキストが必要でしょうか? ラベルにはどの程度のノイズがあるでしょうか?

さらに、ニューラル ネットワークはデータセットの圧縮/コンパイルされたバージョンであるため、ネットワークの予測 (誤った予測) を確認し、その予測がどこから来たのかを理解できます。ネットワークの予測がデータで見つかったものと一致しない場合は、何かが間違っています。

データについてある程度理解できたら、ラベルの種類、注釈のスケール、注釈の数などで検索/フィルタリング/並べ替えを行う簡単なコードを記述し、任意の軸に沿ってデータの分布と外れ値を視覚化できます。外れ値により、データ品質や前処理のバグが明らかになることがよくあります。

2. エンドツーエンドのトレーニング/評価アーキテクチャを構成し、ベースライン結果を取得する

データが理解できたので、ハイエンドのマルチスケール ASPP FPN ResNet の構築を開始し、強力なモデルをトレーニングできるでしょうか? もちろんまだ無理です。これは困難な道です。次のステップは、完全なトレーニングおよび評価アーキテクチャを構築し、一連の実験を通じて精度に対する信頼性を判断することです。

この段階では、線形分類器や非常に単純な ConvNet など、間違いのない単純なモデルを選択します。これらのモデルをトレーニングし、トレーニング損失、モデル予測、その他のメトリック (精度など) を視覚化したいと考えています。もちろん、このプロセスでは、いくつかの明確な仮説に基づいた一連のアブレーション実験も実行する必要があります。

この段階でのヒントと注意事項:

  • 固定ランダムシード: 常に固定ランダムシードを使用すると、同じコードを 2 回実行したときに同じ出力が得られるなど、多くの特性が保証されます。これにより変動要因が排除され、健全な判断が可能になります。
  • 簡素化: 不要なトリックを必ず無効にします。たとえば、この段階ではデータ拡張は必ずオフにする必要があります。データ拡張は後の段階で導入することができ、強力な正規化戦略として機能します。ただし、この段階で導入すると、いくつかの愚かなバグが発生する可能性があります。
  • 検証評価にはより多くのデータとより少ないエポックを使用します。テスト損失をプロットする場合、より大きなテスト セット全体で評価を実行する必要があります。数バッチごとにテスト損失をプロットして、TensorBoard のスムージングに頼らないでください。正確さを追求しながらも、こうした低レベルのミスを避ける必要があります。
  • 初期化における損失の検証: 損失関数が初期化において適切な損失値を持っていることを確認します。たとえば、最終層を正しく初期化した場合、初期化された Softmax 値を -log(1/n_classes) で測定する必要があります。 L2 回帰や Huber 損失関数などはすべて同じデフォルト値を持ちます。
  • 適切な初期化: 最終レイヤーを正しく初期化します。たとえば、平均値が 50 のデータを回帰する場合、最終的なバイアス項は 50 に初期化する必要があります。不均衡なデータセット(各クラスが 1:10)がある場合は、モデルが初期化時に確率 0.1 を予測するように、ロジットにバイアスを設定する必要があります。これらのバイアス項を正しく構成すると、ネットワークは基本的に最初の数回の反復でのみバイアスを学習するため、収束が高速化されます。
  • 人間のベースライン結果: 人間が解釈および検査できる損失値やその他のメトリック (精度など) を監視します。可能な場合はいつでも、あなた(人間)が達成した精度を評価し、それを構築したモデルと比較します。あるいは、テスト データを 2 回ラベル付けして、1 つは予測値用、もう 1 つはラベル付けされた値用とすることもできます。
  • 入力に依存しないベースライン結果: 入力に依存しないベースライン モデルをトレーニングします。たとえば、最も簡単な方法は、すべての入力を 0 に設定することです。このようなモデルは、実際の入力データよりもパフォーマンスが悪くなるはずです。モデルは、あらゆる入力からあらゆる情報を抽出できる状態になっていますか?
  • データ バッチのオーバーフィッティング: 単一のデータ バッチ (2 つ以上の少数のサンプル) のオーバーフィッティング。これを行うには、モデルのフィッティング能力を高め、達成できる損失値 (つまり 0) を検証する必要があります。また、ラベルと予測を同じプロットに表示し、損失が最小限に抑えられたときにそれらが整列することを確認したいと考えました。
  • トレーニング損失の減少を検証する: この段階では、データセットをアンダーフィットし、モデルを最小限にする必要があります。次に、モデルの適合性を少し高めて、トレーニング損失が少し減少するかどうかを確認します。
  • ネットワークに入力する前に視覚化する: モデルを実行する前に、データを視覚化する必要があります。つまり、ネットワークに入力される特定のデータ、つまり元のテンソルのデータとラベルを視覚化する必要があります。これは「真実の源」であり、このプロセスによって多くの時間が節約され、データの前処理とデータ拡張の問題が明らかになることが何度もありました。
  • 予測プロセスの視覚化: トレーニング プロセス中に、固定されたテスト バッチのデータに対するモデルの予測を視覚化するのが好きです。これにより、予測がどのように変化するかが示され、トレーニング プロセスに関する優れた直感が得られます。多くの場合、ネットワークが何らかの形でわずかに変動する場合、モデルはデータに適合させようとしている可能性が高く、これも不安定性を示します。学習率が低すぎたり高すぎたりすると、ジッターの量が多くなるため、気づきやすくなります。
  • バックプロパゲーションを使用して依存関係を描画する: ディープラーニング コードには、複雑なベクトル化された Boardcast 操作が含まれることがよくあります。よくあるバグとしては、誤って transpose/permute の代わりに view を使用し、データのバッチ内で次元情報が混在してしまうことが挙げられます。ただし、ネットワークは引き続き通常どおりトレーニングされ、他の例のデータを無視するように学習するだけです。これをデバッグする 1 つの方法は、ある例 i の損失を 1.0 に設定し、入力までバックプロパゲーションを実行して、i 番目の例の勾配がゼロでないことを確認することです。より一般的には、勾配はネットワーク内の依存関係を提供し、デバッグ中に非常に役立ちます。
  • 特殊なケースの一般化: これはより一般的なコーディング手法ですが、特に一般的な機能をゼロから構築する場合、これらの手法を使用すると新しいバグが導入されるケースをよく見かけます。代わりに、現時点で必要なことだけを含む非常に具体的な関数を直接記述することを好みます。まず関数を動作させてから一般化し、同じ結果が得られることを確認します。通常、このプロセスはベクトル化されたコードに反映されます。まずループを含む手順を記述し、次にループごとにベクトル化されたコードに変換します。

3. 過剰適合

この段階では、データセットを理解し、トレーニングと評価のプロセスを完了している必要があります。任意のモデルに対して、信頼の尺度を計算できます。また、入力に依存しないベースラインのパフォーマンス、いくつかのダム ベースラインのパフォーマンス (これらを超えることをお勧めします) も準備しており、人間のパフォーマンスの大まかな概要を把握しています (これに匹敵することを望んでいます)。これで、適切なモデルを反復する準備が整いました。

適切なモデルを見つけるために私が使用するアプローチには、2 つの段階があります。まず、過剰適合できるほど十分に大きなモデルを取得し (つまり、トレーニング損失に焦点を当てます)、次にそれを適切に正規化します (トレーニング損失の一部を破棄して、検証損失を改善します)。私がこの 2 つのフェーズを好んでいる理由は、どのモデルでも低いエラー率を達成できない場合、何らかの問題、バグ、構成ミスを示している可能性があるからです。

この段階でのヒントと注意事項:

  • モデルの選択: 望ましいトレーニング損失を達成するには、データに適切なアーキテクチャを選択する必要がある場合があります。モデルを選択するときは、あまり高い目標を立てないようにというのが私のアドバイスです。多くの人が、最初からいくつかの新しいモジュールを積み重ねたり、さまざまな異種アーキテクチャにそれらを創造的に使用して、すべてを一度に実行することに非常に熱心であることがわかります。私の提案は、最も関連性の高い論文を見つけて、そのシンプルなアーキテクチャを直接使用して優れたパフォーマンスを達成することです。その後、このアーキテクチャに基づいて変更や改善を行い、アイデアを追加することができます。
  • 一般的な選択肢は Adam です。ベースライン モデルを構成する初期段階では、Adam アルゴリズム (学習率は 3e-4) を使用するのが一般的です。私の経験では、Adam はハイパーパラメータに対してより寛容であり、最適ではない学習率で適度な結果を達成できます。畳み込みネットワークの場合、慎重に調整された SGD はほとんどの場合 Adam よりもわずかに優れたパフォーマンスを発揮しますが、学習率の可能な範囲ははるかに狭くなります。
  • 複雑さを 1 つずつ追加する: 分類子に複数の機能を組み込む場合は、期待どおりのパフォーマンス向上が得られるように、一度に 1 つずつ組み込むことをお勧めします。最初にすべてを一度に追加しないでください。そうしないと、どの機能が実際にパフォーマンスの向上をもたらすかがわからなくなります。複雑さを増やす方法は他にもあります。たとえば、最初に小さい画像を挿入して、徐々に増やしていくという方法があります。
  • デフォルトの学習率減衰を信頼しないでください。他のドメインのコードを変更する場合は、学習率減衰方法に注意する必要があります。問題が異なれば、異なる減衰戦略を使用するだけでなく、エポック数が異なるため減衰プロセスも異なります。たとえば、データ セットのサイズはエポックの数に影響し、多くの学習率減衰戦略はエポックに直接関係しています。私自身の作業では、学習率の減衰を完全にオフにする、つまり一定の学習率を使用することがよくあります。

4. 正規化

理想的には、トレーニング セットに適合する大規模なモデルが少なくとも 1 つあることになります。ここで、これを正規化し、トレーニング精度の一部を放棄して検証精度を向上させます。ヒントは次のとおりです:

  • より多くのデータ: まず、今日のあらゆる実用的な設定でモデルを正規化する方法は、実際のトレーニング データをさらに追加することです。より多くのデータを収集できるにもかかわらず、小さなデータセットからより良い結果を得ようとエンジニアリングに多くの時間を費やすのはよくある間違いです。適切に構成されたニューラル ネットワークのパフォーマンスを単調に向上させるには、データを追加することが信頼できる方法だと思います。
  • データ拡張: 実際のデータより劣る方法は、実験中のより積極的なデータ拡張である半偽データです。
  • クリエイティブ強化: 半偽造データが利用できない場合は、偽造データでも問題ありません。人々はデータセットを拡張するための創造的な方法を模索しています。たとえば、ドメインのランダム化、シミュレートされたデータの使用、シーンへのデータの挿入などの巧妙なハイブリッドアプローチ、さらには GAN の使用などです。
  • 事前トレーニング: データが大量にある場合でも、事前トレーニング済みのネットワークをほとんど損失なく使用できます。
  • 教師あり学習に固執する: 教師なし学習に熱中しすぎないでください。私の知る限り、現在のコンピューター ビジョン タスクで強力な結果をもたらす教師なし学習法は存在しません (NLP 分野には現在 BERT やその他の類似モデルがありますが、これは主にテキストの成熟度が増し、信号対雑音比が向上したためです)。
  • 入力次元が小さい: スプリアス信号を含む可能性のある特徴を削除します。データセットが小さい場合、偽の入力を追加すると過剰適合の可能性が高くなるだけです。同様に、低レベルの詳細があまり役に立たない場合は、より小さな画像を入力してみてください。
  • より小さなモデル: 多くの場合、ネットワーク上でドメイン知識制約を使用してモデルのサイズを縮小できます。たとえば、ImageNet バックボーンの上に完全に接続されたレイヤーを使用することが一般的でしたが、後に単純な平均プーリングに置き換えられ、プロセス内の多数のパラメーターが削除されました。
  • バッチ サイズを縮小: BN はバッチ サイズに基づいて正規化するため、バッチ サイズが小さいほど正規化効果が強くなります。これは主に、バッチの統計的な平均と標準偏差が実際の平均と標準偏差の近似値であるため、小さなバッチ内ではスケールとオフセットがより大きく変動するからです。
  • drop: ドロップアウトを増やします。畳み込みネットワークで dropout2d (空間ドロップアウト) を使用します。ドロップアウトはバッチ正規化にはあまり適していないと思われるため、慎重に使用してください。
  • 重量減少: 重量減少ペナルティを追加します。
  • 早期停止: 過剰適合が始まる直前にモデルを取得するために得られた検証損失に基づいてトレーニングを停止します。
  • より大きなモデルを試す: 過去に何度も、より大きなモデルは最終的に大幅に過剰適合してしまうことが分かりましたが、「早期停止」後のパフォーマンスは、より小さなモデルよりもはるかに優れています。

ネットワークが適切な分類器であることを確認するために、ネットワークの 1 つのレイヤーの重みを視覚化して、意味のあるエッジを取得していることを確認します。レイヤーのフィルターがノイズのように見える場合は、何かを削除する必要があります。同様に、ネットワーク内の活性化関数によって問題が明らかになることもあります。

5. 微調整

これで、データセット内で、検証損失が低いアーキテクチャのモデル空間を探索する段階に到達したはずです。このステップに関するヒントは次のとおりです。

  • ランダム グリッド サーチ: 複数のハイパーパラメータを同時に微調整する場合、すべての環境をカバーするためにグリッド サーチを使用するのがよいでしょう。ただし、ランダム検索を使用するのが最善の方法であることを忘れないでください。直感的に言えば、ニューラル ネットワークはいくつかのパラメータに対してより敏感だからです。極限では、パラメータ a が重要で、b を変更しても効果がない場合、固定ポイントで何度もサンプリングするよりも、a を徹底的にサンプリングする方がよいでしょう。
  • ハイパーパラメータの最適化: 現在、コミュニティには優れたベイジアン ハイパーパラメータの最適化ツールボックスが数多く存在し、私の友人の中には、それらを使用して大きな成功を収めている人もいます。しかし、私の個人的な経験では、モデル空間とハイパーパラメータを探索する良い幅広い方法は、インターンを雇うことです。冗談だよ、ハハハ。

6. 絞る

適切なアーキテクチャ タイプとハイパーパラメータを見つけたら、システムをさらに改善するために使用できるトリックがまだあります。

  • アンサンブル: モデル アンサンブルは、着実に 2% 精度を向上させるのに適した方法です。テスト フェーズの計算コストを負担できない場合は、「ニューラル ネットワークでの知識の抽出」の方法を使用して、モデルをネットワークに抽出してみてください。
  • トレーニングを継続する: 検証損失が平坦になったときにモデルのトレーニングを中断する人を多く見かけますが、私の経験では、ネットワークは直感に反する時間トレーニングを継続できます。冬休み中にモデルトレーニングをオフにするのを忘れたのですが、1月に戻ってみると、SOTA の結果が達成されていたことがわかりました。

結論は

これを実行すると、ニューラル ネットワーク、データセット、問題に対する十分な理解、完全なトレーニング/評価システムの構成、信頼性の高い精度、段階的に複雑なモデルを探索し、各ステップでパフォーマンスを向上させることなど、成功に必要な要素がすべて揃います。これですべての準備が整いましたので、多くの論文を読み、多くの実験を試し、SOTA 結果を達成することができます。

オリジナルリンク: https://karpathy.github.io/2019/04/25/recipe/

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

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

<<:  驚きですか、それともショックですか?機械学習アルゴリズムの「高エネルギー」な瞬間を評価する

>>:  調査:CIOはAIの実験や投資に依然として慎重

ブログ    

推薦する

AsiaInfoが中国聯通のネットワークAIフォーラムに参加し、自動運転ネットワークの革新研究拠点の設立を開始

9月24日、中国聯通の「ネットワークAIフォーラム」が北京で開催された。フォーラムは5GとAI技術の...

ビジネスコミュニケーションで機械学習を活用する9つの方法

人工知能 (AI) と機械学習 (ML) は、職場でも家庭でも、私たちの生活に欠かせないものになりつ...

電気自動車や自動運転の普及にはエネルギー補給技術の限界を乗り越えなければならない

電気による輸送はますます多様化しています。そして、それは地球規模の持続可能な開発の文脈において重要な...

データマイニングコンテストのルーチンとディープラーニングの限界について話す

序文ちょうど夏休み中に、KaggleのZillow Prizeコンペに参加し、データマイニングと機械...

デジタル画像処理における画像操作

画像操作は、コンピュータービジョンと画像処理において重要な役割を果たします。これらの操作は、前処理、...

...

組み込み物流ロボットの用途は何ですか?

ネットワーク技術やグリッドコンピューティングの発展により、組み込み型モバイル機器を中核とした「ユビキ...

...

アリペイは65歳以上の高齢者が直接人間サービスを利用できる専用ホットラインを立ち上げた。

IT Homeは2月9日、「高齢者のデジタル適応力に関する調査報告」によると、スマートフォンを使用...

...

...

2021年から2030年までのドローン産業のトップ10の発展トレンド

民間ドローン産業は2010年頃から勢いを増し始め、特に2014年から2017年にかけて民生用ドローン...

数千人を対象とした調査: AI に対する一般の認識はどのようなものでしょうか?

人工知能は世界を変えようとしていますが、問題は、それがどのように起こるのか誰も正確には知らないことで...

自動応答は人工知能ではなく、自律応答は

セキュリティ オペレーション センター (SOC) のアナリストは推論と意思決定に優れていますが、2...

将来の戦争において、AIは最も危険な兵器となるのでしょうか?

AI兵器は歴史の流れとともに進化し、今日では危険な一歩となっている。 [[406883]] AIは...