根据您所说:我假设您必须针对 50 个变量进行优化;我还假设您遇到的情况是找到解析导数非常昂贵(更不用说得到数值了),并且您的优化是不受约束的。
让我强调一下,在 25-30 和 100 个变量之间,您有点不幸,因为在选择大型或小型优化例程时,它有点模糊。话虽如此,但没有任何损失。
考虑到即使是一阶导数也很昂贵,这会扼杀牛顿方法的想法。如果你的 Hessian 有点像开始的对角线,你可能会对准牛顿 (BFGS) 有一些运气。CG 通常比 BFGS 慢一点,所以可能不会有太大的改进;如果内存也是一个问题,请使用它(或者在这种情况下只使用 L-BFGS)。此外,考虑到评估函数的速度有多慢,一个简单的最速下降/直线搜索算法会非常缓慢;模拟退火和其他随机搜索变体也是如此(我假设您无权访问 HMC 和所有爵士乐)。
因此,当您在进行单一功能评估时需要物超所值时:使用 Powell 的方法并测试 COBYLA;尽管它是一种受约束的优化算法,因为它会在内部线性近似函数的梯度以加快速度,但它将能够利用函数的线性。也绝对尝试NLopt for Python。他们有很多无梯度优化器;试试大华;这也是鲍威尔的创意(通过二次近似进行无约束优化)。
非常简单:N-CG 算法依赖于计算 Hessian,而你的 Hessian 似乎计算起来非常昂贵。NLCG 和 BFGS 不需要它,尽管它们可能会在第一步中尝试计算一次。
我故意省略了单纯形算法,因为它是完全不同的野兽。与渐变无关。试试看,但我真的不能评论它;这实际上取决于您的问题的性质。
对于数值优化的第一个很好的参考,CTKelly 的《优化的迭代方法》一书会让你走得很远,很好。