バッチサイズとエポック

バッチサイズとエポック

バッチサイズとエポック

ミニバッチ学習

 機械学習においては、普通は手持ちのデータをまとめて全部学習に使うようなことはしません。全データを訓練データとテストデータに分け、さらに訓練データもいくつかのバッチ(かたまり)に分割して、バッチごとに重みの最適化を実行します。言い換えれば、バッチとは重みの更新間隔です。このような学習の仕方をミニバッチ学習とよびます。

 1 バッチに含まれるデータ数を バッチサイズ とよびます。一般的にはどのバッチもサイズが等しくなるように訓練データを均等分割します。

 python batch size

 それぞれのデータはベクトル (1次元配列) です。たとえば、$\boldsymbol{x_0}$ は
 
\[\boldsymbol{x_0}=\begin{bmatrix}x_{00}\\ x_{10}\\ x_{20}\end{bmatrix}\]
というデータを表しています。上の図では全訓練データ数は $N$、バッチサイズは $n$ としているので、バッチの数は $N/n$ となります。

 あるバッチの中にある 1 個のデータで計算した誤差関数(損失関数)を $E_k$ とすると、1 バッチの平均誤差は
 
\[E=\frac{1}{n}\sum_{k=1}^{n}E_k\]
で与えられるので、誤差関数の重み $w$ に対する勾配は
 
\[\frac{\partial E}{\partial w}=\frac{1}{n}\sum_{k=1}^{n}\frac{\partial E_k}{\partial w}\]
によって求めることができます。

 すべての訓練データについて学習し終えた段階を 1 エポック (epoch) といいます。たとえば、5000 個の訓練データをサイズ 100 のバッチに分割した場合、バッチ数は 50 個となるので、50 バッチの学習を終えたときに 1 エポックとなります。一般に、ミニバッチ学習においては、1 エポックごとにデータをシャッフルしてバッチの組合わせを変えながら学習を繰り返します。
 

バッチ学習

 バッチサイズが $n=N$ の場合をバッチ学習とよびます。つまり、全訓練データの数とバッチサイズに等しくなるので、重みの更新間隔は 1 エポックとなります。手持ちのデータをすべて使うので、個々のデータが学習に与える影響は相対的に小さくなり、極端に間違った方向に学習を進めることがありません。

 新しいデータが追加されると、すべてのデータを使って学習をやり直さなくてはならないので、古いデータも保管しておく必要があり、十分なメモリを確保できる環境が要求されます。

 バッチ学習においては、1 バッチの平均誤差は
 
\[E=\frac{1}{N}\sum_{k=1}^{N}E_k\]
で与えられ、誤差関数の重みに対する勾配は
 
\[\frac{\partial E}{\partial w}=\frac{1}{N}\sum_{k=1}^{N}\frac{\partial E_k}{\partial w}\]
によって求めることができます。
 

オンライン学習

 バッチサイズを $n = 1$ にした場合はオンライン学習とよばれます。オンライン学習では 1 回の学習で 1 個のデータのみを使用します。

 学習に使ったデータを捨てることができるので、「ビッグデータを使って学習させたいけれど、すべてのデータをメモリに保管できない」というような状況で有効な学習法です。また、学習中にも逐次追加データが入ってくるような状況(天気予報やスパム分類など)にも、オンライン学習が適しています。