使用本地随机数生成器初始化 Pytorch 层

Initialise Pytorch layer with local random number generator

在编写需要随机过程确定性的大型程序时,通常认为创建特定于函数的随机数生成器 (rng) 并将其传递给依赖于随机性的函数(而不是设置全局种子和有功能依赖于此)。另见 here

例如,当我有一个使用 numpy 生成样本的函数时,我使用了在脚本开头创建的 rng:

# at the beginning of the script
import numpy as np
seed = 5465
rng = np.random.default_rng(seed)
# much later in the script
def generate_sample(rng, size):
  return rng.random(size)
generate_sample(rng, size=5)

我正在尝试在初始化 torch.nn.Linear 层时实现相同的目的,即使用预定义的 rng 来重复初始化层。

这(合理地)可能还是我被迫通过 torch.manual_seed() 设置 Pytorch 全局种子?

Generators are available in Pytorch, and in-place prngs can rely on this input, e.g. the normal distribution generator.

当谈到torch.nn.Linear时,正如您观察到的那样,它没有这样的参数。您仍然可以通过使用保存内部状态、加载所需状态、执行 nn.Linear、保存其状态并将全局 prng 重置为原始状态的装饰器来手动管理全局 prng 的内部状态。通过使用它,您依靠 roch.manual_seed() 但也依靠状态 getter 和 setter 函数从种子状态到达更远的状态。