当我增加maxit以及如何优化maxit值时,为什么nnet会给出不同的输出?

问题描述 投票:1回答:1

我正在使用带有nnet方法的插入包。当我将maxit参数从300更改为500时,我得到不同的结果。我的理解是,如果maxit增加,模型将经历最大的“n”次迭代以找到局部最小值。

在我的情况下,当我将maxit设置为300而不是500时,我得到了很好的结果。

注意:两个模型中的种子值,tune_grid,折叠次数相同。

1)我得到了不同的结果,因为NN优化中的许多局部最小值?

2)maxit越高,模型越好 - 真或假? (基本假设是,如果模型没有收敛300次迭代,它将在迭代增加时收敛)

3)如何调整maxit参数?

r r-caret nnet
1个回答
0
投票

您指定的nnet方法是使用迭代优化(来自基础R中的optim()函数的BFGS方法)来估计模型的参数[1]。优化应该在收敛时停止。如果maxit设置得太低,那么模型将无法收敛。

对于所有优化问题,不保证BFGS方法收敛。尽管如此,它被认为是一种很好的优化方法。优化表面依赖于数据,因此我不会评论您的案例的最小值的数量或性质。您可能已经在300次迭代中达到局部最小值但是在nnet()函数中存在一些随机性(设置随机权重),因此即使所有nnet()参数相同,后续运行也可能不同。注意两个后续nnet()之间的差异以相同的参数运行 - 在100次迭代时为4.115351对比2.112400。

library(nnet)
data(iris)
set.seed(42)

nnet(Species ~ ., data=iris, size=10)
# weights:  83
initial  value 262.654300
iter  10 value 72.296066
iter  20 value 10.287034
iter  30 value 6.341659
iter  40 value 5.814649
iter  50 value 5.187836
iter  60 value 4.199448
iter  70 value 4.150082
iter  80 value 4.122058
iter  90 value 4.117969
iter 100 value 4.115351
final  value 4.115351
stopped after 100 iterations
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling

# Deliberately not setting seed value before second nnet run
nnet(Species ~ ., data=iris, size=10)
# weights:  83
initial  value 201.869745
iter  10 value 67.631035
iter  20 value 11.863275
iter  30 value 6.542750
iter  40 value 5.758701
iter  50 value 5.355368
iter  60 value 3.970210
iter  70 value 2.835171
iter  80 value 2.414463
iter  90 value 2.226375
iter 100 value 2.112400
final  value 2.112400
stopped after 100 iterations
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling

还要注意,上面的nnet()都没有收敛。以下是融合模型的示例:

set.seed(42)
nnet(Species ~ ., data=iris, size=10, maxit=500)
# weights:  83
initial  value 262.654300
iter  10 value 72.296066
iter  20 value 10.287034
# I've truncated the output here
iter 360 value 0.000277
iter 370 value 0.000117
final  value 0.000097
converged
a 4-10-3 network with 83 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width
output(s): Species
options were - softmax modelling

注意,在上面的输出中“收敛”。

不幸的是,不可能使用maxit选项调整tune_grid参数到插入符号train函数。在maxit调用中为train设置一个高值可能是合理的,但我不会推荐一个值,因为它再次依赖于数据。对于虹膜数据,我会尝试一个值,该值比收敛的最大迭代次数高一个数量级或两个数量级。或者,您可以循环maxit的值:

num.it <- 500 # max number of training iterations     
fit.dat <- matrix(ncol=1, nrow=num.it) # fitting criterion values

for(i in 1:num.it) {

    # to monitor progress
    cat(i,'\n') 
    flush.console()

    # to ensure same set of random starting weights are used each time
    set.seed(42)

    # temporary nnet model
    mod.tmp <- nnet(Species ~ ., data=iris, size=10, maxit=i, trace=F)

    # append fitting criterion value
    fit.dat[i,] <- mod.tmp$value             
}

# extract convergence values
which.min(fit.dat)
[1] 375
fit.dat[which.min(fit.dat)]
[1] 9.654717e-05

# plot fitting values
plot(fit.dat, type='l')

上面的循环调整maxit但不考虑过度拟合。更好的方法是使用插入符号train()函数与您当前的tune_grid和交叉验证设置。您还必须检查插入符号train()函数输出以进行收敛。

此外,插入符号和其他包可能与set.seed()具有令人惊讶的重现性问题:R: set.seed() results don't match if caret package loaded

最后,它不太可能有所帮助,但看看seeds选项来照顾trainControl()函数可能会很有趣。正如文档所说,它可能仅在运行并行作业时才有用。

[1] https://cran.r-project.org/web/packages/nnet/nnet.pdf

© www.soinside.com 2019 - 2024. All rights reserved.