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

时间:2019-01-16 17:13:00

标签: r r-caret nnet

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

就我而言,将maxit设置为300而不是500时,我会得到很好的结果。

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

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

2)越高,模型越好-对还是错?    (基本假设是,如果模型未通过300次迭代收敛,则当迭代增加时它将收敛)

3)如何调整maxit参数?

1 个答案:

答案 0 :(得分: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的{​​{1}}选项来调整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的输出是否收敛。

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

最后,它不太可能提供帮助,但是看一下插入train()函数的seeds选项可能会很有趣。正如文档所述,它可能仅在运行并行作业时有用。

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