Optim.jl做了许多冗余的函数调用。对于一个有6个变量的函数和方法LBFGS() (没有提供梯度-我的函数是一个不动点问题的解决方案,不容易计算梯度和ForwardDiff和ReverseDiff,由于某些原因,不能使用我的代码)。
它在第一次迭代中调用函数39次。更重要的是,这些函数调用中的许多都是在完全相同的输入上进行计算的。这似乎非常低效--我做错了什么吗?如果没有,我可以做些什么来提高效率?
我的代码目前如下-如果你需要更多的答案,请告诉我。
function f(x::Vector{Float64})
modelPar.ρ = x[1]
modelPar.χI = x[2]
modelPar.χS = x[3]
modelPar.χE = x[4] * x[3]
modelPar.λ = x[5]
modelPar.ν = x[6]
f = open("figures/log.txt","a")
write(f,"Iteration: ρ = $(x[1]); χI = $(x[2]); χS = $(x[3]);
χE = $(x[3] * x[4]); λ = $(x[5]); ν = $(x[6])\n")
close(f)
output = computeScore(algoPar,modelPar,guess,targets,weights)
end
initial_x = [ modelPar.ρ;
modelPar.χI;
modelPar.χS;
modelPar.χE / modelPar.χS;
modelPar.λ;
modelPar.ν ]
lower = [0.01, 0.1, 0.1, 0.01, 1.001, 0.01]
upper = [0.1, 6, 6, 0.99, 1.5, 0.5]
inner_optimizer = LBFGS()
results = optimize(f,lower,upper,initial_x,Fminbox(inner_optimizer),
Optim.Options(iterations = 0, store_trace = true, show_trace = true))
跟踪如下所示
Results of Optimization Algorithm
* Algorithm: Fminbox with L-BFGS
* Starting Point: [0.04,4.0,2.0,0.5,1.05,0.05]
* Minimizer: [0.04,4.0,2.0,0.5,1.05,0.05]
* Minimum: 2.069848e-02
* Iterations: 1
* Convergence: true
* |x - x'| ≤ 0.0e+00: true
|x - x'| = 0.00e+00
* |f(x) - f(x')| ≤ 0.0e+00 |f(x)|: true
|f(x) - f(x')| = 0.00e+00 |f(x)|
* |g(x)| ≤ 1.0e-08: false
|g(x)| = 1.63e-01
* Stopped by an increasing objective: false
* Reached Maximum Number of Iterations: true
* Objective Calls: 1
* Gradient Calls: 1
但是,文件log.txt
长39行,包含以下内容:
Iteration: ρ = 0.04000605545445239; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.03999394454554761; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.000024221817809; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 3.9999757781821903; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0000121109089046; χE = 1.0000060554544523; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 1.9999878890910952; χE = 0.9999939445455476; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0000121109089048; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 0.9999878890910953; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.050006358227175; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.049993641772825; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05000605545445239
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.04999394454554761
Iteration: ρ = 0.04000605545445239; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.03999394454554761; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.000024221817809; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 3.9999757781821903; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0000121109089046; χE = 1.0000060554544523; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 1.9999878890910952; χE = 0.9999939445455476; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0000121109089048; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 0.9999878890910953; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.050006358227175; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.049993641772825; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05000605545445239
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.04999394454554761
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04000605545445239; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.03999394454554761; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.000024221817809; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 3.9999757781821903; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0000121109089046; χE = 1.0000060554544523; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 1.9999878890910952; χE = 0.9999939445455476; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0000121109089048; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 0.9999878890910953; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.050006358227175; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.049993641772825; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05000605545445239
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.04999394454554761
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
Iteration: ρ = 0.04; χI = 4.0; χS = 2.0; χE = 1.0; λ = 1.05; ν = 0.05
这里发生什么事情?
发布于 2019-02-26 18:37:43
1.0e-08相当低。您可以尝试使用g_tol=1.0e-6
来查看它的收敛情况吗?
results = optimize(f, lower, upper, initial_x, Fminbox(inner_optimizer), Optim.Options(iterations=0, store_trace=true, show_trace=true, g_tol=1.0e-6))
https://stackoverflow.com/questions/54271116
复制