次のサンプルに進む前に、すべてのサンプルの重み/バイアスを変更する必要がありますか、
これを行うことができます。これは確率的勾配降下法(SGD)と呼ばれ、通常は毎回データセットを処理する前にデータセットをシャッフルします。
または、最初に1,000サンプルのロット全体の望ましい変更を計算してから、それらをネットワークに適用し始めますか?
これを行うことができます。これは、バッチ勾配降下法と呼ばれます。または、場合によっては(特に古いリソースでは)通常のアプローチと見なされ、勾配降下法と呼ばれます。
それぞれのアプローチには、長所と短所があります。一般に:
SGDは、処理されたデータの量に関して、各更新をより早く行います。したがって、妥当な値に収束する前に、必要なエポックを少なくすることができます。
SGDはサンプルごとにより多くの処理を実行します(更新頻度が高いため)。したがって、各サンプルの処理に時間がかかるという意味でも、速度は遅くなります。
更新手順では各データ項目を逐次実行する必要があるため、SGDは並列化の利点をあまり活用できません(重みが変更され、特定の重みのセットに対してエラー/勾配の結果が計算されるため)。
SGDの個々のステップは、通常、正しい勾配で非常に大まかな推測のみを行って重みを変更します。これは、欠点(トレーニングセットの目的に対するNNのパフォーマンスが低下するだけでなく増加する可能性もあります)と利点(可能性が低い)の両方です。これらのランダムな違いが原因で発生する「ジッター」が原因で、ローカルの静止点で動けなくなることの原因です)
実際に起こることは、ほとんどのソフトウェアで、バッチ処理と単一サンプル処理の間で妥協して、最高のパフォーマンスと更新特性を得ようとすることです。これはミニバッチ処理と呼ばれ、以下を含みます。
各エポックの開始時にデータセットをシャッフルします。
シャッフルされたデータを処理するとき、問題とハードウェアの制約に応じて、Nアイテムは1時間あたりNアイテムであり、Nはおそらく10から1000まで変化します。一般的な決定は、GPUアクセラレーションが並行して実行できる最大のバッチサイズを処理することです。
小さなバッチごとに必要な更新を計算して適用します。
これは現在、ほとんどのニューラルネットワークライブラリが想定している最も一般的な更新方法であり、トレーニングAPIでバッチサイズパラメータをほぼ例外なく受け入れます。ほとんどのライブラリは、そのSGDを実行する単純なオプティマイザを呼び出します。技術的には真実です。完全なバッチを使用しないため、計算された勾配はまだいくぶんランダム化されていますが、これは一部の古い論文ではミニバッチ勾配降下と呼ばれることがあります。