Установка другого начального значения для каждого запуска кода

#python #numpy #torch #random-seed

#python #numpy #факел #случайное начальное значение

Вопрос:

Я запускаю код, который потенциально может извлечь выгоду из различных инициализаций генераторов случайных чисел. Я использую библиотеки torch и python . Я использую следующие строки кода для установки случайного начального значения в начале каждой итерации.

 import numpy as np
import torch

seed = np.random.randint(0, 1000)
print(f"Seed: {seed}")
np.random.seed(seed)
torch.manual_seed(seed)

 

Однако по какой-то причине на (многих) итерациях я заметил, что начальное значение всегда устанавливается на одно значение, 688 в моем случае. Чего я не понимаю, так это того, что генерация seed переменной не определяется начальным значением, которое устанавливается позже. Итак, почему каждый раз устанавливается одно и то же начальное значение и как мне это исправить? Спасибо.

Комментарии:

1. Я не могу воспроизвести это — random работает так, как ожидалось.

Ответ №1:

В вашем примере вы неявно инициализируете генератор случайных чисел по умолчанию, не вызывая и не предоставляя начальное значение для класса RandomState. В таких случаях NumPy получает альтернативный источник начального значения, который может быть недостаточно случайным.

Кроме того, не считается хорошей практикой генерировать случайное число из небольшого набора чисел и использовать его для заполнения генератора случайных чисел, потому что вероятность того, что вы сгенерируете одно и то же начальное значение, высока. Однако, если у вас похожие начальные значения и не слишком хорошая инициализация, обычной практикой является использование быстрого, крошечного, но, возможно, не слишком хорошего генератора случайных чисел для создания начальных значений хорошего качества или всего начального состояния. Но нет необходимости делать это вручную, потому что устаревшая случайная реализация NumPy соответствует конкретному случаю научно обоснованного подхода [1], который обеспечивает хорошие разные начальные состояния даже при похожих (например, смежных) начальных значениях. Т.Е. Вы можете заполнить свои симуляции от 0 до 1000, а случайноечисла, которые вы получаете с помощью NumPy в разных итерациях, будут выглядеть совершенно по-разному. Вы также можете использовать это начальное значение для идентификации вашего вычисления при его сохранении или при создании статистики.

Однако я не уверен в реализации генератора случайных чисел в torch. Кажется, для этого требуется 64-битное целое число. Если это соответствует вашим потребностям, вы можете генерировать случайные числа с помощью движка NumPy в этом диапазоне и использовать at в качестве начального значения. Если вы выполняете 2 моделирования, вероятность того, что 2 начальных значения одинаковы, равна 1/2^{64} ~ 5 * 10^{-20}.

В приведенном ниже примере гарантируется, что состояние генератора случайных чисел NumPy отличается на каждой итерации for цикла, и случайное состояние torch , скорее всего, отличается на каждой итерации .

 import numpy as np
import torch

max_sim = 3  # how many simulations you need

for numpy_seed in range(max_sim):
    np.random.seed(numpy_seed)
    torch_seed = np.random.randint(low=-2**63,
                                   high=2**63,
                                   dtype=np.int64)
    print(torch_seed)
    torch.manual_seed(torch_seed)
    # do the rest of the simulation

# output:
# 900450186894289455
# -1530673954295414549
# -1180685649882019313
 

[1]: Мацумото, Макото и Вада, Исаку и Курамото, Ай и Ашихара, Хе,
Заголовок: Распространенные дефекты при инициализации генераторов псевдослучайных чисел; около уравнения 30