最近在网上看到这样一篇非常离谱但不完全离谱的文章,文章标题为:torch.manual seed(3407) is all you need: On the influence of random seeds in deep learning architectures for computer vision,作者提出:尽管不同随机种子之间的效果标准差很小,但是仍然能够发现一些“异常点”,也就是使得模型表现相较于平均值特别好或者特别差的随机种子。
也就是说,现在立马把你模型的随机种子改成3407或者你自己的生日,即torch.manual seed(3407)
,也许会得到一个奇妙而有趣的魔法效果。文章已收录至霍格沃茨的《魔法药剂与药水》(误)。
原文链接:https://arxiv.org/pdf/2109.08203.pdf
关于测试随机生成器种子对计算机视觉中普遍存在的深度学习模型结果的影响。他提出以下问题:
针对以上问题,在CIFAR 10 数据集上,作者选取了10000个随机种子,每个随机种子进行30s的时间进行训练和测试,总耗时将近83小时。模型架构采用的是9层的ResNet,优化器SGD。为了保证部分实验中,模型是接近收敛的,因此作者对其中500次的结果训练时长延迟至1分钟。
另外,在ImageNet大型数据集上很难快速进行实验,因此作者使用预训练好的网络,然后仅对最后一层分类层进行初始化并从头训练。每次实验模型训练时间两小时,测试50秒。
首先选取500个随机种子在CIFA 10数据集上进行实验,效果如下图所示:
图1显示的是模型训练过程中的准确率趋势,实线表示超过500个种子的平均值,深红色区域对应一个标准偏差,浅红色对应最大值和最小值。
图2显示的是超过500个种子的CIFAR 10最终验证精度的柱状图和密度图。
因此,第一个问题的答案为:随机种子的不同导致的模型效果分布是类似正态集中的。
作者同时设置长距离和短距离训练,在cifar 10得出准确率
然后设置扫描大量种子,去获得更高或更低的极端值
得到:
回到问题二,答案为深度学习中的黑天鹅确实存在,确实有种子表现得比较好或者比较差,这是一个比较令人担忧的结果,因为当前深度学习社区内,大多文章都是追求模型效果的,而这种较好的效果可能仅仅是由于随机种子引起的。
根据在更大的数据集上进行预训练是否能减少由选择种子引起的差异性的问题
作者使用在Imagenet上对预处理模型进行微调和评估,以查看结合预处理模型使用更大的训练集是否可以减轻因选择种子而导致的分数随机性。得到结果如下:
作者得出:大数据集的上的结果标准差是比CIFA 10小得多的,根据上表还是能够观察到大约0.5%的结果提升——这仅仅是由于随机种子引起的。然而,0.5%的准确率提高在CV领域已经可以算是很明显的提升了。
第三个问题的答案是复杂的:在某种意义上,是的,使用预处理模型和较大的训练集可以减少种子选择引起的变化。但是,对于计算机视觉社区所认为的改进来说,这种变化仍然是显著的。这是一个令人担忧的结果,尤其是因为预处理模型被大量使用的时候。
后面作者也提出了自己的一些想法和嘲讽(误)
学术上来讲,严谨的实验应该进行随机性研究:随机取初始值,数据集分割,在其上建立多个模型,测效果,然后展示最小值和最大值,做均值和标准差。
话虽如此,但是我们也不妨试试随机种子在实验中的魔力。
训练模型过程中,会遇到很多的随机性设置,设置随机性并多次实验的结果更加有说服力。为了随机初始化权重(weight)和偏置(bias)等参数,但是现在发论文越来越要求模型的可复现性,这时候不得不控制代码的随机性问题。我们需要在训练模型之前进行随机种子的设定。如果种子设定为相同的,那么得到的初始权重就是一样的。
相关函数:
torch.manual_seed(number):为CPU中设置种子,生成随机数;
torch.cuda.manual_seed(number):为特定GPU设置种子,生成随机数;
torch.cuda.manual_seed_all(number):为所有GPU设置种子,生成随机数;
如果随机种子相同,每次运行随机函数生成的结果应该都是一样的,那么我们使用3407作为我们的随机种子:
import torch
torch.manual_seed(3047)
print(torch.rand(1))
torch.manual_seed(3047)
print(torch.rand(1))
输出为:
tensor([0.6995])
tensor([0.6995])