是否有任何特定于学习者的优化器?

数据挖掘 机器学习 算法 优化
2022-03-09 12:45:15

在阅读机器学习 (ML) 并通过一些基本示例进行操作时,在我看来,大多数学习算法都使用通用优化器。我使用“优化器”这个词来描述学习者用来最小化损失函数的技术。梯度体面,它的变体,似乎是最常见的。但 ML 的总体思路似乎是不断迭代学习算法,每次调整各种事物以尝试改善损失。

梯度体面和类似技术是通用的,因为它们适用于各种学习模型。这很直观,您所需要的只是预测值和已知目标值。

但是,与通用技术的权衡通常是,虽然它们在任何地方都可以工作,但它们很慢。换句话说,理论上你可以构建一个特定于学习器的优化器,利用学习算法的特性来避免像 SGD 这样的东西可能必须做的一些工作。因此,如果您知道您将使用学习算法 XYZ,那么也许您可以通过使用专门为学习器 XYZ 设计的损失最小化技术来显着加快计算速度。

作为一个粗略的类比,由于我的背景是编程,请考虑排序算法。快速排序经常被认为是最好的通用排序算法。但是,如果您事先知道您的数据在某些方面受到限制,那么在给定特定用例的情况下,其他算法会更快(如果条件合适,即使是好的旧冒泡排序也可以很快!)。

那么,问题来了:是否已经开发了特定于学习者的优化器?(还有一个相关的问题,“优化器”是在这里使用的正确词吗?)

(FWIW,我在Kaggle Q&A上发布了同样的问题,但没有得到任何回复。)

1个回答

我会争辩说不同的机器学习算法使用不同的优化算法。线性回归有一个直接的解决方案(XX)1XY. 对于逻辑回归,sklearn python 库使用 Liblinear C++ 库。该库使用“信任区域牛顿法”。带有反向传播的 SGD(随机梯度下降)主要用于神经网络,在实现我的第一个神经网络之前我没有听说过它们。LightGBM 和 XGBoost 使用他们自己发明的启发式方法来构建决策树。

一般来说,大多数 ML 算法都很快。如果训练时间以秒为单位,则无需优化算法执行时间。如果训练时间实际上是几年(谷歌最近发表的关于神经网络的论文,他们使用了数百个 GPU 和 CPU),那么你肯定会开始考虑速度优化。

SGD 应该不如其他算法,因为它只使用一阶导数。神经网络的问题是梯度变化太快,二阶导数的计算成本太高(有论文对其进行基准测试)。SGD 专门针对具有动量计算的神经网络进行了优化,并在网络停止训练后降低了学习率。不断尝试改进它,例如 ADAM。但是 ADAM 仍然被认为在验证集上表现更差(有一篇关于它的大型基准论文)。

有一些论文尝试使用神经网络来选择下降的方向,而不是使用 SGD。论文显示速度有一些边际改进,但算法仍未用作主要优化方法。

神经网络尝试了许多其他算法。例如,遗传算法。有些论文将 SGD 中的“随机”概念用于遗传算法。根据他们的基准,他们达到了 SGD 速度的 1/10。他们认为,最好的神经网络很大程度上受 SGD 找到最小值的能力的影响(例如带有残差链接的 ResNet)。但是,如果您选择遗传算法,那么也许可以使用 SGD 实际失败的更复杂的神经网络。

在如何调用算法方面。

我更喜欢“优化算法”或“用于训练的算法”这个名称。但是对于某些 ML 方法,“优化算法”听起来是错误的。LightGBM 和 XGBoost 具有相当复杂的构建树的算法,它们在优化分数(对数损失或平方和)和使用其他算法来对抗过度拟合之间取得平衡。决策树可以训练为零错误,但它们是验证集的最差预测因子之一。LightGBM 和 XGBoost 不会将它们的错误减少到零,因此可以在 Kaggle 上使用结构化数据赢得大多数机器学习竞赛。