在相同的条件下用相同的算法训练相同的深度学习模型,训练的结果会是怎么样的呢?

2022-07-23 17:55:11 +08:00
 FutureApple

在相同的条件下用相同的算法训练相同的深度学习模型,训练的结果是否会完全相同,又是为什么呢?

1611 次点击
所在节点    奇思妙想
7 条回复
zxCoder
2022-07-23 18:00:52 +08:00
怎么定义“相同的条件”

如果真的是相同的条件,那结果肯定是相同的
jdhao
2022-07-23 18:04:05 +08:00
不太可能完全相同,因为模型的参数初始化,batch 里面数据选择,这些都会影响结果,如果你把这些变化的量全部固定,结果基本上是一样的。
hsfzxjy
2022-07-23 18:10:20 +08:00
一些 CUDA 运算有随机性,会导致结果不同
xiri
2022-07-23 18:31:29 +08:00
有可能会不同,不少算法为了避免过拟合都会引入一些随机因子
Muniesa
2022-07-23 18:39:33 +08:00
用相同的随机种子应该结果是完全相同的
hsfzxjy
2022-07-23 19:36:20 +08:00
我来说一个很多人不会注意到的随机性来源:并行化计算和浮点运算造成的不确定性。

首先要知道,IEEE754 浮点数的加法和乘法是不符合结合律的。也就是说在某些情况下 (a+b)+c!=a+(b+c),一个反例是在 64-bit 情况下

1e40+((-1e40)+1e10) == 0.0
(1e40+(-1e40))+1e10 == 1000000000.0

因此,对于同一批浮点数相加,它们加的顺序会影响最终的结果。

其次要知道,GPU 算法通常会将一个问题分为几个子问题,对子问题并行计算,再将子问题的结果汇总为最终的结果。

比如你要用 GPU 计算 3 个浮点数的和,你可以开 3 个线程使用 atomicAdd 把这些数加在结果数上。

atomicAdd 能保证没有 race condition ,但是不能保证加的顺序,你这次跑可能是 (a+b)+c ,下一次就可能是 (b+c)+a 。而根据前一条,浮点数的运算顺序会影响运算结果。因此,你每次跑都有可能得到不一样的结果。

只要你的运算涉及将多路并行的浮点数结果汇总,这种随机性就无可避免,不管你如何固定应用层的随机种子。这种随机性的影响可能很小,但在漫长的训练过程中会不断放大,直到产生肉眼可见的差异。

为了克服这种随机性以得到确定性的结果,有时你需要和运算效率做 trade-off ,即以更慢的但是顺序确定的方式汇总浮点数。这也是 torch.backends.cudnn.deterministic 这个开关的由来。

但需要注意的是,torch.backends.cudnn.deterministic 不能保证完全消除这种不确定性。因为这涉及算法的重新设计,而不像固定一个种子这么简单。如果 cudnn 等库的作者考虑不周,那还是会有这种随机性。
lookStupiToForce
2022-07-25 17:16:20 +08:00
依稀记得有人反映过以前洋垃圾至强 CPU 有其他因素全固定死,运算结果也会不稳定的情况

所以排除上面那位大神说的算法层面的影响,物理层面的影响你也不能忽视

啊,找到了一篇知乎的答案,就讲的不要用洋垃圾的道理
https://www.zhihu.com/question/300500895/answer/656703745

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868224

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX