📖

【機械学習メモ】疑似乱数のシードを固定する

2024/07/03に公開

機械学習プロセスの中でよく見られる「疑似乱数のシードを固定する」について、
どういうことなのかをよく分かっていなかったので改めて整理しました。

「疑似乱数のシードを固定する」とは

Python標準のrandomや、numpyのnumpy.randomは、擬似乱数を生成している。
疑似乱数とは、Wikipediaによると「乱数列のように見えるが、実際には確定的な計算によって求めている擬似乱数列による乱数」をさす。
つまりランダムなように見えて、一定の規則に基づいて値が生成されている。

疑似乱数のシード(=疑似乱数生成の際、初期状態として設定する値)を固定することで、ランダムな値を一定のルールのもと生成させることができる。
シードを固定することで、生成された乱数の差分による影響を除外でき、再現性が高まる。

実際にやってみた

シードを固定した場合

import numpy as np

print("1回目")
np.random.seed(0)
for i in range(5):
  print(np.random.randn(5))

print("2回目")
np.random.seed(0)
for i in range(5):
  print(np.random.randn(5))

print("3回目")
np.random.seed(0)
for i in range(5):
  print(np.random.randn(5))

出力結果

1回目
[1.76405235 0.40015721 0.97873798 2.2408932  1.86755799]
[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]
[0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]
[ 0.33367433  1.49407907 -0.20515826  0.3130677  -0.85409574]
[-2.55298982  0.6536186   0.8644362  -0.74216502  2.26975462]
2回目
[1.76405235 0.40015721 0.97873798 2.2408932  1.86755799]
[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]
[0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]
[ 0.33367433  1.49407907 -0.20515826  0.3130677  -0.85409574]
[-2.55298982  0.6536186   0.8644362  -0.74216502  2.26975462]
3回目
[1.76405235 0.40015721 0.97873798 2.2408932  1.86755799]
[-0.97727788  0.95008842 -0.15135721 -0.10321885  0.4105985 ]
[0.14404357 1.45427351 0.76103773 0.12167502 0.44386323]
[ 0.33367433  1.49407907 -0.20515826  0.3130677  -0.85409574]
[-2.55298982  0.6536186   0.8644362  -0.74216502  2.26975462]

シードを固定しない場合

print("1回目")
for i in range(5):
  print(np.random.randn(5))

print("2回目")
for i in range(5):
  print(np.random.randn(5))

print("3回目")
for i in range(5):
  print(np.random.randn(5))

出力結果

1回目
[-1.45436567  0.04575852 -0.18718385  1.53277921  1.46935877]
[ 0.15494743  0.37816252 -0.88778575 -1.98079647 -0.34791215]
[ 0.15634897  1.23029068  1.20237985 -0.38732682 -0.30230275]
[-1.04855297 -1.42001794 -1.70627019  1.9507754  -0.50965218]
[-0.4380743  -1.25279536  0.77749036 -1.61389785 -0.21274028]
2回目
[-0.89546656  0.3869025  -0.51080514 -1.18063218 -0.02818223]
[ 0.42833187  0.06651722  0.3024719  -0.63432209 -0.36274117]
[-0.67246045 -0.35955316 -0.81314628 -1.7262826   0.17742614]
[-0.40178094 -1.63019835  0.46278226 -0.90729836  0.0519454 ]
[ 0.72909056  0.12898291  1.13940068 -1.23482582  0.40234164]
3回目
[-0.68481009 -0.87079715 -0.57884966 -0.31155253  0.05616534]
[-1.16514984  0.90082649  0.46566244 -1.53624369  1.48825219]
[ 1.89588918  1.17877957 -0.17992484 -1.07075262  1.05445173]
[-0.40317695  1.22244507  0.20827498  0.97663904  0.3563664 ]
[0.70657317 0.01050002 1.78587049 0.12691209 0.40198936]

シードを固定すると、全く同じ値が出力される。

ライブラリを利用した実装

以下の記事のまとめがわかりやすいかったのでメモ。
https://qiita.com/si1242/items/d2f9195c08826d87d6ad

参考記事

https://docs.python.org/ja/3/library/random.html
https://qiita.com/HotAllure/items/ca5462b33d8b0a14631f

GitHubで編集を提案

Discussion