0928 DL-Gradient Descent
梯度下降,身為在機器學習的第三個步驟中,主要是用來優化第二步驟(Loss Function)的演算法,每次的迭代更新利用計算參數對成本函數的偏微分乘上學習效率,一直到迭代結束。

我們可以將上次投影片提到的loss function:
其方程式內的 參數改成 ,而成為下列方程式:

每次進行迭代,
Note
梯度的方向
- Gradient方向為Loss的等高線法線方向
- 梯度可以被視為多變量函數的「斜率」。對於多元函數,梯度是一個向量,表示在每個自變量方向上的變化率。

舉例此方程式為:
分別在與微分可以得到其斜率與
因此以上圖來說,紅色斜率方向為負,綠色斜率方向為正,而此概念可以套用在梯度上。
梯度下降需考慮其他事項
learning rate
學習效率的設置:

過小(藍線)
過大(綠線)(黃線)
因為只有在一維或二維可以進行可視化,因此在三維以上情況我們可以藉由右圖"參數與Loss的變化"來可視化其結果。每次在進行計算及更新時,應需繪製"參數與Loss的變化圖"才能確保清楚每次更新情況如何。
Note
右圖綠色線段因為learning rate過大,前面下降太快因此卡住在半陡坡上無法到谷底,因此到中間變趨近平滑無法在下降。
這邊附上learning rate補充圖示及介紹可以更清楚看到learning rate的變化情形

通常在Learnig rate會在我們每次更新參數時越來越接小,因為每次更新我們會越來越接近最低點。而為了確保我們能夠盡量在最後停在最低點,因此需要動態調整學習效率。
動態調整學習效率:
- 初始的時候成本函數較大,需要較大的學習效率來加速收斂
- 幾次迭代之後,逐漸調降學習效率,讓它可以順利收斂在最低點
我們可以假設Learning rate為一個獨立的函數,他是根據你每次進行更新參數而進行變化,其函數假設如下:
其含義為在第t次update參數時(t+1代表迭代次數),原本的Learning rate會除以()來做為當次的新的Learning rate。而這樣就可達到當你參數更新的次數越多,其Learning rate就會跟著減少。
如下圖所示:

但是只有如此,還不夠精準地達到目的,我們還需要根據不同的參數來給予不同的Learning rate,因此便有Adagrad的方式產生:
Adagrad
假設我們的其中一個參數為Loss function內的,他在第t次更新時其變化如下:

當在第 次更新時,根據原上述假設 Learning rat e也會跟著更新,因此為 (此為先原先公式內的 )。
而在 Adagrad 我們則更新成如下:

從上面的更新,我們可以得知新的訊息,是指過去所有微分的值(指梯度值)的 root mean square(平方平均數)

因此對每個參數而言,都可以有不同的學習效率
Tip
t+1代表迭代次數
root mean square:平方平均數,亦稱方均根(參考維基百科)
Important
每個Learning rate都除以算出來的微分值(指梯度值)的root mean square(平方平均數)
以上圖為例:假設你初始的值是 ,計算在 那點的微分,寫作 ,它的 learning rate 是 , 是一個時間獨立的參數, 它是過去算過所有微分值的 root mean square,那在最初情況,我們過去只算過一個微分值,就是 ,所以這個 ,就是 的平方再開根號。而在接下來第二次更新參數,因為有新的數值出現,因此就會是之前的平方再加上新算出的的平方,最後再開根號而得到新的,依此類推。
那原先我們有提到原本的learning rate為:因此我們可以再將這個函數簡化一下,就會如下圖:

但其實Adagrad的參數更新會隨著迭代愈漸減緩

一般來說,梯度愈大則參數更新愈快,Gradient()越大,你參數update就越快,斜率算出來越大,參數 update 就越快;但使用Adagrad的時候,則會因為梯度愈大造成分母項也愈大,也因此參數更新是受限的。尤其是在越後面更新,看過跑1000筆資料,才降不到0.1。
Tip
Adaptive 的 learning rate 其實是一系列的方法,比如說 Adadelta, Adam…等等。這裡舉例的Adagrad則是相對簡單的方法,而在講者的認知中,Adam應該是現在最穩定的。有興趣同學可以去查閱看看其他方法。
有一些 paper 這樣解釋的,這個 Adagrad 它想要考慮的是:
今天這個Gradient有多surprise,那就會多"反差"這樣;就是比如說,反差萌的意思,如果本來一個很兇惡的角色,突然對你很溫柔你就會覺得它特別溫柔這樣,對 Gradient 來說也是一樣的道理,如上圖所述。
為了強調這種反差的效果,所以在 Adagrad 裡面呢,我們就把它除以過去這些 Gradient 的平方值,就能得知更新過的新 Gradient與過去的反差有多大。

Adagrad所表示的是梯度的反差,以二次函數
對x微分為例,其結果如上圖下,它的最低點位於
假設初始位於,最好的方式就是一次到達最低點,兩點之間的距離為,而即為的微分項。
當微分項愈大,代表離原點愈遠(越遠),如果跨出去的距離跟微分大小成正比,那可能就是最好的步伐,但這只限於一個參數情況。
但是,這件事情只有在,只考慮一個參數的時候才成立,如果我們同時有好幾個參數,剛才的論述就不見得成立了,也就是說,Gradient 的值越大就跟最低點的距離越遠,在有好多個參數的時候 ,是不一定成立的。

如左上圖面的顏色,是 loss function的輪廓圖
我們在兩個參數、分別各劃一刀,便可看出error surface形體如何。可以發現綠色的切線相對藍色比較尖且深,雖然單純比較來看會發現c在中的微分子相較a在是比較大(c的斜率較大,因此會認為離最低點比較遠),但c離最低點的距離跟a來比卻是比較近的。
那我們該如何考慮跨參數的情況呢?

我們可以將原本一次微分的情形再做一次微分,再次微分的情況,就是指我們斜率的變化程度,也就是梯度(gradient)的變化程度,以這個方程式來看他二次微分會是一個常數。因此當越大,斜率變化越大,那你的梯度也就變化越大,這時你的參數每步()更新就會變小,因此如果我們如果也把二次微分也考慮進來的話,會發現在這個方向上你的二次微分是比較小的(因為相對來的平滑)。所以在比較跨維參數的同時,除了考慮一次微分,二次微分也需考慮。
我們把Adagrad 的式子列出來:

可以看出 是一個常數,所以不必理會, 就是一次微分,那下面 則是用來代表二次微分,可能會疑問為何不直接寫真正的二次微分呢?的確這個方法是正確可行的,但是有時候遇到的狀況是當你參數量非常大、data 非常多的時候,你可能算一次微分就花一天這樣子,然後你再算二次微分,你要再多花一天;而且每次最後呈現的結果可能未必是會變得比較好。所以,Adagrad 它提供的做法就是,我們在沒有增加任何額外運算的前提之下去評估二次的微分應該是多少。

從上圖中,我們可以藉由多個sample點來得知二次微分的變化量。
Stochastic Gradient Descent
Stochastic 的 Gradient Descent比起一般梯度下降法,可以讓你的training,更快一點。
我們可以先來看一般的 Loss function 長相為下圖:

Loss Function合理來說都會考慮所有資料集,再以所有資料集的總誤差來計算梯度下降。
但Stochastic Gradient Descent(隨機梯度)卻只考慮一筆資料誤差,梯度也只考慮該筆資料。

單筆特徵假設: ,代表第幾個。

我們將Loss function可視化(左上圖),在只有與的參數中,一般的梯度下降法(Gradient Descent)是跑完所有的 example 後再 update 一次參數,會比較穩定,因此它走的方向就是按照 Gradient 建議我們的方向。
而在Stochastic Gradient Descent(右上圖),則會因為根據我們總共幾個example而更新幾次,也就是說你每看到一個 example ,你就 update 一次參數,如果有20個就會跑20次,因此它的圖形看起來就會很散亂。
然而在同時起步開始跑更新的時候,因為當梯度下降法還在計算其他example時,隨機梯度就已經因為每次example進行一次更新而已經迅速地前往到下個example階段,因此能更快抵達收斂。
Note
隨機梯度下降與梯度下降的最大差異在於,梯度下降每次的迭代更新都會計算一次所有的資料誤差再做梯度下降,而隨機梯度下降則是每次的迭代都只計算一筆的誤差並且更新。
也因此,在梯度下降做一次的迭代之後,可以隨機梯度已經看完全部而且更新完了。
但是隨機梯度的收斂無法像梯度下降一樣很穩定的往最佳解前進,它的求解過程中較為震盪。
Feature Scaling
除了以上幾個方式可以來調整整個模型的走向,我們也可以藉由Feature Scaling來進行改善。

假設我們現在要做 Regression,有兩個 feature,分別為 跟 , 是進化前的 CP值, 是它的生命值;如果說他們的範圍分布(range)不一樣,那就把它們做 scaling,令他們 range 分佈變成是一樣。

假設我們Regression function: ,如果我們的本身都很小,只有1,2…而則為100,200…;其差距非常大,可能呈現的error surface圖形就為左圖,而這也表示對Loss影響比較小,對Loss影響比較大;而當他們的scale都很接近,如右圖所示,則呈現結果則變為接近圓形,代表其對Loss影響是差不多的。
在左圖的情況下,我們可以得知同一組learning rate是無法搞定符合兩個參數的,必須使用adaptive rate才有辦法。但是在右圖情況因為其數值差不多,gradient 就有辦法直接順順的往最低點走去,而不是如左圖因數值不同關係還須彎繞進去。
那該如何實作呢?這個方法有千百種,這邊就舉例最簡單的方式:

我們可以假設有有個examole,而每個example都有一個feature,而每個feature有數個component(、、、…);我們對每個dimension i計算平均(mean),標準差 (Standard deviation)。
那現在要進行localization: 舉例說我們對第 個 example 的第 個 component,也就是來進行。
我們將與(第 個 component 的 mean)進行相減,再除以所有的 data 的(第 個 component 的 standard deviation),就會得到新的,而這也會使所有 dimension 的 mean為0,variance(變異數) 就會是 1。
當然還是有其他不同種方始可以來探討gradient…

我們無法立即從error surface 瞬間找出最低點,但我們可以藉由一個初始點,在範圍內找出一個最小值,再以該點為中心,以同樣的方式在範圍內找一個最小值前往。
這個意思就是說,如果你給我一整個 error function,我沒有辦法,馬上一秒鐘就告訴你說,它的最低點在哪裡,但是如果你給我一個 error function,加上一個初始的點,在這個初始點附近,畫一個範圍之內找出一個最小的值。然後藉此將中心更新到新的最小值上,在畫一個圓圈繼續找新的最小值…依此類推。

在Taylor series任何一個 function ,如果它在 這點是 infinitely differentiable,當 x 很接近 的時候可以說非常接近 ,因為展開後會發現遠大於,而又會遠大於更高次項,依此類推,後面次項就不用考慮。當然這是當只有考慮一個變數的情況。

以上圖舉例我們假設,在 約等於 的地方,我們將每項畫出圖形。如果我們考慮只考慮0次的話就是這條水平線,1次則是斜線,2次則是開口項下那條線…;那我們可以單純考慮一次式的話,它的線與橙色線sin雖然非常不像,但是在的地方卻是很像,其它的二次式以後的項目它的值都非常的小,我們可以忽略不看。
那如果說現在要考慮多個變數的情況時,則可參考下圖:

在多參數的狀況下依然可以以Taylor Seris來計算,在都很接近的情況下,平方項之後也是可以被忽略的。

那我們回到formal derivarion
假設,在Loss函數中一個中心點並畫一個很小的圓圈,在這個圓圈內我們可以將Loss Function利用Taylor Series做簡化。
那其中我們假設,,,;而其中這三項都是屬於常數項。
所以可以簡化成
那我們可以藉下列圓形方程式來找出讓Loss最小

因與無關係因此可以忽略
我們可以想像成其實就是與兩個向量作內積出來的結果。因此要讓其值最小,那就是兩個向量方向相反並平行,在夾角180位置,並調整長度讓其剛好在紅圈的極限∘而上面則是代表scale常數,作為調整長度的倍數。
因此如果說我們要找到與讓最小的話,那就是

那我們將方程式整理後,可以發現它其實就跟gradient descent一樣。
而這個式子的成立就是建立在Taylor Series上,就是紅色的圈圈要夠小(越小),才能給到近似值,才會夠精確。而我們可以從此推論出,與成正比,因此如果你要讓你每次 update 參數的時候你的 loss 都越來越小的話,要小才有辦法成立。
Tip
可以想像成今天就是把原本在error surface每次gradient更新的超級小紅點,改成大一點點的紅點去作gradient descent,這樣就能比較清楚明瞭。
Note
那本次作法目前只有考慮Taylor series 裡面的一次式,Taylor series 我們這次還沒有考慮到二次、三次,像是二次的牛頓法可能還要考慮到二次微分以及 Hessian matrix(黑塞矩陣)…等等。而這些運算,在做 deep learning 的時候需耗費大量時間跟資源,因此來換你 update 的效率會覺得不划算。
所以,今天如果在做deep learning 的時候通常,還是 Gradient Descent 是比較普及、主流的作法。
More Limitation of Gradient Descent

那最後要談到有關Gradient Descent的限制。
我們都知道在找 它可能會卡在 local minimum 或 saddle point,只要是微分為0的地方就有可能發生。而自己本身可能也無法得知這個地方是否為最小值,只要接觸到微分值為0就停住。
Caution
因本次影片斷在這,下章節影片前段也沒提到這部分,因此大家可以討論一下。
Important
最後來總結一下,根據上面我們總述我們得知每次的迭代更新並不保證Loss function會下降。
而且修改的方法有很多種,目前就提到了:
1.learning rate的調整-動態學習效率(Adagrad)
2.只考慮一筆資料誤差Stochastic Gradient Descent(隨機梯度)
3.改變特徵參數(、…等等)範圍及大小的Feature Scaling
4.更改error surface的gradient紅點大小的Taylor series
以上,本次介紹完畢,謝謝!!