从动力学角度看优化算法SGD:一些小启示
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)
個(gè)人主頁(yè)丨kexue.fm
在本文中,我們來(lái)關(guān)心優(yōu)化算法 SGD(stochastic gradient descent,隨機(jī)梯度下降),包括帶 Momentum 和 Nesterov 版本的。對(duì)于 SGD,我們通常會(huì)關(guān)心的幾個(gè)問(wèn)題是:?
SGD 為什么有效??
SGD 的 batch size 是不是越大越好??
SGD 的學(xué)習(xí)率怎么調(diào)??
Momentum 是怎么加速的??
Nesterov 為什么又比 Momentum 稍好??
...?
這里試圖從動(dòng)力學(xué)角度分析 SGD,給出上述問(wèn)題的一些啟發(fā)性理解。
梯度下降
既然要比較誰(shuí)好誰(shuí)差,就需要知道最好是什么樣的,也就是說(shuō)我們的終極目標(biāo)是什么?
訓(xùn)練目標(biāo)分析
假設(shè)全部訓(xùn)練樣本的集合為 S,損失度量為 L(x;θ),其中 x 代表單個(gè)樣本,而 θ 則是優(yōu)化參數(shù),那么我們可以構(gòu)建損失函數(shù):
而訓(xùn)練的終極目標(biāo),則是找到 L(θ) 的一個(gè)全局最優(yōu)點(diǎn)(這里的最優(yōu)是“最小”的意思)。
GD與ODE
為了完成這個(gè)目標(biāo),我們可以用梯度下降法(gradient descent,GD):
其中 ε>0 稱為學(xué)習(xí)率,這里剛好也是迭代的步長(zhǎng)(后面我們會(huì)看到步長(zhǎng)不一定等于學(xué)習(xí)率)。梯度下降有多種理解方式,由于一般都有 ε?1,所以這里我們將它改變?yōu)?#xff1a;
那么左邊就近似于 θ 的導(dǎo)數(shù)(假設(shè)它是時(shí)間 t 的函數(shù)),于是我們可以得到 ODE 動(dòng)力系統(tǒng):
而 (2) 則是 (4) 的一個(gè)歐拉解法。這樣一來(lái),梯度下降實(shí)際上就是用歐拉解法去求解動(dòng)力系統(tǒng) (4),由于 (4) 是一個(gè)保守動(dòng)力系統(tǒng),因此它最終可以收斂到一個(gè)不動(dòng)點(diǎn)(讓 θ˙=0),并且可以證明穩(wěn)定的不動(dòng)點(diǎn)是一個(gè)極小值點(diǎn)(但未必是全局最小的)。
隨機(jī)梯度下降
這里表明,隨機(jī)梯度下降可以用一個(gè)隨機(jī)微分方程來(lái)半定性、半定量地分析。?
從GD到SGD
(2) 我們一般稱為“全量梯度下降”,因?yàn)樗枰袠颖緛?lái)計(jì)算梯度,這是梯度下降的一個(gè)顯著缺點(diǎn):當(dāng)樣本成千上萬(wàn)時(shí),每迭代一次需要的成本太大,甚至可能達(dá)到難以進(jìn)行。于是我們想隨機(jī)從 S 中隨機(jī)抽取一個(gè)子集 R?S,然后只用 R 去計(jì)算梯度并完成單次迭代。我們記:
然后公式 (2) 變?yōu)?#xff1a;
注意 L 的最小值才是我們的目標(biāo),而 LR 則是一個(gè)隨機(jī)變量,?θLR(θn) 只是原來(lái) ?θL(θn) 的一個(gè)估計(jì)。這樣做能不能得到合理的結(jié)果呢?
從SGD到SDE
這里我們假設(shè):
服從一個(gè)方差為 σ^2 的正態(tài)分布,注意這只是一個(gè)近似描述,主要是為了半定性、半定量分析。經(jīng)過(guò)這樣假設(shè),隨機(jī)梯度下降相當(dāng)于在動(dòng)力系統(tǒng) (4) 中引入了高斯噪聲:
原來(lái)的動(dòng)力系統(tǒng)是一個(gè) ODE,現(xiàn)在變成了 SDE(隨機(jī)微分方程),我們稱之為“朗之萬(wàn)方程”。當(dāng)然,其實(shí)噪聲的來(lái)源不僅僅是隨機(jī)子集帶來(lái)的估算誤差,每次迭代的學(xué)習(xí)率大小也會(huì)帶來(lái)噪聲。
在噪聲的高斯假設(shè)下,這個(gè)方程的解是怎樣的呢?原來(lái)的 ODE 的解是一條確定的軌線,現(xiàn)在由于引入了一個(gè)隨機(jī)噪聲,因此解也是隨機(jī)的,可以解得平衡狀態(tài)的概率分布為:
求解過(guò)程可以參考一般的隨機(jī)動(dòng)力學(xué)教程,我們只用到這個(gè)結(jié)果就好。
結(jié)果啟發(fā)
從 (8) 式中我們可以得到一些有意義的結(jié)果。首先我們看到,原則上來(lái)說(shuō)這時(shí)候的 θ 已經(jīng)不是一個(gè)確定值,而是一個(gè)概率分布,而且原來(lái) L(θ) 的極小值點(diǎn),剛好現(xiàn)在變成了 P(θ) 的極大值點(diǎn)。這說(shuō)明如果我們無(wú)限長(zhǎng)地執(zhí)行梯度下降的話,理論上 θ 能走遍所有可能的值,并且在 L(θ) 的各個(gè)“坑”中的概率更高。
σ^2 是梯度的方差,顯然這個(gè)方差是取決于 batch size 的,根據(jù)定義 (7),batch size 越大方差越小。而在 (9) 式中,σ^2 越大,說(shuō)明 P(θ) 的圖像越平緩,即越接近均勻分布,這時(shí)候 θ 可能就到處跑;當(dāng) σ^2 越小時(shí),原來(lái) L(θ) 的極小值點(diǎn)的區(qū)域就越突出,這時(shí)候 θ 就可能掉進(jìn)某個(gè)“坑”里不出來(lái)了。
▲?L(θ)曲線
▲?exp(-L(θ))曲線
這樣分析的話,理論上來(lái)說(shuō),我們一開始要讓 batch size 小一些,那么噪聲方差 σ^2 就會(huì)大一些,越接近均勻分布,算法就會(huì)遍歷更多的區(qū)域,隨著迭代次數(shù)的增加,慢慢地就會(huì)越來(lái)越接近最優(yōu)區(qū)域,這時(shí)候方差應(yīng)該要下降,使得極值點(diǎn)更為突出。也就是說(shuō),有可能的話,batch size 應(yīng)該要隨著迭代次數(shù)而緩慢增加。這就部分地解釋了去年 Google 提出來(lái)的結(jié)果《學(xué)界 | 取代學(xué)習(xí)率衰減的新方法:谷歌大腦提出增加Batch Size》,不過(guò) batch size 增加會(huì)大幅度增加計(jì)算成本,所以我們一般增加到一定量也就不去調(diào)整了。
當(dāng)然,從圖中可以看到,當(dāng)進(jìn)入穩(wěn)定下降區(qū)域時(shí),每次迭代的步長(zhǎng) ε(學(xué)習(xí)率)就不應(yīng)該超過(guò)“坑”的寬度,而 σ^2 越小,坑也就越窄,這也表明學(xué)習(xí)率應(yīng)該要隨著迭代次數(shù)的增加而降低。另外 ε 越大也部分地帶來(lái)噪聲,因此 σ^2 降低事實(shí)上也就意味著我們要降低學(xué)習(xí)率。
所以分析結(jié)果就是:?
條件允許情況下,在使用 SGD 時(shí),開始使用小 batch size 和大學(xué)習(xí)率,然后讓 batch size 慢慢增加,學(xué)習(xí)率慢慢減小。?
至于增大、減少的策略,就要靠各位的煉丹水平了。
動(dòng)量加速?
眾所周知,相比 Adam 等自適應(yīng)學(xué)習(xí)率算法,純 SGD 優(yōu)化是很慢的,而引入動(dòng)量可以加速 SGD 的迭代。它也有一個(gè)漂亮的動(dòng)力學(xué)解釋。
從一階到二階
從前面的文字我們知道,SGD 和 GD 在迭代格式上沒(méi)有什么差別,所以要尋求 SGD 的加速,我們只需要尋求 GD 的加速,然后將全量梯度換成隨機(jī)梯度就行了。而 (2) 式到 (4) 式的過(guò)程我們可以知道,GD 將求 L(θ) 的最小值問(wèn)題變成了 ODE 方程的迭代求解問(wèn)題。
那么,為什么一定要是一階的呢?二階的行不?
為此,我們考慮一般的:
這樣就真正地對(duì)應(yīng)一個(gè)(牛頓)力學(xué)系統(tǒng)了,其中 λ>0 引入了類似摩擦力的作用。我們來(lái)分析這樣的系統(tǒng)跟原來(lái) GD 的一階 ODE (4) 與 (10) 有什么差別。
首先,從不動(dòng)點(diǎn)的角度看,(10)最終收斂到的穩(wěn)定不動(dòng)點(diǎn)(讓),確實(shí)也是 L(θ) 的一個(gè)極小值點(diǎn)。試想一下,一個(gè)小球從山頂滾下來(lái),會(huì)自動(dòng)掉到山谷又爬升,但是由于摩擦阻力的存在,最終就停留在山谷了。注意,除非算法停不了,否則一旦算法停了,那么一定是一個(gè)山谷(也有可能是山頂、鞍點(diǎn),但從概率上來(lái)講則是比較小的),但絕對(duì)不可能是半山腰,因?yàn)榘肷窖脑?#xff0c;還存在勢(shì)能,由能量守恒定律,它可以轉(zhuǎn)化為動(dòng)能,所以不會(huì)停下來(lái)。
因此收斂情況跟一階的 GD 應(yīng)該是沒(méi)有差別的,所以只要比較它們倆的收斂速度。
GD+Momentum
我們將 (10) 等價(jià)地改寫為:
我們將 θ˙ 離散化為:
那么 η 要怎么處理呢?ηn?不對(duì)不對(duì),作為 n 時(shí)刻的導(dǎo)數(shù)只有一階近似(
總結(jié)
以上是生活随笔為你收集整理的从动力学角度看优化算法SGD:一些小启示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CVPR 2018现场见闻
- 下一篇: 岗位推荐 | 腾讯音乐娱乐招聘推荐算法工