参数空间受约束时如何运行梯度下降算法?

Eri*_*rin 8 math optimization gradient function

我想用一个参数最大化一个函数.

所以我运行渐变下降(或者,实际上升):我从一个初始参数开始并继续添加渐变(一些学习速率因子变得越来越小),重新评估给定新参数的渐变,依此类推,直到收敛.

但是有一个问题:我的参数必须保持正值,因此它不应该变为<= 0,因为我的函数将是未定义的.我的渐变搜索有时会进入这样的区域(当它是正数时,渐变告诉它要低一些,并且它会超过).

更糟糕的是,在这一点上的渐变可能是负面的,从而使搜索更加负面的参数值.(原因是目标函数包含日志,但梯度不包含.)

什么是处理这种约束优化问题的好(简单)算法?我希望只是对我的算法进行简单的修复.或者可能忽略渐变并进行某种线搜索以获得最佳参数?

Vic*_*Liu 10

  1. 每次更新参数时,请检查它是否为负数,如果是,则将其钳制为零.
  2. 如果不能接受钳制到零,请尝试添加"log-barrier"(Google it).基本上,它为您的目标函数添加了一个平滑的"柔和"墙(并修改了渐变),使其远离您不希望它去的区域.然后,通过强化墙壁使其更加无限垂直,重复运行优化,但从先前找到的解决方案开始.在限制中(实际上只需要几次迭代),您解决的问题与具有硬约束的原始问题相同.


ire*_*ses 4

如果不了解您的问题,很难给出具体的建议。您的梯度上升算法可能不太适合您的函数空间。然而,鉴于这就是您所拥有的,这里有一个可能会有所帮助的调整。

您正在遵循您认为的上升梯度。但当你沿着梯度的方向前进时,你发现自己掉进了负值的坑里。这意味着附近有一个局部最大值,但也有一个非常陡峭的负梯度悬崖。明显的解决方法是回溯到之前的位置,并采取较小的步骤(例如一半大小)。如果您仍然陷入困境,请以更小的步骤重复。这将迭代,直到您在悬崖边缘找到局部最大值。

问题是,不能保证你的局部最大值实际上是全局的(除非你对你的函数的了解比你所分享的更多)。这是朴素梯度上升的主要限制——它总是固定在第一个局部最大值上并收敛到它。如果您不想切换到更强大的算法,一种可以提供帮助的简单方法是运行代码的n次迭代,每次从函数空间中的随机位置开始,并保持总体上找到的最佳最大值。这种蒙特卡罗方法增加了您偶然发现全局最大值的可能性,但代价是运行时间增加了n倍。其效果如何取决于目标函数的“凹凸程度”。