首页 > 解决方案 > R 中的 H2O 深度学习模型能否在保持多线程的同时可重现?

问题描述

我一直致力于验证使用 h2o 开发的模型。

具体来说,我一直在测试使用 h2o.deeplearning 实现的神经网络。我一直试图通过在 H2O 函数中设置种子来生成一致的结果,但即使这样做,我也看到同一模型的不同版本之间的相关系数在 0.6 和 0.85 之间,即使是具有相同种子的版本。

我做了一些阅读,发现我可以通过将 reproducible 标志设置为 TRUE 来强制实现可重复性,但会付出很大的性能代价。该模型的输入太大,无法成为可行的方法。

有没有其他人不得不解决类似的问题/找到了一种方法来强制 H2O 神经网络具有可重复性且对性能的影响更小?

标签: rneural-networkdeep-learningh2oreproducible-research

解决方案


来自关于这个主题的技术说明

为什么深度学习结果不可重现:

动机

H2O 的深度学习使用了一种叫做HOGWILD的技术!这大大提高了训练的速度,但默认情况下不可重现。

解决方案

为了获得可重现的结果,您必须设置reproducible = TRUEseed = 1(例如,但您可以使用任何种子,只要每次使用相同的种子)。如果你强制重复性,它会减慢训练,因为这只适用于单个线程。默认情况下,H2O 集群以与内核数相同的线程数启动(例如,笔记本电脑上通常为 8)。

下面的 R 示例演示了如何生成可重现的深度学习模型:

library(h2o)
h2o.init(nthreads = -1)

# Import a sample binary outcome train/test set into R
train <- read.table("http://www.stat.berkeley.edu/~ledell/data/higgs_10k.csv", sep=",")
test <- read.table("http://www.stat.berkeley.edu/~ledell/data/higgs_test_5k.csv", sep=",")


# Convert R data.frames into H2O parsed data objects
training_frame <- as.h2o(train)
validation_frame <- as.h2o(test)
y <- "V1"
x <- setdiff(names(training_frame), y)
family <- "binomial"
training_frame[,c(y)] <- as.factor(training_frame[,c(y)])  #Force Binary classification
validation_frame[,c(y)] <- as.factor(validation_frame[,c(y)])

现在我们将拟合两个模型并显示训练 AUC 两次都是相同的(即可重现)。

fit <- h2o.deeplearning(x = x, y = y, 
                            training_frame = training_frame, 
                            reproducible = TRUE, 
                            seed = 1)
h2o.auc(fit)
#[1] 0.8715931

fit2 <- h2o.deeplearning(x = x, y = y, 
                            training_frame = training_frame, 
                            reproducible = TRUE, 
                            seed = 1)
h2o.auc(fit2)
#[1] 0.8715931

推荐阅读