我只是在做一个小实验来弄清楚数值梯度的性能比 MATLAB fmincon 的分析梯度有多差。而且,即使有限差分步长(即 df/dx = (f(x+delta)-f(x))/delta)很大,fmincon 也能很好地工作。这很令人惊讶,因为我预计随着步长的增加,性能会呈现出凸曲线(如微笑)。
我的实验的具体结果如下('delta'由选项'FiniteDifferenceStepSize'控制):
(1) 解析梯度
运行时间 = 52.7 秒,fval = 2.3936
(2) 数值梯度
delta = 1e-12,运行时间 = 53.9 秒,fval = 6.9880
delta = 1e-11,运行时间 = 971.7 秒,fval = 6.9733
delta = 1e-10,运行时间 = 1593.9 秒,fval = 5.5913
delta = 1e-9,运行时间 = 2054.6 秒,fval = 5.5913
delta = 1e-8,运行时间 = 1700.4 秒,fval = 5.5913
delta = 1e-7,运行时间 = 1478.8 秒,fval = 5.5913
delta = 1e-6,运行时间 = 2102.2 秒,fval = 5.4790
delta = 1e-5,运行时间 = 3390.0 秒,fval = 2.3936
delta = 1e-4,运行时间 = 2938.8 秒,fval = 2.3936
delta = 1e-3,运行时间 = 2938.8 秒,fval = 2.3936
delta = 1e-2,运行时间 = 3514.9 秒,fval = 2.3936
delta = 1e-1,运行时间 = 4374.4 秒,fval = 2.3936
delta = 1e-0,运行时间 = 2760.6 秒,fval = 2.4022
delta = 1e+1,运行时间 = 61.0 秒,fval = 6.9880
delta = 1e+2,运行时间 = 61.2 秒,fval = 6.9880
对于设置,使用了“sqp”算法,所有其他参数(例如,容差、初始点)都设置为默认值。是的,它最终在 delta = 1 之后开始退化。但它对我来说似乎仍然非常强大,尽管它适用于从 1e-5 到 1e-0 的大范围 delta。
我很好奇这个 MATLAB 求解器背后的魔力。他们是否在做一些技巧,例如,如果他们一开始未能改善给定的步长,则缩短(有限差分)步长?如果不是,他们怎么能打败这个不准确的梯度?或者,没有这样的事情,它仅仅意味着我的问题基本上是平的,所以大三角洲没有问题?