我想知道Coordinate Descent和Gradient Descent这两种算法的不同用例是什么。
我知道坐标下降存在函数不平滑的问题,但是它已用于诸如SVM和LASSO的流行算法中。
但是我认为梯度下降法得到了更广泛的应用,尤其是随着人工神经网络的兴起以及许多其他机器学习任务的出现。
我的问题是:哪种类型的问题适合一种而不是另一种,在这方面,什么使SVM和LASSO的坐标下降适合,而对ANN的梯度下降适合?
选择优化算法时,应该如何在两者之间进行选择?
我想知道Coordinate Descent和Gradient Descent这两种算法的不同用例是什么。
我知道坐标下降存在函数不平滑的问题,但是它已用于诸如SVM和LASSO的流行算法中。
但是我认为梯度下降法得到了更广泛的应用,尤其是随着人工神经网络的兴起以及许多其他机器学习任务的出现。
我的问题是:哪种类型的问题适合一种而不是另一种,在这方面,什么使SVM和LASSO的坐标下降适合,而对ANN的梯度下降适合?
选择优化算法时,应该如何在两者之间进行选择?
Answers:
我认为通常要算出函数的平滑部分和/或罚分的近端算符的梯度是多么简单/容易。
有时候,对于一个变量(或一个块或多个变量)而言,找到问题的精确解决方案要比对所有变量同时进行求解要容易得多。有时,与单个导数相比,计算梯度太昂贵了。同样,坐标下降的收敛与ista ,其中k是迭代次数,但与ISTA和FISTA相比,有时可能表现更好,请参见例如 http://statweb.stanford。 edu /〜tibs / comparison.txt。
例如,这样的事情将影响与ISTA / FISTA相比的协调下降选择。
坐标下降一次更新一个参数,而梯度下降则尝试一次更新所有参数。
很难确切说明一种算法何时会比另一种算法更好。例如,我很震惊地得知协调下降是LASSO的最新技术。我不是唯一的一个。见幻灯片17。
话虽如此,有些功能可以使问题更易于协调以降低血统:
(1)快速的条件更新。如果由于某种原因该问题允许人们非常快速地对参数进行单独优化,则可以使用坐标下降法。例如,一个人可能仅能使用数据的子集来更新某些参数,从而大大降低了这些更新的计算成本。另一种情况是,如果有一个针对单个参数的封闭式解决方案,则以所有其他参数的值为条件。
(2)相对独立的参数模式。如果一个参数的最佳值完全独立于其他参数的值,那么将经过一轮坐标下降来求解(假设每个坐标更新都能找到当前模式)。另一方面,如果给定参数的模式高度依赖于其他参数值,则坐标下降很有可能随时间推移而增加,每轮更新很少。
不幸的是,对于大多数问题,(2)不成立,因此与其他算法相比,坐标下降效果很好。我相信它对LASSO表现良好的原因是,人们可以使用许多技巧来制定条件(1)。
我意识到这是一个古老的问题,并且有一些很好的答案。我想分享一些实际的个人经验。
这实际上是很多问题。对于梯度下降,通常通过惩罚函数处理约束。在这里它不起作用。一旦值违反这些约束之一,您的代码通常会引发各种数字错误。因此,必须从未真正允许优化算法遍历它来处理约束。
您可以将多种变换应用于您的问题,以满足约束条件,以允许梯度下降。但是,如果您正在寻找最简单,最懒惰的方法来实现此目标,那么协调下降是最好的方法:
对于像我这样使用Python的人来说,这通常意味着我必须使用附加的for循环,这会对性能产生负面影响。梯度下降使我可以使用经过优化的Numpy。使用它可以获得一个很好的速度,但是使用坐标下降法是无法实现的,因此我通常使用某种变换技术。
因此,结论实际上是,坐标下降是处理非常严格的约束(例如泊松分布中的速率参数)的最简单选择。如果它变为负数,则您编码为抱怨等。
我希望这能增加一些见识。