向基于梯度的优化器提供近似梯度没有用吗?


9

如果只能提供数值梯度,使用基于梯度的优化算法是否毫无意义?如果不是,为什么对优化库本身执行有限微分很简单,那么为什么要首先提供一个数值梯度呢?

[编辑]

  • 需要澄清的是,我的问题的确比一般的应用更笼统。尽管我的应用领域恰好是各种统计框架下的似然优化。

  • 我与自动区分的问题在于,似乎总是有一个陷阱。要么AD库无法传播到外部库调用(例如BLAS),要么您不得不如此大刀阔斧地改写工作流程,以致于难以处理……尤其是在使用类型敏感语言的情况下。我对AD的了解完全是另外一个问题。但是我想相信!

  • 我想我需要更好地提出我的问题,但是我做的很糟糕。如果可以选择使用无导数优化算法或基于导数的优化算法,但需要注意的是,我只能给它一个数值梯度,平均而言哪一个更好?


2
您是否要问为什么要提供解析梯度而不是仅使用有限差分来计算近似梯度?
spektr

1
换句话说,我的问题是,假设您的方程式对您计算解析梯度而言过于复杂,依赖于梯度的优化算法是否还能优于根本不需要梯度的算法?
bigglesworth教授16年

这是您在上面提出的另一个问题。您也许可以通过其他方法(例如有限元)来计算数值导数。
nicoguaro

1
@nicoguaro是的,在使用偏微分方程进行优化的情况下,确实是这样(并且这是我的研究领域之一,也是我的第一个想法)。但是这个问题没有提到那个方向的任何东西(在这种普遍性上,我认为更有用)。
克里斯蒂安·克拉森

1
同样,即使在那种情况下,这也是一个合理的问题:如果您的PDE(系统)如此复杂以至于您无法导出要通过数值求解以获得梯度的伴随方程,该怎么办?(这些事情可能变得非常令人讨厌,尤其是在涉及非标准边界条件的情况下。)
Christian Clason

Answers:


11

为了补充Brian的出色回答,让我介绍一下(教育)背景。无导数优化方法被定义为仅使用函数求值的方法,基本上是“或多或少地系统地对可允许集合进行采样并保存最佳函数值”的所有变体,这就是给定信息能做的。这些方法可以大致细分为

  1. 随机方法,样本的选择基本上是随机的(意味着随机性是至关重要的组成部分;可以有其他确定性组成部分)。这些方法通常是由物理或生物过程激发的,并具有相应的名称,例如“模拟退火”,“遗传算法”或“粒子群/萤火虫/蚁丘方法”。除了“如果您尝试足够长的时间,您将很有可能击中所有点(包括最小化点),则几乎没有收敛理论。1“(是否会发生-与任何可能性-前宇宙热寂是另一回事......)作为一个数学家,我会考虑这些方法作为最后的手段:如果你不知道什么你功能,这就是您所能做的,您可能会很幸运。

  2. 确定性方法,其中样本的选择不是随机的,即仅基于先前的功能评估。最著名的例子可能是Nelder-Mead单纯形法。其他人正在生成集合搜索方法。重要的是要意识到,只有当函数值在不同点之间存在任何(可解释的)关系时(即函数的某种平滑度),这才起作用。实际上,例如Nelder-Mead方法的收敛理论是基于构造一个非均匀的基于单纯形顶点上的函数值的梯度的有限差分近似,并表明当单纯形收缩到一个点时,梯度收敛到精确的梯度和零。(基于标准有限差分近似的变量称为罗盘搜索。)

  3. 基于模型的方法,其中函数值用于构建函数的局部模型(例如,通过插值法),然后使用标准(基于梯度/基于Hessian的)方法将其最小化。由于有限差分近似等于多项式插值的精确导数,因此经典的“数值梯度”方法也属于此类。

如您所见,这些类之间的界限是可变的,并且通常只是解释问题。但是道德应该很明确:确保使用所有关于最小化功能的可用信息。引用Cornelius Lanczos的话:

缺乏信息无法通过任何数学手段来弥补。

毕竟,如果你不知道什么对你的作用,它也可能是完全随机的,并最小化的随机值是傻瓜的差事......


17

如果您的目标是平滑的,则对导数使用有限差分近似通常比使用无导数优化算法更有效。如果您具有精确计算导数的代码,那么通常最好使用该代码,而不要使用有限差分近似。

尽管某些优化库会使用启发式方法自动为您计算有限差分近似值,以确定步长参数,但最好是使用您自己的例程来计算有限差分近似值,这是因为您更了解适当的步长或您的代码可以利用的功能中的特殊结构。

经常值得考虑的另一种选择是使用自动微分技术来生成一个子例程,该子例程从源代码计算出解析导数,以计算目标函数本身。


3
+1 自动区分。这通常比使用先验符号表示梯度或使用有限差分近似要好得多。
大约

我也建议使用自动区分。对于fortran,请尝试基于源转换的INRIA Sophia-Antipolis的Tapenade。对于C / C ++,还有更多选择,例如adol-c,adept,sacado(Trilinos的一部分)。所有这些都是基于操作员重载并且易于使用,尽管对于非常大的问题不是很有效。
cfdlab '16

在某些情况下,可能很难应用自动微分(AD),但是复杂的阶跃微分有时可能与AD几乎相同(除了能够通过反向模式立即计算整个梯度之外) (AD)的规定可能适用且相对容易实施。
马克·L·斯通

回答修改后的问题:如果您的目标是平滑的(如果不是,则使用基于导数的优化算法是没有意义的),并且变量的数量是否相当小(在PDE约束优化中使用有限差分导数不起作用) ),那么您很有可能会使用具有有限差分近似的基于导数的优化方法,而不是使用DFO技术。
Brian Borchers

4

您的问题询问基于梯度的优化器,所以我认为Brian是正确的。由于我目前正为此而苦苦挣扎,所以我只愿分享一些问题。

具有有限差异的问题是:1)性能,因为您必须为每个维度重新评估函数; 2)选择合适的步长可能很棘手。如果步幅太大,则函数线性的假设可能不成立。如果步幅太小,则由于导数会放大噪声,因此它可能会遇到函数本身的噪声。如果函数涉及求解微分方程,则后者可能是一个真正的问题。如果可以解析地或使用灵敏度方程式来计算梯度,那么它肯定会更准确甚至更快。

如果您还没有在软件上投入太多时间,则可以尝试另一种方法,那就是使用复杂的算法来运行它。这就是所谓的复步微分法。基本思想是在评估函数时,如果希望其相对于参数X的梯度,则将X的虚部设置为非常小的eps。完成计算后,函数值的虚部除以eps就是相对于X的渐变。当您想要相对于Y的渐变时,您当然必须重新做一遍。有趣的是,eps可以做得很小。它起作用的原因是微分算术的一般规则被精确地反映在复杂算术规则中。

就是说,我认为它不是万能药,因为在复杂的算术中执行复杂的函数并不总是那么容易,如果可以通过解析来计算梯度,则不值得,并且在微分方程的情况下,它完全等同于灵敏度方程。,这是我在必要时要做的。


我认为主要好处之一是,您无需在此复杂的有限差分公式中进行任何减法运算。不久前,当我阅读一篇论文讨论这种方法的推导时,与其他有限差分公式相比,它们似乎在实验上得到了验证。这种差异允许在舍入误差成为问题之前选择较小的步长。
spektr

@choward:对。就是这样。我对此表示怀疑。我的一些同事似乎认为这是神奇的子弹。我怀疑它等于灵敏度方程,我的一位同事是应用数学家,对此进行了证明。
Mike Dunlavey

灵敏度方程式很酷。这是一种有趣的方法,但是当然可以权衡其实现。假设要使用它,则必须定义函数的复杂版本,然后执行其他复杂的变量代数/计算,这会使每个函数的求值时间更长。这是您必须弄清楚,较慢的功能评估是否值得增加的导数精度的事情之一。
spektr 2016年

@choward:这就是我得出的结论,此外,我们通常会优化向量,这意味着需要重复评估。当然,另一种选择是灵敏度方程式很难推导。我使用符号区分,但是它们仍然很棘手。整个主题有点像雷区。
Mike Dunlavey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.