[NN] Stochastic Gradient Descent - SAG & SVRG
solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}, default: ‘liblinear’
Algorithm to use in the optimization problem.
- 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.
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: 從淺層模型到深度模型:概覽機器學習優化算法
首先,我們推導出一個監督學習問題的公式,並說明它是如何基於上下文和基本假設產生各種優化問題。
然後,我們討論這些優化問題的一些顯著特征,重點討論 logistic 回歸和深層神經網絡訓練的案例。
本文的後半部分重點介紹幾種優化算法,
- 首先是凸 logistic 回歸,
- 然後討論一階方法,包括了隨機梯度法(SGD)、方差縮減隨機方法(variance reducing stochastic method)和二階方法的使用。
- 最後,我們將討論如何將這些方法應用於深層神經網絡的訓練,並著重描述這些模型的復雜非凸結構所帶來的困難。
機器學習以統計學和計算機科學為基礎,以數學優化方法為核心。
本文試圖概述機器學習學習算法而打破三者之間的理解障礙。
liblinear
Ref: LIBLINEAR -- A Library for Large Linear Classification
When to use LIBLINEAR but not LIBSVM
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.
SAG
Ref: 線性收斂的隨機優化算法 之 SAG、SVRG
很多常見的機器學習模型的目標(比如最小二乘做線性回歸、邏輯回歸)都可以概括成以下這種一般形式:
其中 代表樣本的損失函數,是模型的參數,代表正則化項(用於控制模型復雜度或者模型稀疏度等等),有些時候這個正則化項是不平滑的,也就是說它可能不可導。
暫時先不考慮這個正則化項,只考慮樣本上的損失,並且對符號做一點簡化(),考慮下面這個優化目標:
梯度下降
這個形式非常簡單,只要每個都可導,就可以用梯度下降法(Gradient Descent)叠代求解:
其中 表示第 t+1 次更新後的參數。
劣勢:那就是每次需要求解所有樣本的梯度,樣本數多的時候,導致計算量大增,所以實際生產環境中,往往采用隨機梯度下降算法(Stochastic Gradient Descent),一般簡寫做SGD。
隨機梯度下降算法
SGD每次叠代的時候均勻隨機得選擇mini-batch (even少到一個樣本) 做更新:
優勢:就是可以減少每次更新的計算代價;
劣勢:收斂速度不如梯度下降,也就是說為了達到同樣的精度,SGD需要的總叠代次數要大於梯度下降。
但是,單次叠代的計算量要小得多。從收斂速度分析上看,
- SGD能夠在目標函數強凸並且遞減步長的情況下做到 的次線性收斂(sublinear convergence),
- 梯度下降則可以在目標函數強凸的情況下做到 () 的線性收斂(linear convergence)。
總結起來就是,如果想快速得到一個可以勉強接受的解,SGD比梯度下降更加合適,但是如果想得到一個精確度高的解,應當選擇梯度下降。
SAG算法
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
SVRG的算法思路是:
- 每過一段時間計算一次所有樣本的梯度,
- 每個階段內部的單次更新采用來更新當前參數,
- 每次更新最多計算兩次梯度。
相對於SAG來說,不需要在內存中為每個樣本都維護一個梯度,也就是說節省了內存資源。
此外,SVRG中提出了一個非常重要的概念叫做 variance reduction(方差縮減),這個概念需要聯系SGD的收斂性分析來理解,在SGD的收斂性分析中需要假設樣本梯度的的方差是有常數上界的,然而正是因為這個常數上界導致了SGD無法線性收斂,
因此SVRG的收斂性分析中利用這種特殊的更新項來讓方差有一個可以不斷減少的上界,因此也就做到了線性收斂,這一點就是SVRG的核心,SAG的策略其實也與此類似(雖然證明過程不同)。
SVRG顯然是線性收斂算法,相對於SGD有非常大的優勢,和SDCA具備同階的速度。
[NN] Stochastic Gradient Descent - SAG & SVRG