使用tensorflow-gpu获得可重现的结果

我正在使用TensorFlow进行一个项目。然而,我似乎无法重现我的结果。

我尝试设置了图级种子、NumPy随机种子甚至操作级种子。然而,结果仍然无法重现。

通过谷歌搜索,大多数人指出reduce_sum函数是罪魁祸首,因为即使设置了种子,reduce_sum函数在GPU上具有非确定性特性。然而,由于我正在为论文进行项目,我需要重现结果。有没有其他高效的函数可以解决这个问题?

另一个建议是使用CPU。然而,我在处理大量数据,因此CPU不是一个选项。使用TensorFlow进行复杂项目的人们是如何解决这个问题的?或者,加载保存的模型检查点文件来验证结果对审稿人来说是否可以接受?


回答:

很酷,你想让你的结果可重现!然而,这里有很多需要注意的地方:

我称一篇论文为可重现的,如果通过执行完全相同的步骤,可以获得论文中找到的完全相同的数字。这意味着如果有人能访问到相同的环境、相同的软件、硬件和数据,他们将能够得到相同的结果。相比之下,如果仅遵循论文中的文字描述就能达到相同的结果,则称为可重复的。因此,可重复性更难实现,但也是论文质量的更有力指标。

你希望训练结果在比特级别上完全相同。理想的情况是,你以一种方式撰写论文,如果人们只有论文,他们仍然可以确认你的结果。

请注意,许多重要论文的结果实际上是不可能重现的:

  • 数据集通常不可用:JFT-300M
  • 大量使用计算能力:对于Google的一篇关于AutoML/架构搜索的论文,我问了作者他们在其中一个实验上花费了多少GPU小时。当时,如果我想获得那么多GPU小时,我需要花费大约250,000美元。

这是否是个问题,很大程度上取决于具体情况。作为比较,想想CERN / LHC:完全相同的实验是不可能的。地球上只有极少数机构拥有检查结果的仪器。但这仍然不是问题。所以请咨询你的导师/已经在该期刊/会议上发表过论文的人。

实现可重复性

这非常难。我认为以下几点有帮助:

  • 确保你提到的质量指标没有太多位数
  • 由于训练可能依赖于随机初始化,你可能也想给出一个区间而不是单一数字
  • 尝试小的变化
  • 从头开始重新实现(也许用另一个库?)
  • 让同事阅读你的论文,然后向你解释他们认为你做了什么。

获得比特级别相同的模型

在我看来,你已经做了重要的事情:

  • 设置所有种子:numpytensorflowrandom
  • 确保训练-测试分割一致
  • 确保训练数据以相同的顺序加载

请注意,可能有你无法控制的因素:

  • 比特翻转:B. Schroeder, E. Pinheiro, 和 W.-D. Weber, “Dram errors in the wild: a large-scale field study”
  • 固有的硬件/软件可重现性问题:浮点乘法不是关联的,并且GPU上的不同核心可能在不同时间完成计算。因此,每次运行都可能导致不同的结果。(如果有人能在这里提供权威参考,我会很高兴)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注