Edited at

機械学習/ディープラーニングにおけるバッチサイズ、イテレーション数、エポック数の決め方

Keras、TensorFlow、Pytorchなどの機械学習/ディープラーニングのフレームワークを利用する際、


  • バッチサイズ

  • イテレーション数

  • エポック数

などのハイパーパラメータを設定する必要があります。

が、どうやって決めれば良いのかよく分からず、サンプルプログラムで設定している数値をそのまま使う場合が多いと思います。

そこで、これらのハイパーパラメータの決め方について説明します。

結論を先に言ってしまうと、この場合はこうですという定番の方法があるわけではなく、問題毎にそれぞれのハイパーパラメータをうまく調整していくしかありません。

じゃあ、どうやってうまく調整してくのかということを述べる前に、これらのハイパーパラメータの意味について説明します。

ハイパーパラメータの意味が分かれば、どういう風に調整していけば良いのかなんとなく分かってくるかと思います。


バッチサイズとは?

通常、ディープラーニングのように内部で確率的勾配降下法を使う場合、データセットを幾つかのサブセットに分けて学習します(学習データとテストデータに分けるのとは別の話しです)。

詳細は割愛しますが、幾つかのサブセットに分けて学習する理由は、学習する際に異常値の影響を小さくするためです。

そして、この幾つかに分けたぞれぞれのサブセットに含まれるデータの数をバッチサイズと呼びます。

例えば、1,000件のデータセットを200件ずつのサブセットに分ける場合、バッチサイズは200となります。

また、バッチサイズのことをミニバッチサイズと呼ぶこともあります。

Untitled Diagram (1).png

バッチサイズは機械学習の分野の慣習1として2のn乗の値が使われることが多く、32, 64, 128, 256, 512, 1024, 2048辺りがよく使われる数値だと思います。

データセットの件数が数百件程度であれば32, 64をまずは試してみて、数万件程度であれば1024, 2048をまずは試して見るのが良いのではないでしょうか。

そして、学習がうまくいっておらず、他に調整するパラメータがなくなった時にバッチサイズを大きくしたり小さくしたりするのが良いと思います。


イテレーション数とは?

イテレーション数はデータセットに含まれるデータが少なくとも1回は学習に用いられるのに必要な学習回数であり、バッチサイズが決まれば自動的に決まる数値です。

先程の1,000件のデータセットを200件ずつのサブセットに分ける場合では、イテレーション数は5 (=1,000/200)となります。

つまり、学習を5回繰り返す(イテレートする)ということです。


エポック数とは?


  1. データセットをバッチサイズに従ってN個のサブセットに分ける。

  2. 各サブセットを学習に回す。つまり、N回学習を繰り返す。

1と2の手順により、データセットに含まれるデータは少なくとも1回は学習に用いられることになります。

そして、この1と2の手順を1回実行することを1エポックと呼びます。

つまり、エポック数とは1と2の手順を何回実行するのかということです。

普通、1エポックで十分に学習されることはなく、数エポックから数十エポック回すことが多いです。

では、何回エポックを回せば十分なのでしょうか?

答えとしては、損失関数(コスト関数)の値がほぼ収束するまでです。

そして、データの性質や件数によって収束するまでに掛かる回数は異なるので、実際に幾つかの数値で試してみて損失関数の推移を見るしかありません。

また、ほぼ収束と書いたのは、完全に収束まで実行すると過学習になる恐れがあるためです。


バッチサイズ、イテレーション数、エポック数の決め方

ここまで読んで頂ければ、これらのハイパーパラメータの決め方がなんとなく分かってきたと思います。

バッチサイズについては、データセットのサイズが小さければ32, 64などの小さめの値、大きければ1024, 2048などの大きめの値をまずは使ってみるのがよいでしょう。

そして、バッチサイズが決まればイテレーション数は自動的に決まります。

最後に、エポック数は幾つかの数値で試してみて、損失関数の値の推移を見ながら最適そうな値を探すということになります。


参考資料

Epoch vs Batch Size vs Iterations





  1. SVMの代表的なライブラリであるLIBSVMのグリッドサーチでは2のn乗刻みで最適なパラメータを探索する。