機器學習之梯度下降法 梯度下降法分析

2022-02-02 18:22:39 字數 3164 閱讀 5301

梯度下降法的基本思想是函式沿著其梯度方向增加最快,反之,沿著其梯度反方向減小最快。在前面的線性回歸和邏輯回歸中,都採用了梯度下降法來求解。梯度下降的迭代公式為:

θj=θj−α∂j(θ)∂θj

在回歸演算法的實驗中,梯度下降的步長α

為0.01,當時也指出了該步長是通過多次時間找到的,且換一組資料後,演算法可能不收斂。為什麼會出現這樣的問題呢?從梯度下降法的出發點可以看到,演算法指出了行進的方向,但沒有明確要行進多遠,那麼問題就來了,步子太小,走個一千一萬年都到不了終點,而步子太大,扯到蛋不說,還可能越跑越遠。

如上圖,藍色為乙個碗形函式,其最小值在x=2

那點,假如從x=0

開始迭代,即是圖中點1,此時知道應該向右走,但步子太大,直接到點2 了,同樣點2處知道該往左走,結果又跑太遠到點3了,…,這樣越走越偏離我們的終點了。此情況的驗證可以直接把前面回歸演算法的步長改大,比如把線性回歸迭代步長改為10,要不了幾次迭代結果就是nan了。

這樣有一點需要說明下,同樣的步長α

,為何從1到2和2到3的長度不一致?因為1-6點的梯度是逐步增大的,故雖然步長相同,但移動的距離卻越來越遠,從而進入了乙個惡性迴圈了。

解決方法

對於上面提出的問題,解決方法有多種,下面就大致來說說,若有新的方法此處未提及,歡迎補充。

1.手動測試法

顧名思義,此方法需要手動進行多次實驗,不停調整引數,觀測實驗效果,最終來確定出乙個最優的步長。那麼如何判斷實驗效果的好壞呢?一種常用的方法是觀察代價函式(對線性回歸而言)的變化趨勢,如果迭代結束後,代價函式還在不停減少,則說明步長過小;若代價函式呈現出振盪現象,則說明步長過大。如此多次調整可得到較合理的步長值。

顯然,該方法給出的步長對於這組訓練樣本而言是相對較優的,但換一組樣本,則需要重新實驗來調整引數了;另外,該方法可能會比較累人~~

2.固定步進

這是乙個非常保險的方法,但需要捨棄較多的時間資源。既然梯度下降法只給出方向,那麼我們就沿著這個方向走固定路程,即將梯度下降迭代公式修改為:

θj=θj−αsign(∂j(θ)∂θj)

其中的sign

是符號函式。

那麼α取多大呢?就取可容許的最小誤差,這樣的迭代方式可以保證必然不會跨過最終點,但需要耗費更多次迭代。

3.步長衰減

步長衰減主要考慮到越接近終點,每一步越需要謹慎,故把步長減小,寧肯多走幾步也絕不踏錯一步。在吳恩達公開課中,他也提到了可在迭代中逐步減少步長。那如何減少步長?通常可以有這麼幾種做法:

a.固定衰減。比如每次迭代後,步長衰減為前一次的某個比例(如95%)。

b.選擇性衰減。根據迭代狀態來確定本次是否衰減,可以根據梯度或代價函式的情況來確定。比如,若此次迭代後代價函式增加了,則說明上次迭代步長過大,需要減小步長,否則保持不變,這麼做的乙個缺點是需要不停計算代價函式,訓練樣本過多可能會大大增加耗時;也可以根據梯度變化情況來判斷,我們知道我們的終點是梯度為0的地方,若本次迭代後的梯度與前一次的梯度方向相反,則說明跨過了終點,需要減小步長。

顯然,採用步長衰減的方式,同樣也依賴於初始步長,否則可能不收斂。當然其相對於固定步長,則會更具穩定性。

4.自適應步長

a.設定乙個較大的初始步長值

b.計算若以此步長移動後的梯度

c.判斷移動前後梯度方向是否會改變,若有改變,將步長減半,再進行a步;否則,以此步長為本次迭代的步長。

還是以上面那個影象來說明下。首先,初始點1在x=0

處,按照初始步長則應該移動到點2x=5

處,可點1和2處梯度方向改變了,那邊步長減半則應該到點ax=2.5

處,點1與a的梯度還是不同,那再將步長減半,則移動到點bx=1.25

處,由於點1與b的梯度方向相同,則此次迭代將從1移動到b。

顯然,該方法不會收到初始步長的影響,每次自動計算使得不會跨過終點的最大步長值。另一方面,從計算量上講,有可能會比原來的方式更大,畢竟有得有失,你不用自己去一次次修改引數->執行程式->觀察結果->…->修改引數。具體**只需對原回歸演算法的**略做修改即可。

將原回歸演算法迭代中的2行** 

1         grad = calcgrad(tx, ty, theta, fun);  

2 theta = theta + alpha .* grad;

修改為 

1         alpha = 16 * ones(n, 1);

2 theta0 = theta;

3 grad0 = calcgrad(tx, ty, theta0, fun);

4 while(min(alpha) > eps)

5 theta1 = theta0 + alpha .* grad0;

6 grad1 = calcgrad(tx, ty, theta1, fun);

7 s = sign(grad1 .* grad0);

8 if (min(s)>=0)

9 break;

10 end

11

12 s(s==-1) = 0.5;

13 s(s==0) = 1;

14 alpha = alpha .* s;

15 end

16 grad = grad0;

17 theta=theta1;

即可實現。

補充說明

上面的說明是針對每一維的,對於步長需要每一維計算。若需要所有維度使用同乙個步長,請先將訓練樣本歸一化,否則很可能收斂不到你想要的結果。

機器學習 梯度下降法

梯度下降法,一般用來求解線性回歸方程,我的理解是根據一組形如 特徵1,特徵2.結果 的資料來找到這些對應的特徵和結果之間的聯絡 例如,我們利用一組 銷量的資料判斷乙個物品的銷量和 之間的關係 我們要求的線性回歸方程可以表示為 銷量 引數 實質上其實就是找到對應的 引數 而當影響乙個結果的特徵不只有乙...

機器學習 梯度下降法

1 梯度下降法的邏輯思路 的取值影響獲得最優解的速度 取值不合適,甚至得不到最優解 是梯度下降法的乙個超引數 一般需要調參找到最適合的 太小,減慢收斂學習速度 太大,導致不收斂 2 梯度下降法的問題 3 其它1 具體實現 模擬損失函式 y x 2.5 2 1 資料集特徵值 plot x np.lin...

機器學習 梯度下降法

機器學習中往往需要刻畫模型與真實值之間的誤差,即損失函式,通過最小化損失函式來獲得最優模型。這個最優化過程常使用梯度下降法完成。在求解損失函式的最小值時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函式和模型引數值。解釋梯度之前需要解釋導數與偏導數。導數與偏導數的公式如下 導數與偏導數都是...