I have a few questions regarding convergence in Optim:
- When an optimization finishes and prints the convergence report, at the top it says either “success” or “failure”. Does this refer to whether or not the algorithm converged (within the specified time, iteration, and function call limits) ?
My next two questions concern the following example using the Rosenbrock function:
f(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
once_diff = OnceDifferentiable(f, [1.98,-1.95]; autodiff = :forward);
res = Optim.optimize(once_diff, [1.25, -2.1], [Inf, Inf], [2.0, 2.0], Fminbox(ConjugateGradient()),
Optim.Options(x_abstol = 1e-3, x_reltol = 1e-3, f_abstol = 1e-3, f_reltol =
1e-3, g_tol = 1e-3))
This gives the following convergence report:
Status: failure
* Candidate solution
Final objective value: 9.339344e-01
* Found with
Algorithm: Fminbox with Conjugate Gradient
* Convergence measures
|x - x'| = 4.73e-04 ≤ 1.0e-03
|x - x'|/|x'| = 1.09e-04 ≤ 1.0e-03
|f(x) - f(x')| = 0.00e+00 ≤ 1.0e-03
|f(x) - f(x')|/|f(x')| = 0.00e+00 ≤ 1.0e-03
|g(x)| = 5.05e-01 ≰ 1.0e-03
* Work counters
Seconds run: 0 (vs limit Inf)
Iterations: 1000
f(x) calls: 2033
∇f(x) calls: 1021
- Why does it not indicate the reason for the failure?
I was looking at the Optim source code and it appears to me, based on the function Base.show(io::IO, r::MultivariateOptimizationResults)
whose definition starts on line 223, that it’s supposed to print a “failure string” which indicates the reason for the failure. In the case of the above example, why didn’t it print “failure (reached maximum number of iterations)”?
- I then checked the convergence:
println(res.x_converged)
println(res.f_converged)
println(res.g_converged)
and got false
for all three. The third false makes sense, but why are res.x_converged
and res.f_converged
both false? In the convergence report, it clearly shows that all convergence criteria except for |g(x)| are met…I also checked res.x_abschange
, res.x_relchange
, res.f_abschange
, and res.f_relchange
, just to be sure, and indeed they are all the same value as shown in the report…So I’m pretty confused by this…