なぜ毎回結果が違うの?
機械学習では、重みの初期化・データのシャッフル・Dropout などに乱数が使われます。そのため、同じコードを同じデータで実行しても、結果が微妙に異なることがよくあります。
研究や本番環境では「毎回同じ結果になる=再現性」が非常に重要です。これを実現するには「シード値の固定」が欠かせません。
PyTorch での固定方法(完全版)
import torch
import random
import numpy as np
def set_seed(seed=42):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
この関数を set_seed(123)
のように呼び出すことで、学習の再現性が大幅に向上します。
なぜこれだけやる必要がある?
random.seed
→ Python 標準ライブラリ用np.random.seed
→ NumPy 用(データ処理などで使われがち)torch.manual_seed
→ CPU 上の PyTorch モデルtorch.cuda.manual_seed
→ GPU モデルcudnn.deterministic=True
→ CuDNN(高速ライブラリ)の挙動を固定cudnn.benchmark=False
→ 高速化チューニングを無効に
これらすべてを設定することで、Python・NumPy・PyTorch・GPU の乱数に対応し、CuDNN の最適化挙動も抑制できます。そのため、この方法は「実用上もっとも高い再現性を実現できる構成」であり、「完全版」と呼ばれます。
実用Tips:何に効果がある?
ケース | シード固定の効果 |
---|---|
CNN の学習 | 勾配や精度のばらつきを抑える |
ハイパーパラメータチューニング | 公平な比較が可能になる |
他人のノートブック再現 | 学習ログと一致した結果を得やすくなる |
シード値の決め方
シード値は どんな整数でもOK ですが、以下のような数字がよく使われます:
シード値 | 由来・理由 |
42 | SF小説『銀河ヒッチハイクガイド』より「生命、宇宙、すべての答え」 |
0 | テスト時に便利 |
1234 / 2023 | 覚えやすい / 年号 |
再現性を保つには、シード値 + ライブラリバージョン + 環境もセットで記録しておくのが理想です。
シードなしで学習してしまった場合は?
もしシード値を設定しないまま学習を進めてしまった場合でも、以下の対処が可能です:
- モデルやログがあれば再利用可能:model.pth や train.log がある場合、継続学習や fine-tuning が可能。
- ハイパーパラメータを保存しておく:再学習時に同条件を再現しやすくなります。
- 次回からは必ずシード設定を!:PyTorch や NumPy など複数の箇所で統一してシードを設定しておきましょう。
まとめ
AI 開発の信頼性は、再現性が支えています。特にチューニングや分析を行う際には、必ずシードを固定する習慣をつけましょう。たった数行で、未来の自分やチームの混乱を防げます!