前言
??這篇文章是李宏毅的《機器學(xué)習(xí)》課程的筆記,主要目的是讓我自己梳理一遍課程的內(nèi)容练链,加深理解翔脱,找到課上沒弄懂的地方,并將新的知識點與我以前的一些認知結(jié)合起來媒鼓。如有寫錯的地方或者理解有問題的地方希望能得到糾正届吁,歡迎相關(guān)的問題。
正文
??回顧在前面線性回歸處使用的梯度下降來尋找損失函數(shù) (或記為
) 最小時的參數(shù)
绿鸣,我們的目標(biāo)函數(shù)是:
??其中疚沐, 是最優(yōu)條件下的參數(shù)
值。
??梯度下降的方法的過程就是隨機選取一個起始點 潮模,然后計算在這一點的梯度向量
亮蛔,并設(shè)定一個學(xué)習(xí)率參數(shù)
,然后更新參數(shù)
得到一個新的
:
??然后不斷重復(fù)這個過程再登,直到找到 最小的點尔邓。上面這個是
只有兩個參數(shù)的情況晾剖,也就是二維的情況,如果把
與
的關(guān)系圖以等高線的形式畫在圖上梯嗽,那么梯度的方向向量其實就是那一點等高線的垂線方向齿尽。梯度下降就是不斷重復(fù)找當(dāng)前所在位置的等高線的梯度方向,然后往其反方向走一步的過程灯节,過程如圖所示循头,紅線是梯度方向,藍線是移動方向炎疆,圖中
就是上面的
表示損失函數(shù)卡骂。(PS: 學(xué)習(xí)率在李宏毅的課程中是記為
的,而在吳恩達 Coursera 上是記為
形入,我是先看的吳恩達的課全跨,所以習(xí)慣用
,不過貌似好像
作為學(xué)習(xí)率更常用亿遂,所以以后都寫成
)
Learning rate
學(xué)習(xí)率的設(shè)置
??在上面所說的梯度下降的方法中浓若,學(xué)習(xí)率是一個不變的常數(shù),那么如何來設(shè)置這個參數(shù)其實是一個很重要的問題蛇数,因為如果設(shè)的太大的話挪钓,可能因為每次更新參數(shù)的幅度太大了而無法收斂到最低點(下圖綠線),甚至變得發(fā)散了(下圖黃線)耳舅。如果設(shè)的太小的話可能收斂的速度會很慢(下圖藍線)碌上。
??上面這個圖是在參數(shù)為一維的情況下才能畫出來的,如果參數(shù)大于等于三維浦徊,其實是沒有辦法可視化畫出 和
之間的關(guān)系圖的馏予,所以也就沒法從圖中觀察到我的學(xué)習(xí)率時候設(shè)置的太小了或者太大了。但是我們可以畫出每次迭代時的當(dāng)前
的圖盔性,如下圖所示吗蚌,可以看到當(dāng)學(xué)習(xí)率過大而損失值發(fā)散的時候會像黃線那樣,當(dāng)太小的時候會像藍線那樣纯出。所以畫迭代次數(shù)與損失值的關(guān)系圖可以幫我們了解到我們的學(xué)習(xí)率
是否合適。
自適應(yīng)學(xué)習(xí)率 (Adaptive learning rates)
??上面所說的學(xué)習(xí)率是不變的敷燎,那么我們想讓我們的學(xué)習(xí)率能夠自適應(yīng)迭代的過程要怎么辦呢暂筝?一個大的原則是希望隨著參數(shù)的不斷更新,學(xué)習(xí)率會變的越來越小硬贯,以便更好的收斂焕襟。那么很容易可以想到可以讓學(xué)習(xí)率隨著迭代的次數(shù)而衰變,例如第 次迭代時的學(xué)習(xí)率
為:
??使用上面這種學(xué)習(xí)率自適應(yīng)方法的梯度下降叫做 vanilla gradient descent饭豹,至此為止鸵赖,學(xué)習(xí)率對于每一個參數(shù) 都是一樣的务漩,但是應(yīng)該為不同的參數(shù)設(shè)定不同的學(xué)習(xí)率。所以有另一種學(xué)習(xí)率自適應(yīng)的算法它褪,叫做 Adagrad 饵骨。
Adagrad
??Adagrad 每次的學(xué)習(xí)率不是只關(guān)于迭代次數(shù) 來衰減,還與這
次迭代時每次的微分有關(guān)茫打。記任意一個參數(shù)為
居触,改參數(shù)第
次的微分為
。則 使用 Adagrad 進行梯度下降的參數(shù)更新方法如下:
??其中 老赤,
轮洋,
√可以發(fā)現(xiàn)弊予,分子分母都有
,所以約掉后變成:
??對比 vanilla gradient descent 和 Adagrad 开财,當(dāng)在某一點偏微項 算出來比較大時汉柒,vanilla gradient descent 也會更新的比較大,而 Adagrad 的
變大時床未,
會導(dǎo)致更新的一步變小竭翠,這一個變大時另一個會變小,相乘后不一定會變大薇搁,怎樣來理解這種設(shè)定呢斋扰?
??一種理解是 Adagrad 想要考慮的是這個梯度的反差有多大,就是如果前面的梯度算出來都很小啃洋,突然來了一個比原來的大了幾個數(shù)量級的就會覺得這個特別大传货,這樣就會更新一個接近 的一步。如果原來都很大宏娄,突然來了個小一兩個數(shù)量級的梯度问裕,那么就會基本不更新。所以是把原來的依據(jù)絕對的微分的大小決定更新的大小變成了現(xiàn)在依據(jù)相對的微分的大小絕對更新的大小了孵坚。就像下面這個表格粮宛,有兩個參數(shù)比如說是
和
在第五次迭代微分(偏導(dǎo))算出來都是 0.1 ,如果用 vanilla gradient descent 來更新的話卖宠,兩個參數(shù)更新的大小會是一樣的巍杈,但是使用了 Adagrad 后,
會更新的很大扛伍,接近
筷畦,而
則基本不更新。那么為什么要這么更新呢刺洒?
??這就要從數(shù)學(xué)上來理解了鳖宾。我們在更新參數(shù) 時吼砂,都會有一種直覺,就是當(dāng)微分比較大時鼎文,那么離最小值點會比較遠渔肩,而微分比較大時,會離最小值點比較近漂问。例如在一個二次曲線上赖瞒,a 點微分比 b 點大,離最小值點也比 b 點遠蚤假。
??但是這在多維上就不一定成立了栏饮,比如在一個二維的損失值與 (圖中的 w ) 的圖上,分別用兩個平面去切磷仰,得到兩個曲線袍嬉,雖然在 c 點的微分會比在 a 點的更大,但實際是 c 點離的更遠灶平,更應(yīng)該進行大的參數(shù)更新伺通。那么為什么 Adagrad 能讓藍線中的 a 點更新的比 c 點更多一點呢?我們先來看一下另一個問題逢享。
??假如我們有一個二次曲線 罐监,還有一個起始點
,那么我們想要更新以后能夠到達最小值點瞒爬,最好的一步應(yīng)該是這一點到最小值點的距離
弓柱,不管這個曲線是像上面藍色的那樣緩慢變化的,還是像綠線那樣陡峭變化的侧但,最好的更新的距離都是
矢空,當(dāng)然各自的
是不一樣的。那么怎么得到這個
呢禀横?把他變成一個分式屁药,分子其實是
的一階導(dǎo)數(shù),即在這一點的微分值柏锄,而分母是二次微分酿箭。所以我們知道了,在這種情況下趾娃,最好的一步不是函數(shù)的一次微分(vanilla gradient descent 的更新方式)七问,而是一次微分除以二次微分。
??那么這和 Adagrad 有什么關(guān)系呢茫舶?難道 是在那一點的二次微分?沒錯刹淌,
其實就是二次微分的估計饶氏。那么是怎么估計的呢讥耗? Adagrad 所做的其實就是在一次微分上采樣,在比較平滑的曲線上疹启,一次微分會比較小古程,在比較陡峭的曲線上,一次微分會比較大喊崖,采多個點求平方和在開根號就能夠反映二次微分的大小挣磨,因為比較平滑的取消上的
會比比較陡峭的
大,二次微分也是這樣的荤懂。
??那么不可避免的會問茁裙, 和二次微分應(yīng)該還是不一樣的,這應(yīng)該只能反映不同參數(shù)上二次微分的大小關(guān)系节仿,為什么不直接計算二次微分呢晤锥?其實是因為在數(shù)據(jù)比較大的時候,往往是不能忍受需要額外計算二次微分的計算開銷的廊宪,而 Adagrad 沒有增加過多的運算矾瘾,用的是原來已經(jīng)算好的一次微分來盡可能達到同樣的效果,所以是很有效的箭启。
Stochastic Gradient Descent
??在原來的梯度下降中壕翩,我們每次迭代用到了所有樣本的,因為原來的損失函數(shù)是:
??Stochastic Gradient Descent 說傅寡,我不要用這個多樣本放妈,每次我只用一個,然后依次取訓(xùn)練集的所有樣本來更新赏僧。那么使用第 個數(shù)據(jù)進行梯度下降時的損失函數(shù)就變成了:
??那么原來掃描一遍數(shù)據(jù)只能更新 1 次大猛,現(xiàn)在掃描一遍能更新 次了,下圖是
時的兩種梯度下降的對比淀零,(其中
等同于我所寫的
) 驾中“埃可以看到雖然每次更新不一定會朝著總體損失減小的方向進行,但大部分更新還是會朝著損失減小的方向進行的肩民,同樣掃描一遍訓(xùn)練集唠亚,Stochastic Gradient Descent 離最優(yōu)點更近一些。
Feature scaling
??通常持痰,在進行梯度下降的時候灶搜,需要將不同屬性的數(shù)據(jù)縮放到相近的取值范圍,縮放的方式可以采取減均值再除以方差的方式進行,公式如下:
??其中割卖, 是第
個數(shù)據(jù)的第
個屬性的取值前酿,
是所有數(shù)據(jù)的第
的屬性數(shù)據(jù)的均值,
鹏溯,
是 所有數(shù)據(jù)的第
的屬性數(shù)據(jù)的方差罢维。縮放后丙挽,所有屬性的均值為 0 肺孵,方差為 1 。
??那么為什么要將不同屬性的數(shù)據(jù)縮放到類似大小的范圍呢颜阐?讓我們來分別看下縮放前和縮放后的效果平窘,假設(shè)有一個函數(shù)是 (這里的
分別對應(yīng)前面的
),如果不縮放的話瞬浓,就如下圖左圖那樣初婆,
的等值線是一個橢圓≡趁蓿縮放后就像右邊那樣是一個原磅叛。我們知道梯度下降每次的方向是等值線的發(fā)現(xiàn)方向,那么在橢圓上萨赁,法線方向一般不是指向圓心的弊琴,如果進行梯度下降,就會像圖中那樣繞個大彎杖爽,如果是一個圓的話敲董,無論在哪里法線都是指向圓心的,只需要更少的次數(shù)就能收斂慰安。所以特征縮放可以加速梯度下降收斂的速度腋寨,更快的找到最小值點。
Theory (梯度下降的數(shù)學(xué)原理)
??梯度下降的基本原理是在當(dāng)前所處位置的周圍很小的范圍內(nèi)(下圖紅圈內(nèi))看一看哪一點是最低的化焕,然后朝著那個方向走一步萄窜,直到走到最低點,那么怎么才能找到哪一點是紅圈里最低的點呢撒桨?
??讓我們先來回顧一下泰勒展開式查刻,泰勒展開說,當(dāng) 在
出
階可導(dǎo)的時候凤类,那么可以寫成:
??所以當(dāng) 與
很接近的時候穗泵,
,因為后面二次一個很小的數(shù)約等于 0 谜疤,更高次就更小了佃延。從一個 sin 函數(shù)的展開可以直觀的看到這一點现诀。將一個正弦函數(shù)在
位置展開,畫出各次項的曲線履肃。0 次的時候就是一條水平線赶盔,1 次的時候是一條斜線,更高次更擬合橙色的正弦曲線榆浓,在
周圍很小的范圍里,一次項是可以擬合正弦曲線的撕攒。
??二元的泰勒展開是下面這樣的:
??所以可以 陡鹃。讓我們回到上面那個二維情況下的梯度下降中,當(dāng)紅圈足夠的小的時候抖坪,我們可以用一次的泰勒展開去近似原函數(shù)萍鲸。假設(shè)當(dāng)前所在的位置是
,則在這個點周圍的那個紅圈里:
??其中 其實是個常數(shù)擦俐,后面兩項其實可以看作兩個向量的內(nèi)積脊阴,第一個向量是
,另一個是
即
。第一個其實就是在這一點的梯度方向,而要使
最小,第二個向量最好是第一個向量的反方向最長的位置菇肃,即梯度反方向的射線與紅圈的交點是最小值點瓜贾。 這從數(shù)學(xué)上解釋了參數(shù)為什么要這么更新,以及為什么有的時候會導(dǎo)致更新后的
反而變大寓盗,因為更新的步子太大了而使的紅圈變得太大了而不滿足一次泰勒展開的近似關(guān)系了。
More Limitation of Gradient Descent
??我們前面就知道了,梯度下降會有落入局部最小的風(fēng)險蜜猾,然后事情并沒有這么簡單。梯度下降是按照梯度的大小來進行更新的振诬,但并不是只有最小值點的梯度可能是 0 蹭睡,鞍點 (saddle point) 的梯度也可能是 0 ,比如 在 0 處的導(dǎo)數(shù)是 0 赶么,但并不是極值點肩豁,所以我們可能會落入鞍點。除此之外禽绪,我們在具體實現(xiàn)的時候蓖救,并不是梯度嚴(yán)格等于 0 的時候才停止迭代,當(dāng)梯度約等于 0 時印屁,就會停循捺,那么就會有一種風(fēng)險,可能只是函數(shù)在某一段比較平緩雄人,其實離極值點還很遠从橘。這三種情況分別對應(yīng)了下圖三個點: