1. 前言
今天我們聊一聊機器學習和深度學習里面都至關重要的一個環節,優化損失函數。我們知道一個模型只有損失函數收斂到了一定的值,才有可能會有好的結果,降低損失方式的工作就是優化方法需要做的事。下面會討論一些常用的優化方法:梯度下降法家族、牛頓法、擬牛頓法、共軛梯度法、Momentum、Nesterov Momentum、Adagrad、RMSprop、Adam等。
優化過程的示意圖如下:
2. 梯度下降法
2.1 梯度下降法原理
舉個形象的例子,梯度下降法就好比一個蒙着眼睛的人下山,每次在負梯度最大的方向,向前走一步,走出一步后,比較前后的的落差,若落差小於一定閾值,則認為到達山谷,若落差大於閾值,則繼續向前走,直到到達山谷。
2.2 梯度下降法概念
在詳細了解梯度下降的算法之前,我們先看看相關的一些概念。
- 步長(Learning rate):步長又稱學習率,決定了在梯度下降迭代的過程中,每一步沿梯度負方向前進的長度。用上面下山的例子,步長就是在當前這一步所在位置沿着最陡峭最易下山的位置走的那一步的長度。
- 損失函數(loss function):為了評估模型擬合的好壞,通常用損失函數來度量擬合的程度。損失函數極小化,意味着擬合程度最好,對應的模型參數即為最優參數。在線性回歸中,損失函數通常為樣本輸出和假設函數的差取平方。
2.3 梯度下降法調優
在梯度下降法中調優比較重要的是3個因素,步長、初始值、歸一化。
- 步長:步長太小,收斂慢,步長太大,會遠離最優解。所以需要從小到大,分別測試,選出一個最優解。
- 初始值:隨機選取初始值,當損失函數是非凸函數時,找到的解可能是局部最優解,需要多測試幾次,從局部最優解中選出最優解。當損失函數是凸函數時,得到的解就是最優解。
- 歸一化:如果不歸一化,會收斂的很慢,會形成之字的路線。
2.4 梯度下降法分類
2.4.1 批量梯度下降法(BGD)
計算梯度時使用所有的樣本,這樣每次算出來的梯度都是當前最優的方向。
- 優點
- 迭代次數少
- 若損失函數為凸函數,能夠保證收斂到全局最優解;若為非凸函數,能夠收斂到局部最優值(結果的准確度)
- 缺點
- 訓練速度慢(時間,每一次訓練需要的時間)
- 需要內存大(空間)
- 不支持在線更新
2.4.2 隨機梯度下降法(SGD)
隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的數據,而是僅僅選取一個樣本j來求梯度
- 優點
- 訓練速度快
- 支持在線更新
- 有幾率跳出局部最優解
- 缺點
- 容易收斂到局部最優,並且容易被困在鞍點
- 迭代次數多
2.4.3 小批量梯度下降法(MBGD)
小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對於m個樣本,我們采用x個樣子來迭代,\(1<x<m\)。一般可以取\(x=10\)。
3. 其他優化算法
3.1 牛頓法
牛頓法又名切線法,它的基本思想是對損失函數的二階泰勒展開進行求導。
從本質上去看,牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。
如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之后,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。(牛頓法目光更加長遠,所以少走彎路;相對而言,梯度下降法只考慮了局部的最優,沒有全局思想。)
切線法形象化如下:
從幾何上說,牛頓法就是用一個二次曲面去擬合你當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。
- 優點
- 梯度下降的速度很快
- 缺點
- 牛頓法是一種迭代算法,每一步都需要求解目標函數的Hessian矩陣的逆矩陣,計算比較復雜。
3.2 擬牛頓法
擬牛頓法的本質思想是改善牛頓法每次需要求解復雜的Hessian矩陣的逆矩陣的缺陷,它使用正定矩陣來近似Hessian矩陣的逆,從而簡化了運算的復雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時計算目標函數的梯度(一階導數)。
- 優點
- 使用正定矩陣模擬Hessian矩陣,使得迭代速度比BGD快
- 只計算了函數的梯度,所以訓練時間比牛頓法快
3.3 共軛梯度法
共軛梯度法是介於最速下降法與牛頓法,擬牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣並求逆的缺點,克服了擬牛頓法需要很大的存儲空間,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。
- 優點
- 需存儲量小
- 穩定性高
- 不需要任何外來參數
4. SGD延伸算法
4.1 Momentum(動量法)
Momentum旨在加速學習,特別是處理高曲率、小但一致的梯度,或帶噪音的梯度。Momentum算法會觀察歷史梯度(動量),若當前梯度的方向與歷史梯度一致(表明當前樣本不太可能為異常點),則會增強這個方向的梯度,若當前梯度與歷史梯方向不一致,則梯度會衰減。
一種形象的解釋
我們把一個球推下山,球在下坡時積累慣性(動量),在途中若球運動方向不變,因為慣性,球會越來越快,若球的方向發生變化,因為慣性,球的速度會變慢。
左邊是SGD,右邊是Momentum旨在加速學習:
4.2 Nesterov Momentum(NAG)
Nesterov Momentum是Momentum的變種,用於解決SGD容易陷入局部最優的問題。我們知道Momentum方法中梯度方向由積累的動量和當前梯度方法共同決定,與其看當前梯度方向,不妨先看看跟着積累的動量走一步是什么情況,再決定怎么走。
在小球向下滾動的過程中,我們希望小球能夠提前知道在哪些地方坡面會上升,這樣在遇到上升坡面之前,小球提前就開始減速,就不容易陷入局部最優解。
4.3 Adagrad
Adagrad是自適應梯度法。它通過記錄每次迭代過程中的前進方向和距離,從而使得針對不同問題,有一套自適應調整學習率的方法,對於出現頻率較低參數采用較大的α更新;相反,對於出現頻率較高的參數采用較小的α更新。
4.4 RMSprop
Adagrad會累加之前所有的梯度平方,而RMSprop僅僅是計算對應的平均值,因此可緩解Adagrad算法學習率下降較快的問題。
4.5 Adam
Adam(Adaptive Moment Estimation)是另一種自適應學習率的方法。總結以上算法,以SGD作為最初的算法,Momentum在其基礎上加入了一階動量(歷史梯度的累計),AdaGrad和RMSProp在其基礎上加入了二階動量(歷史梯度的平方累計),Adam就是結合了一階動量和二階動量算法。
4.6 Nadam
我們說Adam是集大成者,而Nadam = Adam + NAG。
4.7 展示
介紹了上面的幾種學習率的優化方法,大家可能一下不太好理解,這里放兩張動圖,幫助大家加深理解。
5. 總結
本文對機器學習中常用的優化算法做了一個簡短的總結,只介紹了算法各自的最大的特點,並沒有涉及具體的公式和細節。具體針對每種算法各自的實現方式和適用范圍還需讀者自己了解。希望本文能給讀者展現出一個機器學習中優化算法的大概的知識圖譜。