3 Gradient Descent - 梯度下降
1 爲什麼要用 Gradient Descent
首先讓我們回顧一下機器學習的三部曲,
在 step 2 中,我們要定義一個 Loss Function,用來判斷我們找出的函數的好壞。
在 step 3 中,我們要挑出一個可以使得 Loss 函數值最小的一個函數,當做最好的函數。
想一想我們以前是怎麼求一個函數的最小值的,或許看一下就出來了,或者簡單求個導。但是在神經網絡中,我們面臨的是一個參數可能上萬個,百萬個甚至更多的函數,顯然我們需要更好的方法。
而這個方法就是 Gradient Descent。
2 Gradient Descent 怎麼做
首先我們要知道 梯度(Grad) 這個概念,梯度就是 一個函數增長最快的方向。而 Gradient Descent 就是沿着梯度的反方向,也就是下降得最快的方向前進,直至找到一個最小值(理論上來說可能只能找到極小值,但是經過一些變種,好像可以增大找到最小值的概率)。
舉個例子:
稍微解釋一下就是:
- 先隨機(或者其他更有效的方法)設置一個初始值 ;
- 算出 上的梯度值 ;
- 令 。其中 叫做 learning rate ,決定步長。
- 算出 上的梯度值 ………..循環 2, 3 兩個步驟,直至達到目標。
直觀的解釋如下圖:
以上就是 Gradient Descent 最通用的操作了。觀察一下上面的公式,我們能調的參數也就 ,如果 的值沒有取好的話, 越大,學習速度越快,但是可能沒辦法收斂; 越小,學習速度越慢,但是不容易跳過最小值。可能根本就無法得到想要的結果。以下是 的大小對 Loss 的影響:
接下去會介紹一些改進版的梯度算法,主要區別就是在算法過程中如何動態改變 的值。
3 梯度下降算法plus
- 基本原則:learning rate 的設置一般都是隨着學習的深入逐漸變小的。
- 前期離目標比較遠,所以讓 learning rate 大一點,使學習速度更快。
- 後期離目標比較近,所以讓 learning rate 小一點,使算法可以收斂。
3.1 Adagrad
將每個參數的 learning rate 除以之前算過的所有導數的 均方根(N 個項的和除以 N 再開平方)。
舉個例子,
由於 和 都有一個 ,所以實際計算時可以抵消掉,如下圖:
上圖的式子中, 想做的其實是算二次微分,但是爲什麼這麼做以及爲什麼可以這麼做就不詳細說明了。
3.2 Stochastic Gradient Descent
在前面的 Gradient Descent 中,我們每一次更新參數都要算出 Total Loss,也就是每次都要遍歷所有的訓練樣本才能更新一次參數。這種做法的好處是可以算出下降得最快的路徑,缺點是每次的計算量比較大,耗費的時間比較長。
而 Stochastic Gradient Descent 的思想是,我們每算出一個訓練樣本的微分就更新一次參數。這樣做的好處就是一個字:快。雖然走的不是最優路線,但是學習起來非常快。
3.3 Feature Scaling
假設 ,如果 的分佈很不一樣,那就應該對其中某一個變量做 Scaling(縮放),使得兩個變量的分佈一樣。
爲什麼要做縮放呢?以上面的公式 爲例,下面是兩個其對應的神經元,但是不同的是,左邊的 輸入是比較大的如 之類的,但是右邊的 輸入比較小。
上圖下方兩幅圖表示的是 的變化對 的影響,
- 左邊的等高線是橢圓形,因爲 Gradient Descent 並不是朝着最低點走,而是沿着等高線走,其路線就是圖上箭頭方向,這樣子的方向要更新參數是比較困難的;
- 右邊就是正圓形,不管在哪裏初始化參數,都可以筆直朝着圓心方向走,更新參數就變得比較容易。
怎麼做縮放?方法有很多,這裏提供一種比較常用的方法。
4 Gradient Descent 的數學原理
- 這部分沒聽懂,現在先放着,以後有空再補坑。
5 Gradient Descent 的侷限性
會陷入局部最優(Local Minimum);
有一些微分是 0 的點甚至連局部最優都不是,這種點我們叫做 saddle point。
我們實際在做的時候,並不會真的更新到微分值等於 0 的點,可能只是小於一個比較小的值(比如 )就不更新參數了,而我們無從得知這個點是不是一個比較優的值,可能只是處於一個平坦的高原地區。