机器学习最常用的优化算法 — 梯度下降法
1. 學習目標
每一個機器學習模型都有一個目標函數,而學習的目標,就是最小化目標函數。直觀而言,當我們已經獲得了一個函數,最小化該函數其實就是,在其自變量取值范圍內,找到使得因變量最小的那個自變量取值點。
經典機器學習模型的目標函數都是凸函數,函數的凸性保證了其有最小值。
2. 凸函數
什么叫做凸函數?這個有一套嚴格的數學定義:某個向量空間的凸子集(區間)上的實值函數,如果在其定義域上的任意兩點 ,有 f(tx + (1-t)y) <= tf(x) + (1-t)f(y),則稱其為該區間上的凸函數。
將這一定義用一元函數的形式,在二維坐標軸里表現出來,是這樣的:
直觀的理解,就是二維空間中的一條曲線,有個“彎兒”沖下,那個彎兒里面的最低點,就是該函數在自變量取值區間內的最小值。
如果自變量取值區間是整個實數域的話,那么可以想象這條曲線所有向下的彎兒里面有一個低到最低的,叫全局最小,而其他的彎兒,就叫做局部最小。
如果自變量本身是二維的(二元函數),則凸函數在三維空間中的圖像是這樣的:
同樣有個“彎兒”,只不過這個彎兒不再是一段曲線,而是成了一個碗狀的曲面,“碗底兒”就是區域內的極值點。在三維空間中,我們要找的最小值就是最深的那個碗底兒(如果不止一個的話)。
3. 梯度下降法
既然已經知道了學習的目標就是最小化目標函數的取值,而目標函數又是凸函數,那么學習的目標自然轉化成了尋找某個凸函數的最小值。
判定一個給定函數是否是凸函數是一件比較復雜的事情,我們在此不多講。
因為本課都是講解經典機器學習模型,所以,前人的工作已經保證我們用到的目標函數都是凸函數。如果未來在應用中構建自己的目標函數,那么千萬記得在直接應用任何優化算法之前,應該先確定它是凸函數。
最常用的一種方法,叫做梯度下降法。
這種方法從直觀來看,非常容易理解。我們還是先以一元函數為例。假設我們的目標函數是一個一元凸函數。
這個函數本身我們已經知道了,那么只要給定一個自變量的取值,就一定能夠得到相應的因變量的取值。
那么我們可以采用如下步驟來獲得其最小值:
- 隨機取一個自變量的值 x
- 對應該自變量算出對應點的因變量值:f(x);
- 計算 f( x) 處目標函數 f(x) 的導數;
- 從 f( x) 開始,沿著該處目標函數導數的反方向,按一個指定的步長 α,向前“走一步”,走到的位置對應自變量取值為 x
- 繼續重復 2-4,直至退出迭代(達到指定迭代次數,或 f(x) 近似收斂到最優解)。
對應三維的情況,可以想像在一個很大的碗的內壁上放上一個小球,每次,我們都沿著當時所在點的切線方向(此處的切線方向是一個二維向量)向前走一步,直到走到碗底為止。
4. 梯度下降超參數
上面講了梯度下降法,其中的 α,又叫做步長,它決定了為了找到最小值點而嘗試在目標函數上前進的步伐到底走多大。
步長是算法自己學習不出來的,它必須由外界指定。
這種算法不能學習,需要人為設定的參數,就叫做超參數。
步長參數 α 是梯度下降算法中非常重要的超參數。這個參數設置的大小如果不合適,很可能導致最終無法找到最小值點。
比如下左圖就是因為步幅太大,幾個迭代后反而取值越來越大。改成右側那樣的小步伐就可以順利找到最低點了。
不過大步伐也不是沒有優點。步伐越大,每一次前進得越多。步伐太小,雖然不容易“跨過”極值點,但需要的迭代次數也多,相應需要的運算時間也就越多。
為了平衡大小步伐的優缺點,也可以在一開始的時候先大步走,當所到達點斜率逐漸下降——函數梯度下降的趨勢越來越緩和——以后,逐步調整,縮小步伐。比如下圖這樣:
5. 梯度下降難點
如果目標函數有多個極小值點(多個向下的“彎兒”),那么如果開始位置不妥,很可能導致最終是走到了一個局部極小值就無法前進了。比如下圖的 Postion1 和 Position2。
這種情況確實很難克服,是梯度下降算法的一大挑戰。
如果目標函數不能確定只有一個極小值,而獲得的模型結果又不令人滿意時,就該考慮是否是在學習的過程中,優化算法進入了局部而非全局最小值。
這種情況下,可以嘗試幾個不同的起始點。甚至嘗試一下大步長,說不定反而能夠跨出局部最小值點所在的凸域。
參考:https://gitbook.cn/gitchat/column/5ad70dea9a722231b25ddbf8/topic/5b19c29485f83d502a1c01a4
總結
以上是生活随笔為你收集整理的机器学习最常用的优化算法 — 梯度下降法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌镇会展中心要门票吗
- 下一篇: 云南车票多少钱啊?