优化是指找到目标函数的输入集,该输入集能产生最大化或最小化的函数评估值的问题。
这是许多机器学习算法的基础,从拟合逻辑回归模型到训练人工神经网络,这是一个具有挑战性的问题。
可能有数百种流行的优化算法,在流行的科学代码库中也有数十种算法可供选择。这可能会让人难以知道应考虑哪些算法来解决特定的优化问题。
在本教程中,您将发现一个优化算法的导览。
完成本教程后,您将了解:
- 优化算法可以分为使用导数和不使用导数两类。
- 经典算法使用目标函数的一阶导数,有时也使用二阶导数。
- 直接搜索和随机算法是为目标函数导数不可用的情况设计的。
启动您的项目,阅读我的新书《机器学习优化》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。
如何选择优化算法
摄影:Matthewjs007,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- 优化算法
- 可微分的目标函数
- 不可微分的目标函数
优化算法
优化是指找到函数输入参数或自变量,使得函数输出达到最小或最大的过程。
机器学习中最常见的优化问题是连续函数优化,其中函数的输入自变量是实值数值,例如浮点值。函数的输出也是输入值的实值评估。
我们可以将这类问题称为连续函数优化,以区别于接受离散变量的函数,后者称为组合优化问题。
有许多不同类型的优化算法可用于连续函数优化问题,并且有许多方法可以对它们进行分组和总结。
一种对优化算法进行分组的方法是基于被优化目标函数的可用信息量,这些信息量反过来可以被优化算法使用和利用。
一般来说,关于目标函数的信息越多,函数就越容易优化,前提是这些信息能够被有效地用于搜索。
或许优化算法的主要划分在于目标函数是否可以在某一点上进行微分。也就是说,对于给定的候选解,是否可以计算函数的一阶导数(梯度或斜率)。这会将算法分为可以利用计算出的梯度信息的算法和不能利用这些信息的算法。
- 可微分目标函数?
- 使用导数信息的算法。
- 不使用导数信息的算法。
在本教程中,我们将以此作为优化算法的主要分组依据,并探讨适用于可微分和不可微分目标函数的算法。
注意:这并非对连续函数优化算法的详尽介绍,但它确实涵盖了您作为普通从业者可能遇到的主要方法。
想要开始学习优化算法吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
可微分的目标函数
一个可微分函数是指对于输入空间中的任何给定点都可以计算其导数的函数。
函数在某一点的导数是指函数在该点的变化率或变化量。它通常被称为斜率。
- 一阶导数:在给定点的目标函数的变化率或变化速度。
对于具有多个输入变量(例如多变量输入)的函数的导数,通常称为梯度。
- 梯度:多变量连续目标函数的导数。
多变量目标函数的导数是一个向量,向量中的每个元素都称为偏导数,或者在所有其他变量保持不变的情况下,给定变量在该点的变化率。
- 偏导数:多变量目标函数导数的元素。
我们可以计算目标函数导数的导数,即目标函数变化率的变化率。这称为二阶导数。
- 二阶导数:目标函数导数的变化速率。
对于一个接受多个输入变量的函数,它是一个矩阵,并被称为 Hessian 矩阵。
- Hessian 矩阵:具有两个或多个输入变量的函数的二阶导数。
简单的可微分函数可以通过微积分进行解析优化。通常,我们感兴趣的目标函数无法通过解析求解。
如果可以计算目标函数的梯度,优化将变得更加容易,因此,对于使用导数的优化算法的研究比不使用导数的算法要多得多。
一些使用梯度信息的算法组包括
- 区间搜索算法
- 局部下降算法
- 一阶算法
- 二阶算法
注意:此分类法受到 2019 年出版的《优化算法》一书的启发。
让我们依次仔细看看每一个。
区间搜索算法
区间搜索优化算法适用于输入变量为单个的优化问题,且已知最优解存在于特定范围内。
区间搜索算法能够有效地在已知范围内导航并定位最优解,尽管它们只假设存在单个最优解(称为单峰目标函数)。
某些区间搜索算法可以在没有导数信息的情况下使用,如果其信息不可用的话。
区间搜索算法的示例包括
- 斐波那契搜索
- 黄金分割搜索
- 二分法
局部下降算法
局部下降优化算法适用于输入变量多于一个且存在单一全局最优解(例如单峰目标函数)的优化问题。
也许局部下降算法最常见的例子是线搜索算法。
- 线搜索
线搜索有许多变种(例如 Brent-Dekker 算法),但其过程通常涉及选择一个在搜索空间中移动的方向,然后在选定的方向上进行线或超平面的区间搜索。
重复此过程,直到无法再进行改进。
其局限性在于,优化搜索空间中的每个方向移动在计算上都很昂贵。
一阶算法
一阶优化算法明确地使用一阶导数(梯度)来选择搜索空间中移动的方向。
该过程首先计算函数的梯度,然后沿着相反方向(例如,对于最小化问题,沿着下坡方向)使用步长(也称为学习率)进行移动。
步长是一个超参数,用于控制在搜索空间中移动的距离,而“局部下降算法”则在每次方向移动时执行完整的线搜索。
步长太小会导致搜索耗时过长且可能陷入停滞,而步长太大则会导致搜索空间中的“之字形”或“来回跳跃”,从而完全错过最优解。
一阶算法通常被称为梯度下降,更具体的名称指的是对该过程的细微扩展,例如
- 梯度下降
- 动量
- Adagrad
- RMSProp
- Adam
梯度下降算法也为流行的随机版本算法提供了模板,称为随机梯度下降(SGD),用于训练人工神经网络(深度学习)模型。
重要的区别在于,梯度是使用训练数据上的预测误差来近似的,而不是直接计算的,例如使用单个样本(随机)、所有样本(批量)或一小部分训练数据(小批量)。
旨在加速梯度下降算法的扩展(动量等)可以并且通常与 SGD 一起使用。
- 随机梯度下降
- 批量梯度下降
- 小批量梯度下降
二阶算法
二阶优化算法明确地使用二阶导数(Hessian)来选择搜索空间中移动的方向。
这些算法仅适用于 Hessian 矩阵可以计算或近似的目标函数。
一元目标函数的二阶优化算法示例包括
- 牛顿法
- 割线法
多变量目标函数的二阶方法称为拟牛顿法。
- 拟牛顿法
有许多拟牛顿法,它们通常以算法的开发者命名,例如
- Davidson-Fletcher-Powell
- Broyden-Fletcher-Goldfarb-Shanno (BFGS)
- Limited-memory BFGS (L-BFGS)
现在我们熟悉了所谓的经典优化算法,接下来我们来看看在目标函数不可微分时使用的算法。
不可微分的目标函数
利用目标函数导数的优化算法快速高效。
然而,存在一些目标函数,由于各种实际原因,其导数无法计算,通常是因为函数过于复杂。或者导数可以在域的某些区域计算,但并非全部,或者导数不是一个好的指导。
上一节所述经典算法在目标函数方面的一些困难包括
- 函数没有解析描述(例如模拟)。
- 多个全局最优解(例如多峰)。
- 随机函数评估(例如噪声)。
- 不连续的目标函数(例如无效解的区域)。
因此,存在一些不要求一阶或二阶导数可用的优化算法。
这些算法有时被称为黑盒优化算法,因为它们对目标函数(相对于经典方法)的假设很少或没有。
这些算法的一个分组包括
- 直接算法
- 随机算法
- 群体算法
让我们依次仔细看看每一个。
直接算法
直接优化算法适用于无法计算导数的目标函数。
这些算法是确定性过程,通常假设目标函数只有一个全局最优解,例如单峰。
直接搜索方法通常也被称为“模式搜索”,因为它们可能会使用几何形状或决策(例如模式)来导航搜索空间。
梯度信息直接(因此得名)从目标函数比较搜索空间中点相对差异的结果中近似得到。然后使用这些直接估计来选择搜索空间中移动的方向并三角化最优解区域。
直接搜索算法的示例包括
- 循环坐标搜索
- Powell 方法
- Hooke-Jeeves 方法
- Nelder-Mead 单形搜索
随机算法
随机优化算法是使用搜索过程中的随机性来处理无法计算导数的目标函数的算法。
与确定性直接搜索方法不同,随机算法通常涉及更多的目标函数采样,但能够处理具有欺骗性局部最优解的问题。
随机优化算法包括
- 模拟退火
- 进化策略
- 交叉熵方法
群体算法
群体优化算法是随机优化算法,它们维护一个候选解池(一个群体),该群体一起用于采样、探索和逼近最优解。
这类算法适用于更具挑战性的目标问题,这些问题可能具有嘈杂的函数评估和许多全局最优解(多峰),并且使用其他方法找到一个好的或足够好的解决方案具有挑战性或不可行。
候选解池增加了搜索的鲁棒性,提高了克服局部最优解的可能性。
群体优化算法的示例包括
- 遗传算法
- 差分进化
- 粒子群优化
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
文章
总结
在本教程中,您了解了优化算法的导览。
具体来说,你学到了:
- 优化算法可以分为使用导数和不使用导数两类。
- 经典算法使用目标函数的一阶导数,有时也使用二阶导数。
- 直接搜索和随机算法是为目标函数导数不可用的情况设计的。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
为什么只使用 Adam 不是一个选项?您多久需要选择一个特定的优化器?
很好的问题!
Adam 对于训练神经网络非常有用,但对于其他优化问题,当我们拥有更多信息或响应曲面的形状更简单时,它就非常糟糕。
为您的目标函数使用正确的优化算法至关重要——我们不仅讨论拟合神经网络,而是更广泛地讨论所有类型的优化问题。
https://stackoverflow.com/questions/68072013/custom-loss-function-not-differentiable
有人能回答这个问题吗?
信息量很大。
先生,我的问题是关于哪种优化算法更适合优化股票市场的投资组合
抱歉,我不太了解金融。而且我不相信股市是可预测的
https://machinelearning.org.cn/faq/single-faq/can-you-help-me-with-machine-learning-for-finance-or-the-stock-market
也许可以格式化您的目标函数,然后可以先尝试一个随机优化算法。
我正在使用我自己的语言模型进行迁移学习,将其应用于另一个分类 LSTM 模型。SGD 优化器在语言模型中效果很好,但在 RNN 分类模型中,我很难用不同的优化器和学习率来收敛,您建议如何处理这种复杂的学习任务?
感谢您的文章!
好问题,我推荐这里的教程来诊断模型学习动态问题以及要尝试的技术。
https://machinelearning.org.cn/start-here/#better
我阅读了本教程,结果得到了一系列算法名称,但对它们的优缺点、复杂性一无所知。这简直是假的。
了解算法的工作原理不会帮助您选择最适合目标函数的算法。
了解其复杂性也不会有帮助。
不确定它为什么是假的——这是一个概述。也许进一步阅读部分中的资源能帮助您找到所需的内容。
您能为全局优化运行填充函数方法的算法代码,用 Python 吗?
嗨 Nashwa…请告诉我们您对建议的发现!
不是假的,但可以说细节较少
一步总结的优化算法课程……详情请
阅读书籍
同意。
我写了关于每种算法的教程,并已安排好,它们将在未来几周内出现在博客上。
你好。
您能运行差分进化算法的 Python 代码吗?
比如代码特征重要性得分?
是的,我写了一些关于差分演化的教程,并安排很快就会在博客上发布。
还有雅可比矩阵,因为您定义了 Hessian 矩阵。我只是很好奇。
当然
https://en.wikipedia.org/wiki/Jacobian_matrix_and_determinant
先生,我想做一个关于“农业生产中的多目标优化问题”的项目。那么哪种优化算法最适合我的工作呢?
也许您可以测试一套算法,找出最适合您特定问题的方法。
非常有用的概述
谢谢
不客气。
我写了一个名为 HumpDay 的包,它提供了六十种优化策略的 Elo 评分,这些策略来自所有流行的 Python 优化包。
https://www.microprediction.com/blog/humpday
干得好!
感谢分享。
嗨,Jason,
我有一些数值特征和一个称为操作成本的数值输出,对应于我数据集中的每条记录。我该如何在此处最小化成本?
您对数据有什么假设?如果我们假设特征和输出之间存在函数(例如线性),那么您可以先构建函数,然后对其进行最小化。如果存在随机性,那么您可能需要对特征进行一些预处理。
谢谢 Adrian,问题是如何构建那个目标函数,我们不知道它是线性的还是非线性的。我们只有一些特征影响成本(y)的例子,需要通过优化特征系数来最小化 y。
我想办法将拟合的模型用作目标函数,并优化模型以最小化 y。
是的,在优化之前您需要做一些假设。在极端情况下,如果我假设您的特征和输出完全无关,那么您就没有什么可优化的了。
特征与输出相关,但特征对之间没有依赖性。问题是我们如何最小化输出 y,而我们没有目标函数和约束,并希望通过单独优化输入特征来实现!
我有一个问题,在模拟一个工业过程之后,优化将是我的任务之一,
所以我有操作参数(决策)和最终产量(目标)(我可以为不同的场景生成数据以获得目标数据,通过试错来训练模型)。
然后我想构建一个机器学习模型,用它来优化/决定最佳操作参数。
我将使用元启发式模型,但我很难知道如何决定选择哪种算法?……我希望您能给我一些细节和建议。
嗨 Nigro…以下内容可能对您有所帮助
https://machinelearning.org.cn/combined-algorithm-selection-and-hyperparameter-optimization/
亲爱的 James,
非常感谢您的推荐,我完全是初学者,所以如果我理解正确,这意味着优化算法基本上是在构建了监督机器学习模型(例如多项式回归)之后才出现的。之后,优化算法被耦合起来。坦白说,我觉得我有点没抓住重点。
例如,对于优化,我将使用 GA(遗传算法),但这只是为了优化,而对于监督机器学习,我需要一个适合输入数据(变量/决策 – 操作参数)的模型,这意味着我必须从监督 ML 工具中进行选择,例如线性回归、逻辑回归、多项式回归等。
我的问题现在是,执行此操作的正确步骤是什么?
我非常感谢你们的帮助和努力。
嗨 Nigro…请澄清任何具体问题,以便我能更好地帮助您。
1- 优化算法如何与机器学习模型耦合?(但每一个都有自己的算法)
2- 假设,GA 被指定用于优化,那么构建 ML 模型还是实现 GA 哪个先来?如果这样,如何选择适合多目标优化 GA 的 ML 算法。
3- 设计一个能够优化多个目标的 ML 模型的逻辑步骤是什么?
非常感谢
Niro
嗨 Nigogo…以下内容会很有帮助
https://machinelearning.org.cn/optimization-for-machine-learning-crash-course/
非常有启发性的文章。你能给我推荐一下,对于带有约束的凸优化问题,应该使用哪种算法吗?
嗨 Jack……对于这类问题,你可能想研究一下贝叶斯优化。
https://machinelearning.org.cn/what-is-bayesian-optimization/
嗨
我想为CNN模型使用混合优化。你能推荐任何效果好的混合优化方法吗?我读了很多关于混合优化的文章。但不知道如何选择两种优化方法进行混合。有什么混合的标准吗?
嗨 Jeba……下面这篇论文是关于这个主题的绝佳入门。它还提供了一些很好的资源供你继续研究。
https://arxiv.org/ftp/arxiv/papers/2203/2203.00869.pdf
很棒的作品。现在,在我提出问题之前,请允许我提供一些背景信息:我是一名化学家,从事配方原型、实验室仪器校准和分析程序验证工作,这些都处于研发和SQC工业环境中。正如你可能猜到的,这些产品以及我们用来检查其质量的测量设备需要大量的微调。负责这些任务的领域被称为化学计量学,正如你可能知道的,它正是偏最小二乘回归方法论的诞生地。我就是从这里来的。因此,我们这些配方设计化学家都致力于在最短的时间、最少的精力和最少的资源内达到并发现最高质量的规格。简而言之,就是效率。这是我们的文化,也是整个业务的基础。但对我们来说,实验设计(Design of Experiments)和响应面方法(Response Surface Methodologies)过于局限,因为它们假设数据是统计独立的。实际上,反应器中混合的化学物质本质上是相互关联的。你可以处理多达20种成分和至少10个规格参数。数学上,这导致了极高的多重共线性,使得经典的响应面方法失效。DoE和RSM生成的回归模型是不可信的。因此,PLS应运而生。问题是,一旦我们得到了模型,优化规格的发现,即函数极大值和极小值的发现,就依赖于“黑箱”软件供应商。这很棒。直到它不那么棒为止。所以我的问题是:我非常想学习和探索,至少一点点,如何探索选项,测试、比较和选择最能描述我们产品规格的算法,以及看看它们各自有什么优势。我用R是因为它对我来说很容易,而且我很习惯。但现在看来,如果我必须这样做,我需要转向Python。而且必须使用PLS。(ANNs不是一个选项,因为我们的行业不倾向于使用它。)你对此怎么看?在你看来,什么算法,甚至更好的,哪些库是合适的?很棒的作品!谢谢你的时间和建议。
嗨 Victor……感谢你的反馈!以下位置是你开始机器学习之旅的绝佳起点,我们提供了相关内容。
https://machinelearning.org.cn/start-here/