この記事では、22のニューラルネットワークトレーニングスキルを習得できます

次の記事は、Deep Blue AI、著者Kuang Jiからのもので、侵入されて削除されました

この記事では、22のニューラルネットワークトレーニングスキルを習得できます


ニューラルネットワークのトレーニングは非常に複雑なプロセスであり、多くの変数が相互作用するため、このプロセス中にこれらの変数がニューラルネットワークにどのように影響するかを研究者が理解することは困難です。この記事で提供される多くのヒントは、ニューラルネットワークトレーニングの過程で誰もがトレーニングネットワークをより簡単かつ便利にスピードアップできるようにすることです。もちろん、これらのヒントはネットワークをトレーニングするために必要なプロセスではありませんが、ヒューリスティックな提案として、誰もが目前のタスクをよりよく理解し、ターゲットを絞った方法で適切なテクノロジーを選択できるようにします。

まず、適切な初期トレーニング状態の選択は、画像の強調からハイパーパラメータの選択など、非常に幅広いトピックです。以下に、特定の操作を示します。


1.単一のバッチをオーバーフィットする

単一バッチの過剰適合-主にネットワークのパフォーマンスをテストするために使用されます。まず、データの単一のバッチを入力し、このデータのバッチに対応するラベルが正しいことを確認します(ラベルが必要な場合)。次に、損失関数の値が安定するまで、このデータのバッチでトレーニングを繰り返します。ネットワークが(さまざまなメトリックを使用して)完全な正解率を達成できない場合は、最初にデータをチェックします。この方法では、データが正しいことを確認する条件でモデルのパフォーマンスをチェックします。このようにして、単純な問題を解決するために大きすぎるモデルや複雑なモデルを使用することを避けます。結局のところ、最適な方法を見つけることが最も効果的です(鶏を殺すためにナイフは必要ありません)


2.多数のエポックで実行する

多くの場合、多数のエポックを通じてモデルをトレーニングした後、良好な結果を得ることができます。モデルを長期間トレーニングする余裕がある場合は、エポックの数を選択する戦略を採用できます(例:100から500に徐々に増やします)。このように、モデルのトレーニングに多くの経験がある場合は、独自のデータセット(エポックファクターと呼ばれます)を要約できます。これらのパラメーターを使用して、新しいモデルをトレーニングするときに、初期トレーニングエポックをすばやく設定できます。エポックを増やすには、一定の割合に従います。


3.シードを設定します

モデルの再現性を確保するために、私たちが取ることができる1つのアプローチは、任意の乱数生成操作をシードすることです。たとえば、TensorFlowフレームワークを使用している場合、次のコードスニペットを使用できます。

import os, random
import numpy as np
import tensorflow as tf

def set_seeds(seed: int):
 os.environ['PYTHONHASHSEED'] = str(seed)
 random.seed(seed)
 tf.random.set_seed(seed)
 np.random.seed(seed)

Pytorchフレーム:


np.random.seed(0)
torch.manual_seed(0)
torch.cuda.manual_seed_all(0)

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

演算シードを使用する理由は、コンピューターが実際に乱数を出力できないためです。つまり、コンピューターは、特定の規則に従って乱数を出力する疑似乱数を出力します。この場合、一連のルールを使用して乱数の生成をシミュレートできます。つまり、set_seed関数を使用して乱数の生成をシミュレートできます。詳細については、TensorFlowのドキュメントを参照してください。


4.データセットのバランスを取り直します

不均衡なデータセット—つまり、1つのクラスまたは複数のクラスがデータセット全体の大部分を占めます。逆に、1つのクラスまたは複数のクラスがデータセットの小さな部分を占めます。使用するデータの異なるカテゴリが本質的に同じ特性を持っている場合は、そのような問題を解決するための戦略を検討します。たとえば、最小のカテゴリのデータのアップサンプリング、最大のカテゴリのデータのダウンサンプリング、追加のデータサンプルの収集などです。 (可能であれば)そしてデータ拡張を使用して偽のデータサンプルなどを生成します。


5.ニュートラルクラスを使用する

次の状況を考えてみましょう。データセットには、class1とclass2(つまり、class1ではない)の2つのクラスがあり、これらのデータサンプルがすべて専門家によってラベル付けされていると仮定します(データラベルの精度を確保するため)。次に、このデータにクラスを判別できない例がある場合、このサンプルのクラスはnoneとしてマークされるか、クラスとしてマークされる可能性があります(ただし、信頼性は非常に低くなります)。そのような場合、そのような問題を解決するための良い方法である第3のカテゴリーを紹介します。現在の場合、この追加のカテゴリは「不確定」カテゴリとして示されます。ネットワークモデルのトレーニング中に、この3番目のタイプのデータをトレーニングへの参加から除外できます。その後、トレーニング済みモデルを使用して、これらのファジーラベル付きデータサンプルにラベルを付け直すことができます。


6.出力層のバイアスを設定します

ラベルのないデータセットの場合、ネットワークは初期段階でデータサンプルを推測することを避けられません。ネットワークモデルをトレーニングしてデータサンプルの正しいラベルを学習することはできますが、これによりトレーニング時間が大幅に増加します。モデル設計段階でより良いモデルバイアス式を設計することにより、モデルのトレーニング時間を短縮できます。シグモイド層の場合、バイアスは次の式で計算できます(クラスが2つしかない場合):
bias = log(pos /negative)bias = log(pos /negative)bia s=l o g p os / n e g a t i v e
モデルを作成したら、上記で計算した値を使用してバイアスを初期化できます。


7.学習率を調整します

いくつかのハイパーパラメータを調整する場合、最初に焦点を当てるのは学習率です。以下に、学習率の設定が高すぎる場合のモデル学習結果の出力グラフを示します。

ここに画像の説明を挿入
対照的に、異なる初期学習率を使用すると、次の結果が得られます。
ここに画像の説明を挿入
明らかに、トレーニング時間の消費とモデルの精度に対応する学習率の選択は特に重要であり、ここでは説明しません。 。トレーニングを通じて最適な学習率を選択する戦略が設計されている場合、最適な学習率を選択する方法は、フォローアップ記事で詳しく説明されています(フォローアップ記事に注意してください)。ここでは、経験的な学習値、つまり0.001〜0.01の範囲の初期学習率を示します。


8.高速データパイプラインを使用する

小規模なプロジェクトでは、カスタムジェネレーターを使用できます。また、大規模なプロジェクトに携わっている場合は、ジェネレーターを専用のデータセットメカニズムに置き換えることができます。TenorFlowの例ではtf.data、このAPIを使用できます。このAPI関数には、シャッフル、バッチ処理、プリフェッチなど、必要なメソッドのほとんどが含まれています。カスタマイズされたデータジェネレータの代わりに、この専門的なデータセットメカニズムは、実際のプロジェクトにうまく適用できます。


9.データ拡張を使用する

データ拡張を使用すると、データセットの数を増やすか、データの小さなカテゴリをアップサンプリングすることで、より堅牢なネットワークモデルをトレーニングできますが、これらのデータ拡張の消費は、トレーニングセッションの数の増加になります。以下に、一般的に使用されるデータをいくつか示します。一般的な画像データの強調方法: 1。
フリップ(フリップ)
ここに画像の説明を挿入
2。回転(回転)
ここに画像の説明を挿入
3。スケール(ズーム)
ここに画像の説明を挿入
4。クロップ(クロップ)
ここに画像の説明を挿入


10.ラベルのないデータでオートエンコーダをトレーニングし、埋め込みとして潜在空間表現を使用します

トレーニングに使用するラベル付きデータセットが比較的小さい場合でも、これらのデータセットを使用してタスクを実行するために活用できる戦略があります。方法の1つは、オートエンコーダーを使用することです。その背景には、ラベルのないデータを簡単に収集できるというものがあります。次に、AutoEncoderとAutoEncoderを使用して、適切なサイズの潜在空間(300〜600エントリなど)を大きくして、妥当で小さい値の再構成損失関数を取得できます。実際のデータの埋め込み情報を取得するために、デコーダーネットワーク層を破棄し、予約済みのエンコーダーネットワーク層を使用して埋め込み情報を生成します。


11.他のモデルの埋め込みを利用する

独自のデータを使用して埋め込み情報を取得する項目10とは異なり、他のモデルから埋め込み情報を学習することもできます。テキストデータタスクの場合、事前に学習した埋め込みをダウンロードするのが一般的なアプローチです。画像データタスクの場合、大規模なデータセット(例:ImageNet)でトレーニングされたモデルを使用し、完全にトレーニングされたネットワークレイヤーを選択してこれらの出力をカットし、これらのカットの結果を埋め込み情報として使用できます。


12.埋め込みを使用してデータを縮小する

まず、データセットサンプルにカテゴリ特徴情報があると仮定すると、最初は、データサンプルに対応するカテゴリ特徴は2つの値しか取ることができません。つまり、対応するワンホットエンコーディングには2つの添え字があります。ただし、このカテゴリ値が1000カテゴリ以上に拡張されると、データを比較的低次元で表すことができるため、スパースワンホットエンコーディング方法は効率的ではなくなり、情報埋め込みを使用することが効果的な方法になります。トレーニングの前に埋め込みレイヤーを挿入することができ(0から1000までの大きなカテゴリのデータ情報、またはさらに大きなカテゴリを使用)、カテゴリ情報を入力するか、次元を減らした埋め込み情報を入力できます。このような表現は、ネットワークモデルの学習を通じて取得できます。


13.チェックポイントを使用する

ネットワークモデルを数時間以上トレーニングすると、残念ながらモデルがクラッシュしますが、すべてのトレーニング情報が失われるため、これは非常に苛立たしいことです。ハードウェアもソフトウェアも完全に実行されないことを考えると、セーブポイントのストレージで適切な作業を行うことは非常に重要な操作です。単純なチェックポイントの使用法では、kステップごとにモデルの重みを保存するだけで、後の複雑なチェックポイントの使用法では、オプティマイザーの状態、現在の情報、その他の重要な情報を保存できます。次に、トレーニングの実行が開始された後、失敗した実行スナップショットを確認し、この実行スナップショットに基づいて必要なすべての設定をすばやく復元できます。特に、14のカスタムトレーニングセッションと組み合わせたチェックポイントの使用は非常に効果的です。


14.カスタムトレーニングループを作成する

ほとんどの場合、TensorFlowなどのデフォルトのトレーニングパイプラインを使用するとmodel.fit\(\)十分に効率的です。ただし、デフォルトのトレーニングプロセスを使用する柔軟性には限界があり、いくつかの小さな変更は簡単に組み込むことができますが、大きな変更は実装が難しいことに気付きました。これが、独自のカスタムアルゴリズムを作成することをお勧めする理由です。ここでは、これ以上詳しく説明しません。フォローアップの一連の記事で、さまざまなコードケースを通じてアルゴリズムをすばやく実装および変更し、独自の最新のアイデアを統合する方法について説明します。


15.ハイパーパラメータを適切に設定する

最新のGPUは行列計算に非常に優れているため、大規模なニューラルネットワークモデルのトレーニングに広く使用されています。適切なハイパーパラメータを選択することで、アルゴリズムの効率をさらに向上させることができます。たとえば、Nvidia GPU(現在主流のGPU)の場合、次のガイドラインを参照できます。

  1. 選択したバッチサイズは、通常の4倍、または2の倍数にすることができます

  2. 密集したネットワークレイヤーの場合、入力と出力の両方を64で割り切れるように設定します

  3. 畳み込み層の場合、入力チャネルと出力チャネルを4で割り切れる、または2の倍数になるように設定します。

  4. RGB3チャンネルから4チャンネルへの入力画像のパディング

  5. BHWCを使用したデータモード(Batch_height_width_channels)

  6. リカレントネットワークレイヤーの場合、バッチレイヤーと非表示レイヤーを4で割り切れるように設定します。理想的な値は、64、128、256です。

これらの推奨事項の背後にある考え方は、データをより均等に分散させることです。ここでは、いくつかの参照ドキュメントを提供します。

Nvidiaドキュメント1

Nvidiaドキュメント2

Nvidiaドキュメント3


16.早期打ち切りを使用する

モデルのトレーニングをいつ停止するかは、答えるのが難しい質問です。発生する可能性のある現象の1つは、脂質二重層の深い降下です。つまり、モデルメトリックは着実に改善された後に劣化し始め、トレーニングを更新した後、モデルスコアは以前よりもさらに良くなります。間にバウンスするのを避けるために、検証データセットを使用できます。この個別のデータセットは、新しい、見えないデータに対するアルゴリズムのパフォーマンスを測定するために使用されます。設定した「患者のステップ」内でパフォーマンスが更新されない場合、モデルはトレーニングを続行しません。ここで重要なのは、モデルのカスタマーサービスが一時的なスコアのプラトーを克服するのに役立つ適切な「患者ステップパラメータ」を選択することです。一般的に使用される「患者ステップパラメータ」は、5〜20エポックから選択できます。


17.転移学習を使用する

転移学習の背後にある考え方は、業界の多数のデータセットでトレーニングされたモデルの結果を使用して、それをタスクに適用することです。理想的には、私たちが使用するネットワークは、同じデータタイプ(画像、テキスト、オーディオ)と、私たちのタスク(分類、翻訳、検出)と同様のタスクでトレーニングされています。主に2つの関連する方法があります。

1.微調整

微調整は、すでにトレーニングされたモデルを取得し、特徴的な問題の重みを更新するタスクです。通常、最初のいくつかのレイヤーは基本的な機能を認識するようにトレーニングされているため、フリーズしてから、データセットの残りのレイヤーを微調整します。

2.特徴抽出

微調整とは対照的に、特徴抽出は、訓練されたネットワークを使用して特徴を抽出する方法を説明します。事前に選択されたトレーニング済みモデルで、独自の分類器を追加し、ネットワークのこの部分のみを更新します。ベースレイヤーは凍結されます。このアプローチに従う理由は、元のトップレベルネットワークは特徴的な問題についてのみトレーニングされているためですが、タスクは異なります。多くの場合、ネットワークレイヤーのカスタム部分を最初から学習することで、大規模なベースモデルの利点を維持しながら、データセットに集中することができます。


18.データ並列トレーニングを採用する(データ並列トレーニングを使用)

モデルをより高速にトレーニングしたい場合は、複数のGPUでアルゴリズムを実行して、トレーニング速度を計算できます。通常、これはデータ並列方式で実行されます。ネットワークはさまざまなデバイスに複製され、さまざまなデータのバッチが分割されて分散されます。次に、勾配が平均化され、各ネットワークレプリカに適用されます。TensorFlowでは、さまざまな分散トレーニング戦略を採用できます。最も簡単なオプションは「MirroredStategy」ですが、ここでは取り上げない戦略が他にもたくさんあります。たとえば、カスタムトレーニングループ(上記の項目14など)を作成する場合、これらのチュートリアルに従うことができます。トレーニングの経験によると、1つのGPUから2〜3つのトレーニングにデータを分散するのが最速であり、大規模なデータセットの場合、これはトレーニングセッションの数を減らす効果的な方法です。


19.マルチラベルタスクにシグモイドアクティベーションを使用する

サンプルに複数のラベルを付けることができる場合、softmaxとは異なり、シグモイド活性化関数を使用できます。これは、シグモイドが各ニューロンに個別に適用されることを意味します。つまり、複数のニューロンを起動でき、出力値はすべて0〜 1、これは解釈に便利です。このメソッドは、サンプルを複数のクラスに分類したり、さまざまな異なるオブジェクトを検出したりするなどのタスクで重要です。


20.ワンホットエンコードされたカテゴリデータ(ワンホットエンコードされたカテゴリデータ

数値表現が必要なため、カテゴリデータは数値としてエンコードする必要があります。たとえば、「ゴールデンレトリバー」カテゴリを直接フィードバックすることはできませんが、「ゴールデンレトリバー」を表すカテゴリ番号のみを取得します。より魅力的なオプションは、すべての可能な値を列挙することです。つまり、このアプローチは、コード化された「ゴールデンレトリバー」1とコード化された「オレンジキャット」2でソートすることを意味します。ただし、これらの順序が実際に使用されることはめったにありません。そのため、変数の独立性を保証するワンホットエンコーディングに依存しています。


21.数値入力の再スケーリング

ネットワークモデルは重みを更新することによってトレーニングされ、オプティマイザーが主にこれを担当します。通常、出力値が[-1、1]の間にある場合、それらは最適な値に調整できますが、それはなぜですか?最も低い地点を見つけるために丘陵の風景を想定しましょう。周辺地域に丘が多い場合は、地元の丘陵の最小値を見つけるためにより多くの時間を費やします。しかし、風景の現在の状態を変更できるとしたらどうでしょうか。解決策をより早く見つけることができますか?これは、値を調整することによって達成されることです。値を[-1,1]にスケーリングすると、曲率がより球形になります(つまり、より丸く、より均一になります)。この範囲のデータを使用してモデルをトレーニングすると、より速く収束できます。どうしてこれなの?特徴のサイズ(つまり、重み値)は勾配の大きさに影響を与えるため、特徴が大きいほど勾配が大きくなり、重みの更新が大きくなり、収束するためにより多くのステップが必要になり、トレーニングが遅くなります。これについて詳しく知りたい場合は、TensorFlowチュートリアルをご覧ください。


22.知識蒸留を使用する

BERTモデルについて聞いたことがあるでしょう?このTransformerモデルには数億のパラメーターがありますが、GPUでトレーニングできない可能性があります。この多数のパラメーターは、知識蒸留プロセスが有効になる場所です。2つ目のモデルをトレーニングして、より大きなモデルの出力を生成します。 、出力は元のデータセットのままですが、ラベルはモデルの出力(ソフト出力とも呼ばれます)を参照します。この手法の目標は、小さなモデルを使用して大きなモデルを複製することです。ここでは、知識の蒸留と教師と生徒のネットワークモデルの知識について過度に説明していません。さらに理解が必要な場合は、これらの関連チュートリアルを参照してください。


参照
[1]。https://towardsdatascience.com/tips-and-tricks-for-neural-networks-63876e3aad1a?gi = 2732cb2a6e99

[2] .https://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-ha ve-limited-data-part2 /

[3] .https://www.tensorflow.org/tutorials/structured_data/imbalanced_data#optional_set_the_correct_initial_bias

[4] .https://docs.nvidia.com/deeplearning/performance/index.html

[5] .https://docs.nvidia.com/deeplearning/performance/dl-performance-fully-connected/inde x.html

[6] .https://docs.nvidia.com/deeplearning/performance/dl-performance-convolutional/index。html

[7] .https://openai.com/blog/deep-double-descent/

[8] .https://www.tensorflow.org/tutorials/distribute/multi_worker_with_ctl

[9] .https://www.tensorflow.org/tutorials/images/transfer_learning#rescale_pixel_values

[10] .https://medium.com/huggingface/distilbert-8cf3380435b5

おすすめ

転載: blog.csdn.net/weixin_43694096/article/details/125837438