0x00 內容
梯度下降:實現(xiàn)梯度下降、線性回歸中的梯度下降
隨機梯度下降:相關代碼即調用
0x01??梯度下降法(回顧四:0x04?梯度下降法)
最小二乘法求損失函數(shù)的最小值,但是這只是一個特例。大多數(shù)復雜復雜情況下,損失函數(shù)就需要用到“梯度算法”。
從損失值出發(fā),去更新參數(shù),且要大幅降低計算次數(shù)。
多元函數(shù)的導數(shù)(derivative)就是梯度(gradient),分別對每個變量進行微分,然后用逗號分割開,梯度是用括號包括起來,說明梯度其實一個向量。
解決局部最低點方案,:首先隨機產(chǎn)生多個初始參數(shù)集,然后分別對每個初始參數(shù)集使用梯度下降法,直到函數(shù)值收斂于某個值,最后從這些值中找出最小值,這個找到的最小值被當作函數(shù)的最小值。
0x02??梯度下降之前需要使用歸一化(回顧四:0x05)
真實數(shù)據(jù)整體不在一個規(guī)模上,解決的方式,就是在梯度下降之前進行數(shù)據(jù)歸一化。
0x03?速度更快的隨機梯度下降法
批量梯度下降法BGD(Batch Gradient Descent):每次更新參數(shù)時計算所有樣本,通過對數(shù)據(jù)集所有樣本的計算來求解梯度的方向。這種方法在數(shù)據(jù)量很大時計算的時間成本很高。
隨機梯度下降法SGD(stochastic gradient descent):每次迭代使用一個樣本來對參數(shù)進行更新。雖然不是每次迭代得到的損失函數(shù)都向著全局最優(yōu)方向,但是大的整體的方向是向全局最優(yōu)解的,最終的結果往往是在全局最優(yōu)解附近。(相比于批量梯度,這樣的方法更快,結果也是可以接受的。)
3.1 隨機取值的公式推導
從數(shù)學的角度來看:將批量梯度下降損失函數(shù)(J(θ)=MSE(y,y^))求導后矩陣,乘以m。(樣本數(shù)量求和這一操作去掉)得:

注意,得到的向量是搜索方向,不是梯度方向,因此已經(jīng)不算是函數(shù)的梯度了。
3.2 隨機下降與學習率的取值
隨機梯度下降過程就是:每次隨機取出一個i,得到一個向量,沿著這個隨機產(chǎn)生的向量的方向進行搜索,不停的迭代,得到的損失函數(shù)的最小值。
批量搜索,那么每次都是沿著一個方向前進;隨機梯度下降法則不能保證隨機選擇的方向是損失函數(shù)減小的方向(更不能保證一定是減小速度最快的方向),所以搜索路徑會呈現(xiàn)隨機特性。即隨機梯度下降有著不可預知性。
隨機梯度下降法的過程中,學習率η是逐漸遞減。因為如果學習率取一個固定值,可能會導致已經(jīng)在最小值附近的點θ,由于固定步長(點θ的取值)跳出這個點的范圍。
設計一個函數(shù),使學習率η隨著下降循環(huán)次數(shù)的增加而減小。(分子變?yōu)槌?shù)t0,并在分母上增加一個常數(shù)項t1緩解初始情況下,學習率變化太大的情況,且更靈活。)η=t0/(Ii ter+t1)
0x04 BGD&SGD效果比較
梯度下降算法主要比較運行時間和迭代次數(shù)這兩個指標。
不同:
1.表達式為:X_b_i.T.dot(X_b_i.dot(theta) - y_i) * 2(傳遞的不是整個矩陣Xb和整個向量y,而是其中一行X_b_i、其中的一個數(shù)值y_i)
2.內置學習率:η=t0/(Ii ter+t1)
3.終止循環(huán)條件:循環(huán)次數(shù)達到上限
代碼中隨機梯度下降,只使用1/3。并且隨機梯度下降中只考慮的1/3的樣本量,且得到的結果一定達到了局部最小值的范圍內。
批量梯度下降法BGD(Batch Gradient Descent)
優(yōu)點:全局最優(yōu)解;易于并行實現(xiàn);
缺點:當樣本數(shù)據(jù)很多時,計算量開銷大,計算速度慢。
隨機梯度下降法SGD(stochastic gradient descent)
(每次迭代使用一個樣本來對參數(shù)進行更新)
優(yōu)點:計算速度快;
缺點:收斂性能不好 。
0x05 ?
梯度下降另外一種調試方式
一種簡單的方法,能夠對梯度下降法中求梯度的公式推導進行調試。?
以一維為例,求某一點(紅色)相應的梯度值(導數(shù)),就是曲線在這個點上切線的斜率。可以使用距離該點左右兩側的兩個藍色點的連線的斜率,作為紅點處切線斜率。



從數(shù)學上來看比較直觀,每個維度上都要求兩次帶入,因此時間復雜度變高了。作為一個調試的手段,在還未完成時,可以使用小數(shù)據(jù)量,進行計算,得到最終結果。(然后再通過推導公式的方式得到的梯度結果,是否和其相同。)在求梯度的時候,可以用這種通用的debug方式先在小數(shù)據(jù)集上對求導公式進行檢驗。
0xFF 總結
批量梯度下降法BGD(Batch Gradient Descent),每次對所有樣本都看一遍,缺點是慢,缺點是穩(wěn)定。
隨機梯度下降法SGD(stochastic gradient descent),每次隨機看一個,優(yōu)點是快,缺點是不穩(wěn)定。
小批量梯度下降法 MBGD(Mini-Batch Gradient Descent),優(yōu)點:減少了計算的開銷量,降低了隨機性。(在每次更新時用b個樣本,其實批量的梯度下降就是一種折中的方法,用一些小樣本來近似全部。)
代碼相關:
1.Jupyter中使用IPython的魔法(Magic)命令“%%time”表示代碼塊用時,必須首行。
參考閱讀:
1.《還不了解梯度下降法?看完這篇就懂了!》(回顧四)
2.《手動實現(xiàn)梯度下降(可視化)》?(回顧四)
3.《線性回歸中的梯度下降》?(回顧四)