Julia Optim.jl在每次迭代中进行许多冗余函数调用

Julia Optim.jl在每次迭代中进行许多冗余函数调用,julia,nonlinear-optimization,Julia,Nonlinear Optimization,Optim.jl执行许多冗余函数调用。对于6个变量的函数和方法LBFGS()(没有提供梯度-我的函数是不易计算梯度和ForwardDiff和ReverseDiff的定点问题的解决方案,出于某种原因,不使用我的代码) 它在第一次迭代中调用函数39次。更重要的是,许多函数调用都是在完全相同的输入下进行计算的。这似乎效率很低-我做错什么了吗?如果没有,我可以做些什么来提高效率 我的代码如下-如果您需要更多答案,请告诉我 function f(x::Vector{Float64}) model

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.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))

你以为会发生什么?我的意思是,你期望有多少功能评估?你用中心有限差分近似梯度,所以它永远不会只是一次求值,而且它会不止一次求值,因为它是一种基于线搜索的方法。除此之外,它不可能帮助您,因为您没有提供MWE(我无法运行您的代码并复制,因为缺少很多片段,有些片段对于您试图解决的问题来说是多余的),我理解这不会只是一次评估。我的问题是,为什么它要在相同的输入值下多次调用函数,正如我提供的日志文件中所示(每次Optim调用函数f时,它都必须向log.txt写入它调用函数的参数,因为这在函数f中-我相当肯定这是可行的)。结果可以缓存,不是吗?或者我遗漏了什么?如果没有computeScore,这很难说,因为我无法运行您的示例并对其进行研究。好的,我知道额外调用来自何处。因为我们似乎没有在Fminbox代码中初始化缓存,所以我们一遍又一遍地讨论这个问题。我打开了一个问题