ニューラルネットワークのトレーニングは1つずつ行われますか?[重複]


9

この一連のビデオを見て、Pythonで単純なニューラルネットワークを実装することで、ニューラルネットワークを学習しようとしています。

ここで、私が疑問に思っていることが1つあります。ニューラルネットワークをサンプルデータでトレーニングしていて、サンプルが1,000あります。トレーニングは、重みとバイアスを徐々に変更して、コスト関数がより小さなコストになるようにします。

私の質問:次のサンプルに移る前に、すべてのサンプルの重み/バイアスを変更する必要がありますか、それとも最初に1,000サンプルのロット全体の望ましい変更を計算してから、ネットワークへの適用を開始する必要がありますか?

回答:


9

次のサンプルに進む前に、すべてのサンプルの重み/バイアスを変更する必要がありますか、

これを行うことができます。これは確率的勾配降下法(SGD)と呼ばれ、通常は毎回データセットを処理する前にデータセットをシャッフルします。

または、最初に1,000サンプルのロット全体の望ましい変更を計算してから、それらをネットワークに適用し始めますか?

これを行うことができます。これは、バッチ勾配降下法と呼ばれます。または、場合によっては(特に古いリソースでは)通常のアプローチと見なされ、勾配降下法と呼ばれます。

それぞれのアプローチには、長所と短所があります。一般に:

  • SGDは、処理されたデータの量に関して、各更新をより早く行います。したがって、妥当な値に収束する前に、必要なエポックを少なくすることができます。

  • SGDはサンプルごとにより多くの処理を実行します(更新頻度が高いため)。したがって、各サンプルの処理に時間がかかるという意味でも、速度は遅くなります。

  • 更新手順では各データ項目を逐次実行する必要があるため、SGDは並列化の利点をあまり活用できません(重みが変更され、特定の重みのセットに対してエラー/勾配の結果が計算されるため)。

  • SGDの個々のステップは、通常、正しい勾配で非常に大まかな推測のみを行って重みを変更します。これは、欠点(トレーニングセットの目的に対するNNのパフォーマンスが低下するだけでなく増加する可能性もあります)と利点(可能性が低い)の両方です。これらのランダムな違いが原因で発生する「ジッター」が原因で、ローカルの静止点で動けなくなることの原因です)

実際に起こることは、ほとんどのソフトウェアで、バッチ処理と単一サンプル処理の間で妥協して、最高のパフォーマンスと更新特性を得ようとすることです。これはミニバッチ処理と呼ばれ、以下を含みます。

  • 各エポックの開始時にデータセットをシャッフルします。

  • シャッフルされたデータを処理するとき、問題とハードウェアの制約に応じて、Nアイテムは1時間あたりNアイテムであり、Nはおそらく10から1000まで変化します。一般的な決定は、GPUアクセラレーションが並行して実行できる最大のバッチサイズを処理することです。

  • 小さなバッチごとに必要な更新を計算して適用します。

これは現在、ほとんどのニューラルネットワークライブラリが想定している最も一般的な更新方法であり、トレーニングAPIでバッチサイズパラメータをほぼ例外なく受け入れます。ほとんどのライブラリは、そのSGDを実行する単純なオプティマイザを呼び出します。技術的には真実です。完全なバッチを使用しないため、計算された勾配はまだいくぶんランダム化されていますが、これは一部の古い論文ではミニバッチ勾配降下と呼ばれることがあります。


「一般的な決定は、GPUアクセラレーションが並行して実行できる最大のバッチサイズを処理することです。」これをどのように判断しますか?バッチサイズが並列処理のピークに十分であるときにコメントできるリソースは見たことがありません
DuttaA


同様の質問がこのウェブサイトで以前に尋ねられました。私はそれが複製であるとさえ思っています(たとえ少しだけ別の観点から見ても)。参照:ai.stackexchange.com/q/11667/2444
nbro

「一般的な決定は、GPUアクセラレーションが並行して実行できる最大のバッチサイズを処理することです。」-あなたはそれを逆に持っています!最初のヒューリスティックは、許容できるパフォーマンスをもたらす最小のミニバッチサイズを処理することです。ただし、多くのモデルでは、ハードウェアの効率を飽和させる前にメモリ制限に達しているため、RAMに収まる最大のモデルを実行することになります。ただし、一般的に、バッチサイズが小さいほど確率が高くなるため、最小値がより適切になります。注意点は、バッチサイズが非常に小さいと、バッチノルムが壊れることです。
Aleksandr Dubinsky

@AleksandrDubinsky RAMはハードウェアです。
DuttaA

0

理想的には、データセット内のすべてのサンプルを調べて、重みを更新する必要があります。これは、バッチ勾配降下法と呼ばれます。しかし、ノーとして。トレーニングの例が増えると、計算が膨大になり、トレーニングが非常に遅くなります。ディープラーニングの登場により、トレーニングのサイズは数百万になり、すべてのトレーニング例を使用した計算は非常に非現実的で非常に遅くなっています。

ここで、2つの最適化手法が顕著になりました。

  1. ミニバッチ勾配降下
  2. 確率的勾配降下法(SGD)

ミニバッチ勾配降下法では、合計サイズよりかなり小さいバッチサイズを使用します。これらの例を通過した後、トレーニング例の重みを更新します。

確率的勾配降下法では、各トレーニング例を通過した後に重みを更新します。

私たちが議論した3つの方法の長所と短所に来る。

  • バッチ勾配降下法は、徐々にグローバルミニマムに収束しますが、速度が遅く、膨大な計算能力が必要です。

  • 確率的勾配降下法は、高速ではあるが全体の最小値に収束せず、全体の最小値の近くのどこかに収束し、その点を中心にホバリングしますが、全体の最小値には収束しません。しかし、確率的勾配降下法の収束点は、すべての実用的な目的には十分です。

  • ミニバッチ勾配は、上記の2つの方法のトレードオフです。ただし、重みの更新のベクトル化された実装があり、
    マルチコアセットアップでトレーニングする場合、またはトレーニングを
    複数のマシンに送信する場合、これはトレーニングの時間とグローバルな最小値への収束の両方の点で最良の方法です。

コスト関数をプロットできます。すべての3種類の勾配降下法における収束の違いを理解するための反復。

  • バッチ勾配降下プロットは、スムーズかつゆっくりと低下し、安定してグローバルな最小値になります。

  • 確率的勾配降下法プロットは振動し、急速に低下しますが、グローバルミニマムの周りを移動します。

これらはいくつかのブログで、それぞれの方法の利点と欠点の詳細な説明と、反復を伴う3つの方法すべてのコスト関数の変化のグラフも含まれています。

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.