深層学習モデルのパラメータを学習させるコツまとめ

目次

1.パラメータ調整のコツのまとめと分析

1. データとラベルの角度

1.1 データの正規化

1.2 データの拡張

1.3. ラベルのスムージング

2. 重みの初期化

3. 学習率の角度

3.1、ウォーミングアップ

3.2、線形スケーリング学習率 - 学習率とバッチサイズの関係

 3.3. 学習率減衰戦略

4. ハードネガティブマイニング

5. モデルの角度

5.1 マルチモデル融合(アンサンブル)

5.2. 知識の蒸留

5.3. 指数移動平均EMA

5.4、TTA(テスト時間拡張)

6. 微分学習率と転移学習

7. マルチスケールトレーニング

8. 相互検証

9. 適切な最適化アルゴリズムを選択する

10. 小さなデータセットを当てはめようとした

2. トレーニングスキルの概要

3. ある程度の経験、素早い試行錯誤

1. 最初は小規模なデータトレーニングを行う

2. 損失設計は合理的でなければなりません

3. 損失​​を観察することは、精度を観察することよりも優れています

4. 機密ネットワーク学習が十分であることを確認する

5. 学習率の設定が合理的である

6. トレーニングセットと検証セットの損失を比較します。

7. 受容野の大きさを知る


その他の参考記事:

1.痛みを伴わない増加: ターゲット検出を最適化するための実践的なトリック

2.モデルをより高いレベルに引き上げます: 最適化されたパラメーターの概要

1.パラメータ調整のコツのまとめと分析

1. データとラベルの角度

1.1 データの正規化

正規化、標準化、およびセンター/ゼロ中心 - ytusdc のブログ - CSDN ブログ

1.2データの強化

ランダム画像のトリミングとパッチング (RICAP) : 4 枚の写真の中央部分をランダムにトリミングして 1 枚の写真につなぎ合わせ、同時にこれら 4 枚の写真のラベルを混合します。これも特別なデータ拡張方法であり、一般的なデータ拡張はサンプルに対して操作するものですが、この方法はサンプルとラベルを同時に融合するため、大量のデータでも良好な結果が得られます。

Cutout: 新しい正則化方法です。原理は、トレーニング中に画像の一部をランダムに減算することで、モデルの堅牢性を向上させることができます。その原因は、コンピューター ビジョンのタスクでよく発生するオブジェクト オクルージョンの問題です。カットアウトを通じてオクルージョンされたオブジェクトを生成すると、オクルージョンの問題が発生したときのモデルのパフォーマンスが向上するだけでなく、モデルが意思決定を行う際に環境 (コンテキスト) をより考慮できるようになります。私の理解では、これもデータ拡張手法であり、画像をある程度不完全にすることで汎化能力を向上させ、過学習のリスクを軽減します。

ランダム消去: 実際、これはカットアウトに非常に似ており、オブジェクトのオクルージョンをシミュレートするためのデータ拡張方法でもあります。違いは、切り抜きは画像内でランダムに選択した四角形領域の画素値を0にすることで切り取ることに相当し、ランダム消去は元の画素値を乱数や平均値に置き換えることです。データセット内のピクセル。また、切り抜きで切り取られる領域の大きさは毎回固​​定であり、ランダム消去で置き換えられる領域の大きさはランダムです。

ミックスアップ トレーニング: このアイデアは、上記のランダムな画像のトリミングとパッチングに似ています。ミックスアップ トレーニングでは、毎回 2 枚の画像を取り出し、それらを線形に結合して新しい画像を取得します。これは、次の式に示すように、ネットワーク トレーニングの新しいトレーニング サンプルとして使用されます。x は画像データを表し、y は画像データを表します。ラベルを取得してから、新しい xhat、yhat を取得します。

データの線形結合が強化され、主にトレーニングサンプル間の線形表現が強化され、ネットワークの汎化能力が強化されているように見えますが、ミックスアップ法はより良い収束に時間がかかります。

1.3. ラベルのスムージング

参考:

ラベル スムージング (Label Smoothing) の詳細 - ytusdc のブログ - CSDN ブログ

2. 重みの初期化

重みの初期化は、他のトリックに比べてあまり頻繁に使用されません。ほとんどの人が使用するモデルは事前トレーニングされたモデルであり、使用される重みは大規模なデータセットでトレーニングされたモデルであるため、もちろん重みを自分で初期化する必要はありません。事前トレーニングされたモデルのないフィールドのみが重み自体を初期化するか、モデル内のニューラル ネットワークの完全に接続された最後のいくつかの層の重みを初期化します。一般的に使用される重み初期化アルゴリズムは、「kaiming_normal」または「xavier_normal」です。

ソフトマックスの回帰出力が一様分布に近づくように、初期化パラメータはできるだけ小さくする必要があり、その結果、ネットワークが最初にデータがどのカテゴリに属する​​かがわかりません。数値最適化では、勾配降下法もより高速に下降できるように、パラメーターの分散が一貫していること (一貫した桁数) が望ましいと考えています。同時に、各層の励起値の一定の分散を維持するために、初期化パラメータ (バイアス項目を除く) の分散を入力ニューロンの平方根に反比例させることができます。

  • unique 一様分布の初期化:
  • Xavier の初期メソッド。通常の活性化関数 (tanh、シグモイド) に適しています。
  • ReLU に適した初期化:
  • 正規ガウス分布が初期化されます。stdev はガウス分布の標準偏差で、平均は 0 に設定されます。

3. 学習率の角度

学習率は非常に重要なハイパーパラメータです。このパラメータの場合、スケール、バッチサイズ、最適化方法、データセットが異なると、その最適な値は不確実であり、経験だけに頼ることはできません。 . lr の値を正確に決定するには、トレーニング中に現在の状態に最適な学習率を常に見つけるしかありません。

学習率の設定が大きすぎるとトレーニングが非常に不安定になり、学習率が小さすぎると損失の減少が遅くなりすぎます一般に、学習率はトレーニングとともに低下します。減衰係数は 0.1、0.3、または 0.5 に設定できます。減衰のタイミングは、検証セットの精度が向上しなくなったとき、または固定数のトレーニング サイクル後に自動的に減衰することができます

たとえば、次の図では、fastai の lr_find() 関数を使用して適切な学習率を見つけます。このときの適切な学習率は、以下の学習率損失曲線によれば 1e-2 です。

fastai のチーフ デザイナー「Sylvain Gugger」によるブログ: How Do You Find A Good Learning Rate[1] と、関連する論文 Cy​​clical Learning Rates for Training Neural Networks[2] をお勧めします。

3.1、ウォーミングアップ

深層学習トレーニング戦略 - 学習率ウォームアップ Warmup_ytusdc のブログ - CSDN blog_warmup_steps

        トレーニングの初期段階:モデルの重みはトレーニングの開始時にランダムに初期化されるため、この時点でより大きな学習率を選択すると、モデルが不安定になる可能性があります。学習率のウォームアップとは、トレーニングの開始時に小さな学習率を使用し、いくつかのエポックまたは反復をトレーニングし、モデルが安定したときにトレーニング用に事前設定された学習率に変更することです。
        上記の方法は常時ウォームアップですが、小さな学習率から比較的大きな学習率に変更すると学習エラーが急激に増加する可能性があるため、Facebookは2018年に上記のウォームアップを改良しました。この問題を解決するために、段階的なウォームアップが提案されています。つまり、初期の小さな学習率から開始して、比較的大きな学習率が最初に設定されるまで、各反復が少しずつ増加します。

3.2、線形スケーリング学習率 - 学習率とバッチサイズの関係

        バッチサイズが大きいと、同一エポックでは精度率が低くなることが実験により証明されており、ウォームアップを使用することである程度解決できますが、学習率をリニアスケーリングすることも有効な方法です。

        一般に、バッチサイズが大きくなると、使用される学習率も大きくなります。
        ミニバッチ SGD トレーニング中は、各バッチのデータがランダムに選択されるため、勾配降下の値はランダムになります。バッチ サイズを増やしても勾配の期待値は変わりませんが、その分散は減少します。言い換えれば、バッチ サイズが大きいと勾配内のノイズが減少するため、学習率を高めて収束を高速化できます。
        具体的な方法は非常に簡単で、例えば ResNet の元の論文では、バッチサイズ 256 のときに選択された学習率は 0.1 でしたが、バッチサイズをより大きな b に変更すると、学習率は 0.1 × b/ になるはずです。 256. つまり、学習率はバッチサイズに応じて線形に設定され、より良い学習効果が得られます。
        簡単に言えば、大きなバッチ サイズで計算される勾配ノイズは小さくなるため、より大きな学習率を使用して収束を高めることができます。ここで質問がありますが、一般的にバッチ サイズが小さいと収束が速くなるのはなぜでしょうか。これは、バッチサイズが小さい方が方向性は必ずしも正確ではありませんが、更新回数が多いため、最終的な収束速度は速くなります。バッチ サイズが大きいとノイズが減り、方向がより正確になりますが、学習率の効果はあまり良くないため、学習率を線形に増加させることは、実際には、単一の更新量を使用して増加することと同じです。更新数は少ないです。

        要約すると、バッチサイズが大きいということは、学習時に収束方向に対する信頼度が高くなるほど、進行方向がより明確になることを意味しますが、バッチサイズが小さいと、より混沌として不規則に見えることになります。バッチが大きい場合、バッチが小さい場合にはより多くの状況に対処することができないため、エラーが発生しないようにするには小さな学習率が必要です。

以下の図で、損失 Loss と学習率 Lr の関係を確認できます。

十分なビデオ メモリの条件下では、トレーニングに大きなバッチ サイズを使用する方が適切であり、適切な学習率を見つけた後は、収束速度を向上させることができます。さらに、バッチサイズを大きくすると、バッチ正規化におけるいくつかの小さな問題を回避できます。

 3.3. 学習率減衰戦略

ウォームアップ後のトレーニング プロセス中に、学習率を継続的に減衰させることは、精度を向上させる良い方法です。したがって、適切な学習率減衰戦略を選択できます。

学習率減衰戦略 - Zhihu

コサインアニーリングとホットリスタートを使用した確率的勾配降下法

「コサイン」はコサイン関数に似た曲線、「アニーリング」は減少、「コサインアニーリング」はコサイン関数に似た緩やかに減少する学習率です。

「ホットリスタート」とは、学習プロセス中に「学習率」がゆっくりと低下し、その後突然「回復」(再開)し、その後ゆっくりと低下し続けることを意味します。

学習率を時々再起動すると、単位時間内に複数の極小値が収束し、多くのモデルを統合して統合できるようになります。

また、一部のパラメーターの学習速度が速いまたは遅いため、モデル内のパラメーター グループごとに異なる学習速度を設定できることにも注意してください。上記リンクにも記載があります

洪水あり

トレーニング損失がしきい値よりも大きい場合は、通常の勾配降下が実行されます。トレーニング損失がしきい値よりも低い場合は、勾配が逆転してトレーニング損失をしきい値付近に保ち、モデルは「ランダム ウォーク」を実行し続けます。 、モデルを期待します。平坦な損失領域に最適化できるため、テスト損失が二重に正常に実行されたことがわかります。

flood = (loss - b).abs() + b

4. ハードネガティブマイニング

1. 分析モデルが正しいサンプルを予測することは困難であり、ターゲットを絞った方法が与えられています。

2. 悪いケースの分析

5. モデルの角度

5.1 マルチモデル融合(アンサンブル)

アンサンブルは論文成果を狙う究極の核兵器 ディープラーニングには一般的に以下のような手法があります

  1. 同じパラメータ、異なる初期化方法
  2. さまざまなパラメーターによる相互検証を通じて、最適なグループを選択します
  3. 同じパラメータ、モデルトレーニングの異なる段階、つまり異なる反復を伴うモデル。
  4. 異なるモデル (RNN と従来のモデルなど) で線形融合を実行します。
  5. モデルのパフォーマンスと堅牢性の向上: 融合と投票を検証します。

ここにモデル 1、モデル 2、モデル 3 があると仮定すると、これらは次のように統合できます。

  1. モデル 1 のプローブ + モデル 2 のプローブ + モデル 3 のプローブ ==> 最終ラベル
  2. モデル 1 ラベル、モデル 2 ラベル、モデル 3 ラベル ==> 投票 ==> 最終ラベル
  3. model1_1 確率 + ... + モデル 1_n 確率 ==> モデル 1 ラベル、モデル 2 ラベル、モデル 3 は 1 と同じラベル メソッドを取得 ==> 投票 ==> 最終ラベル

3 番目の方法は、モデルのランダム シードが固定されていない場合、複数の予測の結果が異なる可能性があるという事実に基づいています。上記の方法の効果は、ラベルの数やデータセットのサイズなどの特定の問題に応じて詳細に分析する必要があり、パフォーマンスが異なる場合があります。この方法は、プローブの単一の使用または組み合わせにすぎません。そして投票方法。

5.2. 知識の蒸留

これは実際にはコスト関数の観点から分析されます。現在のモデル (学生モデル) のトレーニングを支援するために教師モデルを使用します。学生モデルは新しいコスト関数を使用します。詳細については、知識の蒸留を参照してください。

すべてのモデルのアンサンブルを使用した予測は面倒で、多数のユーザーに展開するには計算量が多すぎる可能性があります。このような問題に対処する有効な手法の一つとして、Knowledge Distillation(知識蒸留)手法があります。

知識蒸留法では、現在のモデル (生徒モデル) のトレーニングを支援するために教師モデルを使用します。教師モデルは精度が高い事前トレーニング済みモデルであるため、生徒モデルはモデルの複雑さを変えずに精度を向上させることができます。たとえば、ResNet-152 を教師モデルとして使用して、学生の ResNet-50 トレーニング モデルを支援できます。トレーニング中に、学生モデルと教師モデルの出力の差にペナルティを与えるために蒸留損失を追加します。
このテクノロジーは Hinton によって作成され、より優れたネットワークを通じて軽量ネットワーク トレーニングをガイドし、最終的にはより良いトレーニング結果を達成します。
 

5.3.指数移動平均EMA

スライド平均モデルは、トレーニング プロセス中にパラメーターのスライド平均を継続的に計算します。これにより、安定性をより効果的に維持し、現在のパラメーターの更新の影響を受けなくなります。たとえば、運動量項を使用した確率的勾配降下法では、移動平均モデルを学習率に適用します。

参考記事:

指数移動平均 (EMA) [テスト データ上の最終モデルのパフォーマンス (精度、FID、汎化能力など) をある程度改善します]

5.4、TTA(テスト時間拡張)

当初、この概念は fastai コースで見られました。このプロセスはトレーニング段階には関与せず、検証およびテスト段階で行われます。具体的なプロセスは、処理対象の画像に対していくつかのランダムな画像強調変更を実行し、各画像強調後の画像を予測し、予測結果の平均値を取得することです。

原理はモデルの平均化と似ており、推論の精度を向上させるために推論速度を犠牲にします。もちろん、この技術にも長所と短所があり、私が自分で実行した衛星画像データセットでは、TTA を使用した場合の精度は、使用しない場合に比べて 0.03 ポイント低くなりました。

6. 微分学習率と転移学習

まず移行学習について話しましょう. 移行学習は非常に一般的な深層学習手法です. 私たちは多くの事前トレーニング済みの古典的なモデルを使用して、独自のタスクを直接トレーニングします。ドメインは異なりますが、学習された重みの幅という点で 2 つのタスク間には関連性があります。

 上の図から、「モデル A」によってトレーニングされたモデルの重みを使用して、独自のモデルの重み (「モデル B」) をトレーニングします。ここで、modelA は ImageNet の事前トレーニングされた重みであり、ModelB は使用したいものです。猫と犬の事前訓練された体重を特定します。

それでは、微分学習率と転移学習の間にはどのような関係があるのでしょうか? 他のタスクの学習重みを直接利用するため、最適化を行う際には、適切な学習率をどのように選択するかが非常に重要な問題となります。

一般に、私たちが設計するニューラルネットワーク(下図)は、入力層、隠れ層、出力層の3つの部分に分かれており、層数が増えるほど、ニューラルネットワークが学習する特徴量は多くなります。概要。したがって、下図の畳み込み層と全結合層の学習率も異なるように設定する必要があります。一般に、畳み込み層の学習率は低く設定する必要がありますが、全結合層の学習率は高く設定することができます。適当に増やしました。

 これが差分学習率の意味であり、層ごとに異なる学習率を設定することでニューラルネットワークの学習効果を高めることができます。詳しくは以下の関連を参照してください。

7. マルチスケールトレーニング

マルチスケール トレーニングは「直接的かつ効果的な」方法です。ニューラル ネットワークの畳み込みプーリングの特殊性により、異なるスケールの画像データ セットを入力することで、ニューラル ネットワークが異なる解像度での画像の特性を完全に学習できるようになります。機械学習のパフォーマンスの向上は、過学習効果に対処するためにも使用できます。画像データセットが特に十分でない場合は、最初に小さいサイズの画像をトレーニングし、次にサイズを大きくして同じモデルを再度トレーニングすることができます。 Yolo にあります。v2 の論文にも記載されています。

マルチスケール トレーニングはすべてのディープ ラーニング アプリケーションに適しているわけではないことに注意してください。マルチスケール トレーニングは特別なデータ強化方法とみなされ、画像サイズが調整されています。可能であれば、ビジュアル コードを使用してマルチスケール画像を間近で観察し、「マルチスケールが画像の全体的な情報に影響を与えるかどうかを確認する」ことが最善です。画像情報に影響を与える場合は、そのような直接トレーニングが効果的です。アルゴリズムを誤解させると、望ましい結果が得られなくなります。

8. 相互検証

Li Hang の統計手法では、相互検証は実際のアプリケーションでは「不足しているデータ」に対して使用されることが多く、基本的な目的はデータの再利用です。平常時は、すべてのデータをトレーニング セットと検証セットに分割します。これはすでに単純な相互検証であり、1 分割相互検証と呼ぶことができます。「相互検証はテスト セットとは何の関係もないことに注意してください。テスト セットはアルゴリズムの標準を測定するために使用され、相互検証には参加しません。」

相互検証はトレーニング セットと検証セットでのみ機能します。

相互検証は Kaggle のコンペティションで特に推奨される手法で、トレーニング セットを 5 つの部分に分割し、ランダムに 1 つを検証セットとして選択し、残りをトレーニングとして使用する 5 分割 (5 分割) 相互検証をよく使用します。 set、cycle 5 第 2 に、この種の比較は計算量がそれほど多くありません。また、leave-one-out 相互検証と呼ばれる方法もあります。この種の相互検証は、n をデータセットの容量として表す n 倍の相互検証です。この方法は、データ量が比較的少ない場合にのみ適していますと計算量が膨大になるため、この方法はあまり使われません。

9. 適切な最適化アルゴリズムを選択する

異なるタスクには異なる最適化アルゴリズムが適しているのは当然ですが、私たちが使用する最適化アルゴリズムのほとんどは adam と SGD+monmentum です。Adam は、多くの奇妙な問題を解決できます (損失が下がらない場合もあります。Adam を即座に変更するだけです)。また、多くの奇妙な問題 (単語の頻度の差が非常に大きい、現在のバッチでは問題が解決されないなど) を引き起こす可能性もあります。単語がある 単語ベクトルも更新されます。別の例は、Adam と L2 正則化の組み合わせの複雑な効果です)。使用するときは大胆かつ慎重に、問題が発生した場合は、さまざまな魔法改造アダム (MaskedAdam[14]、AdamW など) を見つけて救援してください。

しかし、SGD と比較して、adam の収束は速いが汎化能力が低く、より良い結果を得るには SGD の微調整が必​​要なようだというブログをいくつか読みました。小さなデータに対する adam、adadelta など、ここでの実験の効果は sgd ほど良くなく、sgd の収束速度は遅くなりますが、最終的な収束結果は一般に優れています。sgd を使用する場合、学習率 1.0 または 0.1 から開始することを選択でき、一定期間後に検証セットで確認することができます。コストが下がらない場合は、学習率を半分にすることができます。これを行う論文、私自身 実験の結果も非常に良好です。もちろん、ada シリーズを使用して最初に実行し、最終的な収束が速い場合は sgd に置き換えてトレーニングを続けることもできます。一般に分類問題に対しては adadelta の方が良い効果があると言われており、adam は問題に対してより良い効果を生成しています。

adam は収束が早いですが、sgd+momentum に比べて得られる解が良くない場合が多いので、時間コストを考慮しない場合は sgd を使用してください。Adam は lr を特別に調整する必要はありませんが、sgd は lr と初期ウェイトを調整するためにより多くの時間を費やす必要があります。

10. 小さなデータセットを当てはめようとした

これは古典的なトリックですが、多くの人がやらないので、ぜひ試してみてください。正則化/ドロップアウト/データ拡張をオフにして、トレーニング セットのごく一部を使用してニューラル ネットワークを数エポックトレーニングさせます。損失がゼロであることを確認してください。そうでない場合は、何かが間違っている可能性があります。

その他のトリック
上記の多くの非常に高度なトリックに加えて、パフォーマンスを向上させるための小さなトリックが多数あり、そのうちのいくつかは特によく使用され、一般的です。

2. トレーニングスキルの概要

  1. 大規模なデータ セットの場合は、データが出現したらすぐに全量を実行しないでください。まず、より小さいトレーニング セット (1/100、1/10 を使用することをお勧めします) でトレーニングとテストを行い、モデルのパフォーマンスとトレーニング時間の最終結果を把握し、全量のデータを実行するのにかかる時間を推定します。十分な自信がなければ大規模な実験を行わないでください。小規模なデータセットで過学習またはより良い結果を予測できるかどうかを確認してください。そうでない場合は、学習率が大きすぎるか、コードが間違って書かれている可能性があります。まず学習率を下げてみて、それでも機能しない場合は、コードをチェックしてデータローダーによるデータ出力が正しいかどうかを確認し、モデルの各ステップのサイズが期待を満たしているかどうかを確認します。例: 最初に大規模なデータセットは必要ありませんが、最初に約 2 ワットのトレーニング セットと 2,000 のテスト セットの小さなデータ セットのパラメーターを調整します。
  2. train/eval の損失曲線を見ると、通常、train 損失はログ状に減少し続け、最終的に安定するはずですが、eval 損失はあるエポックまで減少し始め、その後安定または上昇し始めます。 、早期停止を使用できます。評価損失が最も低いモデルを保存します。a. 損失曲線が非常に異常な場合は、ラベルが間違っているなど、データ処理に問題がある可能性があります。戻ってコードを確認してください。b. 設計したネットワークが機能せず、トレーニング セットの正解率も非常に低い場合は、サンプル数を減らし、正則化項目を削除してからパラメーターを調整できます。 、これは、Web の結果に問題がある可能性を設計したことを意味します。
  3. オプティマイザーは最初に adam を使用し、学習率が 1e-3 または 1e-4 に設定されてから、Radam (LiyuanLucasLiu/RAdam) を試します。sgd は非常に遅いため、推奨されません。sgd の収束速度は遅くなりますが、最終的な収束結果は一般に優れています。sgd を使用する場合、学習率 1.0 または 0.1 から開始することを選択でき、一定期間後に検証セットで確認することができます。コストが下がらない場合は、学習率を半分にすることができます。これを行う論文、私自身 実験の結果も非常に良好です。もちろん、ada シリーズを使用して最初に実行し、最終的な収束が速い場合は sgd に置き換えてトレーニングを続けることもできます。一般に分類問題に対しては adadelta の方が良い効果があると言われており、adam は問題に対してより良い効果を生成しています。
  4. 微調整中に、新しく追加されたレイヤーの学習率を高め、再利用されたレイヤーの学習率を比較的低く設定できます。
  5. 通常、アクティベーション関数には relu を使用するだけで十分ですが、leaky relu を試すこともできます。活性化関数が RELU の場合、バイアス項目を初期化するとき、デッドノードが多すぎる (活性化値は 0) ことを避けるために、通常は小さな正の値に初期化できます。
  6. トレーニングプロセス中、トレーニングセットとテストセットの損失が減少するかどうか、正解率が増加するかどうかを観察するだけでなく、時間内のパラメータと活性化値の分布を観察することも必要です。そして一定の変動があるはずです。適切な手段は、視覚化ライブラリを使用して、いくつかのトレーニング例の後、またはエポック間に重みヒストグラムを生成することです。これは、勾配の消失や勾配の爆発 (勾配の爆発) など、深層学習モデルのいくつかの一般的な問題を追跡するのに役立つ可能性があります。
  7. 勾配の正規化を行うには、つまり、計算された勾配をミニバッチ サイズで除算します。
  8. 勾配テスト: トレーニングやデバッグでアルゴリズムに問題がある場合は、近似数値勾配と計算された勾配を使用して、勾配が正しく計算されているかどうかを比較および確認することを検討できます。
  9. 勾配クリッピング (勾配クリッピング): 勾配クリッピング (torch.nn.utils.clip_grad_norm) を実行するいくつかのタスク (特に RNN を使用するタスク) があり、最大勾配を制限することで勾配の爆発を防ぐことができます。実際、 value = sqrt(w1^2) +w2 ^2….) 、値がしきい値を超える場合、それは減衰係数とみなされ、 value の値はしきい値と等しくなります: 5、10、15。RNN のトレーニングでは、勾配クリッピングが追加されていない場合、一定期間のトレーニング後に損失が突然ナンになります。
  10. バッチノームとドロップアウトを試すことができますが、場所は非常に重要です。最終出力層の前、埋め込み層の後に配置するようにしてください。RNN は、layer_norm を試すことができます。ただし、これらのレイヤーを一部のタスクに追加すると、悪影響が生じる可能性があります。Dropout は小さなデータの過学習を防ぐのに効果があり、その値は通常 0.5 に設定されます。小さなデータに対する Dropout+sgd は、私の実験のほとんどで非常に明白な効果をもたらしました。したがって、可能であれば、試してみることをお勧めします。ドロップアウトの位置はさらに特殊で、RNN の場合は、入力 -> RNN および RNN -> 出力の位置に配置することを推奨します。
  11. lrscheduler は torch.optim.lr_scheduler.CosineAnnealingLR を使用し、T_max は 32 または 64 に設定されており、いくつかのタスクのテスト結果は良好です。(この lr_scheduler と Adam 部門のオプティマイザーを使用すると、基本的に学習率を調整する必要はありません)
  12. スーパーパラメータに関しては、学習率が最も重要であり、コサイン学習率と巡回学習
    率を理解し、次にバッチサイズと重み減衰を理解することをお勧めします。モデルが悪くない場合は、データ拡張を試みたり、損失関数を変更してモデルをさらに良くすることができます。重量減衰を試すことができます。私は通常 1e-4 を使用します。
  13. 初期学習率を決定するときは、小さい値 (たとえば、1e-7) から開始し、各ステップでのトレーニングのために学習率を指数関数的に (たとえば、1.05 倍) 増加させます。数百のステップでトレーニングした後、損失関数がトレーニング ステップ数に応じてティックの形状になっていることが観察できるはずです。損失が最も早く減少する学習率を選択するだけです。
  14. ゲートなどに加えて、出力を 0-1 に制限する必要があり、シグモイド関数は使用しないようにし、tanh や relu などの活性化関数を使用できます。シグモイド関数は区間 [-4, 4] にあります。大きなグラデーションがより効果的です。区間外では勾配が 0 に近くなり、勾配消失の問題が発生しやすくなります。平均値 0 を入力しても、シグモイド関数の出力は平均値 0 ではありません。
  15. データをシャッフルしてみる
  16. モデルに全結合層 (MLP) が含まれており、入力サイズと出力サイズが同じ場合は、MLP を高速道路ネットワークに置き換えることを検討できます。結果を少し改善してみます。モデルを改善する手段として推奨されます。原理は非常に単純で、出力には情報の流れを制御するゲートが追加されます。
  17. 正則化を追加する 1 ラウンド、正則化を追加しない 1 ラウンドを繰り返します。
  18. CNN がある場合はショートカットを使用します。CNN 層の数が特定の値まで追加されると、結果への影響は大きくなくなり、この値はパラメーターとして調整できます。
  19. 実験の再現性と一貫性に注意を払い、実験を良好に記録する習慣を身につけることに注意を払います ==> それ以外の場合は、実験の結論をどのように分析するか。
  20. ほとんどのタスクでは、モデルよりもデータの方が重要です。新しいタスクに直面するときは、まずデータを分析し、次にデータに基づいてモデルを設計し、各パラメータを決定します。たとえば、nlp の一部のタスクのパディング長は、通常、データセットの 90% 以上に達する必要がありますが、これは pandas の description 関数で分析できます。

rnnチューニングスキル

  1. LSTM のフォーゲット ゲートのバイアスは、1.0 以上の値で初期化すると、より良い結果が得られます。ここでの実験では 1.0 に設定しました。これにより、収束速度が向上します。実際の使用では、さまざまなタスクを試す必要があるかもしれません。異なる値。
  2. rnn トリックを追加します。時間コストを考慮せずに、バッチ サイズ = 1 は非常に優れた正則化です。
  3. 小さなデータの Word2vec 初期化は、収束速度を効果的に向上させるだけでなく、結果も改善します。
  4. rnn の dim および埋め込みサイズは通常 128 程度から調整されます。バッチ サイズは通常 128 程度から調整されます。最も重要なことは、バッチ サイズが適切であることであり、大きければ大きいほど良いというわけではありません。
  5. GPU でエラーが報告された場合は、できるだけ CPU で再実行するようにすると、エラー メッセージがわかりやすくなります。たとえば、GPU は「ERROR:tensorflow:Model diverged with loss = NaN」とレポートします。実際、入力 ID がソフトマックス語彙の範囲を超えている可能性が非常に高くなります。

3. ある程度の経験、素早い試行錯誤

いくつかの重要なメモ:

1. 最初は小規模なデータトレーニングを行う

最初は小規模なデータをアップロードしてからモデルを拡大すると、ビデオ メモリがバーストしない限り、128 個の代わりに 256 個のフィルターを使用できます。そのまま過学習に進みます。そうです、それは訓練されたフィッティング ネットワークです。テストセットや検証セットでもご利用いただけます。

その理由は?
1. トレーニング スクリプトのプロセスが正しいことを確認する必要があります。このステップのデータ量は少なく、生成速度は速いですが、すべてのスクリプトは将来の大規模なトレーニングと一貫性があります (実行ループが少ない場合を除く)。 2. データ量が少ない場合、大まかなスクリプト
と大規模なネットワークはオーバーフィッティングになります。どれも機能しませんでした。それで、あなたは自分自身を振り返り始めなければなりません、モデルの入力と出力に問題はありませんか? コードをチェックしますか? (コードを移動していない限り、ツール ライブラリを疑ってはいけません)? 問題はありますか?モデルによって解決される問題の定義は間違っていませんか? 適用シナリオの理解は間違っていますか? NN の能力を疑うな、NN の能力を疑うな、NN の能力を疑うな。パラメータ調整ドッグで遭遇する可能性のある問題に関して言えば、NN が適合しない、この確率はどのくらい小さいでしょうか? これを行う必要はありませんが、2 日間データを準備して、次のことが判明した場合は、再生すべき問題、今週は醤油だね。

2. 損失設計は合理的でなければなりません

1. 一般に、分類はソフトマックス、回帰は L2 の損失です。ただし、損失の誤差範囲 (主に回帰) に注意してください。値 10,000 のラベルを予測し、モデルの出力が 0 であれば、損失の大きさを計算できます。これは依然として単変量のケースです。一般的な結果はナンです。したがって、入力を正規化する必要があるだけでなく、出力も正規化する必要があります。
2. マルチタスクの場合、各損失アイデアは 1 つの大きさに制限されるか、最終的には 1 つの大きさに制限され、初期段階では 1 つのタスクの損失に焦点を当てることができます。

3. 損失​​を観察することは、精度を観察することよりも優れています

正解率は評価指標ではありますが、学習過程でのロスにも注意が必要です。場合によっては、正解率が突然変化することがわかります。常に 0 でしたが、何千回の反復の間もそのままであった後、突然 1 に変化することがあります。これを理由にトレーニングを早期に中止した場合、神だけがあなたを悲しむでしょう。そして、最適化の目標は損失であるため、損失がそのような奇妙な状況になることはありません。NN に少し時間を与え、NN がタスクに応じて学習できるように一定のスペースを残します。過去の期間で改善されていないとは言えず、無視されています。しばらくは上達せず、その後コツコツと勉強を始めるケースもあります。

4. 機密ネットワーク学習が十分であることを確認する

分類ネットワークは、カテゴリ間の境界を学習することがすべてです。ネットワークが曖昧なカテゴリから明確なカテゴリにゆっくりと変化していることがわかります。確認方法は? Softmax によって出力された確率の分布を見てください。二項分類の場合、最初のネットワーク予測はすべて 0.5 前後であり、非常に曖昧であることがわかります。学習プロセスにより、ネットワーク予測はゆっくりと 0 と 1 の極値に移動します。したがって、ネットワークの予測分布が中間にある場合は、学習するようにしてください。

5. 学習率の設定が合理的である

大きすぎる場合: 損失が爆発的に増加する、または nan が
小さすぎる場合: 損失が長期間反映されない (ただし、LR を下げる必要がある場合も同様です。ここでは、重みではなく、ネットワークの中間結果が視覚化されています。効果があります。2 つの視覚的な結果は異なります。小さすぎる場合、中間結果は水の波紋またはノイズのように見えます。フィルターの学習が遅すぎるため、試してみると (明らかに) さらに学習する必要があることがわかります
。減少:現在のLRでは損失はずっと減少しましたが、半日下げ止まりました。
より複雑なタスクがある場合、最初は人間の肉が監視して LR を調整する必要があります。後で学習するこのタスクネットワークの特性に慣れたら、それを捨てて逃げることができます。
上記の損失設計が無理な場合は、初期状況で爆発しやすいため、最初に小さな LR を設置して爆発しないことを確認し、損失が低下するのを待ち、その後ゆっくりと LR を増加させます。これはひどいですが、LRを再度減らします。
ReLUによってニューロンが殺されないように、LRは動作可能な最大値で閉じます。もちろん、私はせっかちな性格なので、常に大きなものを設定するのが好きです。

6. トレーニングセットと検証セットの損失を比較します。

オーバーフィッティングの判断、トレーニングが十分かどうか、早期停止が必要かどうかはすべてかなり標準的な原則なので、多くは言いません。

7. 受容野の大きさを知る

CV のタスクでは、コンテキスト ウィンドウが非常に重要です。したがって、モデルの受容野のサイズを知る必要があります。この効果への影響は依然として非常に重要です。特に FCN では、大きなターゲットには大きな受容野が必要です。フル接続のネットワークとは異なり、少なくとも収益をカバーするfcがあり、グローバルな情報が利用可能です。
 

おすすめ

転載: blog.csdn.net/ytusdc/article/details/128502800