如何在 R 中的 h2o.grid 中调整 hidden_dropout_ratios

How to tune hidden_dropout_ratios in h2o.grid in R

我想在 R 中使用 h2o 调整一个带有 dropout 的神经网络。这里我为 iris 数据集提供了一个可重现的例子。我避免调整 etaepsiplon(即 ADADELTA 超参数),其唯一目的是加快计算速度。

require(h2o)
h2o.init()
data(iris)
iris = iris[sample(1:nrow(iris)), ]
irisTrain = as.h2o(iris[1:90, ])
irisValid = as.h2o(iris[91:120, ])
irisTest = as.h2o(iris[121:150, ])
hyper_params <- list(
    input_dropout_ratio = list(0, 0.15, 0.3),
    hidden_dropout_ratios = list(0, 0.15, 0.3, c(0,0), c(0.15,0.15),c(0.3,0.3)),
    hidden = list(64, c(32,32)))
grid = h2o.grid("deeplearning", x=colnames(iris)[1:4], y=colnames(iris)[5],
                training_frame = irisTrain, validation_frame = irisValid,
                hyper_params = hyper_params, adaptive_rate = TRUE,
                variable_importances = TRUE, epochs = 50, stopping_rounds=5,
                stopping_tolerance=0.01, activation=c("RectifierWithDropout"),
                seed=1, reproducible=TRUE)

输出为:

Details: ERRR on field: _hidden_dropout_ratios: Must have 1 hidden layer dropout ratios.

问题出在hidden_dropout_ratios。请注意,我在 input_dropout_ratio 和 hidden_dropout_ratios 中包含了 0,因为我还想测试没有丢失的激活函数。我知道我可以使用 activation="Rectifier 但我认为我的配置应该会产生相同的结果。在调整具有不同层数的架构时如何调整 hidden_dropout_ratios

尝试 1:失败,我没有调整 hidden

hyper_params <- list(
    input_dropout_ratio = c(0, 0.15, 0.3),
    hidden_dropout_ratios = list(c(0.3,0.3), c(0.5,0.5)),
    hidden = c(32,32))
ERRR on field: _hidden_dropout_ratios: Must have 1 hidden layer dropout ratios.

尝试 2:成功但我没有调整 hidden

hyper_params <- list(
    input_dropout_ratio = c(0, 0.15, 0.3),
    hidden_dropout_ratios = c(0.3,0.3),
    hidden = c(32,32))

如果用 hidden_dropout_ratios 进行试验,您必须固定网格中隐藏层的数量。起初我把多个网格组合起来搞得一团糟;然后,在研究我的 H2O 书时,我看到有人顺便提到,如果你给它们起相同的名字,网格是如何自动组合的。

所以,你仍然需要为每个隐藏层数调用h2o.grid(),但它们最终都可以在同一个网格中。这是您为此修改的示例:

require(h2o)
h2o.init()
data(iris)
iris = iris[sample(1:nrow(iris)), ]
irisTrain = as.h2o(iris[1:90, ])
irisValid = as.h2o(iris[91:120, ])
irisTest = as.h2o(iris[121:150, ])

hyper_params1 <- list(
    input_dropout_ratio = c(0, 0.15, 0.3),
    hidden_dropout_ratios = list(0, 0.15, 0.3),
    hidden = list(64)
    )

hyper_params2 <- list(
    input_dropout_ratio = c(0, 0.15, 0.3),
    hidden_dropout_ratios = list(c(0,0), c(0.15,0.15),c(0.3,0.3)),
    hidden = list(c(32,32))
    )

grid = h2o.grid("deeplearning", x=colnames(iris)[1:4], y=colnames(iris)[5],
    grid_id = "Whosebug",
    training_frame = irisTrain, validation_frame = irisValid,
    hyper_params = hyper_params1, adaptive_rate = TRUE,
    variable_importances = TRUE, epochs = 50, stopping_rounds=5,
    stopping_tolerance=0.01, activation=c("RectifierWithDropout"),
    seed=1, reproducible=TRUE)

grid = h2o.grid("deeplearning", x=colnames(iris)[1:4], y=colnames(iris)[5],
    grid_id = "Whosebug",
    training_frame = irisTrain, validation_frame = irisValid,
    hyper_params = hyper_params2, adaptive_rate = TRUE,
    variable_importances = TRUE, epochs = 50, stopping_rounds=5,
    stopping_tolerance=0.01, activation=c("RectifierWithDropout"),
    seed=1, reproducible=TRUE)

当我去打印网格时,我被提醒在使用列表超参数(例如隐藏或 hidden_dropout_ratios 时网格输出存在错误。您的代码是一个很好的独立示例,所以我现在将报告它。同时,这里有一行显示对应于每个超参数的值:

sapply(models, function(m) c(
  paste(m@parameters$hidden, collapse = ","),
  paste(m@parameters$hidden_dropout_ratios, collapse=",")
  ))

给出:

     [,1]    [,2] [,3]        [,4]   [,5]      [,6] 
[1,] "32,32" "64" "32,32"     "64"   "32,32"   "64" 
[2,] "0,0"   "0"  "0.15,0.15" "0.15" "0.3,0.3" "0.3"

即没有隐藏的丢失比一点点好,比很多好。而且两个隐藏层比一个好。

顺便说一句,

  • input_dropout_ratio:控制输入层和第一个隐藏层之间的dropout。可以独立于激活函数使用。
  • hidden_dropout_ratios:控制每个隐藏层和下一层(下一个隐藏层,或输出层)之间的dropout。如果指定,则必须指定 "WithDropout" 激活函数之一。