从优化的梯度信息的角度看,优化算法一般可分为三类:first-order optimization methods(一阶优化方法)以随机梯度下降算法为代表、high-order optimization methods(高阶优化方法)以牛顿法为代表、 heuristic derivative-free optimization methods(启发式无导数优化方法)以坐标下降法为代表。
一、一阶方法
方法 | 内容 | 优势 | 劣势 |
GD | 沿梯度下降方向求解最优值。该方法以线性速度收敛。 | 当目标函数为凸函数时,解是全局最优解。 | 每次参数更新都需要计算总样本的梯度,计算成本较高。 |
SGD | 更新参数是使用随机抽样的小批量计算的。该方法以次线性速率收敛。 | 每次更新的计算时间不依赖于训练样本的总数,节省了大量的计算成本。 | 选择合适的学习率是困难的,对所有参数使用相同的学习率是不合适的。在某些情况下,结果可能被困在鞍点。 |
NAG | 通过积累之前的梯度作为动量来加速当前的梯度下降,并使用动量执行梯度更新过程。 | 当梯度方向改变时,动量可以减缓更新速度,减小振荡;当梯度方向不变时,动量可以加速参数更新。动量有助于跳出局部最优解。 | 选择一个合适的学习率是很困难的。 |
AdaGrad | 学习率根据所有历史梯度的平方和进行自适应调整。 | 在训练早期,累积梯度较小,学习率较大,学习速度较快。该方法适用于处理稀疏梯度问题。各参数的学习率自适应调整。 | 随着训练时间的增加,累积梯度会越来越大,使得学习率趋于零,导致参数更新无效。手动学习率仍然是需要的。它不适用于处理非凸问题。 |
AdaDelta/ RMSProp | 将总梯度积累的方式改为指数移动平均。 | 改善AdaGrad后期学习无效的问题。它适用于非平稳和非凸问题的优化。 | 在训练后期,更新过程可能会在局部最小值附近重复。 |
Adam | 将自适应方法和动量方法相结合。利用梯度的一阶矩估计和二阶矩估计,动态调整各参数的学习率。添加偏差修正。 | 梯度下降过程相对稳定。它适用于大多数具有大数据集和高维空间的非凸优化问题。 | 该方法在某些情况下可能不收敛。 |
SAG | 每个样本的旧梯度和所有样本的梯度总和保存在内存中。对于每次更新,随机选择一个样本,重新计算梯度和作为更新方向。 | 该方法是一种线性收敛算法,速度比SGD快得多。 | 该方法只适用于光滑函数和凸函数,需要存储每个样本的梯度。它不便于应用于非凸神经网络。 |
SVRG | 不是保存每个样本的梯度,而是定期保存平均梯度。梯度和在每次迭代中通过计算相对于随机选择的样本的旧参数和当前参数的梯度来更新。 | 该方法不需要维护内存中的所有梯度,从而节省了内存资源。这是一个线性收敛算法。 | 将其应用于更大/更深的神经网络,其训练成本是一个关键问题,仍需要进一步的研究。 |
ADMM | 该方法通过在目标上增加惩罚项,将变量分解为可迭代求解的子问题,求解具有线性约束的优化问题。 | 该方法利用凸优化问题中的可分离算子,将一个大问题划分为多个可分布式求解的小问题。该框架在大多数大规模优化问题中是实用的。 | 原始残差和对偶残差都与惩罚参数有关,而惩罚参数的值很难确定。 |
Frank-Wolfe | 该方法用线性函数逼近目标函数,求解线性规划寻找可行下降方向,并在可行域内沿方向进行一维搜索。 | 该方法可以求解具有线性约束的优化问题,在迭代初期收敛速度快。 | 这种方法在后面的阶段收敛得很慢。当迭代点接近最优解时,目标函数的搜索方向和梯度趋于正交。这样的方向不是最好的向下方向。 |
二、高阶方法
方法 | 内容 | 优势 | 劣势 |
Conjugate Gradient (共轭梯度) | 它是一种介于一阶梯度法和二阶梯度法之间的优化方法。利用已知点的梯度构造一组共轭方向,沿共轭方向搜索目标函数的最小点。 | CG法只计算一阶梯度,但收敛速度比最陡下降法快。 | 与一阶梯度法相比,共轭梯度法的计算更为复杂。 |
Newton’s Method (牛顿法) | 牛顿法计算Hessian矩阵的逆矩阵,比一阶梯度下降法收敛更快。 | 牛顿法采用二阶梯度信息,收敛速度比一阶梯度法快。牛顿方法在一定条件下具有二次收敛性。 | 每次迭代计算和存储Hessian矩阵的逆矩阵需要较长的计算时间和较大的存储空间。 |
Quasi-Newton Method(拟牛顿法) | 拟牛顿法用一个近似矩阵来近似Hessian矩阵或其逆矩阵。常用的拟牛顿方法有DFP、BFGS和LBFGS。 | 拟牛顿法不需要计算Hessian矩阵的逆矩阵,减少了计算时间。在一般情况下,拟牛顿方法可以实现超线性收敛。 | 拟牛顿方法需要较大的存储空间,不适合处理大规模问题的优化。 |
Sochastic Quasi- Newton Method | 随机拟牛顿法采用随机优化技术。有代表性的方法有online-LBFGS和SQN。 | 随机拟牛顿方法可以处理大规模机器学习问题。 | 与随机梯度法相比,随机拟牛顿法的计算更为复杂。 |
Hessian Free Method | HF方法利用共轭梯度进行次优化,避免了昂贵的逆Hessian矩阵计算。 | HF方法可以利用二阶梯度信息,但不需要直接计算Hessian矩阵。因此,它适用于高维优化。 | 在HF方法中,矩阵向量积的计算成本随着训练数据量的增加而线性增加。它不适用于大规模的问题。 |
Sub-sampled Hessian Free Method | 下采样Hessian自由法在更新过程中使用随机梯度和下采样Hessian矢量。 | 下采样HF方法可以处理大规模机器学习优化问题。 | 与随机梯度法相比,该方法计算更复杂,每次迭代需要更多的计算时间。 |
Natural Gradient | 自然梯度的基本思想是在预测函数空间而不是参数空间中构造梯度下降算法。 | 自然梯度利用参数空间的黎曼结构来调整更新方向,更适合于寻找目标函数的极值。 | 在自然梯度法中,费希尔信息矩阵的计算比较复杂。 |
三、无导数优化法
无导数优化的思路主要分为以下两种:
一种是使用启发式算法。它以经验法则为特征,包括经典的模拟退火算法,遗传算法,蚁群算法和粒子群优化。这些启发式方法通常会产生近似的全局最优值。
另一种是根据目标函数的样本来拟合一个函数。这种类型的方法通常将一些约束条件附加到搜索空间以得出样本。坐标下降法是一种典型的无导数算法。它是针对多变量函数的无导数优化算法。其思想是可以沿每个轴方向顺序执行一维搜索,以获得每个维的更新值。
四、公共优化工具包
工具包 | 语言 | 描述 |
CVX | Matlab | CVX是一个基于matlab的凸优化建模系统,但不能处理大规模问题。 |
CVXPY | Python | CVXPY是由斯坦福大学凸优化组开发的python包,用于解决凸优化问题。 |
CVXOPT | Python | CVXOPT可用于处理凸优化。它是由Martin Andersen, Joachim Dahl, LievenV andenberghe开发的。 |
APM | Python | APM python适用于大规模优化,可以解决线性规划、二次规划、整数规划、非线性优化等问题。 |
SPAMS | C++ | SPAMS是一个用于解决各种稀疏估计问题的优化工具箱,由Julien Mairal开发和维护。可用的接口包括matlab、R、python和c++。 |
minConf | Matlab | minConf可用于优化受简单参数约束的可微多元函数。它是一组matlab函数,其中有很多方法可供选择。 https://www.cs.ubc.ca/∼schmidtm/Software/minConf.html |
tf.train.optimizer | Python; C++; CUDA | 基本优化类,通常不直接调用它,经常使用它的子类。它包括经典的优化算法,如梯度下降和AdaGrad。 https://www.tensorflow.org/api guides/python/train |