雑記

お気付きの点がありましたらご指摘いただけますと幸いです。

💜

f:id:cookie-box:20211229165400p:plain:w70
  • Flax でニューラルモデルを生成するときは、jax.random.PRNGKey(seed) なる関数で「疑似乱数生成器の鍵?」を生成するようですが、これは何なのでしょうか。乱数のシードをセットするのとどう違うのでしょうか。この関数のドキュメント [1] をみれば何かわか……何もわかりませんでした。
  • 資料 [2] をみつけました。Jax の話に入る前に Numpy における疑似乱数の話がありますね。Numpy の疑似乱数生成はグローバルな状態に基づくと。いいたいのは、Numpy において「シード s をセットしてから n 回目に生成した乱数であって分布 f から生成したもの」は、s, n, f が同一の値であればいつだって同一の値になるということですよね。資料 [2] にも例がありますが、以下のように、サイズ 3x3 のランダム行列を生成しても、1つの乱数を9回生成しても、同じ値が生成される(以下の assert が通る)ということです。知りませんでしたが、いわれてみればそうなってほしいです。それで、「シード s をセットしてから n 回生成した」という状態は np.random.get_state() で確認できると。疑似乱数の生成方法に暗いのでこの整数の羅列が何をいみするかわかりませんが……。
  • import numpy as np
    
    # シードをセット
    np.random.seed(26)
    # サイズ 3x3 のランダムな整数を一気に生成する
    r0 = np.random.randint(0, 100, (3, 3))
    
    # シードをセット
    np.random.seed(26)
    # 1つのランダムな整数を生成することを 9 回行う
    for i in range(3):
        for j in range(3):
            r1 = np.random.randint(0, 100)
            assert r0[i, j] == r1  # 等しい