Is there any gradient descent method available?
215 views (last 30 days)
Show older comments
We are working on the optimization of nonconvex energies in mechanics of solid (see the attached picture) resulting from the finite element discretization with a moderate number of variables (up to several thousands).
At the moment I am using the function fminunc. It typically converges very slow or not at all (for more variables) taking many iterations:
First-order
Iteration Func-count f(x) Step-size optimality
0 1781 0.4 0.00625
1 5343 0.39987 0.168734 0.03
2 7124 0.399645 1 0.0235
3 8905 0.398947 1 0.0616
4 10686 0.398602 1 0.0458
5 12467 0.398094 1 0.0459
6 14248 0.397673 1 0.059
7 16029 0.397249 1 0.0415
8 17810 0.396635 1 0.0404
9 19591 0.396317 1 0.0847
10 21372 0.395881 1 0.0523
some iteration between and
First-order
Iteration Func-count f(x) Step-size optimality
60 110422 0.310397 1 0.128
61 112203 0.307966 1 0.121
62 113984 0.305174 1 0.235
63 117546 0.303857 0.241185 0.128
64 121108 0.302965 0.1 0.118
65 124670 0.301738 0.1 0.0921
66 229749 0.301464 0.0188263 0.181 Local minimum possible.fminunc stopped because it cannot decrease the objective function
along the current search direction.
We have no information on the gradient (the subgradient computation is possible, but theoretically demanding to derive, there are some nondifferentiable terms etc.) and consequently no information on the second gradient (both are evaluated numerically) and applied the setup
options = optimoptions('fminunc','Algorithm','quasi-newton','Display','iter');
We are thinking with my colleague, the quasi-newton method is a bit overkill for our problem, and we would like to run only few iterations of the gradient descent (possibly with a damping) to get a picture what happens around our initial energy.
It there any implementation of the method able to evaluate the numerical gradient and maybe compare it with our theoretically derived gradient later? It would be perfect, if fminunc had this option but I could not find it.
Thank you, Jan Valdman
0 Comments
Accepted Answer
Alan Weiss
on 15 Oct 2018
Indeed, fminunc has a mainly-undocumented gradient descent feature that you can see demonstrated in this example. Usually, gradient descent does not work very well, but I suppose that you already know that.
To check whether the internally-calculated gradients in fminunc match a gradient function at the initial point you can use the CheckGradients option. If you want to get a numerical approximation to your gradients you can use John D'Errico's file exchange contribution Adaptive Robust Numerical Differentiation, though on second thought this might not be exactly suited to your problem.
Good luck,
Alan Weiss
MATLAB mathematical toolbox documentation
2 Comments
Alan Weiss
on 24 Nov 2021
Indeed, if you can provide a gradient and Hessian in general (not just at the initial point), then you can expect your optimization to proceed more quickly and in fewer iterations. For an example, see https://www.mathworks.com/help/optim/ug/symbolic-math-toolbox-calculates-gradients-and-hessians.html#SymbolicMathToolboxCalculatesGradientsAndHessiansExample-10
But if you can provide the Hessian only at the initial point, then I do not know how you can incorporate the information into the solver. Sorry.
Alan Weiss
MATLAB mathematical toolbox documentation
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!