エポック数(epoch)とステップ数(step)の違い、バッチサイズとは【初級 深層学習講座】
ディープラーニングを学ぶ際に、エポック数(epoch)、ステップ数(step)、バッチサイズ(batch size)という用語を頻繁に見聞きします。本記事では、エポック数とステップ数の違い、バッチサイズの意味と役割について、初心者にもわかりやすく解説します。
エポック数とは(EPOCH)
エポック数とは、「訓練データ全体を何回繰り返して学習させるか」の数のことです。
例えば、訓練データが10,000個ある場合、10,000個を1回ずつ学習させると1エポックになります。100エポックは、各訓練データを100回ずつ学習させたことになります。
ディープラーニングでは、訓練データを何度も学習させることで精度を向上させます。ただし、繰り返し過ぎると過学習(訓練データに過剰に適合した状態)になる可能性もあるので注意が必要です。
訓練データ全体を学習させた場合に「1」とする数
ステップ数とは(STEP)
ステップ数は、学習の回数です。
ディープラーニングでは、学習時(訓練時)に1つずつのデータを入力するわけではなく、いくつかのデータをまとめて入力します。
つまり、一度に複数個のデータを入力し、それを1単位として学習します。
ステップ数は、この1単位のことです。つまり、ステップ数=バッチ数(※バッチサイズではなくバッチ数ですので注意)となります。
例えば、バッチサイズが100、訓練データが10,000個の場合、1エポックには10,000/100=100ステップが含まれていることになります。
訓練データのサイズが変わると、1エポックの意味は大きく変化します。
例えば、1,000個のデータと10,000個のデータを1エポック学習させた場合、どちらも1エポックとなりますが、学習するデータ量は10倍です。
一方、バッチサイズが100の場合のステップ数で比較すると、前者は10ステップ、後者は100ステップとなり、学習したデータ量の差がきちんと分かります。
ステップ数もエポック数もどちらも学習回数を表すものですが、ステップの方がより細かな単位となります。
学習を行う単位(バッチ)を「1」とする数。バッチ数=ステップ数
バッチサイズとは(batchsize)
バッチサイズとは
ディープラーニングでは、訓練データを使って訓練を行いますが訓練時にはデータを1つずつ入力するのではなく、ある程度のサイズで入力することが一般的です。この1度に入力するデータの個数を「バッチサイズ」と呼びます。たとえば、10,000個のデータを100個ずつ入力する場合は、この100がバッチサイズ、バッチ数は10,000を100で割った100個となります。
バッチサイズ100で総データ数が10,000個の場合、10,000÷100=100個がバッチ数
具体的に説明すると、ディープラーニングでの一回のトレーニングは以下の手順で行われています。
- バッチサイズ単位でモデルに訓練データを入力
- 正解との誤差を計算
- 誤差をパラメータに反映させる(逆伝搬, backward)
全ての訓練データに対する訓練は、①〜③の処理を何度も繰り返すことで行われます。先ほどのデータ総数が10,000でバッチサイズが100の場合、上記の処理が100回繰り返されます。
このように、ディープラーニングではバッチサイズ単位で訓練が行われるのが一般的です。
学習の単位。誤差計算をしてパラメータを修正する処理を行う単位。
バッチ単位で学習する理由
では、なぜバッチ単位で学習させるのでしょうか?
ディープラーニングでバッチ単位で学習させる主な理由は以下の通りです。
- 計算効率
バッチサイズ単位で入力すると並列計算しやすくなるので、GPUなどの計算リソースを効率的に利用できるようになります。つまり、バッチ単位で処理することで、学習時間を短縮することができます - メモリ効率
バッチサイズを調整することで、GPUのメモリ等を効率よく利用することが可能になります。例えば、バッチサイズをGPUのメモリを最大限に利用できるサイズまで拡大することで、GPUメモリを効果的に利用できます - 安定性の向上
バッチサイズ単位で学習すると、ノイズや外れ値の影響を軽減する効果があります。これにより、モデルの訓練が安定化します。また、過学習を防ぐ効果もあります
結局のところバッチ単位で学習させる理由は大きく2つになります。1つは学習時間を短縮する狙いです。もう1つは精度を向上させる狙いです。
このバッチサイズは、重要なハイパーパラメータの1つで、精度に影響を与えます
バッチサイズを適切に調整できれば、モデルの訓練を効率的に行え、かつ高い精度をえることができます。
バッチサイズの決め方
結論から言いますが、残念なことに、どの問題にも共通の「最適なバッチサイズ」はありません
一般的には、バッチサイズは8,16,32,64…といった2のn乗が選ばれることが多いです。
まずは、こういった数値をためしてみると良いでしょう。
ただし、GPUのメモリサイズが小さかったり、モデルが大きい場合は、バッチサイズはGPUのメモリサイズで制限されてしまいます。
言語モデル(transformerなど)は大きめなモデルが多いので、バッチサイズは2とか4しか設定できないこともあります。
一般的にバッチサイズを大きくすると「ノイズや外れ値の影響が軽減され、過学習を抑制するのに役立つ」といわれています。しかし、「バッチサイズを大きくすると汎化性能が落ちた」という論文もあります。
では、小さくすればよいのかというと、小さくすると「モデルが多様なデータに対応することができ汎化性能が向上する」というメリットはありますが、「ノイズや外れ値の影響が高まるため、訓練が不安定になりやすい」という問題があります。
結局、バッチサイズは実験的に決めるしかないというのが実際のところです。
まとめ
ディープラーニング初心者向けに、エポック数、ステップ数、バッチサイズについてまとめました。AIエンジニアと会話する場合に、結構出てくる単語ですので、単語の意味を理解しておきましょう。