具有约束的梯度下降(拉格朗日乘数)

时间:2012-09-05 15:17:40

标签: machine-learning gradient-descent

我试图使用梯度下降找到N个参数中的函数的最小值。然而,我想这样做,同时将参数的绝对值之和限制为1(或< = 1,无关紧要)。由于这个原因,我使用了拉格朗日乘数的方法,所以如果我的函数是f(x),我将最小化f(x)+ lambda *(g(x)-1)其中g(x)是平滑近似值参数绝对值的总和。

据我所知,当g(x)= 1时,此函数的渐变仅为0,因此找到局部最小值的方法应该找到满足条件的函数的最小值。问题是这个加法我的函数无限制,因此Gradient Descent只是找到越来越大的lambdas,其参数越来越大(绝对值)并且永远不会收敛。

目前我正在使用CG的python(scipy)实现,所以我真的更喜欢不要求我自己重新编写/调整CG代码但使用现有方法的建议。

3 个答案:

答案 0 :(得分:23)

问题在于,当使用拉格朗日乘数时,关键点不会出现在拉格朗日的局部最小值 - 它们发生在鞍点处。由于梯度下降算法旨在找到局部最小值,因此在给出约束问题时它无法收敛。

通常有三种解决方案:

  • 使用能够找到鞍点的数值方法,例如:牛顿的方法。然而,这些通常需要渐变和Hessian的解析表达式。
  • 使用惩罚方法。在这里,您可以在成本函数中添加一个额外的(平滑)项,当约束满足(或接近满足)时为零,而当不满足约束时则为非常大。然后你可以像往常一样运行梯度下降。然而,这通常具有较差的收敛性,因为它进行了许多小的调整以确保参数满足约束条件。
  • 不是寻找拉格朗日的临界点,而是最小化拉格朗日梯度的平方。显然,如果拉格朗日量的所有导数都为零,那么梯度的平方将为零,并且由于某些东西的平方永远不会小于零,您将找到与拉格朗日极值相同的解决方案。但是,如果你想使用渐变下降,那么你需要一个拉格朗日渐变平方渐变的表达式,这可能不容易找到。

就我个人而言,我会选择第三种方法,如果它很难得到拉格朗日的渐变,那么就可以找到拉格朗日梯度的平方渐变。

另外,你没有在你的问题中明确表达 - 你是使用渐变下降还是CG(共轭渐变)?

答案 1 :(得分:5)

对OP有所帮助可能为时已晚,但在相同情况下可能对其他人有用:

绝对值约束的问题通常可以通过添加一些“辅助”变量重新表述为只有线性约束的等效问题。

例如,考虑问题1:

查找(x1,x2)使f(x1,x2)最小化受非线性约束| x1 | + | x2 |< = 10。

存在线性约束版本,问题2:

查找(x1,x2,x3,x4),根据以下线性约束最小化f(x1,x2):

  1. X1&LT = X3
  2. -x1&LT = X3
  3. X2&LT = X4
  4. -x2&LT = X4
  5. X3 + X4,LT = 10
  6. 注意:

    • 如果(x1,x2,x3,x4)满足问题2的约束,则(x1,x2)满足问题1的约束(因为x3> = abs(x1),x4> = abs(x2))
    • 如果(x1,x2)满足问题1的约束,那么我们可以通过设置x3 = abs(x1),x4 = abs(x2)<来扩展到满足问题2约束的(x1,x2,x3,x4) / LI>
    • x3,x4对目标函数没有影响

    因此,找到问题2的最优值将为问题1提供最佳选择,反之亦然。

答案 2 :(得分:1)

我发现1988年写的一篇题为“约束差分优化”的旧论文确实很好而且很容易。

在那篇论文中,作者声称对于拉格朗日算子: L(x,b)= f(x)+ b g(x)

通过在x上进行梯度下降而在b上进行梯度“上升” ,您最终将收敛到L(x,b)的固定点,这是f(x的局部最小值)在g(x)= 0的约束下。还可以结合使用惩罚方法来使收敛更快,更稳定。

通常只需反转b的梯度即可。

我已经在几种简单的情况下尝试过了,并且可以正常工作,尽管在阅读了这篇论文后我并不太明白为什么。