一、優化問題
總體來看,機器學習的核心目標是給出一個模型(一般是映射函數),然後定義對這個模型好壞的評價函數(目標函數),求解目標函數的極大值或者極小值,以確定模型的參數,從而得到我們想要的模型。在這三個關鍵步驟中,前兩個是機器學習要研究的問題,建立數學模型。第三個問題是純數學問題,即最優化方法。
對於形式和特點各異的機器學習算法優化目標函數,我們找到了適合它們的各種求解算法。除了極少數問題可以用暴力搜索來得到最優解之外,我們將機器學習中使用的優化算法依照求解方法的不同,可以分成以下兩類:解析解和數值解。
- 解析解給出一個最優化問題精確的公式解,所謂的解析解是一種包含分式、三角函數、指數、對數甚至無限級數等基本函數的解的形式,也稱爲公式解,一般是理論結果。
- 數值解是在要給出極值點的精確計算公式非常困難的情況下,用數值計算方法近似求解得到最優點。
除此之外,還有其他一些求解思想,如分治法,動態規劃等。
一般機器學習和深度學習中都是通過數值計算的方法近似得到最優解,以下方法多爲數值解的角度。
二、駐點、鞍點與局部極值
首先來回顧一些優化算法相關的數學問題。
對於一個可導函數,尋找其極值的統一做法是尋找導數爲0的點,即費馬定理。微積分中的這一定理指出,對於可導函數,在極值點處導數必定爲0:
對於多元函數,則是梯度爲0:
導數爲0的點稱爲駐點。需要注意的是,導數爲0只是函數取得極值的必要條件而不是充分條件,它只是疑似極值點。是不是極值,是極大值還是極小值,還需要看更高階導數。
對於一元函數,假設x是駐點:
-
如果,則在該點處取極小值
-
如果,則在該點處取極大值
-
如果,還要看更高階導數
海森矩陣是一個自變量爲向量的實值函數的二階偏導數組成的方塊矩陣,對函數,Hessian矩陣爲:
在導數爲0的點處,函數可能不取極值,這稱爲鞍點。下圖是鞍點的一個例子(來自SIGAI雲端實驗室):
對於多元函數,假設x是駐點:
- 如果Hessian矩陣H正定,(所有特徵值> 0),那麼二次型問題在高維空間中呈“碗”形,且嚴格凸(只有一個全局最小值)。如果,那麼是全局最小值點。
- 如果半正定,(所有特徵值>=0),則函數是凸的,如果,則是局部最小值點。
- 如果負正定(所有特徵值<0),二次型問題在高維情況下呈倒碗狀,並且是嚴格凹的(只有一個全局最大值)。如果,那麼就是全局最大值。
- 如果半負定(所有特徵值< = 0),那麼函數是凹的。如果,則是局部最大值。
- 如果H是不定的(在處的特徵值有正有負),這意味着是局部最小&局部最大,因此是一個鞍點。
除鞍點外,最優化算法可能還會遇到另外一個問題:局部極值問題,即一個駐點是極值點,但不是全局極值。如果我們對最優化問題加以限定,可以有效的避免這兩種問題。典型的是凸優化,它要求優化變量的可行域是凸集,目標函數是凸函數。但是機器學習大部分問題,都不是凸優化問題。
雖然駐點只是函數取得極值的必要條件而不是充分條件,但如果我們找到了駐點,再判斷和篩選它們是不是極值點,比之前要容易多了。無論是理論結果,還是數值優化算法,一般都以找駐點作爲找極值點的目標。對於一元函數,先求導數,然後解導數爲0的方程即可找到所有駐點。對於多元函數,對各個自變量求偏導數,令它們爲0,解方程組,即可達到所有駐點。幸運的是,在機器學習中,很多目標函數都是可導的,因此我們可以使用這套方法。
三、優化方法
3.1 梯度下降法
梯度下降最常見的三種變形 Batch Gradient Descent,Stochastic Gradient Descent,Mini-Batch Gradient Descent,這三種形式的區別就是取決於我們用多少數據來計算目標函數的梯度。
由於GD是機器學習最基礎的優化方法,因此本文僅以SGD爲例進行介紹。
隨機梯度下降(SGD)
在這裏SGD和mini batch gradient descent是同一個意思,抽取m個小批量(獨立同分布)樣本,通過計算他們的平均梯度均值。
簡單好理解,但是其存在的缺陷是,只有當自變量是一個維度的時候,它的前進方向纔是真正梯度下降的方向。當存在多維變量時,若某一維度的梯度過大,會使得下降方向在該梯度方向的分量過大,偏離了真正的軌道。
優點:
- 針對大數據集,訓練速度很快。從訓練集樣本中隨機選取一個batch計算一次梯度,更新一次模型參數。
缺點:
- 選擇恰當的初始學習率很困難。
- 學習率調整策略受限於預先指定的調整規則。
- 相同的學習率被應用於各個參數,如果我們的數據是稀疏的,我們更希望對出現頻率低的特徵進行大一點的更新。LR會隨着更新的次數逐漸變小。leraning rate 選擇太小,收斂速度會很慢,如果太大,則loss function會在極小值附近不停的震盪,甚至片偏離。
- 對於非凸函數,還要避免陷於局部極小值處,或者鞍點處,因爲鞍點周圍的error是一樣的,所有維度的梯度都接近於0,SGD很容易被困在這裏,即容易收斂到局部最優。
3.2 動量優化法
動量優化方法引入物理學中的動量思想,加速梯度下降,有Momentum和Nesterov兩種算法。當我們將一個小球從山上滾下來,沒有阻力時,它的動量會越來越大,但是如果遇到了阻力,速度就會變小,動量優化法就是借鑑此思想,使得梯度方向在不變的維度上,參數更新變快,梯度有所改變時,更新參數變慢,這樣就能夠加快收斂並且減少動盪。
Momentum(動量)
如果一直朝着某個方向前進,那麼在這個方向上的梯度會越來越大。當使用SGD時,會出現過度振盪,徘徊前進,而在這個過程中其實那個梯度分量過大的方向的梯度其實在慢慢減小的,原本梯度分量較小的方向在慢慢增大,動量思想可以放大這個過程,使得模型儘快收斂。要是當前時刻的梯度與歷史時刻梯度方向相似,這種趨勢在當前時刻則會加強;要是不同,則當前時刻的梯度方式減弱,簡言之就是通過積累之前的動量來加速當前的梯度。
特點:
- 下降初期時,使用上一次參數更新,下降方向一致,乘上較大的能夠進行很好的加速。由於下降方向和梯度方向一致,而使t時刻的動量變大和t時刻的變化量變大,從而達到加速的目的
- 下降中後期時,在局部最小值來回震盪的時候,,使得更新幅度增大,跳出陷阱
- 在梯度方向改變時,momentum能夠降低參數更新速度,從而減少震盪;在梯度方向相同時,momentum可以加速參數更新, 從而加速收斂。總而言之,momentum能夠加速SGD收斂,抑制震盪。
NAG(Nesterov)
momentum保留了上一時刻的梯度,對其沒有進行任何改變,NAG(Nesterov accelerated gradient)是momentum的改進,在梯度更新時做一個矯正,具體做法就是在當前的梯度上添加上一時刻的動量,避免前進太快,同時提高靈敏度。 將上一節中的公式展開可得:
可以看出,並沒有直接改變當前梯度,所以Nesterov的改進就是讓之前的動量直接影響當前的動量。即:
所以,加上nesterov項後,梯度在大的跳躍後,進行計算對當前梯度進行校正。如下圖:
momentum首先計算一個梯度(短的藍色向量),然後在加速更新梯度的方向進行一個大的跳躍(長的藍色向量),nesterov項首先在之前加速的梯度方向進行一個大的跳躍(棕色向量),計算梯度然後進行校正(綠色梯向量)。
其實,momentum項和nesterov項都是爲了使梯度更新更加靈活,對不同情況有針對性。但是,人工設置一些學習率總還是有些生硬,接下來介紹幾種自適應學習率的方法。
3.3 自適應學習率優化算法
在機器學習中,學習率是一個非常重要的超參數,但是學習率是非常難確定的,雖然可以通過多次訓練來確定合適的學習率,但是一般也不太確定多少次訓練能夠得到最優的學習率,玄學事件,對人爲的經驗要求比較高,所以是否存在一些策略自適應地調節學習率的大小,從而提高訓練速度。
AdaGrad
AdaGrad,即Adaptive Gradient。
設置全局學習率之後,每次通過,全局學習率逐參數的除以歷史梯度平方和的平方根,使得每個參數的學習率不同。
優點:學習率可以自適應的減小。
缺點:學習率過早、過量的減少。
Adadelta
Adadelta是對Adagrad的擴展,最初方案依然是對學習率進行自適應約束,但是進行了計算上的簡化。 Adagrad會累加之前所有的梯度平方,而Adadelta只累加固定大小的項,並且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
在此處Adadelta其實還是依賴於全局學習率的,但是作者做了一定處理,經過近似牛頓迭代法之後:
其中,E代表求期望。
此時,可以看出Adadelta已經不用依賴於全局學習率了。
特點:
- 訓練初中期,加速效果不錯,很快
- 訓練後期,反覆在局部最小值附近抖動
RMSProp
RMSProp,即Root Mean Square prop。
鑑於神經網絡都是非凸條件下的,RMSProp在非凸條件下結果更好,改變梯度累積爲指數衰減的移動平均以丟棄遙遠的過去歷史。
相比於AdaGrad的歷史梯度:
RMSProp增加了一個衰減係數來控制歷史信息的獲取多少:
自適應調節學習率。對學習率進行了約束,適合處理非平穩目標和RNN。
Adam(重要)
Adam:Adaptive Moment Estimation
利用梯度的一階矩估計和二階矩估計動態調節每個參數的學習率。
Adam算法可以看作修正後的Momentum+ RMSProp算法。
優點:
- 經過偏置校正後,每一次迭代都有確定的範圍,使得參數比較平穩。善於處理稀疏梯度和非平穩目標。
- 對內存需求小
- 對不同內存計算不同的學習率
- 更新的步長能夠被限制在大致的範圍內(初始學習率)
- 能自然地實現步長退火過程(自動調整學習率)
- 很適合應用於大規模的數據及參數的場景
- 適用於不穩定目標函數
- 適用於梯度稀疏或梯度存在很大噪聲的問題
Adam optimiser的侷限性是什麼?
雖然使用Adam進行訓練有助於快速收斂,但結果模型的泛化性能往往不如使用SGD進行動量訓練時的泛化性能。另一個問題是,即使Adam有自適應學習率,當使用良好的學習率計劃時,它的性能也會提高。特別是在訓練的早期,使用較低的學習率來避免發散是有益的。這是因爲在一開始,模型的權值是隨機的,因此得到的梯度不是很可靠。如果學習率太大,可能會導致模型採取太大的步驟,而沒有確定合適的權重。當模型克服了這些初始穩定性問題後,可以提高學習速度,加快收斂速度。這個過程被稱爲學習率熱身,其中一個版本在論文“Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour”中有描述。
AdamW和Adam有什麼不同?
AdamW是Adam在權重上使用了L2正則化,這樣小的權重泛化性能更好。
Adamax
Adamax是Adam的一種變體,此方法對學習率的上限提供了一個更簡單的範圍。公式上的變化如下:
可以看出,Adamax學習率的邊界範圍更簡單。
Nadam
Nadam類似於帶有Nesterov動量項的Adam。公式如下:
可以看出,Nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
3.4 牛頓法與擬牛頓法
牛頓法
牛頓法是二階優化技術,也是求解無約束最優化問題的方法,收斂速度較快(考慮到了二階導數的信息),利用了函數的一階和二階導數信息,直接尋找梯度爲0的點。
我們假設點爲函數的根,那麼有。現在我們把函數在點處一階泰勒展開有:
假設點爲該方程的根,則有:
可以得到:
這樣我們就得到了一個遞歸方程,我們可以通過迭代的方式不斷的讓x趨近於x∗從而求得方程f(x)的解。
已經證明,如果是連續的,並且待求的零點x是孤立的,那麼在零點x周圍存在一個區域,只要初始值x0位於這個鄰近區域內,那麼牛頓法必定收斂。 並且,如果不爲0, 那麼牛頓法將具有平方收斂的性能。粗略的說,這意味着每迭代一次,牛頓法結果的有效數字將增加一倍。下圖爲一個牛頓法執行過程的例子。
牛頓法的迭代公式爲:
或表示成:
其中爲Hessian矩陣,爲梯度向量。牛頓法不能保證每次迭代時函數值下降,也不能保證收斂到極小值點。在實現時,也需要設置學習率,原因和梯度下降法相同,是爲了能夠忽略泰勒展開中的高階項。學習率的設置通常採用直線搜索(line search)技術。
在實現時,一般不直接求Hessian矩陣的逆矩陣,因爲計算比較複雜,而是求解下面的線性方程組:
其解d稱爲牛頓方向。迭代終止的判定依據是梯度值充分接近於0,或者達到最大指定迭代次數。
牛頓法比梯度下降法有更快的收斂速度,但每次迭代時需要計算Hessian矩陣,並求解一個線性方程組,運算量大。另外,如果Hessian矩陣不可逆,則這種方法失效。
牛頓法在logistic迴歸,AdaBoost算法等機器學習算法中有實際應用。
擬牛頓法
牛頓法在每次迭代時需要計算出Hessian矩陣,並且求解一個以該矩陣爲係數矩陣的線性方程組,Hessian矩陣可能不可逆。爲此提出了一些改進的方法,典型的代表是擬牛頓法。擬牛頓法的思路是不計算目標函數的Hessian矩陣然後求逆矩陣,而是通過其他手段得到一個近似Hessian矩陣逆的矩陣。具體做法是構造一個近似Hessian矩陣或其逆矩陣的正定對稱矩陣,用該矩陣進行牛頓法的迭代。
擬牛頓法用一個矩陣來近似代替(或來代替),其中滿足擬牛頓條件:
其中,。因此按照擬牛頓條件,每次只需更新(或)即可,使得。
牛頓法有多種的具體實現,其中DFP算法選擇更新,BFGS選擇更新,這裏就不細講了。
3.5 座標軸下降法
座標下降法的基本思想是每次對一個變量進行優化,這是一種分治法。座標軸下降法和梯度下降法具有同樣的思想,都是沿着某個方向不斷迭代,但是梯度下降法是沿着當前點的負梯度方向進行參數更新,而座標軸下降法是沿着座標軸的方向。
假設要求解的優化問題爲:
座標下降法求解流程爲每次選擇一個分量進行優化,將其他分量固定住不動,這樣將一個多元函數的極值問題轉換爲一元函數的極值問題,這樣也避免了Lasso迴歸的損失函數不可導的問題。如果要求解的問題規模很大,這種做法能有效的加快速度。
座標軸下降法等非梯度優化的方法可以解決L1正則化不可導的問題。
3.6 *NLP中大型預訓練模型常用優化器
按照時間上的迭代順序,近些年神經網絡先後出現了 GD、Momentum、AdaGrad、RMSprop、Adam等上述優秀的優化器。到如今,大部分 NLP 預訓練模型已不再使用這些方法,而是使用AdamW和去年首度亮相的 LAMB。
AdamW
AdamW即Adam Weight Decay Regularization
Adam雖然收斂速度快,但沒能解決參數過擬合的問題。學術界討論了諸多方案,其中包括在損失函數中引入參數的 L2 正則項。這樣的方法在其他的優化器中或許有效,但會因爲 Adam 中自適應學習率的存在而對使用 Adam 優化器的模型失效。AdamW 的出現便是爲了解決這一問題,達到同樣使參數接近於 0 的目的。具體的舉措,是在最終的參數更新時引入參數自身:
即爲權重衰減因子,常見的設置爲 0.005/0.01。這一優化策略目前正廣泛應用於各大預訓練語言模型。
LAMB
LAMB即Layer-wise Adaptive Moments optimizer for Batching training,是 2019 年出現的一匹新秀。 LAMB 出現的目的是加速預訓練進程,這個優化器也成爲 NLP 社區爲泛機器學習領域做出的一大貢獻。在使用 Adam 和 AdamW 等優化器時,一大問題在於 batch size 存在一定的隱式上限,一旦突破這個上限,梯度更新極端的取值會導致自適應學習率調整後極爲困難的收斂,從而無法享受增加的 batch size 帶來的提速增益。LAMB 優化器的作用便在於使模型在進行大批量數據訓練時,能夠維持梯度更新的精度:
其中,是一個可選擇的映射函數,一種是 ,另一種則爲起到歸一化作用的 ,和爲預先設定的超參數,分別代表參數調整的下界和上界。這一簡單的調整所帶來的實際效果非常顯著。使用 AdamW 時,batch size 超過 512 便會導致模型效果大幅下降,但在 LAMB 下,batch size 可以直接提到 32,000 而不會導致精度損失。
由於在下游微調預訓練模型時,通常無需過大的數據集,因而 LAMB 僅在預訓練環節使用。遺憾的是,LAMB 在 batch size 512 以下時無法起到顯著作用,目前只能作爲大體量財團的工具。
總結
以上僅爲面試中常見的優化器,給出這些算法的分類和它們之間的關係如下圖:
- 對於稀疏數據,儘量使用學習率可自適應的優化方法,不用手動調節,而且最好採用默認值
- RMSprop, Adadelta, Adam 在很多情況下的效果是相似的
- 隨着梯度變的稀疏,Adam 比 RMSprop 效果會好。
- SGD通常訓練時間更長,但是在好的初始化和學習率調度方案的情況下,結果更可靠
- 如果在意更快的收斂,並且需要訓練較深較複雜的網絡時,推薦使用學習率自適應的優化方法。
- Adadelta,RMSprop,Adam是比較相近的算法,在相似的情況下表現差不多。
- 在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果
不同算法的損失平面等高線:
不同算法在鞍點處的比較:
參考網址:
機器學習中優化算法總結(較多原理及圖示)
深度學習幾種優化器的比較(較全)
An overview of gradient descent optimization algorithms(很全,包含了SGD的一些變種)
機器學習各優化算法的簡單總結(不全,但簡單明瞭)
深度學習——優化器算法Optimizer詳解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)(較全,有動圖)
座標軸下降法(解決L1正則化不可導的問題)
AdamW, LAMB: 大型預訓練模型常用優化器
機器學習中的最優化算法總結
牛頓法和擬牛頓法(原理講解)
【機器學習】優化算法
最全的機器學習中的優化算法介紹