Bootstrap

随机数种子的作用

设置随机数种子(random seed)的目的是为了确保随机数生成器在每次运行时产生相同的随机数序列,从而保证实验结果的一致性。随机数种子通过初始化随机数生成器的内部状态,使得在相同的种子值下,随机数生成器每次调用时生成的序列是相同的。

为什么设置随机数种子能保证实验结果的一致?

  1. 确定性:随机数生成器通常使用一个确定性算法,这意味着如果给定相同的初始状态(种子值),生成的随机数序列将完全相同。
  2. 可重现性:在科学实验或算法调试中,可重现性是非常重要的。通过设置种子,可以确保其他人使用相同的代码和相同的种子值时能够得到相同的结果。

随机数种子传入到哪里?

随机数种子通常传入到随机数生成器的初始化函数中。不同的编程语言和库有不同的方法来设置随机数种子。以下是一些常见编程语言和库的示例:

Python

在Python中,常用的随机数生成库有randomnumpy

import random
random.seed(42)

import numpy as np
np.random.seed(42)
NumPy

如果使用NumPy中的随机数生成器,可以这样设置种子:

import numpy as np
np.random.seed(42)
TensorFlow

在TensorFlow中,可以设置全局随机种子来确保结果的可重复性:

import tensorflow as tf
tf.random.set_seed(42)
PyTorch

在PyTorch中,可以通过以下方式设置种子:

import torch
torch.manual_seed(42)
C++

在C++中,可以使用标准库的std::mt19937来设置种子:

#include <random>
std::mt19937 generator(42); // 42是随机数种子

通过在代码的关键部分(如模型初始化、数据拆分、训练过程等)设置随机数种子,可以确保实验结果的一致性,从而便于调试和比较不同实验结果。

这段代码定义了一个 set_seed 函数,用于设置随机数种子以确保实验的可重复性。在深度学习和机器学习实验中,设置随机数种子是一个常见的做法,因为它可以确保每次运行代码时得到相同的结果。以下是每一行代码的详细介绍及中文注释:

import random
import numpy as np
import torch

def set_seed(args):
    # 设置 Python 内置 random 模块的随机数种子
    random.seed(args.seed)
    # 设置 NumPy 的随机数种子
    np.random.seed(args.seed)
    # 设置 PyTorch 的 CPU 随机数种子
    torch.manual_seed(args.seed)
    # 如果使用多个 GPU,则为所有的 GPU 设置随机数种子
    if args.n_gpu > 0:
        torch.cuda.manual_seed_all(args.seed)

详细解释

  1. import random:导入 Python 内置的 random 模块,用于生成随机数。

  2. import numpy as np:导入 NumPy 库并将其重命名为 np,NumPy 是一个常用的科学计算库。

  3. import torch:导入 PyTorch 库,这是一个流行的深度学习框架。

  4. def set_seed(args)::定义一个名为 set_seed 的函数,它接受一个参数 args。这个参数通常是一个包含实验设置的对象或命名空间。

  5. random.seed(args.seed):设置 Python 内置的 random 模块的随机数种子为 args.seed。这确保了使用 random 模块生成的随机数是可重复的。

  6. np.random.seed(args.seed):设置 NumPy 的随机数种子为 args.seed。这确保了使用 NumPy 生成的随机数是可重复的。

  7. torch.manual_seed(args.seed):设置 PyTorch 在 CPU 上的随机数种子为 args.seed。这确保了在 CPU 上使用 PyTorch 生成的随机数是可重复的。

  8. if args.n_gpu > 0::检查是否使用多个 GPU(通过检查 args.n_gpu 是否大于0)。

  9. torch.cuda.manual_seed_all(args.seed):如果使用多个 GPU,为所有的 GPU 设置随机数种子为 args.seed。这确保了在 GPU 上使用 PyTorch 生成的随机数是可重复的。

示例

假设我们有一个 Args 类,用于存储实验的配置参数,包括随机数种子和 GPU 的数量。我们可以这样使用 set_seed 函数:

import random
import numpy as np
import torch

class Args:
    def __init__(self):
        self.seed = 42  # 设置随机数种子为42
        self.n_gpu = 2  # 假设有2个GPU

args = Args()

def set_seed(args):
    random.seed(args.seed)
    np.random.seed(args.seed)
    torch.manual_seed(args.seed)
    if args.n_gpu > 0:
        torch.cuda.manual_seed_all(args.seed)

# 设置随机数种子
set_seed(args)

# 现在,所有的随机数生成都可以是可重复的
print(random.random())  # 每次运行都会输出相同的随机数
print(np.random.rand())  # 每次运行都会输出相同的随机数
print(torch.randn(3))  # 每次运行都会输出相同的随机数

运行这段代码,每次输出的随机数应该都是相同的,因为我们已经设置了随机数种子。这对于需要重现实验结果的深度学习和机器学习研究非常重要。

;