バッチサイズとエポック
ミニバッチ学習
機械学習においては、普通は手持ちのデータをまとめて全部学習に使うようなことはしません。全データを訓練データとテストデータに分け、さらに訓練データもいくつかのバッチ(かたまり)に分割して、バッチごとに重みの最適化を実行します。言い換えれば、バッチとは重みの更新間隔です。このような学習の仕方をミニバッチ学習とよびます。
1 バッチに含まれるデータ数をバッチサイズとよびます。一般的にはどのバッチもサイズが等しくなるように訓練データを均等分割します。
それぞれのデータはベクトル (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 個のデータのみを使用します。
学習に使ったデータを捨てることができるので、「ビッグデータを使って学習させたいけれど、すべてのデータをメモリに保管できない」というような状況で有効な学習法です。また、学習中にも逐次追加データが入ってくるような状況(天気予報やスパム分類など)にも、オンライン学習が適しています。
【おすすめ書籍】直感 Deep Learning Python×Kerasでアイデアを形にするレシピ
直感 Deep Learning ?Python×Kerasでアイデアを形にするレシピ 中古価格 |
『直感 Deep Learning』は「数式よりコードを見せて欲しい」「とにかく早くディープラーニングを実装してみたい」と考えるエンジニアさん向けの本です。自然言語処理・テキスト生成・AI ゲーム・画像識別などを Keras を使ってどんどん実装しながら、技術の速い習得を目指します。
コメント