PaddleClas: トレーニングのヒント

トレーニングのヒント

1. オプティマイザーの選択

勢いのある SGD オプティマイザには、収束速度が遅いこと、初期学習率の設定に多くの経験を必要とすることの 2 つの欠点がありますが、初期学習率を適切に設定し、最適化の数を設定すれば、これは、多くのオプティマイザーの中でも際立っており、検証セットでより高い精度を実現します。

Adam、RMSProp などの一部の適応学習率オプティマイザーは、より速く収束する傾向がありますが、最終的な収束精度はわずかに悪くなります。

より高速な収束速度を追求する場合は、これらの適応学習率オプティマイザーを使用することを推奨し、より高い収束精度を追求する場合は、勢いのある SGD オプティマイザーを使用することを推奨します。

2. 学習率と学習率削減戦略の選択

学習率の選択は、多くの場合、オプティマイザー、データ、タスクに関連します。ここでは主に、学習率と、ImageNet-1k をトレーニングするためのオプティマイザーとして Momentum+SGD を使用した学習率削減の選択について紹介します。

学習率削減戦略:

学習の初期段階では、重みがランダムに初期化された状態にあるため、損失関数の勾配降下法が比較的容易であり、より大きな学習率を設定することができます。

学習の後半段階では、重みパラメータがすでに最適値に近づいているため、学習率を大きくしても最適値を見つけることができず、より小さな学習率を設定する必要があります。

トレーニング プロセス全体を通じて、多くの研究者が使用する学習率削減方法は、学習率を段階的に削減することを意味する「ピースワイズ ディケイ」です。たとえば、ResNet50 標準トレーニングでは、初期学習率を 0.1 に設定し、学習率が 0.1 に設定されます。 30 エポックごとに元の値に戻ります。1/10、合計 120 エポックの反復。多くの研究者は、piecwise_decay に加えて、polynomial_decay (多項式減少)、exponential_decay (指数関数的減少)、cosine_decay (コサイン減少) など、学習率を下げる他の方法も提案しています。ハイパーパラメータを使用し、比較的高い堅牢性を備えているため、モデルの精度を向上させるために推奨される学習率削減方法となっています。

cosine_decay と Piecewise_decay の学習率変化曲線を次の図に示します。cosine_decay はトレーニング プロセス全体を通じて大きな学習率を維持するため、収束は遅くなりますが、最終的な収束効果は Piecewise_decay よりも優れていることが簡単にわかります。 。

さらに、図から、cosine_decay の学習率が小さいとラウンド数が少なく、最終的な精度に影響することがわかります。そのため、cosine_decay のパフォーマンスを向上させるには、200 ホイールなど、より多くのラウンドを反復することをお勧めします。

ウォームアップ戦略

より大きなバッチサイズを使用してニューラル ネットワークをトレーニングする場合は、ウォームアップ戦略を使用することをお勧めします。名前が示すように、ウォームアップ戦略は最初に学習をウォームアップすることです。トレーニングの初期段階では、最大学習率を直接使用せず、徐々に増加する学習率を使用してネットワークをトレーニングします。最高点まで上げてから学習を使用します。 レート削減戦略で説明した学習率削減方法は、学習率の値を減衰させます。実験によれば、batch_size が大きい場合、ウォームアップによってモデルの精度が着実に向上することがわかります。MobileNetV3 のトレーニングなど、より大きなバッチ サイズを使用する実験では、ウォームアップのエポックをデフォルトで 5 に設定します。つまり、最初に 5 エポックを使用して学習率を 0 から最大値まで増加させてから、対応する学習率の減衰を実行します。

3.バッチサイズの選択

Batch_size は、ニューラル ネットワークのトレーニングにおける重要なハイパーパラメーターであり、この値により、トレーニングのために一度にニューラル ネットワークに送信されるデータの量が決まります。論文 [1] では、著者は実験を通じて、batch_size の値が学習率の値と線形の関係にある場合、収束精度はほとんど影響を受けないことを発見しました。ImageNet データをトレーニングする場合、ほとんどのニューラル ネットワークは初期学習率 0.1 とバッチ サイズ 256 を選択します。 したがって、実際のモデル サイズとビデオ メモリに応じて、学習率を 0.1*k に設定し、バッチ サイズを 256 に設定できます。 256*k。

4.weight_decayの選択

過学習は機械学習の一般的な用語です。単純に理解すると、モデルはトレーニング データでは良好に実行されますが、テスト データではパフォーマンスが低下します。畳み込みニューラル ネットワークには、過学習の問題もあります。過学習を避けるために、多くの通常の手法がいくつか提案されていますが、その中でも、weight_decay は過学習を回避するために広く使用されている手法の 1 つですWeight_decay は、最終的な損失関数の後に L2 正則化を追加することに相当します。L2 正則化により、ネットワークの重みはより小さい値が選択される傾向になります。最終的に、ネットワーク全体のパラメータ値は 0 に近づく傾向があり、汎化パフォーマンスは、それに応じてモデルも改良されます。主要な深層学習フレームワークの実装では、この値の意味はL2正則化前の係数ですが、パドルフレームワークではこの値の名前がl2_decayであるため、以下ではl2_decayと呼びます。係数が大きいほど、追加される正則化が強くなり、モデルのアンダーフィッティングが大きくなる傾向があります。ImageNet の学習タスクでは、ほとんどのネットワークでパラメーター値が 1e-4 に設定されますが、MobileNet シリーズ ネットワークなどの一部の小規模ネットワークでは、ネットワークのアンダーフィッティングを避けるために、値が 1e-5 ~ 4e-5 に設定されます。もちろん、この値の設定は特定のデータセットにも関連します。タスクのデータセットが大きい場合、ネットワーク自体が過小適合状態になる傾向があるため、この値を適切に下げることができます。タスクの量が小さいと、ネットワークが過学習になる傾向があるため、値を適切に増やすことができます。次の表は、ImageNet-1k でさまざまな l2_decay を使用した MobileNetV1_x0_25 の精度を示しています。MobileNetV1_x0_25 は比較的小規模なネットワークであるため、l2_decay が過剰になるとネットワークの適合が不十分になる傾向があるため、このネットワークでは 1e-4 より 3e-5 の方が良い選択となります。

モデル L2_減衰 acc1/acc5を訓練する acc1/acc5 をテストします
MobileNetV1_x0_25 1e-4 43.79%/67.61% 50.41%/74.70%
MobileNetV1_x0_25 3e-5 47.38%/70.83% 51.45%/75.45%

さらに、この値の設定は、トレーニング プロセス中に他の正則化が使用されるかどうかにも関係します。トレーニング プロセス中のデータの前処理がより複雑である場合、つまりトレーニング タスクがより困難になる場合は、値を適切に減らすことができます。次の表は、 ImageNet-1k 上で、ResNet50 がランダグメント前処理メソッドを使用した後に異なる l2_decay を使用することを示しています。 。タスクが困難になると、より小さい l2_decay を使用するとモデルの精度が向上することが簡単にわかります。

モデル L2_減衰 acc1/acc5を訓練する acc1/acc5 をテストします
レスネット50 1e-4 75.13%/90.42% 77.65%/93.79%
レスネット50 7e-5 75.56%/90.55% 78.04%/93.74%

要約すると、l2_decay は特定のタスクやモデルに応じて調整できます。一般に、単純なタスクまたは大規模なモデルの場合は、より大きな l2_decay を使用することをお勧めします。複雑なタスクまたは小さなモデルの場合は、より小さな l2_decay を使用することをお勧めします。

5.label_smoothingの選択

Label_smoothing は深層学習における正則化手法の 1 つで、正式名称は Label Smoothing Regularization (LSR) で、ラベル スムージング正則化です。従来の分類タスクで損失関数を計算する場合、実際のワン ホット ラベルとニューラル ネットワークの出力はクロス エントロピーに従って計算されますが、label_smoothing は実際のワン ホット ラベルをラベルに平滑化し、ネットワークが学習するようにします。 label ハードラベルではなく、確率値を持ったソフトラベルで、カテゴリに対応する位置の確率が最も大きく、他の位置の確率は非常に小さい値になります。具体的な計算方法については論文[2]を参照してください。label_smoothing には、ラベルをどの程度柔らかくするかを表すイプシロンパラメータの値があり、この値が大きいほど、ラベル平滑化後のラベルベクトルのラベル確率値が小さくなり、ラベルが滑らかになります。ラベルはハードラベルになる傾向があるため、ImageNet-1k をトレーニングする実験では通常、この値は 0.1 に設定されます。ImageNet-1k のトレーニング実験では、label_smooting を使用した後、ResNet50 サイズレベル以上のモデルの精度が着実に向上していることがわかりました。次の表は、label_smoothing を使用する前と後の ResNet50_vd の精度指標を示しています。

モデル use_label_smoothing テストacc1
ResNet50_vd 0 77.9%
ResNet50_vd 1 78.4%

同時に、label_smoohing は通常の方法と同等であるため、比較的小規模なモデルでは、精度の向上は明らかではないか、むしろ低下します。次の表は、ImageNet-1k で label_smoohing を使用する前後の ResNet18 の精度指標を示していますlabel_smoothing を使用した後、精度が低下していることがはっきりとわかります。

モデル use_label_smoohing acc1/acc5を訓練する acc1/acc5 をテストします
レスネット18 0 69.81%/87.70% 70.98%/89.92%
レスネット18 1 68.00%/86.56% 70.81%/89.89%

要約すると、より大きなモデルで label_smoohing を使用するとモデルの精度が効果的に向上しますが、より小さなモデルで label_smoohing を使用するとモデルの精度が低下する可能性があるため、label_smoohing を使用するかどうかを決定する前に、モデルとタスクの難易度。

6. 小型モデルの画像のトリミング領域とストレッチ変形度を変更する

ImageNet-1k データの標準的な前処理では、random_crop 関数でスケールと比率の 2 つの値が定義されており、2 つの値はそれぞれ画像のトリミングのサイズと画像の引き伸ばしの度合いを決定します。スケールの値は 0.08 ~ 1( lower_scale ~ upper_scale)、比率のデフォルト値の範囲は 3/4 ~ 4/3( lower_ratio ~ upper_ratio) です。非常に小規模なネットワークをトレーニングする場合、このタイプのデータ拡張によりネットワークの適合が不十分になり、精度が低下する可能性があります。ネットワークの精度を向上させるために、そのデータ強調を弱くすることができます。つまり、画像のトリミング領域を増やすか、画像のストレッチ変換の程度を弱めます。lower_scale の値を増やすか、 lower_ratio と upper_scale の間のギャップをそれぞれ減らすことで、より弱い画像変換を実現できます。次の表は、異なる lower_scale を使用した MobileNetV2_x0_25 のトレーニングの精度を示したもので、画像のトリミング領域を増やすと、トレーニング精度と検証精度の両方が向上していることがわかります。

モデル スケール値の範囲 Train_acc1/acc5 テスト_acc1/acc5
MobileNetV2_x0_25 [0.08,1] 50.36%/72.98% 52.35%/75.65%
MobileNetV2_x0_25 [0.2,1] 54.39%/77.08% 53.18%/76.14%

7. データ拡張を使用して精度を向上させる

一般に、データ セットのサイズはパフォーマンスにとって重要ですが、画像のアノテーションは高価であることが多いため、アノテーション付きの画像の数が不足していることがよくあります。この場合、データの拡張が特に重要です。ImageNet-1kの学習における標準的なデータ拡張では、random_cropとrandom_flipの2つのデータ拡張手法が主に使用されていますが、近年では、カットアウト、ミックスアップ、カットミックス、オートオーグメントなど、より多くのデータ拡張手法が提案されています。 。実験により、これらのデータ拡張メソッドがモデルの精度を効果的に向上できることが示されています。次の表に、8 つの異なるデータ拡張メソッドにおける ResNet50 のパフォーマンスを示します。ベースラインと比較して、すべてのデータ拡張メソッドのパフォーマンスが向上していることがわかります。利点その中でcutmix は現在最も効果的なデータ拡張ですデータ拡張の詳細については、「データ拡張」の章を参照して

モデル データ拡張方法 テストトップ-1
レスネット50 標準変換 77.31%
レスネット50 自動拡張 77.95%
レスネット50 混同 78.28%
レスネット50 カットミックス 78.39%
レスネット50 切り取る 78.01%
レスネット50 グリッドマスク 77.85%
レスネット50 ランダム拡張 77.70%
レスネット50 ランダム消去 77.91%
レスネット50 かくれんぼ 77.43%

8. train_acc と test_acc を通じて調整戦略を決定します。

ネットワークのトレーニングのプロセスでは、通常、各エポックのトレーニング セットの精度と検証セットの精度が出力され、どちらも 2 つのデータ セットに対するモデルのパフォーマンスを示します。一般に、訓練セットの精度が検証セットの精度よりもわずかに高い、または両者が同等であることが比較的良好な状態です。トレーニング セットの精度が検証セットの精度よりもはるかに高いことが判明した場合、それはタスクが過学習されており、l2_decay の値を増やしたり追加したりするなど、トレーニング プロセスにさらに正則化を追加する必要があることを意味します。より多くのデータ拡張戦略。label_smoothing 戦略などを追加します。トレーニング セットの精度が検証セットの精度よりも低いことが判明した場合、それはタスクが適合不足である可能性があることを意味し、その際に正則化効果を弱める必要があります。 l2_decay の値を減らし、データ拡張方法を減らすなどのトレーニング プロセス、画像のトリミング領域を増やす、画像のストレッチ変換を弱める、label_smoothing を削除するなど。

9. 既存の事前トレーニング済みモデルを通じて独自のデータセットの精度を向上させる

現在のコンピューター ビジョンの分野では、事前トレーニングされたモデルを読み込んで独自のタスクをトレーニングすることが一般的になっています。ランダムな初期化からトレーニングを開始する場合と比較して、事前トレーニングされたモデルを読み込むことで、多くの場合、特定のタスクの精度が向上します。一般的に、業界で広く使用されている事前トレーニング モデルは、128 万枚の画像と 1,000 のカテゴリからなる ImageNet-1k データ セットをトレーニングすることによって取得されます。事前トレーニング モデルの fc 層の重みは k*1000 行列です。ここで、k はfc 層の前のニューロンの数 事前にトレーニングされた重みをロードする場合、fc 層の重みをロードする必要はありません。学習率に関しては、タスク トレーニングのデータセットが特に小さい場合 (画像が 1,000 枚未満など)、0.001 (batch_size:256、以下同様) などの小さい初期学習率を使用することをお勧めします。大きな学習率を避ける 事前訓練された重みを破棄します。トレーニング データ セットが比較的大きい (100,000 を超える) 場合は、0.01 以上など、より大きな初期学習率を試すことをお勧めします。

このドキュメントが役に立ったと思われる場合は、プロジェクトにスターを付けてください: GitHub - PaddlePaddle/PaddleClas: PaddlePaddle による視覚的な分類と認識のための宝箱

参考文献

[1]P. ゴヤル、P. ダラー、RB ギルシック、P. ノルドハウス、L. ウェソロフスキー、A. カイロラ、A. タロック、Y. ジア、K. ヘ。正確で大規模なミニバッチ SGD: 1 時間で imagenet をトレーニングします。CoRR、abs/1706.02677、2017。

[2]C.セゲディ、V.ヴァンフーク、S.イオッフェ、J.シュレンズ、Z.ウォジナ。コンピューター ビジョンの初期アーキテクチャを再考する。CoRR、abs/1512.00567、2015。

 

参考:

1:https://paddleclas.readthedocs.io/zh_CN/latest/models/Tricks.html

おすすめ

転載: blog.csdn.net/lilai619/article/details/131590755