2010-06-29 61 views
6

我想使用一个参数最大化功能。所以我运行梯度下降(或实际上升):我从一个初始参数开始,并继续添加梯度(乘以一些学习速率因子越来越小),重新评估给定新参数的梯度,直到收敛。如何在参数空间受限时运行梯度下降算法?

但有一个问题:我的参数必须保持积极,所以它不应该变成< = 0,因为我的函数将是未定义的。我的渐变搜索有时会进入这样的区域(当它是正面的时候,渐变告诉它会降低一些,并且会超调)。

而使事情变得更糟的是,这样一个点的梯度可能是负值,从而推动搜索走向更负面的参数值。 (原因是目标函数包含日志,但梯度没有。)

什么是一些很好的(简单)算法来处理这个约束优化问题?我希望对我的算法进行简单的修复。或者,也许可以忽略渐变并对最佳参数进行某种线搜索?

回答

3

不知道更多关于您的问题,很难给出具体的建议。您的渐变上升算法可能不适合您的功能空间。然而,鉴于这是你的,这是一个调整,将有所帮助。

你在追随你认为是上升的梯度。但是当你向着梯度方向前进时,你会发现你陷入了一个负值的坑中。这意味着有一个附近的局部最大值,但也是一个非常尖锐的负梯度悬崖。明显的解决办法是回到原来的位置,并采取较小的步骤(例如一半大小)。如果你还在,重复一个更小的步骤。这将迭代,直到你在悬崖边缘发现局部最大值。

问题是,不能保证你的本地最大值实际上是全局的(除非你比你共享的更多地了解你的功能)。这是天真梯度上升的主要限制 - 它总是固定在第一个局部最大值并收敛于它。如果你不想切换到更强大的算法,一个可能有用的简单方法是运行你的代码迭代,每次从函数空间中的随机位置开始,并保持整体最好的最大值。这种蒙特卡罗方法会增加您偶然发现全局最大值的几率,但会增加运行时间n。这是多么有效将取决于你的目标函数的“颠簸”。

2

将参数限制为正值的一个简单技巧是根据其对数重新设置问题(确保相应地更改梯度)。当然,这种转换可能会对最佳转换产生影响,并且搜索不会收敛。

8
  1. 每次更新参数时,请检查它是否为负值,如果是,则将其限制为零。
  2. 如果钳位为零是不可接受的,请尝试添加“对数屏障”(Google it)。基本上,它为您的目标功能(并修改您的渐变)添加了一个平滑的“软”墙,使其远离您不想要的区域。然后重复运行优化,通过加固墙来使其更加无限垂直,但是从之前找到的解决方案开始。在极限情况下(实际上只需要几次迭代),您正在解决的问题与具有严格约束的原始问题相同。
+0

+1对数惩罚法 – 2010-06-29 08:35:18

2

在每一步,限制参数为正。这是(简而言之)投影渐变法您可能想要谷歌。

2

我有三个建议,按照你想做多少思考和工作的顺序。

首先,在梯度下降/上升中,您每次移动梯度时间的某个因子,您称之为“学习率因子”。如果如你所描述的那样,这个举动导致x变成负数,有两种自然的解释:梯度太大或学习速率因子太大。由于您无法控制渐变,请采用第二种解释。检查你的移动是否会导致x变为负数,如果是这样,请将学习速率因子减半,然后重试。其次,要详细说明Aniko的答案,让x是你的参数,f(x)是你的函数。然后定义一个新的函数g(x)= f(e^x),并注意到虽然f的域是(0,无穷大),但g的域是(-infinity,infinity)。所以g不能承受f遭受的问题。使用梯度下降找到最大化g的值x_0。那么e ^(x_0),这是正数,使f最大化。为了在g上应用梯度下降,您需要通过链规则导出它的导数f'(e^x)* e^x。第三,这听起来像是你试图最大化一个函数,而不是写一个通用的最大化例程。您可以考虑搁置渐变下降,并根据您的特定功能的特性定制优化方法。我们必须更多地了解f的预期行为,以帮助您做到这一点。

0

你在这里得到了很好的答案。重新参数化是我会推荐的。另外,你有没有考虑另一种搜索方法,如Metropolis-Hastings?实际上,一旦你通过可怕的数学计算,它实际上很简单,它给你提供了标准的错误以及最佳的数据。

+0

大都会黑斯廷斯距离原来的问题是光年。 – 2010-06-29 14:17:44

+0

@亚历山大:第一句话说目标是最大限度地发挥功能。通过限制提案分发,可以容易地限制MH避免禁区。渐变可能是嘈杂和有问题的,特别是如果它们是通过有限差分来计算的,或者如果函数几乎是平坦的话。 – 2010-06-29 15:21:03

+0

MCMC方法(和相关的随机梯度方法)用于其他一切都失败的情况。没有迹象表明原始问题需要非确定性方法收敛不良。 – 2010-06-29 15:41:25

1

只需使用Brent's method for minimization。如果你只有一个参数,它是稳定和快速的,并且是正确的。这是R函数optimize使用的。该链接还包含一个简单的C++实现。是的,你可以给它MIN和MAX参数值限制。