【发布时间】:2019-06-13 17:31:39
【问题描述】:
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
这是怎么回事?
【问题讨论】:
-
您预计会发生什么?我的意思是,您期望进行多少次功能评估?您正在使用中心有限差分来近似梯度,因此它永远不会只是 1 次评估,最重要的是它会多次评估它,因为它是一种基于线搜索的方法。除此之外,无法为您提供帮助,因为您没有提供 MWE(我无法运行您的代码并重现,因为缺少很多部分,有些对于您要解决的问题是多余的)跨度>
-
我知道这不仅仅是一次评估。我的问题是为什么它以相同的输入值多次调用该函数,正如我提供的日志文件中所见(每次 Optim 调用函数 f,它都必须写入 log. txt 它用什么参数调用它,因为它在函数 f 内部——我相当确定它是有效的)。结果可以被缓存,不是吗?还是我错过了什么?
-
如果没有
computeScore,这很难说,因为我无法运行您的示例并对其进行调查。 -
好的,我知道额外的电话是从哪里来的。因为我们似乎没有在 Fminbox 代码中初始化缓存,所以我们一遍又一遍地点击这个github.com/JuliaNLSolvers/Optim.jl/blob/…。我打开了一个问题github.com/JuliaNLSolvers/Optim.jl/issues/704
标签: julia nonlinear-optimization