发布日期:2024-05-13 来源: 网络 阅读量()
本文主要对机器学习中的优化方法进行系统的回顾和总结。首先描述了机器学习中的优化问题。然后,介绍了常用优化算法的原理以及优化算法在一些热门机器学习领域的应用和发展。 大多数机器学习算法的本质是建立一个优化模型,从给定的数据中学习目标函数中的参数。几乎所有的机器学习算法都可以表示成优化问题。根据建模目的以及需要解决的问题,机器学习算法分为以下几类: 对于监督学习(Supervised Learning),目标是找到一个最优映射函数 来最小化训练样本的损失函数,损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,可表示为如下优化问题: 结构风险损失函数是指经验风险损失函数加上正则,可以减轻过拟合,可表示为如下优化问题: 其中, 是训练样本量, 是映射函数的参数, 是样本 的特征向量, 是样本 对应的标签, 是损失函数。损失函数(loss function)是用来估量模型的预测值 与真实值 的不一致程度,它是一个非负实值函数,损失函数越小,通常模型性能越好。不同模型用的损失函数一般也不一样。监督学习中常用的损失函数如下: 半监督学习 (Semi-Supervised Learning,SSL) 属于无监督学习(没有任何标记的训练数据)和监督学习(完全标记的训练数据)之间。半监督学习利用少量有标签的数据和大量无标签的数据来训练模型。半监督学习算法可分为:self-training(自训练算法)、Graph-based Semi-supervised Learning(基于图的半监督算法)、Semi-supervised supported vector machine(半监督支持向量机,S3VM)等。其中,S3VM算法可以表示为如下优化问题: 其中, 是惩罚系数。 有标签的数据: 无标签的数据: 为了利用无标签的数据,在加了松弛变量 的支持向量机(SVM)的基础上,S3VM 添加了两个对无标签的数据的约束。令 为假设未标记的点属于类别1时的错分误差, 为假设未标记的点属于类别2时的错分误差。 目标是使有标签的误差 以及无标签的误差 最小。 S3VM 是非凸离散组合优化,求解难度大且很难获得全局最优解。 聚类算法将一组样本分成多个簇,保证同一簇内样本之间的差异尽可能小,不同簇内的样本尽可能不同。 K-means聚类算法可表示为如下优化问题: 其中, 是簇的个数, 是样本的特征向量, 是第 个簇的均值向量, 是第 个簇的样本集合。目标是让同一个簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。 在高维情形下会出现数据样本稀疏、距离计算困难等问题,即“维数灾难(curse of simensionality)”。缓解维数灾难的一个重要途径是降维(dimension reduction), 即通过某种数学变换将原始高维属性空间转变为一个低维 ”子空间“(subspace), 在这个子空间中样本密度大幅提高,距离计算也变得更为容易。 所以降维算法的目标是确保将数据投影到低维空间后,尽可能保留原始信息。 Principal component analysis (PCA)算法是一个经典的降维算法,可以表示为如下优化问题: 其中, 是样本量, 是 维的特征向量, 是 的重构向量, 维。 是 在 维坐标中的投影。 是 维坐标下的标准正交基。 概率模型中另一个常见的优化目标是最大化训练样本的对数似然函数 (MLE): 在贝叶斯方法的框架下,往往在参数 上假设一些先验分布,这也有缓解过拟合的作用。 强化学习与监督学习和无监督学习不同,旨在找到一个最优策略函数,其输出随环境而变化。强化学习主要分三种方法分别是:基于价值(value-based)、基于策略(policy-based)以及基于模型(model-based)的方法。 基于价值方法的目标是优化价值函数 : 是状态 下的价值函数值,是智能体可以预期的未来奖励积累总值: 其中, 是未来每一个时间步的奖励; 表示折扣率,在0和1之间: · 越大,折扣越小。表示智能体越在意长期的奖励 。 · 越小,折扣越大。表示智能体越在意短期的奖励 。 机器学习的主要步骤是建立模型假设,定义目标函数,求解目标函数的最大值或最小值来确定模型的参数。在这三个至关重要的步骤中,前两步是将机器学习的问题建模成最优化问题,第三步是通过优化算法求解出想要的模型。 机器学习中的最优化问题分为无约束的最优化问题,带等式约束的最优化问题,带不等式约束以及等式约束的最优化问题。 无约束的最优化问题: 至少一阶可微。 根据费马引理,可导函数的每一个可导的极值点都是驻点(函数的导数在该点为零): 驻点只是函数取得极值的必要条件而不是充分条件,但可以先找到驻点,再判断和筛选它们是不是极值点。无论是解析法,还是数值优化算法,一般都以找驻点作为找极值点的目标。在解析法中,对于一元函数,先求导数,然后求解令导数为0的方程可找到所有驻点。对于多元函数,对各个自变量求偏导数,令它们为0,解方程组,即可找到所有驻点。 带等式约束的最优化问题: 该问题一般使用 dual ascent (对偶上升法),即拉格朗日乘数法求解。 求解可得到 。为使 有解,约束的个数 应小于 的维数 ,否则对 的约束方程数将大于 的变量个数导致约束太强,各约束方程无法同时被满足而无解。 带不等式约束以及等式约束的最优化问题: 创建一般化的拉格朗日算子: 在极值点 处, 满足如下KKT条件: 条件 1 是对拉格朗日函数取极值的一个必要条件,条件2、3是原约束条件,条件 4 是拉格朗日系数约束(同等式情况),条件 5 是拉格朗日系数约束(不等式约束情况),条件 6 是互补松弛条件。 最优化问题可以通过解析法和数值法求解。相对数值法,解析法更快,并且能得到精确的解。 以线性回归模型为例:求解 和 使损失函数 最小化。 这是个无约束的优化问题,将 分别对 和 求导,得到: 令上面两个式子为0,可得到 和 的解析解: 但有时由于时间和硬件性能的限制或解析解是未知的时候,则必须采用数值法。比如,大多数机器学习的目标函数或约束都存在指数函数、对数函数之类的超越函数,梯度等于0的方程组是没法直接解出来的。对于这种无法直接求解的问题,只能采用近似的算法来求解,即数值优化算法。数值优化算法的有效性和效率极大地影响着机器学习模型的推广和应用。为了促进机器学习的发展,已经有一系列行之有效的优化方法被提出,提高机器学习方法的性能和效率。数值优化一般采用基于迭代的方法来求解一个问题的极值,即,首先确定一个初始点 ,然后基于前一步的结果确定下一步的解,最终求得的是目标函数驻点的一个近似点。 从数值优化中的梯度信息来看,数值优化方法可以分为三类: 首先介绍梯度下降法的发展(GD, SGD, NAG, AdaGrad, AdaDelta, RMSProp, Adam, SAG, SVRG)。接着介绍乘子交替方向法 (ADMM)和数值优化中的Frank-Wolfe方法。 梯度下降(Gradient Descent) 函数的梯度(gradient)指出了函数的最陡增长方向。按梯度的方向走,函数增长得最快。按梯度的负方向走,函数值降低得最快。 梯度下降的伪代码如下: 首先选择迭代法的初始点。接着选取迭代方向,也就是从当前点迭代的方向。梯度下降法选取当前点的梯度负方向 作为迭代方向,因为梯度的负方向是局部下降最快的方向。接着选择迭代步长 。更新 为 。 以线性回归为例,假设 是需要学习的函数, 是需要学习的参数, 是损失函数。目标是最小化如下损失函数: 其中, 是样本量; 是特征数量。梯度下降法交替执行以下两个步骤,直到收敛: (1)计算 关于 的梯度 (2) 更新 梯度下降法与最速下降法的对比 最速下降法的伪代码如下: 最速下降法的迭代思路是找泰勒一阶展开式 中,能使方向导数(Directional Derivative)最小的 。最速下降法的下降方向受到范数的限制,如果这里的范数取欧式范数(Euclidean Norm),则最速下降法与梯度法是一样的,所以梯度法是最速下降法使用欧式范数的特殊情况。但如果这里取其它范数,则会得到不同的结果。 随机梯度下降(Stochastic gradient descent, SGD) 随机梯度下降是批量梯度下降的一个变体,相对于批量梯度下降需要使用所有的样本进行更新,随机梯度下降每次更新只使用一个样本进行计算。还是以线性回归为例: 由于 SGD 每次迭代仅使用一个样本,因此每次迭代的计算复杂度为 ,其中 是特征数。当样本数 很大时,SGD 每次迭代的更新速率比批量梯度下降快得多。然而,SGD 由于随机选择引入的额外噪声会导致梯度方向振荡。因此需要的迭代次数将增加,而且得到的解可能并非最优解。 此外,如何选择学习率是梯度算法中的重要问题。学习率太小会导致收敛速度变慢,而学习率太大会阻碍收敛。解决这个问题的一种方法是设置一个预定义的学习率列表或学习率衰减公式,并在学习过程中调整学习率 。常用的学习率衰减方法: 其中, 为衰减率(超参数), 为将所有的训练样本完整过一遍的次数。 但是,这些列表或公式需要根据数据集的特性提前定义。对所有参数使用相同的学习率也是不合适的。 后续的NAG, AdaGrad, AdaDelta, RMSProp, Adam等算法就如何调整学习率,如何加快收敛速度,在搜索过程中如何防止陷入局部极小值的问题进行了进一步的优化。 Nesterov Accelerated Gradient Descent (NAG) 该算法通过累积之前的梯度作为动量来加速当前的梯度下降,并以动量进行梯度更新过程。在处理有噪声的梯度时,动量法可以加快收敛速度。动量算法引入变量 作为速度,表示参数在参数空间中运动的方向和速率。速度设为负梯度的指数加权平均。 指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,计算公式为: 其中, 是 时刻下的实际值, 是 时刻下加权平均后的值, 是权重。 动量算法更新变量 不仅用到梯度下降中的 ,还融入了过去更新的速度 : 其中, 是动量项的权重。如果当前梯度与之前的速度 平行,那么之前的速度可以加快本次搜索的速度。当学习率 较小时,适当的动量起到加速收敛的作用。如果梯度衰减到0,它将继续更新 以达到平衡,并会因摩擦而衰减。这有利于在训练过程中逃离局部最小值,从而使搜索过程可以更快地收敛。如果当前梯度与之前更新的 相反,则 的取值会对本次搜索产生减速效果。具有合适的动量项权重 的动量法可以减小学习率较大时收敛的振荡。然而,如果动量因子较小,很难获得提高收敛速度的效果。如果动量因子很大,当前点可能会跳出最优值点。许多实验已经根据经验验证了动量因子最合适的设置是 0.9。 然而,当优化问题的各变量尺度差异较大时,动量法在更新过程中会出现震荡问题,Nesterov算法给出了初步解决: 跟上面动量算法的唯一区别在于,梯度不是根据当前参数位置,而是根据先走了本来计划要走的一步后,达到的参数位置计算出来的。如果前面的梯度比当前位置的梯度大,则梯度下降的幅度比原来大一些,如果前面的梯度比现在的梯度小,则梯度下降的幅度比原来小一些。 Adaptive Learning Rate Method 自适应学习率方法(AdaGrad,AdaDelta,RMSProp,Adam)主要用来自动调整学习率。这些方法无需调参,收敛速度快,往往能取得不错的效果。它们广泛用于深度神经网络以处理优化问题。 AdaGrad SGD 最直接的改进是 AdaGrad,其主要思路是根据之前一些迭代中的历史梯度动态调整学习率。更新公式如下: 其中 是参数 在第 次迭代时的梯度, 是参数 在第 次迭代时的累积历史梯度, 是参数 在第 次迭代时的值。AdaGrad 与梯度下降的区别在于,在参数更新过程中,学习率不再是固定的,而是使用累积到本次迭代的所有历史梯度来计算的。 一般使用默认值 0.01。 虽然 AdaGrad 自适应调整学习率,但它仍然存在两个问题。 1)算法仍然需要手动设置全局学习率 。 2)随着训练时间的增加,累积的梯度会越来越大,使得学习率趋于零,导致参数更新无效。 RMSProp RMSProp 为解决学习率最终会归零的问题,改进了AdaGrad。相比AdaGrad方法累积所有历史梯度,RMSProp 只关注一段时间内窗口中的梯度,并使用指数移动平均计算二阶累积动量,即,将历史梯度平方值按照衰减之后再累加,将AdaGrad中的 改为下式: 其中 是人工设定的参数。RMSProp也需要人工指定的全局学习率 。 AdaDelta AdaDelta算法也像RMSProp算法一样,使用指数移动平均计算二阶累积动量: 与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量 ,其元素同样在时间步0时被初始化为0。AdaDelta 使用 来计算自变量的变化量: 其中, 是为了维持数值稳定性而添加的常数。接着更新自变量: 最后,使用 来记录自变量变化量 按元素平方的指数加权移动平均: 可以看到,如不考虑 的影响,AdaDelta算法与RMSProp算法的不同之处在于使用 来替代超参数 。 Adaptive moment estimation (Adam) Adam是另一种先进的 SGD 方法,它为每个参数引入自适应学习率。Adam 结合了自适应学习率和动量方法。除了如 AdaDelta 和 RMSProp 方法中存储过去梯度平方的指数衰减平均值 : Adam 还保留过去梯度的指数衰减平均值 ,类似于动量法: 其中 和 是指数衰减率。参数 的最终更新公式为: 、 和 的默认值建议分别设置为 0.9、0.999 和 。 Adam 在实践中表现良好,广泛应用于深度学习。 Alternating Direction Method of Multipliers(ADMM) 交替方向乘子法(Alternating Direction Method of Multipliers,ADMM)利用凸优化问题中的可分离算子,将一个大问题分解成多个可以分布式求解的小问题。即,利用ADMM算法可以将原问题的目标函数等价的分解成若干个可求解的子问题,然后并行求解每一个子问题,最后协调子问题的解得到原问题的全局解。理论上,ADMM的框架可以解决大部分的大规模优化问题。 考虑以下示例: 构造增广拉格朗日函数(augmented Lagrangian function): 惩罚参数 对 ADMM 算法的收敛速度有一定的影响。 越大,对约束项的惩罚越大。 Frank-Wolfe Method Frank-Wolfe Method 是一种求解线性约束下非线性规划问题的算法。其基本思想是将目标函数作线性近似,通过求解线性规划求得可行下降方向,并沿该方向在可行域内作一维搜索。这种方法又称作近似线性化方法。 考虑如下问题: 可用 来近似,将其带入上式: 等价于: 假设存在最优解 ,则如下式子必然成立: 所以 是 在 处的下降方向。 Frank-Wolfe 算法的伪代码如下: Frank-Wolfe 算法的特点是早期迭代收敛速度快,后期收敛速度较慢。当迭代点接近最优解时,搜索方向与目标函数的梯度方向趋于正交。这样的方向不是最好的向下方向,因此Frank-Wolfe算法可以在下降方向的选择上进行改进和扩展。 各一阶优化方法总结如下表: 二阶方法通过引入曲率信息,用于解决目标函数高度非线性的问题。二阶方法有: 牛顿法(Newton’s method) 牛顿法的基本思想是同时使用一阶导数(梯度)和二阶导数(Hessian矩阵),用二次函数逼近目标函数,然后求解二次函数的最小值。重复此过程,直到更新的变量收敛。 一维牛顿法迭代公式表示为: 其中, 是目标函数, 是步长。高维牛顿迭代公式为: 其中, 是 的 Hessian矩阵。牛顿法比梯度下降法有更快的收敛速度,但每次迭代时需要计算Hessian矩阵,运算量大。如果Hessian矩阵不可逆,则无法使用牛顿法。 拟牛顿法(Quasi-Newton method) 拟牛顿法是一种以牛顿法为基础设计的,求解非线性方程组或连续的最优化函数的零点或极大、极小值的算法。拟牛顿法可以解决牛顿法中雅可比矩阵或Hessian矩阵难以甚至无法计算的情况。其本质思想是用一个正定矩阵来逼近Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法是求解非线性优化问题最有效的方法之一。 与牛顿法相同,拟牛顿法是用一个二次函数来近似目标函数 , 的二阶泰勒展开为: 其中, 是 的梯度, 是Hessian矩阵 的近似。梯度 可用下式近似: 令上式等于0,得到Newton步长 : 拟牛顿法主要迭代步骤: 1) 2) 3) 计算新的迭代点下的梯度 4) 令 5) 利用 ,近似 ,近似的方法如下表: 启发式无导数优化方法(坐标轮换法 等)是一类不需要函数导数信息的方法,通过试算来寻找优化方向。 优势:对函数没有可微假设。 劣势:收敛速度往往很慢。 坐标轮换法(univariate search technique) 从某个初始点 出发,沿着各个坐标轴依次做一维搜索得 ,直到不再显著变化。 算法步骤: 1)选取初始点。设定 ,误差阈值 ,令 2)进行一维搜索。从 出发,沿坐标轴方向 进行一维搜索,求 使得 令 3) 检查迭代次数。若 ,则跳到步骤4,否则令 跳到步骤2 4) 检查终止准则。若 ,终止迭代输出 ,否则令 ,返回步骤2 参考文献: [1]Sun S, Cao Z, Zhu H, et al. A survey of optimization methods from a machine learning perspective[J]. IEEE transactions on cybernetics, 2019, 50(8): 3668-3681. [2]S. Boyd and L. Vandenberghe, Convex Optimization. Cambridge University Press, 2004.模型类型 损失函数 含义 优点 缺点 应用 分类模型 0-1损失函数 (zero-one Loss Function) 当预测错误时,损失函数为1,当预测正确时,损失函数值为0 能够直观地刻画分类的错误率 由于其非凸、非光滑的特点,使算法很难直接对该函数进行优化 感知机 分类模型 对数损失函数 / 交叉熵损失函数 (Cross-entropy Loss Function) 在二分类问题下,y 取值为0或1,输出的 f(x) 可以理解为1的概率 能非常好的表征概率分布 健壮性不强,相比于hinge loss对噪声更敏感 逻辑回归、神经网络 分类模型 指数损失函数(exponential Loss Function) 通过弱分类器投票进行强分类器的合成 序列性迭代决策;分类函数线介于square和log;对过拟合的情况不必担心 对离群点、噪声非常敏感;计算量较大 AdaBoost 分类模型 合页损失函数
(Hinge Loss Function)如果被分类正确,损失为0,否则损失为 1?yf(x) 更专注于整体的误差;健壮性相对较高,对异常点、噪声不敏感 没有太好的概率解释 SVM 回归模型 平方损失函数 (MSE) 选择使用欧式距离作为误差度量,计算残差的平方和 处处可导;梯度随误差变化,不需要额外调整学习率 对异常点敏感 回归 回归模型 绝对值损失函数 (MAE) 计算预测值与目标值的差的绝对值 对异常点不敏感;收敛速度快 在0处不连续;梯度固定,无论误差大小梯度都是一样的 回归 回归模型 Huber损失函数 当δ~ 0时,Huber损失会趋向MAE;当δ~ ∞,Huber损失会趋向于MSE 同时具备MSE和MAE这两种损失函数的优点;对异常值更鲁棒性 需要训练超参数δ,而且这个过程需要不断迭代 回归
首先构造拉格朗日乘子函数: 在极值点处, 拉格朗日乘子函数 对 和拉格朗日乘子变量的导数都为0:
增广拉格朗日函数是在拉格朗日函数后面加了个平方的正则项(系数 , ),主要是为了增加对偶上升方法的鲁棒性和放松目标严格凸(strictly convex)的要求。对 用dual ascent(对偶上升法):
ADMM 是在此基础上( 一起迭代)改成 单独交替迭代。即:
将前面的增广拉格朗日函数带入上式: 优化方法 性质 优点 缺点 GD 沿着梯度下降的方向求解最优值。该方法以线性速率收敛。 当目标函数是凸函数时,解是全局最优的。 每次参数更新都需要计算总样本的梯度,计算成本高。 SGD 更新参数是使用随机采样的小批量样本计算的。该方法以次线性速率收敛。 每次更新的计算时间不依赖于总的训练样本,节省了大量的计算成本。 很难选择合适的学习率,对所有参数使用相同的学习率不合适。在某些情况下,会陷入鞍点。 NAG 通过累积之前的梯度作为动量来加速当前的梯度下降,并以动量进行梯度更新过程。 当梯度方向发生变化时,动量可以减缓更新速度,减少振荡;当梯度方向保持不变时,动量可以加速参数更新。动量有助于跳出局部最优解。 很难选择合适的学习率。 AdaGrad 学习率根据所有历史梯度的平方和自适应调整。 在训练初期,累积梯度较小,学习率较大,学习速度较快。该方法适用于处理稀疏梯度问题。每个参数的学习率自适应调整。 随着训练时间的增加,累积梯度会越来越大,使得学习率趋于零,导致参数更新无效。需要手动调整学习率。不适合处理非凸问题。 AdaDelta / RMSProp 将总梯度累加的方式改为指数移动平均。 改善 AdaGrad 后期无效学习问题。适用于优化非平稳和非凸问题。 在后期训练阶段,可能会围绕局部最小值重复更新过程。 Adam 结合自适应方法和动量方法。利用梯度的一阶矩估计和二阶矩估计动态调整各参数的学习率。添加偏差校正。 梯度下降过程相对稳定。适用于大多数大数据集、高维空间的非凸优化问题。 在某些情况下,该方法可能不会收敛。 ADMM 该方法通过将线性约束作为惩罚项添加至目标,并将问题分成可以迭代解决的子问题来解决具有线性约束的优化问题。 该方法利用凸优化问题中的可分离算子将一个大问题分解成多个可以分布式求解的小问题。该框架在大多数大规模优化问题中都很实用。 原始残差和对偶残差都与惩罚系数有关,惩罚系数的值难以确定。 Frank-Wolfe 该方法用线性函数逼近目标函数,求解线性规划寻找可行的下降方向,并在可行域内沿该方向进行一维搜索。 该方法可以解决具有线性约束的优化问题,其收敛速度在早期迭代中很快。 该方法在后期阶段收敛缓慢。当迭代点接近最优解时,搜索方向与目标函数的梯度趋于正交。这样的方向不是好的下降方向。