这些模型是否等效?

这些模型是否等效?,第1张

这些模型是否等效?

问题的根源在于模型定义和随机性预期 行为 与实际 行为。要查看发生了什么,我们必须了解“ RNG”的工作原理:

  • “随机数生成器”(RNG)实际上是一种生成数字的函数,以便将它们映射到“长期”的概率分布上
  • 例如,当
    RNG()
    调用RNG函数时,它将返回一个“随机”值,并将 其内部计数器加1 。呼叫此计数器
    n
    -然后:
    random_value = RNG(n)
  • 当设置SEED,设置
    n
    根据该种子的值(但不是 该种子); 我们可以通过
    + c
    柜台代表这种差异
  • c
    将是由种子的非线性但确定性函数产生的常数:
    f(seed)

    import numpy as np

    np.random.seed(4) # internal counter = 0 + c
    print(np.random.random()) # internal counter = 1 + c
    print(np.random.random()) # internal counter = 2 + c
    print(np.random.random()) # internal counter = 3 + c


    np.random.seed(4) # internal counter = 0 + c
    print(np.random.random()) # internal counter = 1 + c
    print(np.random.random()) # internal counter = 2 + c
    print(np.random.random()) # internal counter = 3 + c

    0.9670298390136767
    0.5472322491757223
    0.9726843599648843

    0.9670298390136767
    0.5472322491757223
    0.9726843599648843

假设

model1
有100个权重,并且您设置了一个种子(
n = 0 + c
)。后
model1
建,你的计数器是
100 + c
。如果您
重置种子,即使您
model2
使用 完全相同的代码进行 构建,则模型也会有所不同-因为
model2
的权重是根据
n
from
100 +c
进行初始化的
200 + c


附加信息:

有以下 三种 种子可确保更好的随机性:

import numpy as npnp.random.seed(1)         # for Numpy opsimport random random.seed(2) # for Python opsimport tensorflow as tftf.set_random_seed(3)     # for tensorfow ops - e.g. Dropout masks

这将提供很好的可重复性,但如果使用GPU,则不是完美的-
由于 *** 作的并行性;这个视频很好地解释了。为了获得更好的重现性,请

PYHTONHASHSEED
在官方Keras常见问题解答中设置your -that和其他信息。

“完美”的可重复性相当多余,因为您的结果应该在大部分时间的0.1%之内达成一致-
但是,如果您确实需要它,那么当前唯一的方法可能就是切换到CPU并停止使用CUDA-但这会减慢速度极大地训练(通过x10 +)。


随机性的来源

  • 权重初始化(每个默认的Keras初始化程序都使用随机性)
  • 噪声层(降落,高斯噪声等)
  • 散列基于散列的 *** 作,例如集合或字典中的项目顺序
  • GPU并行性(请参阅链接的视频)

模型随机性演示

import numpy as npnp.random.seed(4)model1_init_weights = [np.random.random(), np.random.random(), np.random.random()]model2_init_weights = [np.random.random(), np.random.random(), np.random.random()]print("model1_init_weights:", model1_init_weights)print("model2_init_weights:", model2_init_weights)model1_init_weights: [0.9670298390136767, 0.5472322491757223, 0.9726843599648843]model2_init_weights: [0.7148159936743647, 0.6977288245972708, 0.21608949558037638]

重新启动内核。现在运行:

import numpy as npnp.random.seed(4)model2_init_weights = [np.random.random(), np.random.random(), np.random.random()]model1_init_weights = [np.random.random(), np.random.random(), np.random.random()]print("model1_init_weights:", model1_init_weights)print("model2_init_weights:", model2_init_weights)model1_init_weights: [0.7148159936743647, 0.6977288245972708, 0.21608949558037638]model2_init_weights: [0.9670298390136767, 0.5472322491757223, 0.9726843599648843]

因此,在代码中翻转

model1
和的顺序
model2
也会翻转损失。这是因为种子不会在两个模型的定义之间重置自己,因此您的权重初始化完全不同。

如果希望它们相同,请在定义“每个模型”之前以及在拟合每个模型之前重置种子-并使用如下方便的功能。但是最好的选择是重新启动内核并在单独的

.py
文件中工作。

def reset_seeds():    np.random.seed(1)    random.seed(2)    tf.set_random_seed(3)    print("RANDOM SEEDS RESET")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5646168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存