ミニバッチサイズがすべてのトレーニングデータを含む単一の「バッチ」よりも優れている理由
1. 序章
機械学習(ML)モデルをトレーニングするときは、テストセットで高精度を実現するために、ハイパーパラメーターのセットを定義する必要があります。
これらのパラメータには、学習率、重みの減衰、層の数、バッチサイズなどがあります。
このチュートリアルでは、データセット全体をバッチとして使用してモデルを更新することと、ミニバッチを使用することの主な違いについて説明します。
最後に、TensorFlowを使用してさまざまな最急降下法を実装する方法を説明します。 ただし、最初に、モデルを更新するタイミング、方法、および理由の基本を理解しましょう。
2. 最急降下法の計算
通常、深層学習の問題は最適化問題と見なすことができます。 私たちの目標は、いくつかの機能を最大化または最小化することです。 最小化問題はMLでより一般的であり、この関数を損失関数と呼びます。
損失関数の最小点に到達するにはどうすればよいですか?
最も一般的なアプローチは、最急降下法を使用することです。 ある時点で関数の導関数を使用して、その値が増加または減少する傾向があるかどうかを確認します。
最急降下法が2次関数でどのように機能するかを簡単に確認できます。
の最小値を見つけたいとしましょう。
点からランダムに開始し、次の値で導関数を計算します。
(1)
この時点から、結果のシグナルを分析します。 この場合、導関数は負であるため、反対側の正の方向に一歩踏み出す必要があります。
に等しいステップを実行すると、ポイントに到達し、もう一度導関数を計算します。
(2)
ここで、導関数はゼロより大きいので、負の方向に一歩踏み出します。 適切なサイズで十分な手順を実行すると、グローバル最小値に到達します。
大きな一歩を踏み出すと、ある地点から別の地点に跳ね返るので、最小値が見つからない可能性があります。 逆に、非常に小さなステップを踏むと、プロセスに多くの時間がかかります。
学習率は、モデルの値を更新するために使用するステップのサイズを定義します。
3. バッチサイズ
最急降下法の一歩を踏み出し、さまざまな方法でパラメーターを更新できます。 選択したアプローチは、モデルのパフォーマンスと収束を劇的に定義します。
先に進む前に、エポックとバッチの概念を強調することが不可欠です。
モデルがトレーニングセット全体を確認した後、1つのエポックが終了したと言います。
トレーニング中に、トレーニングセット全体のサブセットがモデルによって計算された後、重みと勾配を更新できます。 これをサブセットバッチまたはミニバッチと呼びます。
ニューラルネットワークをトレーニングするときに直面する最も一般的な問題の1つは、損失関数に極小値のいくつかのポイントがあり、モデルが可能な限り最高の状態を達成したと誤解させる可能性があることです。
さまざまなバッチサイズがトレーニングプロセスにどのように影響するかについて説明し、モデルが鞍点と呼ばれる局所的な最小領域または平坦な領域でスタックするのを防ぐ場合があります。
3.1. バッチ勾配降下
私たちが持っている最も簡単なアプローチは、バッチ勾配降下法または勾配降下法(GD)です。 このアプローチでは、データセット全体がトレーニングで使用された後にのみ勾配を計算します。
この戦略に関する主な懸念事項の1つは、トレーニングセットに数十万のサンプルがある場合、膨大な量のメモリが必要になることです。 これは、データセット全体が評価されるまで、各サンプルのエラーを累積する必要があるためです。 次に、パラメータが更新され、最急降下法が1回の反復を終了します。
3.2. ミニバッチ最急降下法
ミニバッチGDでは、データセットのサブセットを使用して、学習プロセスの別のステップを実行します。 したがって、ミニバッチの値は1より大きく、完全なトレーニングセットのサイズよりも小さくすることができます。
モデルがデータセット全体を計算するのを待つ代わりに、パラメーターをより頻繁に更新できるようになりました。これにより、さまざまなバッチが考慮されるため、極小値でスタックするリスクが軽減されます。各反復で、堅牢な収束が可能になります。
データセット全体のエラーをメモリに保存する必要はありませんが、すべてのミニバッチが評価された後、勾配を更新するためにサンプルエラーを累積する必要があります。
3.3. 確率的勾配降下法
確率的勾配降下法(SGD)を使用する場合、データセットの各サンプルがトレーニングフェーズで評価された後、パラメーターが更新されます。 SGDは、サイズが1のミニバッチGDと見なすことができます。
このアプローチは、1つのサンプルによって示される方向が他のサンプルの方向と異なる可能性があるため、非常にノイズが多いと見なされます。 問題は、モデルが簡単に飛び回ることができ、すべてのエポックで分散が異なることです。
一部のMLアプリケーションでは、非凸問題のある複雑なニューラルネットワークがあります。 これらのシナリオでは、損失関数の空間を調査する必要があります。
このようにして、悪い局所最適から脱出し、大域最適を見つける可能性が高くなります。
SGDの主な利点の1つは、パラメーターが常に更新されるため、モデルのパフォーマンスを早期に示すことができることです。
ただし、複雑度が高く、トレーニングデータセットが大きいモデルは、収束するまでに多くの時間がかかり、SGDを非常に高価な最適化戦略に変えます。
4. TensorFlowの例
このセクションでは、実際の例を使用して、ニューラルネットワークのトレーニングにおけるさまざまなバッチサイズの影響を説明します。
例を見る前に、 N サンプルを含むデータセットを考慮して、各戦略の主な違いを要約しましょう。
この例では、畳み込みニューラルネットワークのTensorFlowモデルを使用して、手書きの数字を認識します。 私たちのトレーニングセットには、24×24画像の54000サンプルが含まれています。 パラメータの調整に使用される検証セットには6000サンプルがあり、最終精度のテストセットには10000サンプルがあります。
3つの異なるバッチサイズを使用します。 最初のシナリオでは、27000に等しいバッチサイズを使用します。 理想的には、バッチサイズをシミュレートするために54000のバッチサイズを使用する必要がありますが、メモリの制限により、この値を制限します。
ミニバッチの場合、反復ごとに128枚の画像を使用します。 最後に、SGDの場合、サイズが1に等しいバッチを定義します。
この例を再現するには、関数fitが呼び出されたときにバッチサイズ変数を調整するだけで済みます。
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)
使用したデータセットのSGDとミニバッチがバッチ勾配降下法をどのように上回っているかを簡単に確認できます。
バッチサイズが27000の場合、10エポック後に最大の損失と最小の精度が得られました。 これは、データセットの半分を使用して、重みの更新を1つだけ計算した場合の効果を示しています。
精度曲線から、2つのエポックの後、モデルはすでにミニバッチとSGDの最大精度に近づいていることがわかります。 これは、トレーニングに使用されるサンプルが等しくないものの、非常に類似しているために発生します。
この冗長性により、時間の制約も考慮されている場合、バッチGDのパフォーマンスが低下します。
5. 結論
トレーニングで使用するバッチサイズを定義する厳密なルールはありません。 これは、調整する必要のあるハイパーパラメータです。
一般的なガイドラインに従って、満足のいくモデルを実現するように調整できます。
問題が凸型損失関数に関係していることが事前にわかっている場合は、バッチ勾配降下法が適している可能性があります。 時々それが妥当な時間で最小点を見つけるので、それはまた役に立ちます。
逆に、データセットに数百万のサンプルがあり、損失関数に多くの極小値がある可能性が高い場合は、ミニバッチまたはSGD最適化の使用を検討する必要があります。
このようにして、数千のサンプルが評価されるのを待つ代わりに、わずか数百回の反復後にモデルがどのように実行されているかを示すことができます。