トレーニングの3つの単位
トレーニングデータは、モデルに1サンプルずつ供給されるわけでも、一度にすべて供給されるわけでもありません。データはバッチに分割されます。モデルはバッチを処理し、すべてのターゲットトークンにわたる誤差を平均化して、重みを1回更新します。この1回の更新がステップ(イテレーションとも呼ばれます)です。すべてのトレーニングサンプルが1回ずつ使用されると、1エポックが完了します。通常、次のエポックの前にデータはシャッフルされるため、毎回異なる組み合わせのバッチになります。
| 用語 | カウントの対象 | ファインチューニングでの典型的な値 |
|---|---|---|
| バッチ | 1回の更新前にまとめて処理されるサンプル | 数個から数十個のサンプル。多くの場合Auto |
| ステップ | 1回の重み更新 | 1回の実行につき数十から数千 |
| エポック | すべてのトレーニングサンプルを1周すること | 教師ありファインチューニングでは1〜3 |
計算式
effective batch = per-device batch × gradient accumulation × number of GPUs
steps per epoch = ceil(training examples ÷ effective batch)
total steps = steps per epoch × epochs
tokens processed = tokens in the training file × epochs- エポックあたりのステップ数: 800 ÷ 8 = 100ステップ。
- 合計ステップ数: 100 × 3エポック = 300ステップ。モデルの重みは300回変更されます。
- 各サンプルが参照される回数: 3回。データがシャッフルされるため、エポックごとに1回、毎回異なるバッチで参照されます。
- 5%のウォームアップ: 0.05 × 300 = 15ステップ。完全な学習率に達するまでの段階的な引き上げ。
- バッチサイズ32での同じデータ: 800 ÷ 32 = エポックあたり25ステップ、合計75ステップ。更新回数が少なく滑らかになり、通常はやや高い学習率と組み合わされます。
- 処理されるトークン数: トレーニングファイルに400,000トークンが含まれる場合、3エポックで1,200,000トークンが処理され、これがトークン単位の課金対象となります。
数が割り切れない場合、エポックの最後のバッチは小さくなります。810個のサンプルを8個ずつのバッチに分けると、101個の完全なバッチと2個のサンプルのバッチが1つできます。トレーニングの設定によっては、この部分的なバッチを保持するものもあれば、破棄するものもあります。いずれにせよ、実行への影響はごくわずかです。
バッチサイズが重要である理由
各ステップの勾配は、そのバッチ内のサンプルから作成された、真の降下方向の推定値です。小さなバッチではノイズの多い推定になります。個々のサンプルが重みをあちこちに引っ張りますが、エポックあたりの更新回数は多くなります。大きなバッチではより多くのサンプルが平均化されるため、各ステップはより確実に降下方向を指し示しますが、ステップ数は少なくなり、それぞれにより多くのGPUメモリが必要になります。大規模バッチトレーニングに関する研究では、収穫逓減が示されています。タスクに依存する特定のポイントを超えると、バッチを2倍にしても必要なステップ数は半分にならず、追加の計算の大部分は無駄になります。
勾配累積は、GPUが計算するバッチとオプティマイザが更新するバッチを分離します。GPUは例えば一度に4つのサンプルを処理し、そのようなマイクロバッチ8個分の勾配を合計してから1回更新します。これにより、4個分のメモリコストで32個の有効バッチを実現します。複数のGPUを使用する場合、それぞれが独自のマイクロバッチを処理するため、有効バッチはGPUの数でも乗算されます。
per-device batch 4 × accumulation 8 × 1 GPU = effective batch 32
memory: as for 4 examples updates: one per 32 examplesエポック数が重要である理由
エポックは、モデルがどの程度のデータを参照したかを示す自然な単位です。小規模なデータセットでの1エポックは、多くの場合、動作を顕著に変化させるには不十分です。同じ小規模なデータセットで多数のエポックを実行すると、モデルは個々の回答を暗記してしまいます。数百から数千のサンプルでの教師ありファインチューニングでは通常1〜3エポック、選好チューニングでは1〜2エポックを使用します。小規模なデータセットではもう少し多くのエポックを許容できますが、非常に大規模なデータセットでは多くの場合1エポックで十分です。
エポックは繰り返しの回数を、ステップは更新の回数をカウントするため、両方に注意を払う必要があります。バッチサイズ8で100サンプルの3エポックはわずか39ステップであり、学習率のスケジュールが機能するには少なすぎる可能性があります。50,000サンプルの1エポックは6,250ステップであり、十分な更新が行われますが、繰り返しはまったくありません。
よくある間違い
- データ不足を補うためにエポック数を増やすこと。40個のサンプルを何度も繰り返すと、タスクそのものではなく、その40個の回答を学習してしまいます。
- 学習率を見直さずにバッチサイズを変更すること。ステップ数が少なく規模が大きい場合は通常、より高い学習率が必要となり、その逆も同様です。
- 別の実行からステップ単位で指定されたウォームアップをコピーすること。新しい実行のステップ数がはるかに少ない場合、固定のウォームアップがトレーニングの大部分を占めてしまう可能性があります。
- トレーニングレコードではなくメッセージをカウントすること。プロバイダーの形式によっては、複数のターゲットを持つ会話が複数のレコードになる場合があります。
参考文献および関連資料
外部ソースは新しいタブで開きます。
- 01Linear regression: HyperparametersGoogle Machine Learning Crash Course · developers.google.comバッチサイズとエポックの明確な定義と、エポックあたりのステップ数の計算式の解説。
- 02TrainerHugging Face Transformers docs · huggingface.co実際のトレーニング引数としての、デバイスごとのバッチサイズ、勾配累積、エポック、ウォームアップのリファレンス。
- 03An Empirical Model of Large-Batch TrainingMcCandlish et al., 2018 · arXiv · arxiv.orgバッチサイズを大きくすることがある時点までは有効で、その後効果がなくなる理由。
- 04Stochastic gradient descentWikipedia · en.wikipedia.org