Peter教你談情說AI | 04梯度下降法

上一節我們知道了算法是訓練出來的,訓練過程需要依據某種算法進行運算,這一節我們一起看下線性迴歸中最常用的優化算法——梯度下降法。

凸函數

在前面,我們講到,每一個機器學習模型都有一個目標函數,而學習的目標,就是最小化目標函數。是不是所有函數都能夠在自變量取值範圍內找到因變量最小值呢?顯然不是。不過我們要學習的幾個經典機器學習模型的目標函數都有最小值,也就是我們常說的凸函數

數學定義:某個向量空間的凸子集(區間)上的實值函數,如果在其定義域上的任意兩點 ,有 f(tx + (1-t)y) <= tf(x) + (1-t)f(y),則稱其爲該區間上的凸函數。

將這一定義用一元函數的形式,在二維座標軸裏表現出來,是這樣的:

直觀的理解,就是二維空間中的一條曲線,有個“彎兒”衝下,那個彎兒裏面的最低點,就是該函數在自變量取值區間內的最小值。

如果自變量取值區間是整個實數域的話,那麼可以想想這條曲線所有向下的彎兒裏面有一個低到最低的,叫全局最小,而其他的彎兒,就叫做局部最小。

如果自變量本身是二維的(二元函數),則凸函數在三維空間中的圖象是這樣的:

同樣有個“彎兒”,只不過這個彎兒不再是一段曲線,而是成了一個碗狀的曲面,“碗底兒”就是區域內的極值點。在三維空間中,我們要找的最小值就是最深的那個碗底兒(如果不止一個的話)。

什麼是梯度下降法

既然已經知道了學習的目標就是最小化目標函數的取值,而目標函數又是凸函數,那麼學習的目標自然轉化成了尋找某個凸函數的最小值。

求凸函數的最小值最常用的一種方法,就是梯度下降法。

我們先以一元函數爲例,採用如下步驟來獲得其最小值:

  1. 隨機取一個自變量的值 x 0 ;
  2. 對應該自變量算出對應點的因變量值:f( x 0 );
  3. 計算 f( x 0 ) 處目標函數 f(x) 的導數;
  4. 從 f( x 0 ) 開始,沿着該處目標函數導數的方向,按一個指定的步長 α ,向前“走一步”,走到的位置對應自變量取值爲 x 1 。換言之,| x 0 – x 1 | / α = f(x) 在 f ( x 0 ) 處的斜率;
  5. 繼續重複2-4,直至退出迭代(達到指定迭代次數,或 f(x) 近似收斂到最優解)。

直觀的看起來,就像上圖演示的那樣,在 J(w) 曲線上任取一點,放上一個沒有體積的“小球”,然後讓這個小球沿着該處曲線的切線方向“跨步”,每一步的步長就是 α ,一直跨到最低點位置。

對應三維的情況,可以想像在一個很大的碗的內壁上放上一個小球,每次,我們都沿着當時所在點的切線方向(此處的切線方向是一個二維向量)向前走一步,直到走到碗底爲止。

梯度下降的超參數

上面講了梯度下降法,其中的 α ,又叫做步長,它決定了爲了找到最小值點而嘗試在目標函數上前進的步伐到底走多大。

步長是算法自己學習不出來的,它必須由外界指定。

這種算法不能學習,需要人爲設定的參數,就叫做超參數

步長參數 α 是梯度下降算法中非常重要的超參數。這個參數設置的大小如果不合適,很可能導致最終無法找到最小值點。

比如下左圖就是因爲步幅太大,幾個迭代後反而取值越來越大。改成右側那樣的小步伐就可以順利找到最低點了。

不過大步伐也不是沒有優點。步伐越大,每一次前進得越多。步伐太小,雖然不容易“跨過”極值點,但需要的迭代次數也多,相應需要的運算時間也就越多。

爲了平衡大小步伐的優缺點,也可以在一開始的時候先大步走,當所到達點斜率逐漸下降——函數梯度下降的趨勢越來越緩和——以後,逐步調整,縮小步伐。比如下圖這樣:

梯度下降的注意點

那是不是隻要步伐合適,就一定能找到最小值點呢?也不一定。

如果目標函數有多個極小值點(多個向下的“彎兒”),那麼如果開始位置不妥,很可能導致最終是走到了一個局部極小值就無法前進了。比如下圖的 Postion1 和 Position2。

如果目標函數不能確定只有一個極小值,而獲得的模型結果又不令人滿意時,就該考慮是否是在學習的過程中,優化算法進入了局部而非全局最小值。這種情況下,可以嘗試幾個不同的起始點。甚至嘗試一下大步長,說不定反而能夠跨出局部最小值點所在的凸域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章