我试图使用梯度下降找到N个参数中的函数的最小值。然而,我想这样做,同时将参数的绝对值之和限制为1(或< = 1,无关紧要)。由于这个原因,我使用了拉格朗日乘数的方法,所以如果我的函数是f(x),我将最小化f(x)+ lambda *(g(x)-1)其中g(x)是平滑近似值参数绝对值的总和。
据我所知,当g(x)= 1时,此函数的渐变仅为0,因此找到局部最小值的方法应该找到满足条件的函数的最小值。问题是这个加法我的函数无限制,因此Gradient Descent只是找到越来越大的lambdas,其参数越来越大(绝对值)并且永远不会收敛。
目前我正在使用CG的python(scipy)实现,所以我真的更喜欢不要求我自己重新编写/调整CG代码但使用现有方法的建议。
答案 0 :(得分:23)
问题在于,当使用拉格朗日乘数时,关键点不会出现在拉格朗日的局部最小值 - 它们发生在鞍点处。由于梯度下降算法旨在找到局部最小值,因此在给出约束问题时它无法收敛。
通常有三种解决方案:
就我个人而言,我会选择第三种方法,如果它很难得到拉格朗日的渐变,那么就可以找到拉格朗日梯度的平方渐变。
另外,你没有在你的问题中明确表达 - 你是使用渐变下降还是CG(共轭渐变)?
答案 1 :(得分:5)
对OP有所帮助可能为时已晚,但在相同情况下可能对其他人有用:
绝对值约束的问题通常可以通过添加一些“辅助”变量重新表述为只有线性约束的等效问题。
例如,考虑问题1:
查找(x1,x2)使f(x1,x2)最小化受非线性约束| x1 | + | x2 |< = 10。
存在线性约束版本,问题2:
查找(x1,x2,x3,x4),根据以下线性约束最小化f(x1,x2):
注意:
因此,找到问题2的最优值将为问题1提供最佳选择,反之亦然。
答案 2 :(得分:1)
我发现1988年写的一篇题为“约束差分优化”的旧论文确实很好而且很容易。
在那篇论文中,作者声称对于拉格朗日算子: L(x,b)= f(x)+ b g(x)
通过在x上进行梯度下降而在b上进行梯度“上升” ,您最终将收敛到L(x,b)的固定点,这是f(x的局部最小值)在g(x)= 0的约束下。还可以结合使用惩罚方法来使收敛更快,更稳定。
通常只需反转b的梯度即可。
我已经在几种简单的情况下尝试过了,并且可以正常工作,尽管在阅读了这篇论文后我并不太明白为什么。