您的位置:首页 > 文旅 > 美景 > 网络营销推广方式有几种_四川网站开发哪家好_全网推广外包公司_青岛seo服务哪家好

网络营销推广方式有几种_四川网站开发哪家好_全网推广外包公司_青岛seo服务哪家好

2024/12/23 10:42:10 来源:https://blog.csdn.net/qq_52383168/article/details/143131967  浏览:    关键词:网络营销推广方式有几种_四川网站开发哪家好_全网推广外包公司_青岛seo服务哪家好
网络营销推广方式有几种_四川网站开发哪家好_全网推广外包公司_青岛seo服务哪家好

在这里插入图片描述

随机种子:Pytorch 设置随机种子Seed来保证训练结果唯一

作为机器学习的小白,在学习机器学习这门课做课后作业时,我总能看到以下几行代码:

myseed = 6666  # set a random seed for reproducibility
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(myseed)
torch.manual_seed(myseed)
if torch.cuda.is_available():torch.cuda.manual_seed_all(myseed)

去网上找解释:得到的大部分解释都是以下这种说辞:

​ 在编程和数据处理中,随机数扮演着重要的角色。然而,计算机生成的随机数并不是真正的随机,而是基于一定的算法产生的伪随机数。

通过设置不同的随机数种子(Random Seed),我们可以得到不同的随机数序列,这在很多应用中都是非常有用的。比如在机器学习模型的训练中,通过固定随机数种子,我们可以确保每次运行代码时得到的结果是一致的,方便进行结果对比和复现。

随机数种子在PyTorch中的作用主要体现在以下几个方面:

  1. 实验可复现性:通过设置固定的随机数种子,可以确保每次运行实验时得到的随机过程是一致的,从而方便进行结果对比和模型调优。
  2. 数据划分一致性:在数据预处理阶段,我们通常需要将数据划分为训练集、验证集和测试集。通过设置随机数种子,可以确保每次划分得到的数据集是一致的,避免了因为数据划分不同而导致的模型性能差异。
  3. 模型初始化一致性:在神经网络模型的初始化过程中,权重和偏置通常是随机初始化的。通过设置随机数种子,可以确保每次初始化模型时得到的权重和偏置是一致的,从而保证了模型训练的一致性。

可我就有疑问了:既然是随机种子,产生随机数,增加模型的泛化能力我能理解,但是什么叫确保我们每次训练模型时得到的结果是一致的

然后我找到了这篇博客,自我感觉是把随机种子和伪随机数说明白了:

以下的内容是这篇博客的搬运。

【调参侠的修炼笔记2】随机种子Seed的讲人话解释 - 知乎 (zhihu.com)

随机种子

首先,随机种子以及它的作用是什么?

随机种子的作用就是固定模型训练过程中所产生的随机数,从而在对所描述模型进行复现的时候可以最大程度地逼近描述效果。当然在大多数情况下,即使设定了随机种子,依旧难以完全复制论文所描述的效果,后面会提到原因。

可能有些人会问,随机数既然叫做随机数,那么应当具有随机性,如果随机种子能固定随机数,那么“随机数”的说法是否是个悖论。这里就要引入一个==“伪随机数”==的概念。在机器控制的算法或过程中,所产生的都是伪随机数。

真正的随机数是物理意义上真实产生的,比如从黑箱里摸球,投掷硬币等等。那么物理意义上的随机数具有独立性和均匀性,而且难以寻找结果产生的规律。但是所产生的结果序列是不可复制的,另外这种完全随机性所参与的计算过程往往需要昂贵的计算资源。

那么对于机器控制的随机过程而言,参与计算的“随机数”,也就是伪随机数,是通过一定规律产生的,也就是过程可控的,这种规律叫做随机数生成器,但是这种规律很复杂,就像一个黑盒,我们可以近似地将其视为随机数的模拟。随机种子就可以认为是在机器模拟过程中固定随机数产生过程的船锚。

我们可以将产生随机数的过程视为一个固定的黑盒,把设定好的种子扔进去,黑盒将会返回所想要的随机数,以及保证生成下一个随机数的新的种子,再将这颗种子继续丢进黑盒,循环迭代,从而进入随机数生成的无限循环。因此,只要初始随机种子不改变,我们将会得到固定的随机数序列

第二,为什么随机种子固定了随机数,但依旧存在难以完全复制效果的情况呢?

在机器学习中,随机种子的设计的一个主要目的就是方便下一次复现,但是需要明确的是,就算我们生成了固定的随机数,结果已经与描述效果相差无几,还是存在难以完全复制效果的情况,这一点不难理解。因为模型训练不只是有随机数这一个随机过程,例如模型使用SGD等优化算法,这些方法本身就带有了随机性,每次迭代更新都是随机采样batch size个样本的平均梯度来更新权值,虽然说随机种子一定程度上降低了随机性,但由于这些方法本身的敏感,结果的细微差别依旧是难以避免的。

第三,随机种子如何进行设置?

我们首先需要明确一件事,就是随机种子的设定对大部分的模型并不会产生特别大的实质性影响,神经网络更多会和迭代次数,学习率等相关。但是对于预训练模型而言,非常依赖参数的随机初始化过程,那么对于这样的场景,随机种子的设定就显得非常重要。

关于随机种子的值设置为多少,实际上是无所谓的。我们把每一组随机数序列封装在一个集装箱里,那么随机种子就好比集装箱上的标号,固定标号之后,我们只能说从堆放成千上万集装箱的码头上,找到固定的集装箱,但是里面的物品(随机数)和这个标号没有半毛钱关系(因为伪随机数的原因,这个解释并不是特别严谨,只是可以近似地看成没有关系)。

随机数的设定有两种方式,一种是带参,一种是无传参,都与random函数一同出现。常见的代码设定包括4种,分别是python内置、numpy、tensorflow及pytorch:

seed = 1
# or
random.seed=seedrandom.seed(seed)
np.random.seed(seed)
tf.random.set_seed(seed)
torch.manual_seed(seed)

而且随机种子的设定范围是不固定的,你设定1也行,10也行,100也行,对于初学者而言,更多是复现别人的方法,就按照论文或者源代码文件中设定的seed进行复现即可,也可以自己修改一下看一下效果。当然看到有一些研究人员说调参只需要考虑随机种子,感觉这个说法有些过于绝对了,仁者见仁,智者见智。

随机种子(Random Seed)是计算机专业术语。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。

按照这个理解,我们如果可以设置最初的 真随机数(种子),那么后面出现的随机数将会是固定序列。

以下是一段对比随机生成和设置随机种子后的生成:

import random# 生成随机整数
print("第一次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))# 生成随机整数
print("第二次随机生成")
print(random.randint(1,100))
print(random.randint(1,100))# 设置随机数生成器种子
random.seed(11)# 生成随机整数
print("第一次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))# 重置随机数生成器种子
random.seed(11)# 生成随机整数
print("第二次设定种子后随机生成")
print(random.randint(1,100))
print(random.randint(1,100))

结果如下,前两次随机生成的序列不同,后两次设定种子后随机生成的序列相同:

第一次随机生成
66
37
第二次随机生成
93
56
第一次设定种子后随机生成
58
72
第二次设定种子后随机生成
58
72

至此,也许你就可以理解了为什么说确保了可复现性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com