この記事では、ディープラーニング モデルのトレーニングを改善するために私が個人的に見つけた 4 つの異なる Pytorch トレーニング トリックについて説明し、コードを紹介します。
混合精度通常のトレーニング ループでは、PyTorch はすべての浮動小数点変数を 32 ビットの精度で保存します。厳しい制約の下でモデルをトレーニングする場合、これによりモデルが大量のメモリを占有し、より遅いトレーニング プロセスのためにより小さなモデルとより小さなバッチ サイズを使用せざるを得なくなることがあります。したがって、モデル内のすべての変数/数値を 16 ビットの精度で保存すると、モデルのメモリ消費量を大幅に削減し、トレーニング ループを高速化するなど、モデルのパフォーマンス/精度を維持しながら、これらの問題のほとんどを改善および修正できます。 Pytorch ですべての計算を 16 ビット精度に変換するのは非常に簡単で、数行のコードしか必要ありません。ここにあります:
上記の方法は、fp16 で操作するときに勾配アンダーフローを最小限に抑えるために勾配スケーリング スカラーを作成します。
損失とオプティマイザーを使用してバックプロパゲーションを実行する場合は、loss.backward() と optimizer.step() を使用する代わりに、scale.scale(loss) を使用する必要があります。オプティマイザーを更新するには、scaler.step(optimizer) を使用します。これにより、すべての勾配をスカラー変換し、すべての計算を 16 ビットの精度で実行し、最後に scaler.update() を使用してスケーラーを更新し、トレーニング勾配に適応させることができます。 すべてを 16 ビットの精度で実行すると、数値が不安定になり、使用している一部の関数が正しく動作しなくなる可能性があります。 16 ビットの精度では、特定の操作のみが正しく機能します。詳細については公式ドキュメントを参照してください。 進捗バー各段階で完了したトレーニングの割合を示す進行状況バーがあると非常に便利です。進行状況バーを取得するには、tqdm ライブラリを使用します。ダウンロードしてインポートする方法は次のとおりです。
トレーニング ループと検証ループでは、次の操作を行う必要があります。
トレーニングおよび検証ループに tqdm コードを追加すると、モデルが完了したトレーニングの割合を示す進行状況バーが表示されます。次のようになります: この図では、691 はモデルが完了する必要があるバッチ数、7:28 はモデルが 691 バッチに要する合計時間、1.54 it/s はモデルが各バッチに費やす平均時間を表しています。 勾配の蓄積CUDA メモリ不足エラーが発生した場合は、コンピューティング リソースを超えたことを意味します。これを修正するには、すべてを 16 ビット精度に変換する、モデルのバッチ サイズを縮小する、より小さなモデルに切り替えるなど、いくつかの方法があります。 しかし、16 ビット精度に切り替えても問題が完全に解決されない場合があります。これを修正する最も簡単な方法はバッチ サイズを縮小することですが、バッチ サイズを縮小したくない場合は、勾配累積を使用して目的のバッチ サイズをシミュレートできます。 CUDA のメモリ不足問題に対する別の解決策は、複数の GPU を単純に使用することですが、これは多くの人が利用できないオプションです。 マシン/モデルが 16 のバッチ サイズしかサポートできず、これを増やすと CUDA メモリ不足エラーが発生するため、バッチ サイズを 32 にしたいとします。勾配累積は、バッチ サイズ 16 でモデルを 2 回実行し、各バッチの計算された勾配を累積し、最後にこれら 2 つの順方向伝播と勾配累積の後に最適化ステップを実行することによって機能します。 勾配の蓄積を理解するには、ニューラル ネットワークのトレーニング時に何が行われているのかを正確に理解することが重要です。次のようなトレーニング ループがあるとします。
上記のコードを見ると、覚えておくべき重要な点は、 loss.backward() がモデルの勾配を作成して保存するのに対し、 optimizer.step() は実際に重みを更新するということです。オプティマイザーを呼び出す前に loss.backward() が 2 回呼び出されると、勾配が累積されます。 PyTorch で勾配累積を実装する方法は次のとおりです。
上記の例では、マシンがサポートできるバッチ サイズは 16 のみで、必要なバッチ サイズは 32 です。基本的に、2 つのバッチの勾配を計算し、実際の重みを更新します。これにより、有効なバッチ サイズは 32 になります。 翻訳者注: 勾配の蓄積は単なる妥協です。テストの結果、勾配が蓄積されると、最後の loss.backward() の勾配は、前のバックプロパゲーションの重みよりも高くなります。理由は正確にはわかりません。そういった問題はありますが、このようなトレーニングはやはり効果的です。 16 ビット精度の勾配累積は非常に似ています。
結果評価ほとんどの機械学習プロジェクトでは、評価のための指標を手動で計算する傾向があります。精度、適合率、再現率、F1 などのメトリックを計算することは難しくありませんが、加重精度、再現率、F1 など、これらのメトリックのいくつかのバリエーションが必要な場合もあります。これらを計算するにはさらに作業が必要になる場合があります。実装でこれらすべてのメトリックを正確、効率的、迅速かつエラーなく計算できない場合は、sklearns の classified_report ライブラリを使用できます。これは、これらのメトリックを計算するために特別に設計されたライブラリです。
上記のコードはバイナリ分類用です。この機能は、さらに多くの目的に合わせて設定できます。最初のリストはモデルの予測を表し、2 番目のリストは正しい値を表します。上記のコードは以下を出力します: 結論はこの記事では、PyTorch でディープ ニューラル ネットワークのトレーニングを最適化する 4 つの方法について説明しました。 16 ビットの精度によりメモリ消費量が削減され、より大きなバッチ サイズを使用して勾配の蓄積をシミュレートできます。tqdm の進行状況バーと sklearns の classified_report は、モデルのトレーニングを簡単に追跡し、モデルのパフォーマンスを評価できる 2 つの便利なライブラリです。個人的には、私は常に上記のすべてのトレーニング手法を使用してニューラル ネットワークをトレーニングし、必要に応じて勾配累積を使用します。 最後に、pytorch を使用している場合、または pytorch の初心者の場合は、次のライブラリを使用できます。 github/deephub-ai/トーチハンドル 彼はあなたにとって大きな助けとなるでしょう。 |
<<: グラフディープラーニングで複雑な研究タイプのタスクを実装するのは、あまりにも面倒ですか?この新しいツールキットは、
>>: スマート物流が一般的なトレンドであり、ロボット、ドローン、5Gの価値が強調されている
2017 年現在までに最もよく使われている流行語は人工知能 (AI) と機械学習 (ML) ですが...
[[431792]]自己教師学習はコンピューター ビジョンで広く使用されており、手動で注釈を付ける...
人工知能はあらゆる社会的立場を変えるイノベーションです。これは、データを統合し、情報を分析し、その後...
ジェレミー・ハワード氏はかつて、Generative Adversarial Network (GA...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
北京時間12月6日、海外メディアの報道によると、克服すべき障害はまだ多くあるものの、自動運転車の技術...
コンピューター科学者は、人工知能の中核技術である機械学習とディープラーニングにおいて大きな進歩を遂げ...
人工知能と機械学習の技術は世界に革命をもたらし、世界をより先進的なものにしていますが、この 2 つの...
ビッグデータ時代の到来により、データ移行は多くの企業や組織が直面しなければならない課題の 1 つにな...
グーグルは6月15日、オンラインショッピングツールに新たな生成AI技術を導入すると発表した。この技術...