ニューラルネットワークのバッチサイズとは何ですか?


175

Python Keras packageニューラルネットワークに使用しています。これがリンクです。であるがbatch_size、試験サンプルの数に等しいですか?ウィキペディアから次の情報があります。

ただし、他の場合では、sum-gradientを評価するには、すべてのsummand関数からの勾配の高価な評価が必要になる場合があります。トレーニングセットが膨大で、単純な公式が存在しない場合、勾配の評価にはすべての加数関数の勾配を評価する必要があるため、勾配の合計の評価は非常に高価になります。すべての反復で計算コストを節約するために、確率的勾配降下では、すべてのステップで被加数関数のサブセットをサンプリングします。これは、大規模な機械学習の問題の場合に非常に効果的です。

上記の情報はテストデータを説明していますか?これbatch_sizeはkeras(勾配更新ごとのサンプル数)と同じですか?


3
class.coursera.org/ml-005/lecture/previewコース、特に4〜6 + 10週目を見るのは良いことです。ウィキペディアは、ニューラルネットワークを学習するのにそれほど貴重なリソースではないかもしれません。
404ピオ

回答:


230

バッチサイズは、ネットワークを介して伝播されるサンプルの数を定義します。

たとえば、1050個のトレーニングサンプルがありbatch_size、100に等しい値を設定するとします。アルゴリズムは、トレーニングデータセットから最初の100個のサンプル(1〜100番目)を取得し、ネットワークをトレーニングします。次に、2番目の100個のサンプル(101番目から200番目)を取得し、ネットワークを再度トレーニングします。ネットワークを介してすべてのサンプルを伝搬するまで、この手順を実行できます。最後のサンプルセットで問題が発生する場合があります。この例では、残りのない100で割り切れない1050を使用しました。最も簡単な解決策は、最後の50サンプルを取得してネットワークをトレーニングすることです。

バッチサイズ<すべてのサンプル数を使用する利点:

  • 必要なメモリが少なくなります。より少ないサンプルを使用してネットワークをトレーニングするため、全体的なトレーニング手順で必要なメモリは少なくなります。データセット全体をマシンのメモリに収めることができない場合、これは特に重要です。

  • 通常、ネットワークはミニバッチでより速くトレーニングします。これは、各伝播後に重みを更新するためです。この例では、11個のバッチ(そのうちの10個は100個のサンプル、1個は50個のサンプル)を伝播し、それぞれの後にネットワークのパラメーターを更新しました。伝播中にすべてのサンプルを使用した場合、ネットワークのパラメーターを1回だけ更新します。

バッチサイズを使用することの欠点<すべてのサンプルの数:

  • バッチが小さいほど、勾配の推定の精度が低下します。次の図では、完全バッチグラデーション(青色)の方向と比較して、ミニバッチグラデーション(緑色)の方向が大きく変動していることがわかります。

さまざまなバッチ設定の勾配方向

Stochasticはbatch_size1に等しいミニバッチです。その場合、グラデーションはミニバッチグラデーションよりも頻繁に方向を変更します。


3
いいえ、しませんでした。これはニューラルネットワークで一般的な手法であり、この用語はさまざまなライブラリ、書籍、記事で見ることができます。すべてのエポックでテストデータエラーをチェックしますか、またはトレーニング後にモデルを検証しますか?
itdxer

1
また、更新の数がかなり多いため、ネットワークはより速く収束します。ミニバッチサイズの設定は一種の芸術であり、小さすぎるため、学習が確率的で高速になるリスクがありますが、信頼できないモデルに収束し、大きすぎてメモリに収まらず、まだ時間がかかります。
ラマリョ

2
通常、人々がオンライン学習と言うとき、彼らは意味しbatch_size=1ます。オンライン学習の背後にある考え方は、例を見るとすぐにモデルを更新することです。バッチサイズが大きいと、更新を行う前に複数のサンプルを最初に見ることになります。RNNでは、バッチのサイズにさまざまな意味があります。通常、トレーニングシーケンスを固定サイズ(10ワードなど)のウィンドウに分割するのが一般的です。この場合、トレーニング中にこれらの100個のウィンドウを含めると、あなたが持っていることを意味しますbatch_size=100
itdxer

1
@Oleg Melnikov、最後のバッチのサイズが大幅に小さい場合(50ではなく1としましょう)、勾配の推定の精度は低くなり、重みが少し大きくなります。上の画像で、ミニバッチ100(緑の線)で10回、ミニバッチ1(赤の線)で1回更新するとします。つまり、次のエポックでは、最初の反復のいくつかで、前のエポックからの最後のミニバッチ1更新で問題の解決を開始できます。
itdxer

1
@OlegMelnikov MITディープラーニングブックには、この問題に関連する適切な説明があります(8.1.3章):deeplearningbook.org/contents/optimization.html
itdxer

153

ニューラルネットワークの用語では:

  • 1つのエポック = すべてのトレーニング例の1つのフォワードパスと1つのバックワードパス
  • バッチサイズ = 1回のフォワード/バックワードパスでのトレーニングサンプルの数。バッチサイズが大きいほど、より多くのメモリスペースが必要になります。
  • 多数の反復 =パス数、例の[バッチサイズ]数を用いて各パス。明確にするために、1つのパス= 1つの前方パス+ 1つの後方パス(前方パスと後方パスを2つの異なるパスとしてカウントしません)。

例:1000のトレーニングサンプルがあり、バッチサイズが500の場合、1エポックを完了するには2回の反復が必要です。

参考までに、トレードオフバッチサイズとニューラルネットワークをトレーニングするための反復回数


しかし、[バッチサイズ]の例の数を使用して、各例でネットワークをトレーニングし、次の[バッチサイズ]の数の例を続行することの違いは何ですか。ネットワークを介して1つの例を渡し、SGDを適用して次の例を実行するので、バッチサイズが10、1000、または100000の場合、違いはありません。次のバッチが続きます。[バッチサイズ]の例の数が[反復回数]倍にネットワークを通過し、次の[バッチサイズ]の例に進む場合にのみ違いがあります。
エアハルトディンホブル

重要な違いは、学習ステップ(1ステップ)がすべてのバッチに1回適用されるのに対し、1つのエポックを作成するにはすべてのバッチを循環する必要があることです。したがって、違いはメモリ内だけでなくアルゴリズムでもあります。バッチが大きいほど、より多くのサンプルで勾配を平均することを意味します。
-meduz

エポックと反復の違いは何ですか?
ゴールドネーム

2
@Goldname 1エポックにはすべてのトレーニング例が含まれますが、1イテレーションには[バッチサイズ]数のトレーニング例のみが含まれます。
フランクデルノンクール

3

CPUを使用して最適化問題を解決する場合、いくつかの入力データに対してアルゴリズムを繰り返し適用します。これらの各反復では、通常、データの計算を実行して問題のメトリックを更新します。データのサイズが大きい場合、すべての反復を完了するのにかなりの時間が必要になり、多くのリソースを消費する可能性があります。したがって、時間と計算リソースを節約するために、これらの反復計算をデータの一部に適用することもあります。この部分はbatch_sizeであり、プロセスは(Neural Network Lingoで)バッチデータ処理と呼ばれます。すべてのデータに計算を適用すると、オンラインデータ処理が行われます。用語は60年代から来ていると思います。誰もが覚えていますか。bat DOSファイル?しかしもちろん、概念は、使用されるデータのスレッドまたは一部を意味するように生まれ変わりました。


2

Kerasバッチサイズに関するドキュメントfitは、Models(functional API)ページの関数の下にあります。

batch_size:整数またはなし。勾配更新ごとのサンプル数。指定しない場合、batch_sizeはデフォルトで32になります。

データセットが小さい場合は、バッチサイズをトレーニングデータのサイズと等しくするのが最適です。最初に小さなバッチで試してから時間を節約するために増やします。以下のようitdxerが言及した、精度と速度の間のトレードオフがあります。

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