なぜ毎回結果が違うの?

機械学習では、重みの初期化・データのシャッフル・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 ですが、以下のような数字がよく使われます:

シード値由来・理由
42SF小説『銀河ヒッチハイクガイド』より「生命、宇宙、すべての答え」
0テスト時に便利
1234 / 2023覚えやすい / 年号

再現性を保つには、シード値 + ライブラリバージョン + 環境もセットで記録しておくのが理想です。


シードなしで学習してしまった場合は?

もしシード値を設定しないまま学習を進めてしまった場合でも、以下の対処が可能です:

  • モデルやログがあれば再利用可能:model.pth や train.log がある場合、継続学習や fine-tuning が可能。
  • ハイパーパラメータを保存しておく:再学習時に同条件を再現しやすくなります。
  • 次回からは必ずシード設定を!:PyTorch や NumPy など複数の箇所で統一してシードを設定しておきましょう。

まとめ

AI 開発の信頼性は、再現性が支えています。特にチューニングや分析を行う際には、必ずシードを固定する習慣をつけましょう。たった数行で、未来の自分やチームの混乱を防げます!

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です