机器学习的优化要点

王语嫣 2022-10-21
203

概述

数据科学/机器学习/深度学习有 4 个数学先决条件(或者我们称之为“基本要素”),即:

  1. 概率与统计
  2. 线性代数
  3. 多元微积分
  4. 凸优化

介绍

在本文中,我们将讨论以下问题:

  1. 我为什么要关心 ML 中的优化?
  2. DS/ML/DL 中的优化在哪里使用?
  3. 什么是凸函数?
  4. 究竟什么是优化,它与其他数学问题有何不同?
  5. 有哪些不同类型的优化问题?
  6. 我们如何“解决”优化问题?
  7. 应该使用哪种方法来解决什么样的优化问题?
  8. 你能用机器学习算法展示“优化在行动”吗?
  9. 更多关于 ML/DL 域中使用优化的示例?
  10. 除了 ML/DL 域之外,优化还用在了哪里?

1. 我为什么要关心 ML 中的优化?

事实上,在每个机器学习(和深度学习)算法的背后,都涉及到一些优化。好吧,让我举个最简单的例子。考虑以下 3 个数据点:

熟悉机器学习的人都会立刻意识到,我们将 X1 称为自变量(也称为“ 特征 ”或 “属性”), 而 Y 是因变量(也称为 “目标” “结果” )。 因此,任何机器的总体任务都是找到 X1 和 Y 之间的关系。这种关系实际上是机器从 DATA 中 “学习” 的,因此我们称之为机器学习。我们人类从我们的经验中学习,同样,同样的经验以数据的形式输入机器。

现在,假设我们要通过上述 3 个数据点找到最佳拟合线。下图以蓝色圆圈显示这 3 个数据点。还显示了红线(带正方形),我们称其为通过这 3 个数据点的“ 最佳拟合线”。 此外,我还展示了一个“不合适的-


净目标是找到 最佳拟合直线 的方程 (通过上表中提到的这 3 个数据点)。

是最佳拟合线的方程(上图中的红线)。
其中 w1 = 直线的斜率; w0 = 直线的截距
在机器学习中,这种最佳拟合也称为 线性 回归 (LR) 模型,而 w0 和 w1 也称为 模型权重或模型系数

线性回归模型 (Y^) 的预测值在上图中用红色方块表示。当然,预测值与 Y 的实际值(蓝色圆圈)并不完全相同,垂直差异表示预测中的误差:

对于任何第 i 个数据点。
现在我声称这条最佳拟合线将具有最小的预测误差(在所有可能的无限随机“不良拟合”线中)。所有数据点的总误差表示为 均方误差 (MSE) 函数 , 对于最佳拟合线而言,它将是 最小值。

N = 总数 数据集中的数据点数(在当前情况下为 3)
最小化或最大化任何数量在数学上称为 优化问题, 因此解决方案(存在最小值/最大值的点)被 称为 最优 变量。

2. DS/ML/DL 中的优化在哪里?

监督学习任务有两种类型:回归和分类。

在回归问题 中,目标是找到穿过大多数数据点的“最佳拟合”线(基本上,最佳拟合线将捕获 X 和 Y 之间的模式/关系),并且将具有最小值误差函数(也称为 成本函数或损失函数 ),通常是均方误差 (MSE)。为什么只有 MSE,为什么不简单的误差总和或绝对误差的平均值将在另一篇文章中讨论。因此,如上一节所述,净目标是找到具有该误差函数最小值的线。下表列出了在最常用的回归器算法中被最小化的误差函数。

除了上面的列表,一些 ML 和 DL 算法也使用 Huber 损失。

在分类问题 中,目标是找到 “最佳分离”超平面 ,本质上是一条在数据点“之间”通过的线(或曲线),以便能够将大部分数据点分成 2 个或更多类。在这种情况下,我们希望最小化分类错误(对于错误标记的数据点)。根据分类器 (ML) 算法的类型,该分类错误再次以多种形式表示,下表总结了相同的内容。

实际上,在深度学习架构 中,您可以创建自定义的神经网络并根据问题选择您的损失函数(所有可用的损失函数都在此链接中列出: https ://keras.io/api/losses/ )

3. 什么是凸函数?

既然我们有一个合理的想法,即优化处理最大化或最小化一个数量,那么基本问题可以最大化或最小化任何数学函数吗?简单回答是不。数学函数是严格单调的,没有任何最大值/最小值。(例如,平方函数 y = x^2 或指数函数 y=e^x)。

凸函数具有最小值(在给定范围内),而严格凸函数将只有一个最小值(在整个范围内)。单个变量的凸函数的示例包括二次函数 (x^2) 和指数函数 (e^x)。在机器学习中,我们更喜欢损失函数不仅是凸的,而且是连续的和可微的。例如,LASSO 回归 (SSE + lambda*L1-Norm) 的损失函数是凸的,而 Ridge 回归 (MSE/SSE + lambda*square of L2-norm) 的损失函数是 严格凸 的,类似于使用的 MSE 损失函数在线性回归中。

类似地,凹函数将具有最大值。 您可以在此处 阅读有关凸函数和凹函数 的更多信息。

4. 什么是优化,它与其他数学问题有何不同?

考虑求多项式 2x^2 – 3x + 1 的根的问题。多项式的根表示 x 的值,其中 f(x) = 0。从上图中可以看出,根是0.5 和 1.0。这种“确定性”问题不被视为优化问题。

任何涉及最大化或最小化任何物理量(可以数学计算/以某些变量的形式表示)的问题都被定义为优化问题。

数学上,

读作 “找到 f(x) 的最小值”, 是一个优化问题。这里 f(x) 被称为 目标函数 (在我们的机器学习中被称为损失函数或成本函数),这里的变量“x”被称为“ 决策变量”。

还有下面

读作 “找到 f(x) 具有最小值的参数 x”, 也是一个优化问题。我们所有的机器学习优化都属于这种类型!

5. 有哪些不同类型的优化问题?

通常有两种类型的优化问题:约束和无约束。

x 的值既没有任何“ 界限 ”(例如,x 必须是一个正数,或者它应该在 0 和 10 之间,等等),也没有任何类型的约束需要满足。

线性回归是无约束优化的一个例子,由下式给出:

说,对于给定的 X,Y 数据,找到 MSE 损失函数(在上面的等式 3 中给出)具有最小值的最佳权 ( wj ) 首先请参阅文章开头的表格)。L(wj) 代表 MSE 损失,模型权重的函数,而不是 X 或 Y。请记住,X 和 Y 是您的数据,应该是常数!下标“j”代表第j个模型系数/权重。

(B) 约束优化: 例如

上面给出的“最小化 (x1-2)^2 + (x2-1)^2,受约束”。

满足所有约束的决策变量取值范围构成“ 可行区域 ”,最终的最优值将位于这些可行区域内。如果约束非常“硬”且相互矛盾,则给定的优化问题可能没有任何“可行的解决方案”。

https://en.wikipedia.org/wiki/Support-vector_machine#/media/File:SVM_margin.png

约束优化的一个例子是支持向量机 (SVM),它是一种通常用于分类的 ML 算法(尽管它也有一个回归变量)。默认情况下,支持向量分类器 (SVC) 尝试找到具有最大边距的分离超平面,并带有“硬约束”,即所有数据点都必须正确分类。但是,如果数据不是线性可分的,它可能不会导致任何解决方案。在这种情况下,我们使用“内核技巧”和/或使用 SVM 的软边距变体(由算法中的超参数 C 控制),损失函数为 Hinge Loss。有关 SVM 问题公式、损失函数和内核技巧的更多详细信息可以在本文中找到。 https://www.analyticsvidhya.com/blog/2021/10/support-vector-machinessvm-a-complete-guide-for-beginners/

6. 我们如何“解决”优化问题?

通常有两种方法可以解决大多数最复杂的数值/科学问题:

  • 分析方法: 这是通常在学校/大学教学大纲中教给我们的“纸笔”理论方法。这些方法将为任何可解决的适定数学问题提供“精确”解决方案。例如,如果我们被要求找到函数 f(x) = 2x^2 – 3x + 1 值等于 0 的 x 值(通常称为多项式的“根”),我们知道已经被教导求解通用 2 次多项式 ax^2 + bx + c = 0 的根,由下式给出:

  • 数值方法方法: 通常,在这种方法中,我们从一个猜测值作为解开始,然后执行一些计算(在这种情况下,评估函数 f(x),然后在每次迭代中“改进”解,直到我们得到期望的结果(称为 收敛 )。例如,如果将容差设置为 0.0001,则当 f(x) <= 0.0001 的值时迭代将停止,并且整个优化过程被称为收敛到最优解。典型的“寻零”数值方法包括牛顿法、正割法、布伦特法和二分法。您还可以使用欧拉法和有限差分法迭代求解微分方程。我建议 Steven Chapra 写一本很棒的书《工程师的数值方法》详细研究这个话题。

同样,为了解决优化问题,我们也有两种方法:

  • 分析方法: 其中一个示例是普通最小二乘法 (OLS),由 scikit 的 LinearRegression ( https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html ) 类使用Python 中的 -learn 包和 numpy polyfit 函数。如前所述,OLS 技术给出了最佳拟合线的精确系数(斜率和截距项)。
  • 迭代解决方案: 解决机器学习中优化问题的最流行的迭代方法是梯度下降算法及其变体,随机梯度下降和 MiniBatch 梯度下降。深度学习中还使用了更高级的变体,例如 RMSprop、Adam、Adadelta、Adagrad、Adamax 和 Nadam(请参阅 Keras 的此网页( https://keras.io/api/optimizers/ )。有几篇关于 Gradient 的文章在我们的 Analytics Vidhya 博客上下降。

除了基于 GD 的方法外,还有其他迭代方法可以解决受约束和不受约束的优化问题(请参阅 SciPy 文档页面: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize。最小化.html )

迭代求解器还包括一类“启发式”求解器,如遗传算法、粒子群优化 (PSO)、蚁群优化 (ACO) 和其他非贪心算法,如模拟退火 (SA)。

7. 应该使用哪种方法来解决什么样的优化问题?

对于无约束最小化,您可以使用共轭梯度 (CG)、牛顿共轭梯度或 Broyden、Fletcher、Goldfarb 和 Shanno 算法 (BFGS) 的准牛顿方法、Dog-leg Trust-region 算法、牛顿共轭等方法梯度信任区域算法,或牛顿 GLTR 信任区域算法。

我需要知道这一切吗?好吧,其中一些技术用于 ML 算法!例如,scikit-learn 库的 LogisticRegression 类 默认使用 BFGS 算法

同样,对于有界和无界的约束优化问题,我们有 Nelder-Mead、有限内存 BFGS(称为 L-BFGS)、鲍威尔方法、截断牛顿共轭梯度算法、序列最小二乘规划 (SLSQP) 等算法。

8. 最后,让我们看看“优化在行动”

(A) OLS 方法:
回到我们在文章开头介绍的示例数据集,在等式中替换 Y^。3、最终的MSE损失函数如下:

显然,L 是模型权重 (w0 & w1) 的函数,我们必须在最小化 L 时找到其最优值。最优值在下图中由 (*) 表示。

无需深入本文中的推导(计划在后续文章中),w0 和 w1 的最终最优值(其中 MSE 损失函数最小)由下式给出:



让我们使用 Python 代码进行计算:

import numpy as np
# define your X and Y as NumPy Arrays
X = np.array([1,3,5])
Y = np.array([4.8,12.4,15.5])
# np.polyfit function does a 1-dimensional Polynomial fitting
# and the np.poly1d function convers the polynomial coefficents 
# into a polynomila object that can be evaluated
p = np.poly1d(np.polyfit(X,Y,1))
print(p)
[OUTPUT]:
2.675 x + 2.875


您可以看到我们的“手动计算”值与使用 NumPy 获得的斜率和截距值非常匹配(小的差异是由于我们手动计算中的舍入误差)。我们还可以验证相同的 OLS 是否在 scikit-learn 包中的 LinearRegression 类的“幕后运行”,如下面的代码所示。

# import the LinearRegression class from scikit-learn package
from sklearn.linear_model import LinearRegression
LR = LinearRegression() # create an instance of the LinearRegression class
# define your X and Y as NumPy Arrays (column vectors)
X = np.array([1,3,5]).reshape(-1,1)
Y = np.array([4.8,12.4,15.5]).reshape(-1,1)
LR.fit(X,Y) # calculate the model coefficients
LR.intercept_ # the bias/intercept term (w0*)
[Output]: array([2.875])
LR.coef_ # the slope term (w1*)
[Output]: array([[2.675]])


(B) 求解优化问题的迭代方法

让我使用第 4 节中的示例来演示这一点,我在其中定义了一个函数 fx=2*x^2 – 3*x +1 并绘制了它。如果您看到该图,似乎在 0.7 和 0.8 之间有一个最小值。

fx = λ x: 2*x**2 - 3*x + 1
从 scipy.optimize 导入最小化
x0 = 0 # 对最小值的粗略猜测(可以从最初的图中获得)
解决方案 = 最小化(fx,x0)