鍵.png)
使用這些基本 REST API 最佳實踐構(gòu)建出色的 API
當我們機器學習的學習目標是極大化降低(經(jīng)驗)損失函數(shù),這點和傳統(tǒng)的優(yōu)化是比較相似的,那么如何實現(xiàn)這個目標呢?我們第一反應可能是直接求解損失函數(shù)最小值的公式/解析解(如最小二乘法),獲得最優(yōu)的模型參數(shù)。但是,通常機器學習模型的損失函數(shù)較復雜,很難直接求最優(yōu)解。幸運的是,我們還可以通過優(yōu)化算法(如遺傳算法、梯度下降算法、牛頓法等)有限次迭代優(yōu)化模型參數(shù),以盡可能降低損失函數(shù)的值,得到較優(yōu)的參數(shù)值(數(shù)值解)。上述去搜索一組最\較優(yōu)參數(shù)解w所使用的算法,即是優(yōu)化算法。下圖優(yōu)化算法的總結(jié):(圖與本文內(nèi)容較相符,摘自@teekee)
最小二乘法常用在機器學習回歸模型求解析解(對于復雜的深度神經(jīng)網(wǎng)絡(luò)無法通過這方法求解),其幾何意義是高維空間中的一個向量在低維子空間的投影。
如下以一元線性回歸用最小二乘法求解為例。
其損失函數(shù)mse為:
對損失函數(shù)求極小值,也就是一階導數(shù)為0。通過偏導可得關(guān)于參數(shù)a及偏置b的方程組:
代入數(shù)值求解上述線性方程組,可以求解出a,b的參數(shù)值。也就是求解出上圖擬合的那條直線ax+b。
注:神經(jīng)網(wǎng)絡(luò)優(yōu)化算法以梯度下降類算法較為高效,也是主流的算法。而遺傳算法、貪心算法、模擬退火等優(yōu)化算法用的比較少。
遺傳算法(Genetic Algorithms,GA)是模擬自然界遺傳和生物進化論而成的一種并行隨機搜索最優(yōu)化方法。與自然界中“優(yōu)勝略汰,適者生存”的生物進化原理相似,遺傳算法就是在引入優(yōu)化參數(shù)形成的編碼串聯(lián)群體中,按照所選擇的適應度函數(shù)并通過遺傳中的選擇、交叉和變異對個體進行篩選,使適應度好的個體被保留,適應度差的個體被淘汰,新的群體既繼承了上一代的信息,又優(yōu)于上一代。這樣反復循環(huán)迭代,直至滿足條件。
梯度下降算法可以直觀理解成一個下山的方法,將損失函數(shù)J(w)比喻成一座山,我們的目標是到達這座山的山腳(即求解出最優(yōu)模型參數(shù)w使得損失函數(shù)為最小值)。
下山要做的無非就是“往下坡的方向走,走一步算一步”,而在損失函數(shù)這座山上,每一位置的下坡的方向也就是它的負梯度方向(直白點,也就是山的斜向下的方向)。在每往下走到一個位置的時候,求解當前位置的梯度,向這一步所在位置沿著最陡峭最易下山的位置再走一步。這樣一步步地走下去,一直走到覺得我們已經(jīng)到了山腳。當然這樣走下去,有可能我們不是走到山腳(全局最優(yōu),Global cost minimun),而是到了某一個的小山谷(局部最優(yōu),Local cost minimun),這也后面梯度下降算法的可進一步調(diào)優(yōu)的地方。對應的算法步驟,直接截我之前的圖:
梯度下降是一個大類,常見的梯度下降算法及優(yōu)缺點,如下圖:
對于深度學習而言“隨機梯度下降, SGD”,其實就是基于小批量(mini-batch)的隨機梯度下降,當batchsize為1也就是在線學習優(yōu)化。
隨機梯度下降是在梯度下降算法效率上做了優(yōu)化,不使用全量樣本計算當前的梯度,而是使用小批量(mini-batch)樣本來估計梯度,大大提高了效率。原因在于使用更多樣本來估計梯度的方法的收益是低于線性的,對于大多數(shù)優(yōu)化算法基于梯度下降,如果每一步中計算梯度的時間大大縮短,則它們會更快收斂。且訓練集通常存在冗余,大量樣本都對梯度做出了非常相似的貢獻。此時基于小批量樣本估計梯度的策略也能夠計算正確的梯度,但是節(jié)省了大量時間。
對于mini-batch的batchsize的選擇是為了在內(nèi)存效率(時間)和內(nèi)存容量(空間)之間尋找最佳平衡。
還可以自適應調(diào)節(jié)batchsize,參見《Small Batch or Large Batch? Peifeng Yin》
Momentum算法在梯度下降中加入了物理中的動量的概念,模擬物體運動時候的慣性,即在更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度對之前的梯度進行微調(diào),這樣一來,可以在一定程度上增加穩(wěn)定性,從而學習的更快,并且有一定的擺脫局部最優(yōu)的能力。
該算法引入了變量 v 作為參數(shù)在參數(shù)空間中持續(xù)移動的速度向量,速度一般可以設(shè)置為負梯度的指數(shù)衰減滑動平均值。對于一個給定需要最小化的代價函數(shù),動量可以表達為:更新后的梯度 = 折損系數(shù)γ動量項+ 學習率?當前的梯度。
其中 ? 為學習率,γ ∈ (0, 1] 為動量系數(shù),v 是速度向量。一般來說,梯度下降算法下降的方向為局部最速的方向(數(shù)學上稱為最速下降法),它的下降方向在每一個下降點一定與對應等高線的切線垂直,因此這也就導致了 GD 算法的鋸齒現(xiàn)象。加入動量法的梯度下降是令梯度直接指向最優(yōu)解的策略之一。
Nesterov動量是動量方法的變種,也稱作Nesterov Accelerated Gradient(NAG)。在預測參數(shù)下一次的位置之前,我們已有當前的參數(shù)和動量項,先用(θ?γvt?1)下一次出現(xiàn)位置的預測值作為參數(shù),雖然不準確,但是大體方向是對的,之后用我們預測到的下一時刻的值來求偏導,讓優(yōu)化器高效的前進并收斂。
在平滑的凸函數(shù)的優(yōu)化中,對比批量梯度下降,NAG 的收斂速度超出 1/k 到 1/(k^2)
Adagrad 亦稱為自適應梯度(adaptive gradient),允許學習率基于參數(shù)進行調(diào)整,而不需要在學習過程中人為調(diào)整學習率。Adagrad 根據(jù)不常用的參數(shù)進行較大幅度的學習率更新,根據(jù)常用的參數(shù)進行較小幅度的學習率更新。然而 Adagrad 的最大問題在于,在某些情況,學習率變得太小,學習率單調(diào)下降使得網(wǎng)絡(luò)停止學習過程。
其中是梯度平方的積累量s,在進行參數(shù)更新時,學習速率要除以這個積累量的平方根,其中加上一個很小值是ε為了防止除0的出現(xiàn)。由于s 是逐漸增加的,那么學習速率是相對較快地衰減的。
RMSProp 算是對Adagrad算法的改進,主要是解決學習速率過快衰減的問題,它不是像AdaGrad算法那樣暴力直接的累加平方梯度,而是加了一個衰減系數(shù)γ 來控制歷史信息的獲取多少。
Adam 算法為兩種隨機梯度下降的優(yōu)點集合:
Adam 算法同時獲得了 AdaGrad 和 RMSProp 算法的優(yōu)點,像RMSprop 一樣存儲了過去梯度的平方 v的指數(shù)衰減平均值 ,也像 momentum 一樣保持了過去梯度 m 的指數(shù)衰減平均值:
如果 m 和 v被初始化為 0 向量,那它們就會向 0 偏置,所以做了偏差校正放大它們:
梯度更新能夠從梯度均值及梯度平方兩個角度進行自適應地調(diào)節(jié),而不是直接由當前梯度決定。
牛頓法和梯度下降法相比,兩者都是迭代求解,不過梯度下降法是梯度求解(一階優(yōu)化),而牛頓法是用二階的海森矩陣的逆矩陣求解。相對而言,使用牛頓法收斂更快(迭代更少次數(shù)),但是每次迭代的時間比梯度下降法長(計算開銷更大,實際常用擬牛頓法替代)。
通俗來講,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之后,后面坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。但是,牛頓法對初始值有一定要求,在非凸優(yōu)化問題中(如神經(jīng)網(wǎng)絡(luò)訓練),牛頓法很容易陷入鞍點(牛頓法步長會越來越?。荻认陆捣▌t更容易逃離鞍點(因此在神經(jīng)網(wǎng)絡(luò)訓練中一般使用梯度下降法,高維空間的神經(jīng)網(wǎng)絡(luò)中存在大量鞍點)。
綜上, 對于神經(jīng)網(wǎng)絡(luò)的優(yōu)化,常用梯度下降等較為高效的方法。梯度下降算法類有SGD、Momentum、Adam等算法可選。對于大多數(shù)任務(wù)而言,通??梢灾苯酉仍囅翧dam,然后可以繼續(xù)在具體任務(wù)上驗證不同優(yōu)化器效果。
文章轉(zhuǎn)自微信公眾號@算法進階