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具有同階的速度。