天天看點

李宏毅機器學習——梯度下降

梯度下降回顧

在前篇文章中介紹的機器學習三步走第三步中,我們需要解決下面優化問題:

假設向量有兩個屬性

初始從開始,

接下來計算

這個步驟可以反複進行,再計算一次的話:

其中是初始學習率(learning rate)

上面的式子可以寫得更加簡潔:

叫做梯度。

也就是說:

李宏毅機器學習——梯度下降

紅色箭頭是梯度向量,藍色箭頭是移動的方向。

小心的調整學習率

李宏毅機器學習——梯度下降

每種顔色都是不同的學習率。

如果學習率剛剛好,就像紅色箭頭所示;如果過小則向藍色箭頭,顯得步長太小了;

若太大則像綠色箭頭,那麼永遠到不了低點;甚至還可以過大,導緻像黃色箭頭那樣。

如果是參數是一維或二維我們還可以畫出這種圖,如果參數超過3就沒辦法了。

我們還可以通過參數的變化來觀察損失的變化。

可以通過觀察損失函數的下降速度

李宏毅機器學習——梯度下降

x軸是學習率,y軸是Loss函數的值

是以學習率的調整很重要,簡單的原則是:

  • 開始時由于遠離目标,是以使用大一點的學習率
  • 在幾次更新後,靠近目标了,是以減國小習率
  • 每個參數給不同的學習率

比如可以選擇,其中是計算的次數,但是這樣還不夠。

接下來介紹一種比較好的梯度下降算法:Adagrad。

Adagrad

每個參數的學習率都除上之前算出來的微分值的均方根。

一般的梯度下降(批梯度下降,Vanilla Gradient descent)是這樣的:

其中是某一個參數,因為在做adagrad時,每個參數都有不同的學習率。

是以我們分别考慮每個參數。

而Adagrad的做法是:

是過去所有微分值的均方根。這個值對每個參數而言都是不一樣的,是以是參數獨立的。

我們來舉個例子,假設初值為。

李宏毅機器學習——梯度下降

整個Adagrad的式子式是可以簡化的:

李宏毅機器學習——梯度下降

再回頭來看下批梯度下降算法:

李宏毅機器學習——梯度下降

批梯度下降算法是梯度越大,步伐就越大;

而Adagrad是分子上,梯度越大,步伐越大;分母上,梯度越大,步伐越小。這裡是否感覺有些沖突。

我們來考慮一個二次函數: ,它的圖像如下:

李宏毅機器學習——梯度下降

把上式對做微分并取絕對值,得

它的圖形為:

李宏毅機器學習——梯度下降

在二次函數上,假設初始點為,最低點是此時如果想找到最好的步伐多少

李宏毅機器學習——梯度下降

其實和之間的距離 ,整理一下可得

而就是點的一次微分。

李宏毅機器學習——梯度下降

如果某點的微分值越大,則距離最低點越遠;如果踏出去的步伐和微分大小成正比,則有可能是最好的步伐。

上面我們隻考慮了一個參數,如果考慮多個參數上面的結論則不一定成立。

假設有兩個參數,如果隻考慮參數1,它的圖像為:

李宏毅機器學習——梯度下降

其中a點的微分值大于b點,a點距離最低點更遠。如果也考慮參數,它的圖像是綠色的那個:

李宏毅機器學習——梯度下降

那,如果同時考慮這兩個參數,如果同時考慮a點對的微分,c點對的微分。

c點處的微分值比較大,a點處的微分值小于它,但是c離低點比a離低點更近。

我們再回頭看下最好的微分,發現它的分母上有個。

我們把函數做二次微分得:

也就是說,最好的步伐,它不僅和一次微分成正比,還和二次微分成反比。

那它和Adagrad的關系是什麼?

李宏毅機器學習——梯度下降

我們再來看下adagrad:就是一次微分,那麼它的分母是怎麼和二次微分關聯的呢?(derivative,導數)

adagrad用一次微分來估計二次微分:

李宏毅機器學習——梯度下降

我們考慮二次微分較小的圖形(圖左)和二次微分較大的圖形(圖右)。

然後把它們一次微分的圖形考慮進來:

李宏毅機器學習——梯度下降

我們在一次微分圖形上取很多個點,可以發現在二次微分較小的圖形中,它的一次微分通常也較小。

而Adagrad中的就反映了二次微分的大小。

通過Adagrad實作梯度下降的代碼:

def gradient_descent():
    x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
    y_data = [640, 633, 619, 393, 428, 27, 193, 66, 226, 1591]
    b = -120
    w = -4
    lr = 1 # 學習率
    lr_b = 0 # b的學習率
    lr_w = 0 # w的學習率
    iteration = 10000 #疊代次數
    for i in range(iteration):
        b_grad = 0.0
        w_grad = 0.0
        for n in range(len(x_data)):
            w_grad = w_grad - 2.0 * (y_data[n] - (b + w * x_data[n])) * x_data[n]
            b_grad = b_grad - 2.0 * (y_data[n] - (b + w * x_data[n])) * 1.0

        lr_b = lr_b +  b_grad ** 2
        lr_w = lr_w + w_grad ** 2

        b = b - lr/np.sqrt(lr_b) * b_grad
        w = w - lr/np.sqrt(lr_w) * w_grad

    print(b,w)      

随機梯度下降法

随機梯度下降法( Stochastic Gradient Descent)可以訓練的更快。

上篇文章中說到回歸的損失函數為:

損失考慮了所有的訓練資料。

而随機梯度下降法,每次隻取某一個訓練資料出來:

而損失值隻考慮現在的參數對該訓練資料的的估測值減去實際值:

并且計算梯度的時候也隻計算隻針對該訓練資料計算。

李宏毅機器學習——梯度下降

左邊看完20個訓練資料才更新損失值,右邊每看一個訓練資料,就更新一次損失值。

特征縮放

假設要根據以下函數做回歸

假設的分布比要大,就需要把的分布縮小,讓它們一緻。

李宏毅機器學習——梯度下降

舉例來說

李宏毅機器學習——梯度下降

如果的分布是1,2,… 而 的分布是 100,200,…

那麼畫出的損失值的圖形是圖左的樣子;

如果進行縮放後,圖形是正圓,很容易向着圓心走。可以極大提高算法的效率。

特征縮放的方法