r - R 中的 H2O 深度学习模型能否在保持多线程的同时可重现?
问题描述
我一直致力于验证使用 h2o 开发的模型。
具体来说,我一直在测试使用 h2o.deeplearning 实现的神经网络。我一直试图通过在 H2O 函数中设置种子来生成一致的结果,但即使这样做,我也看到同一模型的不同版本之间的相关系数在 0.6 和 0.85 之间,即使是具有相同种子的版本。
我做了一些阅读,发现我可以通过将 reproducible 标志设置为 TRUE 来强制实现可重复性,但会付出很大的性能代价。该模型的输入太大,无法成为可行的方法。
有没有其他人不得不解决类似的问题/找到了一种方法来强制 H2O 神经网络具有可重复性且对性能的影响更小?
解决方案
来自关于这个主题的技术说明
为什么深度学习结果不可重现:
动机
H2O 的深度学习使用了一种叫做HOGWILD的技术!这大大提高了训练的速度,但默认情况下不可重现。
解决方案
为了获得可重现的结果,您必须设置reproducible = TRUE
和seed = 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
推荐阅读
- java - 如何在 springframework.data.domain.sort 中仅用一天对 Instant 进行排序
- python - Python - 在日期列表中找不到特定日期
- virtual-machine - 错误:无法将套接字连接到“/var/run/libvirt/libvirt-sock”:连接被拒绝
- prolog - Prolog - 即使 asserta/1 尚未执行,动态谓词也会返回 true
- python - 如果Python中的输入为负数,如何结束循环?
- python - Graphviz 太慢了
- python - 如何从此 python 请求响应中获取某个项目
- reactjs - 如何在安全端口上运行 reactjs?
- html - Bootstrap 4导航栏无法向右移动项目
- python - Keras 中的自定义损失函数,以掩码数组作为输入