梯度下降法或最速下降法是求解無約束最優(yōu)化問題的一種最常用的方法复哆,梯度下降法是迭代算法碳褒,每一步需要求解目標(biāo)函數(shù)的梯度向量。
1癣丧、梯度
首先槽畔,我們來看看什么是梯度。
在向量微積分中胁编,標(biāo)量場的梯度是一個向量場厢钧。標(biāo)量場中某一點上的梯度指向標(biāo)量場增長最快的方向,梯度的長度是這個最大的變化率嬉橙。也就是說我們按照某一點的梯度走早直,那么我們可以最快的速度得到其最值。
2市框、回歸與梯度下降
回歸在數(shù)學(xué)上來說是給定一個點集霞扬,能夠用一條曲線去擬合之,如果這個曲線是一條直線枫振,那就被稱為線性回歸喻圃,如果曲線是一條二次曲線,就被稱為二次回歸粪滤,回歸還有很多的變種斧拍,如locally weighted回歸,logistic回歸杖小,等等肆汹,這個將在后面去講。
用一個很簡單的例子來說明回歸予权,這個例子來自很多的地方昂勉,也在很多的open source的軟件中看到,比如說weka扫腺。大概就是岗照,做一個房屋價值的評估系統(tǒng),一個房屋的價值來自很多地方,比如說面積谴返、房間的數(shù)量(幾室?guī)讖d)煞肾、地 段、朝向等等嗓袱,這些影響房屋價值的變量被稱為特征(feature)籍救,feature在機器學(xué)習(xí)中是一個很重要的概念,有很多的論文專門探討這個東西渠抹。在 此處蝙昙,為了簡單,假設(shè)我們的房屋就是一個變量影響的梧却,就是房屋的面積奇颠。
假設(shè)有一個房屋銷售的數(shù)據(jù)如下:
面積(m^2) 銷售價錢(萬元)
123 250
150 320
87 160
102 220
… …
這個表類似于帝都5環(huán)左右的房屋價錢,我們可以做出一個圖放航,x軸是房屋的面積烈拒。y軸是房屋的售價,如下:
如果來了一個新的面積广鳍,假設(shè)在銷售價錢的記錄中沒有的荆几,我們怎么辦呢?
我們可以用一條曲線去盡量準(zhǔn)的擬合這些數(shù)據(jù)赊时,然后如果有新的輸入過來吨铸,我們可以在將曲線上這個點對應(yīng)的值返回。如果用一條直線去擬合祖秒,可能是下面的樣子:
綠色的點就是我們想要預(yù)測的點诞吱。
首先給出一些概念和常用的符號,在不同的機器學(xué)習(xí)書籍中可能有一定的差別竭缝。
房屋銷售記錄表 - 訓(xùn)練集(training set)或者訓(xùn)練數(shù)據(jù)(training data), 是我們流程中的輸入數(shù)據(jù)房维,一般稱為x
房屋銷售價錢 - 輸出數(shù)據(jù),一般稱為y
擬合的函數(shù)(或者稱為假設(shè)或者模型)抬纸,一般寫做 y = h(x)
訓(xùn)練數(shù)據(jù)的條目數(shù)(#training set), 一條訓(xùn)練數(shù)據(jù)是由一對輸入數(shù)據(jù)和輸出數(shù)據(jù)組成的
輸入數(shù)據(jù)的維度(特征的個數(shù)咙俩,#features),n
下面是一個典型的機器學(xué)習(xí)的過程松却,首先給出一個輸入數(shù)據(jù),我們的算法會通過一系列的過程得到一個估計的函數(shù)溅话,這個函數(shù)有能力對沒有見過的新數(shù)據(jù)給出一個新的估計晓锻,也被稱為構(gòu)建一個模型。就如同上面的線性回歸函數(shù)飞几。
我們用X1砚哆,X2..Xn 去描述feature里面的分量,比如x1=房間的面積屑墨,x2=房間的朝向躁锁,等等纷铣,我們可以做出一個估計函數(shù):
θ在這兒稱為參數(shù),在這兒的意思是調(diào)整feature中每個分量的影響力战转,就是到底是房屋的面積更重要還是房屋的地段更重要搜立。為了如果我們令X0 = 1,就可以用向量的方式來表示了:
我們程序也需要一個機制去評估我們θ是否比較好槐秧,所以說需要對我們做出的h函數(shù)進行評估啄踊,一般這個函數(shù)稱為損失函數(shù)(loss function)或者錯誤函數(shù)(error function),描述h函數(shù)不好的程度刁标,在下面颠通,我們稱這個函數(shù)為J函數(shù)
在這兒我們可以做出下面的一個錯誤函數(shù):
這個錯誤估計函數(shù)是去對x(i)的估計值與真實值y(i)差的平方和作為錯誤估計函數(shù),前面乘上的1/2是為了在求導(dǎo)的時候膀懈,這個系數(shù)就不見了顿锰。
如何調(diào)整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square)启搂,是一種完全是數(shù)學(xué)描述的方法硼控,在stanford機器學(xué)習(xí)開放課最后的部分會推導(dǎo)最小二乘法的公式的來源,這個來很多的機器學(xué)習(xí)和數(shù)學(xué)書 上都可以找到狐血,這里就不提最小二乘法淀歇,而談?wù)勌荻认陆捣ā?/p>
梯度下降法是按下面的流程進行的:
1)首先對θ賦值,這個值可以是隨機的匈织,也可以讓θ是一個全零的向量浪默。
2)改變θ的值,使得J(θ)按梯度下降的方向進行減少缀匕。
為了更清楚纳决,給出下面的圖:
這是一個表示參數(shù)θ與誤差函數(shù)J(θ)的關(guān)系圖,紅色的部分是表示J(θ)有著比較高的取值乡小,我們需要的是阔加,能夠讓J(θ)的值盡量的低。也就是深藍(lán)色的部分满钟。θ0胜榔,θ1表示θ向量的兩個維度。
在上面提到梯度下降法的第一步是給θ給一個初值湃番,假設(shè)隨機給的初值是在圖上的十字點夭织。
然后我們將θ按照梯度下降的方向進行調(diào)整,就會使得J(θ)往更低的方向進行變化吠撮,如圖所示尊惰,算法的結(jié)束將是在θ下降到無法繼續(xù)下降為止。
當(dāng)然,可能梯度下降的最終點并非是全局最小點弄屡,可能是一個局部最小點题禀,可能是下面的情況:
上面這張圖就是描述的一個局部最小點,這是我們重新選擇了一個初始點得到的膀捷,看來我們這個算法將會在很大的程度上被初始點的選擇影響而陷入局部最小點
下面我將用一個例子描述一下梯度減少的過程迈嘹,對于我們的函數(shù)J(θ)求偏導(dǎo)J:(求導(dǎo)的過程如果不明白,可以溫習(xí)一下微積分)
下面是更新的過程担孔,也就是θi會向著梯度最小的方向進行減少江锨。θi表示更新之前的值,-后面的部分表示按梯度方向減少的量糕篇,α表示步長啄育,也就是每次按照梯度減少的方向變化多少。
一個很重要的地方值得注意的是拌消,梯度是有方向的挑豌,對于一個向量θ,每一維分量θi都可以求出一個梯度的方向墩崩,我們就可以找到一個整體的方向氓英,在變化的時候,我們就朝著下降最多的方向進行變化就可以達(dá)到一個最小點鹦筹,不管它是局部的還是全局的铝阐。
用更簡單的數(shù)學(xué)語言進行描述步驟2)是這樣的:
倒三角形表示梯度,按這種方式來表示铐拐,θi就不見了徘键,看看用好向量和矩陣,真的會大大的簡化數(shù)學(xué)的描述啊遍蟋。
3吹害、梯度下降法的一般步驟
上面通過一個例子形象的給出了梯度下降法的一個應(yīng)用,接下來虚青,根據(jù)李航老師的《統(tǒng)計學(xué)習(xí)方法》一書它呀,我們給出如下的梯度下降法的步驟:
4、梯度下降法的類型
全量梯度下降(Batch gradient descent)
全量梯度下降法每次使用全量的訓(xùn)練集樣本來更新模型參數(shù)棒厘,即:
其代碼如下:
for i in range(epochs):
params_grad = evaluate_gradient(loss_function,data,params)
params = params - learning_rate * params_grad
epochs 是用戶輸入的最大迭代次數(shù)纵穿。通過上訴代碼可以看出,每次使用全部訓(xùn)練集樣本計算損失函數(shù)loss_function的梯度params_grad奢人,然后使用學(xué)習(xí)速率learning_rate朝著梯度相反方向去更新模型的每個參數(shù)params谓媒。
全量梯度下降每次學(xué)習(xí)都使用整個訓(xùn)練集,因此其優(yōu)點在于每次更新都會朝著正確的方向進行达传,最后能夠保證收斂于極值點(凸函數(shù)收斂于全局極值點篙耗,非凸函數(shù)可能會收斂于局部極值點),但是其缺點在于每次學(xué)習(xí)時間過長宪赶,并且如果訓(xùn)練集很大以至于需要消耗大量的內(nèi)存宗弯,并且全量梯度下降不能進行在線模型參數(shù)更新。
隨機梯度下降(Stochastic gradient descent)
隨機梯度下降算法每次從訓(xùn)練集中隨機選擇一個樣本來進行學(xué)習(xí)搂妻,即:
批量梯度下降算法每次都會使用全部訓(xùn)練樣本蒙保,因此這些計算是冗余的,因為每次都使用完全相同的樣本集欲主。而隨機梯度下降算法每次只隨機選擇一個樣本來更新模型參數(shù)邓厕,因此每次的學(xué)習(xí)是非常快速的扁瓢,并且可以進行在線更新详恼。
代碼如下:
for i in range(epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function,example,params)
params = params - learning_rate * params_grad
隨機梯度下降最大的缺點在于每次更新可能并不會按照正確的方向進行,因此可以帶來優(yōu)化波動(擾動)引几,如下圖:
不過從另一個方面來看昧互,隨機梯度下降所帶來的波動有個好處就是,對于類似盆地區(qū)域(即很多局部極小值點)那么這個波動的特點可能會使得優(yōu)化的方向從當(dāng)前的局部極小值點跳到另一個更好的局部極小值點伟桅,這樣便可能對于非凸函數(shù)敞掘,最終收斂于一個較好的局部極值點,甚至全局極值點楣铁。
由于波動玖雁,因此會使得迭代次數(shù)(學(xué)習(xí)次數(shù))增多,即收斂速度變慢盖腕。不過最終其會和全量梯度下降算法一樣赫冬,具有相同的收斂性,即凸函數(shù)收斂于全局極值點赊堪,非凸損失函數(shù)收斂于局部極值點面殖。
小批量梯度下降(Mini-batch gradient descent)
Mini-batch梯度下降綜合了batch梯度下降與stochastic梯度下降,在每次更新速度與更新次數(shù)中間取得一個平衡哭廉,其每次更新從訓(xùn)練集中隨機選擇m,m<n個樣本進行學(xué)習(xí)脊僚,即:
其代碼如下:
for i in range(epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_size=50):
params_grad = evaluate_gradient(loss_function,batch,params)
params = params - learning_rate * params_grad
相對于隨機梯度下降,Mini-batch梯度下降降低了收斂波動性遵绰,即降低了參數(shù)更新的方差辽幌,使得更新更加穩(wěn)定。相對于全量梯度下降椿访,其提高了每次學(xué)習(xí)的速度乌企。并且其不用擔(dān)心內(nèi)存瓶頸從而可以利用矩陣運算進行高效計算。一般而言每次更新隨機選擇[50,256]個樣本進行學(xué)習(xí)成玫,但是也要根據(jù)具體問題而選擇加酵,實踐中可以進行多次試驗拳喻,選擇一個更新速度與更次次數(shù)都較適合的樣本數(shù)。
5猪腕、梯度下降法的挑戰(zhàn)
雖然梯度下降算法效果很好冗澈,并且廣泛使用,但同時其也存在一些挑戰(zhàn)與問題需要解決:
1)選擇一個合理的學(xué)習(xí)速率很難陋葡。如果學(xué)習(xí)速率過小亚亲,則會導(dǎo)致收斂速度很慢。如果學(xué)習(xí)速率過大腐缤,那么其會阻礙收斂捌归,即在極值點附近會振蕩。
2)學(xué)習(xí)速率調(diào)整(又稱學(xué)習(xí)速率調(diào)度岭粤,Learning rate schedules)[11]試圖在每次更新過程中惜索,改變學(xué)習(xí)速率仅炊,如退火雷恃。一般使用某種事先設(shè)定的策略或者在每次迭代中衰減一個較小的閾值疙剑。無論哪種調(diào)整方法宰闰,都需要事先進行固定設(shè)置潭陪,這邊便無法自適應(yīng)每次學(xué)習(xí)的數(shù)據(jù)集特點颠放。
3)模型所有的參數(shù)每次更新都是使用相同的學(xué)習(xí)速率伪朽。如果數(shù)據(jù)特征是稀疏的或者每個特征有著不同的取值統(tǒng)計特征與空間帮毁,那么便不能在每次更新中每個參數(shù)使用相同的學(xué)習(xí)速率溜宽,那些很少出現(xiàn)的特征應(yīng)該使用一個相對較大的學(xué)習(xí)速率吉拳。
4)對于非凸目標(biāo)函數(shù),容易陷入那些次優(yōu)的局部極值點中适揉,如在神經(jīng)網(wǎng)路中留攒。那么如何避免呢。Dauphin指出更嚴(yán)重的問題不是局部極值點嫉嘀,而是鞍點(These saddle points are usually surrounded by a plateau of the same error, which makes it notoriously hard for SGD to escape, as the gradient is close to zero in all dimensions.)炼邀。
6、梯度下降優(yōu)化算法
待更新