【问题标题】:Optim.jl makes many redundant function calls per iterationOptim.jl 每次迭代都会进行许多冗余函数调用
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2020-08-27
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多