solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}, default: ‘liblinear’php
Algorithm to use in the optimization problem.web
- For small datasets, ‘liblinear’ is a good choice, whereas ‘sag’ is
faster for large ones.算法
- For multiclass problems, only ‘newton-cg’, ‘sag’ and ‘lbfgs’ handle
multinomial loss; ‘liblinear’ is limited to one-versus-rest schemes.网络
‘newton-cg’, ‘lbfgs’ and ‘sag’ only handle L2 penalty.app
Note that ‘sag’ fast convergence is only guaranteed on features with approximately the same scale. You can preprocess the data with a scaler from sklearn.preprocessing. # 故,要归一化框架
Ref: 从浅层模型到深度模型:概览机器学习优化算法less
首先,咱们推导出一个监督学习问题的公式,并说明它是如何基于上下文和基本假设产生各类优化问题。机器学习
而后,咱们讨论这些优化问题的一些显著特征,重点讨论 logistic 回归和深层神经网络训练的案例。ide
本文的后半部分重点介绍几种优化算法,函数
机器学习以统计学和计算机科学为基础,以数学优化方法为核心。
本文试图概述机器学习学习算法而打破三者之间的理解障碍。
当 L 和 r 是关于 w 的任意凸函数时,能够运用在本节中讨论的方法来解决问题(11):
这一类中包含不少机器学习模型,包括支持向量机、Lasso(Least Absolute Shrinkage and Selection Operator)、稀疏逆协方差选择等。
为了每一步都能具体(展示出来),此处咱们指定以二分类的正则化logistic回归为例(进行讲解)。
为了简化例子中的符号,咱们做不失通常性的假设,令。(此处省去了偏置项 b0),这一省略操做能够经过在输入向量上增长一维恒为 1 的特征值来弥补)。
当 w 和 x 都是 d 维时就能够令其为特定的凸优化问题。
值得一提的是,对于此类问题,正则化项必不可少。想想为何说它必不可少,假设对于全部的 i ∈{1,...,n},有参数向量 w,知足 yi(wT*xi) > 0 以及(存在)无界射线 {θw : θ > 0}。那问题就很明朗了,在这个例子中,当 θ →∞时,
也就是说函数(式 12)没法取最小值。另外一方面,经过增长(强制)正则化函数 r,能够保证问题(12)将具备最优解。
【可参见 Ridge regression】
对于正则化函数 r,咱们将会参考经常使用选择和 r(w) = ||w||1。
不过为了简单起见,咱们一般会选择前者,由于它使得公式 12 对于每个因子是连续可微的。
相反,r(w) = ||w||1 会致使非平滑问题,为此,(实现)函数最小化就须要更复杂的算法。
【效果更好,例如感知压缩,但更为复杂】
2.1 一阶方法
2.1.1 梯度降低法
从概念上讲,最小化光滑凸目标的最简单的方法是梯度降低法,具体分析参见 [ 62 ]。在这种方法中,从初始化估计值 w0 开始,经过下述公式迭代地更新权重估计值。
其中 αk > 0 是一个步长参数。步长序列 {αk} 的选择直接决定此算法的性能。在优化研究领域,人们广泛认为,在每次迭代中采用线性搜索来肯定 {αk },能够为解决各类类型的问题找到一个性能优越的算法。【学习率的调节】
然而,对于机器学习应用程序来讲,这种运算成本高昂,由于每次函数 F 的计算都须要传递整个数据集,若是 n 过大,极可能带来高昂的(训练)成本。
好在当每一个α 都设置为一个正的常数α且它是一个足够小的固定值时,从理论上分析,该算法的收敛性仍能够获得保证。
(固定的步长常数在机器学习领域叫作学习率。但即便不是常数,也有人把αK 或整个序列 {αK } 叫作学习率)。该算法的收敛速度取决于函数 f 是强凸函数仍是弱凸函数。【陡不陡的问题】
【用于解决 L1 范数正则化的logistic回归问题的梯度降低】和【加速梯度降低拓展算法】分别被称做 ISTA 和 FISTA。
咱们观察到,在这种状况下,即便λ> 0,目标函数也不会是强凸函数。只有目标函数为凸时 [5],ISTA 和 FISTA 具备与其对应的平滑函数相同的次线性收敛速度。
梯度降低在 ML 训练过程当中的一个重要特性就是计算出每次迭代中求解函数 F 的梯度的运算成本。
在 ML 的训练过程当中,单个梯度计算的成本一般是 O(ND),这个确实能够看到,例如,在正则化项为的状况中,函数 F 关于每个特定的 w 的梯度是
2.1.2 随机梯度法
随机梯度法因为其用于最小化随机目标函数而在运筹学领域广为人知,同时也是 ML 社区中的一种特征优化算法。
该算法最初由 Robbins 和 Monro [ 67 ] 在解决随机方程组问题时提出,值得注意的是,它能够用于最小化具备良好收敛性的随机目标,并且每次迭代的计算复杂度仅为 O(d)而不是 O(nd)(梯度降低中的计算复杂度)。
在每一次迭代中,随机梯度法都会计算梯度 F(Wk)的无偏估计 GK。该估计能够以极低的代价计算获得;例如,对于公式(12),某次迭代的随机梯度可被求解为
其中 Sk 被称做小批量,它的全部元素都是从总数据集 {1,...,n} 中按均匀分布选出来的。接下来的运算相似于梯度降低:
毫无疑问,该算法的关键在于选择步长序列 {αk}。不一样于梯度降低,固定的步长(即学习率)不能保证算法会收敛到强凸函数 F 的最小值,而只保证收敛到最小值的邻域。
SGD 的收敛速度比梯度降低慢。尤为当函数 F 是强凸函数时,该算法只保证当 k ≥ O(1/ε) 时能够获得预期精度的解(即知足 E[F(wk)]-F(w) ≤ ε的解),而当函数 F 仅仅是凸函数时,只有在 k ≥ O(1/ε^2) [11] 时才能保证得出上述解。
另外一方面,正如前文说起的,若是 Sk 的大小由一个常数限定(独立于 n 或 k 的常数),那么 SGD 的每次的迭代成本都比梯度降低法小 0(n)倍。
然而,在实际运用中,标准的 SGD 并不必定是解决机器学习中优化问题的最有效方法。事实上,机器学习和优化算法领域在开发改进或替代 SGD 方面进行了大量的积极研究。在随后的两部分中,咱们将讨论两类方法:方差缩减法和二阶方法。
可是在这两类方法之外,还有多种方法。例如,加有动量的 SGD 就是一个实践中被发现的性能好于标准 SGD 的拓展版 SGD。见下图算法 1
2.1.3 方差缩减法(Variance reducing method)
考虑到问题(11),人们发现经过利用目标 F 的结构做为 n 个函数的有限和再加上简单的凸函数项,能够改善 SGD 方法。目前已经研究出几种方法,如 SAG [74],SAGA [22],SDCA [76] 和 SVRG [44]。
为了方便引用,咱们把 SVRG 叫作算法 2。该算法在每一个外部迭代中执行一次完整的梯度计算,而后沿着随机方向再迭代 L 步,这是整个梯度的随机修正过程。内环步长 L(inner loop size)必须知足必定的条件以保证收敛 [ 44 ]。
SVRG,全称为随机方差减少梯度,其名称源自于该算法能够被视为 SGD 的方差减少变体(尤为是有限和最小化/finite-sum minimization)。
研究员经过结合 SVRG 和 SAGA 的一些思想,提出一个新的方法,叫作 SARAH。仅是内层迭代步长不一样于 SVRG,SARAH 的公式以下
该变化致使 ,使得 SARAH 中的步长不基于无偏梯度估计。不过,相对于 SVRG,它得到了改进的收敛特性。
表 2 : 最小化强凸函数的一阶方法计算复杂度
表 3 : 最小化通常凸函数的一阶方法计算复杂度
2.2 二阶方法和拟牛顿法
受肯定性优化研究领域几十年研究成果的激励,ML 优化中最活跃的研究领域之一就是关于如何使用二阶导数(即曲率)信息来加速训练。
However,当 n 或 d 很大时,在机器学习应用程序中,海塞矩阵(Hessian matrix)的计算和存储变得很是昂贵。
另外一类基于形如(21)模型的算法是拟牛顿方法:
有趣的是,这些方法没有计算出显式二阶导数,而是经过在每次迭代中应用低秩更新构造彻底由一阶导数的海塞近似矩阵。
例如,让咱们简要介绍最流行的拟牛顿算法,全称为 Broyden-Fletcher-Goldfarb-Shanno(BFGS)方法。
在这种方法中,咱们首先能够看到(21)的最小值为、进一步发现它实际上能够方便地计算出逆 Hessian 近似。
因为随着步长 sk = w_k+1 − wk 和位移 yk = ∇F(wk+1) − ∇F(wk) 的移动,有人选择
以最小化
以知足割线方程 sk = (B-1)yk。使用精心挑选的规范表达,这个问题的解析式能够显示的写成
其中之间的差别能够仅表示为二阶矩阵。
为方便引用,完整的经典 BFGS 算法被称为算法 3。
即便采用二阶信息,随机优化方法(无差别减小)也没法达到比次线性更快的收敛速度。
不过,使用二阶信息是一个不错的想法,由于若是海塞近似矩阵收敛于海塞矩阵的真实解,则能够减小收敛速度中的常数,同时还能够减小病态(ill-conditioning)的影响。
However,尽管已经观察到了实际的效率提高,但在理论上尚未一个真正的二阶方法,能够实现这样的提高。【实践好用,但未严格数学证实】
到目前为止,只要海塞(近似)矩阵保持良好特性,大多数实际的方法只能保证明现 SGD 的收敛(速率)特性。例如,若是序列 {Bk}(不必定由 BFGS 更新生成)对全部 k 知足:
此时具备与 SGD 相同的收敛速度属性。咱们就 能够合理地假设这些限定适用于上述讨论的方法,这些假设有适当的保障。
然而,在拟牛顿方法的背景下应该当心,其中随机梯度估计可能与海塞近似相关。
沿着这些方向进行的主要进展包括深层神经网络(DNN)的运用。机器学习的一个相应的分支称为深度学习(或分层学习),它表明了一类试图经过使用包含连续线性和非线性变换的多层次深层图来构造数据中高层次抽象的算法。
近年来科学家们已经研究了各类神经网络类型,包括【全链接神经网络】(FNN),【卷积神经网络】(CNN) 和【循环神经网络】(RNN)。对于咱们来讲,将主要关注前两类神经网络,同时留意其它网络。
3.1 问题公式化
3.2 随机梯度降低法
咱们引用如下内容来强调将优化算法应用于训练 DNN 的使人困惑的反应。首先,例如在 [11] 中,有一个结论代表:
经过应用 SGD 来最小化非凸目标函数(一直从输入×输出空间绘制),能够保证预期梯度风险将消失,至少在一个子序列上是这样,即:。
这一结论使人欣慰,这代表 SGD 能够实现与其余最早进的基于梯度的优化算法相似的收敛保证。
然而,尽管文献中的种种保证是有局限性的; 毕竟,尽管许多基于梯度的优化算法确保目标函数单调减小,但 SG 并不以这种方式计算。
所以,若是一个子序列收敛到一个固定点,那么咱们怎么能肯定该点不是鞍点,或者是有偏差局部最小值,亦或是一些目标值比初始点差的最大值?事实上,咱们并不能确定。也就是说,SGD 方法一般擅长找到局部极小值,而不是全局最小值。另外一方面,SGD 每每会在固定值附近减缓收敛速度,这可能会阻碍它在深度神经网络中发展。
通常来讲,对于非凸问题,SGD 的收敛速度记录在 [29,30],可是它们很是有限,特别是它们不适用于§1.3 中的讨论。所以,咱们不能以一样的方式争论 SGD 是机器学习中非凸优化问题的最佳方法。此外,下式
中的学习界限是没有用的,由于对于许多 DNN 和 CNN,由神经网络产生的分类的复杂度 C 比训练样本数 n 大得多。
事实上,在 [90] 中,经验代表,只有这些集合中的数据随机扰动,神经网络才能轻易地超过典型的数据集类型。
3.3 海塞-自由优化方法(Hessian-free method)
有研究者发现咱们能够修改 DNN 的反向传播算法来计算这样的海塞-矢量乘积,由于它们能够被看做是方向导数 [65]。
计算这种乘积的复杂度只是比计算梯度多一个常数因子。所获得的类的方法一般被称为海塞-自由优化方法,由于当访问和使用 Hessian 信息时,没有显式地存储 Hessian 矩阵。
因为目标函数的非凸性,在 DNN 的状况中出现了其它的问题,真正的海塞矩阵可能不是正定矩阵。
通常来讲,在肯定性优化中,处理这个问题的两种可能的方法是修改海森矩阵和运用置信域(trust region)方法。这两种方法都在训练 DNN 的状况中探讨过,
例如,在 [54,55] 中,提出了一种高斯牛顿法,其在(11)中函数 F 的 Hessian 的公式中的第一项近似于 Hessian 矩阵(省略了正则化项)
其中是关于第一个参数的损失函数 l(·, ·) 的海塞矩阵,∇p(w, xi) 是 dy-维函数 p(w, x) 对于权重 w 的雅可比式,∇^2 [pj (w, xi)] for all j ∈ {1, . . . , dy} 是关于 w 的按元素运算的海塞矩阵。
3.4 子采样海森方法(Subsampled Hessian method)
最近,在一系列论文(3, 15, 34)中,研究员们利用一个很通常的随机模型框架,对凸区域和非凸情形下的置信域、线搜索和自适应三次正则化方法进行了分析。在这项工做中,它代表:
只要 梯度 和 Hessian 估计 是足够准确的一些正几率,使用随机不精确梯度和 Hessian 信息的标准优化方法就能够保留其收敛速度。
在机器学习和采样 Hessian 和梯度的状况下,结果只要求| SK |必须选择足够大的相对于该算法采起的步骤的长度。例如,在 [ 3, 34 ],| SK |大小与置信域半径的关系。
须要注意的是,对于采样的海塞矩阵,其对样本集的大小要求比采样的梯度要高得多,所以支持使用精确梯度的海塞估计的思想催生了强大的算法,它拥有强大理论支撑和良好的实践高效性
Ref: http://blog.csdn.net/njucp/article/details/50488869
下图是两种方法的图示表示,红色为牛顿降低法,绿色为梯度降低法,从图中直观的感受是,红色线短,降低速度快。由于牛顿降低法是用二次曲面去拟合当前的局部曲面,而梯度降低法是用平面去拟合当前的局部曲面,通常用二次曲面拟合的更好,因此通常牛顿算法收敛快。
关于以上的说法中,梯度降低法是用平面去拟合当前的局部曲面。梯度 f’(x)的方向是函数变大的方向。这里须要解释一下,对于一维状况而言,梯度方向只有正方向和负方向。至于为何梯度降低算法就是用平面去拟合了,大多数状况下,没有讲的详细。接下来就聊一下为何。
综上而言,牛顿降低法利用了函数的更多的信息,可以更好的拟合局部曲面,因此收敛的速度也会加快。
Ref: Unconstrained optimization: L-BFGS and CG - ALGLIB
From the user's point of view these algorithms are very similar: they solve unconstrained problems, need function gradient, have similar convergence speed. It makes them interchangeable - if your program uses one algorithm, it can switch to another one with minimal changes in the source code. Both methods can be used for problems with dimensionality ranging from 1 to thousands and even tens of thousands.
However, differences exist too:
In the first part of our experiment we've compared performance of ALGLIB implementations of CG and L-BFGS (with m=8). We've got following results:
Following conclusions can be made. First, when measured in function evaluations, CG is inferior to L-BFGS. However, this drawback is important only when function/gradient are hard to compute.
But if function and its gradient are easy to compute, CG will be better than L-BFGS. 【Function,梯度好计算时使用CG】
Ref: LIBLINEAR -- A Library for Large Linear Classification
There are some large data for which with/without nonlinear mappings gives similar performances.
Without using kernels, one can quickly train a much larger set via a linear classifier. Document classification is one such application.
In the following example (20,242 instances and 47,236 features; available on LIBSVM data sets), the cross-validation time is significantly reduced by using LIBLINEAR:
% time libsvm-2.85/svm-train -c 4 -t 0 -e 0.1 -m 800 -v 5 rcv1_train.binary Cross Validation Accuracy = 96.8136%
345.569s % time liblinear-1.21/train -c 4 -e 0.1 -v 5 rcv1_train.binary Cross Validation Accuracy = 97.0161%
2.944s // 感受像直接带入公式计算的结果
Warning:While LIBLINEAR's default solver is very fast for document classification, it may be slow in other situations. See Appendix C of our SVM guide about using other solvers in LIBLINEAR.
Warning:If you are a beginner and your data sets are not large, you should consider LIBSVM first.
不少常见的机器学习模型的目标(好比最小二乘作线性回归、逻辑回归)均可以归纳成如下这种通常形式:
其中 表明样本
的损失函数,
是模型的参数,
表明正则化项(用于控制模型复杂度或者模型稀疏度等等),有些时候这个正则化项是不平滑的,也就是说它可能不可导。
暂时先不考虑这个正则化项,只考虑样本上的损失,而且对符号作一点简化(),考虑下面这个优化目标:
这个形式很是简单,只要每一个均可导,就能够用梯度降低法(Gradient Descent)迭代求解:
其中 表示第 t+1 次更新后的参数。
劣势:那就是每次须要求解全部样本的梯度,样本数多的时候,致使计算量大增,因此实际生产环境中,每每采用随机梯度降低算法(Stochastic Gradient Descent),通常简写作SGD。
SGD每次迭代的时候均匀随机得选择mini-batch (even少到一个样本) 作更新:
优点:就是能够减小每次更新的计算代价;
劣势:收敛速度不如梯度降低,也就是说为了达到一样的精度,SGD须要的总迭代次数要大于梯度降低。
可是,单次迭代的计算量要小得多。从收敛速度分析上看,
- SGD可以在目标函数强凸而且递减步长的状况下作到
的次线性收敛(sublinear convergence),
- 梯度降低则能够在目标函数强凸的状况下作到
(
) 的线性收敛(linear convergence)。
总结起来就是,若是想快速获得一个能够勉强接受的解,SGD比梯度降低更加合适,可是若是想获得一个精确度高的解,应当选择梯度降低。
SGD后来后来也衍生出了很是多的变种,尤为是一类分析regret的online算法,包括Adagrad、Dual Averaging、FTRL等。
可是,始终学术界对于SGD还有一种期待,就是:是否能够把SGD作到和梯度降低同样的线性收敛。直到2012和2013年,SAG[1]与SVRG[2]算法发表在NIPS上,成为近几年SGD类算法的最大突破。
SAG算法:
具体得说,更新的项来自于用新的梯度
替换掉
中的旧梯度
,这也就是
表达的意思。
如此,每次更新的时候仅仅须要计算一个样本的梯度,而不是全部样本的梯度。
计算开销与SGD无异,可是内存开销要大得多。
Roux, Nicolas L., Mark Schmidt, and Francis R. Bach. "A stochastic gradient method with an exponential convergence rate for finite training sets." Advances in Neural Information Processing Systems. 2012.
中已经证实SAG是一种线性收敛算法,这个速度远比SGD快。
实验目标函数是l2-regularized logistic regression,
注意左一的纵坐标是对数坐标,通常衡量优化算法的速度都会采用对数坐标,由于在对数坐标中能够明显看出一个算法是线性收敛(近乎直线降低)仍是次线性收敛(大致是一条向下凸的曲线)。
能够看出SAG是一种线性收敛算法,且相对于其余参与比较的算法有很大的优点。
SVRG的算法思路是:
相对于SAG来讲,不须要在内存中为每一个样本都维护一个梯度,也就是说节省了内存资源。
此外,SVRG中提出了一个很是重要的概念叫作 variance reduction(方差缩减),这个概念须要联系SGD的收敛性分析来理解,在SGD的收敛性分析中须要假设样本梯度的的方差是有常数上界的,然而正是由于这个常数上界致使了SGD没法线性收敛,
所以SVRG的收敛性分析中利用这种特殊的更新项来让方差有一个能够不断减小的上界,所以也就作到了线性收敛,这一点就是SVRG的核心,SAG的策略其实也与此相似(虽然证实过程不一样)。
SVRG显然是线性收敛算法,相对于SGD有很是大的优点,和SDCA具有同阶的速度。