梯度下降回顧
在前篇文章中介紹的機器學習三步走第三步中,我們需要解決下面優化問題:
假設向量有兩個屬性
初始從開始,
接下來計算
這個步驟可以反複進行,再計算一次的話:
其中是初始學習率(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,…
那麼畫出的損失值的圖形是圖左的樣子;
如果進行縮放後,圖形是正圓,很容易向着圓心走。可以極大提高算法的效率。