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