質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

Python3 乱数の設定がよくわからない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 829

SuzuAya

score 47

前提・実現したいこと

Kerasを使ってモデル開発中なのですが、再現性を得るためには乱数を固定する必要があると公式ドキュメンテーションに記載があります。
https://keras.io/ja/getting-started/faq/
ただし、他のサイト等も確認すると、こちらはCPUを使う場合に限っており、私はGPUを使っているので、少し書き換えて使っています。
エラーは発生しませんが、ちゃんとうまく機能しているかもよく分からないため、コードの中身をよく理解しようと思ったのですが、調べても見つけられなかったのでこちらに質問させていただきました。
①乱数の設定値は大体どれくらいにするのが目安なのでしょうか?また、設定する数字は揃えた方がいいですか?Kerasの公式ドキュメントはばらばらの数字を入れていましたが、数字は揃えた方がいいという記事も見ました。
②GPUを使う場合、乱数を固定しても再現性は得られないという記事を見ました。それならば乱数はあまり気にしなくて良いのでしょうか?
③以下のコードで何を行っているのか、一行ずつ解説していただけるととても助かります(例えば、なぜseed(5)が3回も出てくるのかよく分かりません…)。

初心者の質問でお手数をお掛けしますが、どうぞよろしくお願いいたします。

該当のソースコード

import numpy as np
import tensorflow as tf
import random as rn

os.environ['PYTHONHASHSEED'] = '0'
    np.random.seed(5)
    rn.seed(5)

   config = tf.ConfigProto()
   config.gpu.options.per_process_gpu_memory_fraction = 0.8
   #session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)

    tf.set_random_seed(5)
    sess = tf.Session(graph=tf.get_default_graph(), config=config)#session_conf)
    K.set_session(sess)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+5

まずコードに書いてあるランダムシード(random seed)について調べましょう。

ざっくり説明しておきますね。
ランダムな値を取得する時、「ランダムな値をください」というリクエストを受け付けるたびに返却される値がランダムに変わるわけですが、実際にはシードという初期値を基にして配られる番号は全部決まっています。
したがってあるシードで初期化するとその後に現れるランダムな値の並びは同じものになります。これが「乱数を固定」と書いている部分ですね。順番に取得するタイミングが同じであれば再現性があります。

以下、Pythonコンソールで試した結果です。シードで初期化したあとの並びがすべて同じになっているのがわかりますか?

>>> import random
>>> random.seed(5)
>>> random.random()
0.6229016948897019
>>> random.random()
0.7417869892607294
>>> random.random()
0.7951935655656966
>>> random.random()
0.9424502837770503
>>> random.random()
0.7398985747399307

>>> random.seed(5)
>>> random.random()
0.6229016948897019
>>> random.random()
0.7417869892607294
>>> random.random()
0.7951935655656966
>>> random.random()
0.9424502837770503
>>> random.random()
0.7398985747399307

一方で、並列処理が実施された時の挙動は再現性がないことがあります。
理由は「ランダムな値の取得元の順番」がバラバラになるからです。
あるときはスレッドAが先に値を取得して、別のときにはスレッドBが先に取得するかもしれません。
これは仕方ないことなので再現性を担保することはできないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/11 15:45

    >mather様
    ご丁寧なご回答ありがとうございました!質問②についてクリアになりました。GPUを使う場合は再現性は担保できないのですね。

    キャンセル

  • 2019/07/11 15:48

    「GPUを使う」というのが基本的には並列処理を前提としているはずです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る