エポック(エポック)
機械学習で訓練データ全体を 1 周する単位。または Unix Time の起点(1970-01-01 UTC)を指す。文脈で意味が異なるが、ML 文脈が 2026 年は主流。
概要
エポック(Epoch)は、文脈により全く異なる意味を持つ多義語である:
- 機械学習のエポック: 訓練データ全体を 1 回学習する単位。「3 epoch」なら全データを 3 周学習
- Unix Time のエポック: タイムスタンプの起点 = 1970-01-01 00:00:00 UTC、POSIX 標準
- 歴史的エポック: 「ある時代の始まり」、コンピュータ史で「PC 時代のエポック」のような使い方
2026 年現在、AI / 機械学習文脈での使用が圧倒的多数で、PyTorch / TensorFlow / JAX 等のフレームワークでは epoch がループ単位として標準的に使われる。Unix Time のエポックは伝統的な OS / 通信プロトコルで 50 年以上現役だが、2038 年問題(32bit signed int オーバーフロー)への対応が進行中である。
機械学習のエポック(2026 年)
主要モデル別の標準 epoch 数
| モデル種別 | 標準 epoch 数 | 備考 |
|---|---|---|
| LLM Pretraining(GPT-4 / Llama 3.3) | 1-3 epoch | 訓練データ巨大、繰り返し過学習 |
| LLM Fine-tuning | 3-10 epoch | LoRA / SFT |
| 画像分類(ResNet / ViT) | 100-300 epoch | ImageNet 系 |
| Stable Diffusion 訓練 | 100-1000 epoch | 各バッチ単位で長い |
| 物体検出(YOLO) | 50-300 epoch | COCO 系 |
| 音声認識(Whisper) | 5-50 epoch | 大規模音声データ |
| 強化学習(PPO) | epoch 概念希薄、step ベース | - |
PyTorch コード例
import torch
from torch.utils.data import DataLoader
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)
NUM_EPOCHS = 100
for epoch in range(NUM_EPOCHS):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
# Validation
model.eval()
val_loss = evaluate(model, val_loader)
print(f"Epoch {epoch+1}/{NUM_EPOCHS}, Val Loss: {val_loss:.4f}")
Early Stopping(早期終了)
過学習防止のため、Validation Loss が改善しない epoch が連続したら終了する手法。
patience = 10 # 10 epoch 改善なしで停止
best_val_loss = float('inf')
counter = 0
for epoch in range(NUM_EPOCHS):
val_loss = train_one_epoch(...)
if val_loss < best_val_loss:
best_val_loss = val_loss
counter = 0
save_model(model)
else:
counter += 1
if counter >= patience:
print(f"Early stopping at epoch {epoch+1}")
break
Unix Time(POSIX Epoch)
起点
1970 年 1 月 1 日 00:00:00 UTC からの経過秒数。負数で 1970 年以前を表現。
主要なタイムスタンプ
| 日付 | Unix Time | 備考 |
|---|---|---|
| 1970-01-01 | 0 | エポック起点 |
| 2000-01-01 | 946,684,800 | Y2K |
| 2025-01-01 | 1,735,689,600 | - |
| 2026-05-02 | 1,777,766,400 | 本日(記事作成時) |
| 2038-01-19 03:14:07 UTC | 2,147,483,647 | 32bit signed int 最大、2038 年問題 |
| 2106-02-07 | 4,294,967,296 | unsigned 32bit 最大 |
2038 年問題
32bit signed int で Unix Time を扱うシステムは 2038-01-19 にオーバーフロー。組込みシステム / 古い OS で問題化。対策: 64bit time_t に移行(Linux 5.6+ / glibc 2.32+ で完了)。新規開発は 64bit 必須。
言語別の実装
| 言語 | 関数 / メソッド |
|---|---|
| Python | time.time() / datetime.timestamp() |
| JavaScript / TypeScript | Date.now() / 1000 |
| Go | time.Now().Unix() |
| Rust | std::time::SystemTime::UNIX_EPOCH |
| Java | System.currentTimeMillis() / 1000 |
| C / C++ | time(NULL) |
PC 自作 / 個人開発との接点
- 個人 ML 学習: PyTorch + RTX 4090 で 100 epoch / 数時間
- LLM Fine-tuning: LoRA で 3-10 epoch、消費 GPU 数時間
- DB タイムスタンプ: PostgreSQL の TIMESTAMP / TIMESTAMPTZ、内部で Unix Time
- JWT トークン:
iat/expフィールドが Unix Time
関連用語との違い
| 用語 | 違い |
|---|---|
| イテレーション(Iteration) | 1 バッチ処理単位、エポックは全データ周回 |
| バッチ | 1 回の forward/backward の単位、複数集めて 1 epoch |
| ステップ | 強化学習等での基本単位 |
| ISO 8601 | 人間可読タイムスタンプ規格、Unix Time は数値 |
よくある質問
Q1: ML で何 epoch まわすべき? A: ラフ目安: LLM 1-3、画像分類 100-300、画像生成 100-1000。Validation Loss を見ながら Early Stopping で自動決定が王道。データ量と過学習で大きく変動。
Q2: 2038 年問題は本当に深刻? A: 主要 OS はほぼ対応済み。残るのは組込み / レガシー / 一部の DB(MySQL TIMESTAMP は 2038 まで)。新規開発で BIGINT / 64bit time_t 使えば問題なし。
Q3: Unix Time の起点が 1970 なのはなぜ? A: 1971 年に Unix V1 リリース時の「キリの良い直近年」として選定。当時の数値コンピューティング能力(32bit)でも 1970-2038 年(68 年)をカバーできるという計算。
まとめ
- ML では 訓練データ全体の 1 周 = 1 epoch
- Unix Time では 1970-01-01 UTC を起点 とする秒数
- 2026 年は PyTorch / TensorFlow で epoch ループが学習の標準形