天天看點

從動力學角度看優化算法SGD:一些小啟示

在本文中,我們來關心優化算法 SGD(stochastic gradient descent,随機梯度下降),包括帶 Momentum 和 Nesterov 版本的。對于 SGD,我們通常會關心的幾個問題是:

SGD 為什麼有效?

SGD 的 batch size 是不是越大越好?

SGD 的學習率怎麼調?

Momentum 是怎麼加速的?

Nesterov 為什麼又比 Momentum 稍好?

...

這裡試圖從動力學角度分析 SGD,給出上述問題的一些啟發性了解。

梯度下降

既然要比較誰好誰差,就需要知道最好是什麼樣的,也就是說我們的終極目标是什麼?

訓練目标分析

假設全部訓練樣本的集合為 S,損失度量為 L(x;θ),其中 x 代表單個樣本,而 θ 則是優化參數,那麼我們可以建構損失函數:

從動力學角度看優化算法SGD:一些小啟示

而訓練的終極目标,則是找到 L(θ) 的一個全局最優點(這裡的最優是“最小”的意思)。

GD與ODE

為了完成這個目标,我們可以用梯度下降法(gradient descent,GD):

從動力學角度看優化算法SGD:一些小啟示

其中 ε>0 稱為學習率,這裡剛好也是疊代的步長(後面我們會看到步長不一定等于學習率)。梯度下降有多種了解方式,由于一般都有 ε≪1,是以這裡我們将它改變為:

從動力學角度看優化算法SGD:一些小啟示

那麼左邊就近似于 θ 的導數(假設它是時間 t 的函數),于是我們可以得到 ODE 動力系統:

從動力學角度看優化算法SGD:一些小啟示

而 (2) 則是 (4) 的一個歐拉解法。這樣一來,梯度下降實際上就是用歐拉解法去求解動力系統 (4),由于 (4) 是一個保守動力系統,是以它最終可以收斂到一個不動點(讓 θ˙=0),并且可以證明穩定的不動點是一個極小值點(但未必是全局最小的)。

随機梯度下降

這裡表明,随機梯度下降可以用一個随機微分方程來半定性、半定量地分析。

從GD到SGD

(2) 我們一般稱為“全量梯度下降”,因為它需要所有樣本來計算梯度,這是梯度下降的一個顯著缺點:當樣本成千上萬時,每疊代一次需要的成本太大,甚至可能達到難以進行。于是我們想随機從 S 中随機抽取一個子集 R⊆S,然後隻用 R 去計算梯度并完成單次疊代。我們記:

從動力學角度看優化算法SGD:一些小啟示

然後公式 (2) 變為:

從動力學角度看優化算法SGD:一些小啟示

注意 L 的最小值才是我們的目标,而 LR 則是一個随機變量,∇θLR(θn) 隻是原來 ∇θL(θn) 的一個估計。這樣做能不能得到合理的結果呢?

從SGD到SDE

這裡我們假設:

從動力學角度看優化算法SGD:一些小啟示

服從一個方差為 σ^2 的正态分布,注意這隻是一個近似描述,主要是為了半定性、半定量分析。經過這樣假設,随機梯度下降相當于在動力系統 (4) 中引入了高斯噪聲:

從動力學角度看優化算法SGD:一些小啟示

原來的動力系統是一個 ODE,現在變成了 SDE(随機微分方程),我們稱之為“朗之萬方程”。當然,其實噪聲的來源不僅僅是随機子集帶來的估算誤差,每次疊代的學習率大小也會帶來噪聲。

在噪聲的高斯假設下,這個方程的解是怎樣的呢?原來的 ODE 的解是一條确定的軌線,現在由于引入了一個随機噪聲,是以解也是随機的,可以解得平衡狀态的機率分布為:

從動力學角度看優化算法SGD:一些小啟示

求解過程可以參考一般的随機動力學教程,我們隻用到這個結果就好。

結果啟發

從 (8) 式中我們可以得到一些有意義的結果。首先我們看到,原則上來說這時候的 θ 已經不是一個确定值,而是一個機率分布,而且原來 L(θ) 的極小值點,剛好現在變成了 P(θ) 的極大值點。這說明如果我們無限長地執行梯度下降的話,理論上 θ 能走遍所有可能的值,并且在 L(θ) 的各個“坑”中的機率更高。

σ^2 是梯度的方差,顯然這個方差是取決于 batch size 的,根據定義 (7),batch size 越大方差越小。而在 (9) 式中,σ^2 越大,說明 P(θ) 的圖像越平緩,即越接近均勻分布,這時候 θ 可能就到處跑;當 σ^2 越小時,原來 L(θ) 的極小值點的區域就越突出,這時候 θ 就可能掉進某個“坑”裡不出來了。

從動力學角度看優化算法SGD:一些小啟示

▲ L(θ)曲線

從動力學角度看優化算法SGD:一些小啟示

▲ 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 方程的疊代求解問題。

那麼,為什麼一定要是一階的呢?二階的行不?

為此,我們考慮一般的:

從動力學角度看優化算法SGD:一些小啟示

這樣就真正地對應一個(牛頓)力學系統了,其中 λ>0 引入了類似摩擦力的作用。我們來分析這樣的系統跟原來 GD 的一階 ODE (4) 與 (10) 有什麼差别。

首先,從不動點的角度看,(10)最終收斂到的穩定不動點(讓),确實也是 L(θ) 的一個極小值點。試想一下,一個小球從山頂滾下來,會自動掉到山谷又爬升,但是由于摩擦阻力的存在,最終就停留在山谷了。注意,除非算法停不了,否則一旦算法停了,那麼一定是一個山谷(也有可能是山頂、鞍點,但從機率上來講則是比較小的),但絕對不可能是半山腰,因為半山腰的話,還存在勢能,由能量守恒定律,它可以轉化為動能,是以不會停下來。

是以收斂情況跟一階的 GD 應該是沒有差别的,是以隻要比較它們倆的收斂速度。

GD+Momentum

我們将 (10) 等價地改寫為:

從動力學角度看優化算法SGD:一些小啟示

我們将 θ˙ 離散化為:

從動力學角度看優化算法SGD:一些小啟示

那麼 η 要怎麼處理呢?ηn?不對不對,作為 n 時刻的導數隻有一階近似(𝒪(ε)),而作為 n+1/2 時刻的導數則有二階近似(𝒪(ε^2))。是以,更準确地有:

從動力學角度看優化算法SGD:一些小啟示

類似地,從 (11) 式的第二個式子,我們導出下面的結果,同樣具有二階近似:

從動力學角度看優化算法SGD:一些小啟示

總而言之,為了追求高精度,是 θ 的 n+1/2 時刻的導數,(ηn+1/2−ηn−1/2)/ε 是 η 的 n 時刻的導數,而 (ηn+1/2+ηn−1/2)/2=ηn。它們都具有 𝒪(ε^2) 的精度。

記:

從動力學角度看優化算法SGD:一些小啟示

那麼聯合 (13),(14) 我們得到:

從動力學角度看優化算法SGD:一些小啟示

這就是帶 Momentum 的 GD 算法了。在數學上,他還有一個特别的名字,叫做“蛙跳積分法”。

如何加速?

結合 (15) 和 (16) 兩個式子,我們就可以觀察到 Momentum 是如何加速 GD 了。

在 GD 的 (2) 中,學習率是 ε,步長也是 ε,精度是 𝒪(ε);在Momentum中,學習率是 α≈ε^2,步長是 ε,精度是 𝒪(ε^2)=𝒪(α)。這樣一來,標明學習率 α 後,在同樣精度下,Momentum 實際上是步長前進的,而純 GD 則是以步長 α 前進的。

由于學習率一般小于 1,是以。是以:

Momentum 加速的原理之一就是可以在同等學習率、不損失精度的情況下,使得整個算法以更大步長前進。

從動力學角度看優化算法SGD:一些小啟示

▲ 從A點出發,sgd+momentum能夠到達D點,而sgd通常隻能到達B點

此外,如圖所示,假如從 A 點出發,那麼梯度下降則會慢慢降低到 B 點來,最後停留在 C 點,當然,如果噪聲、學習率比較大,那麼它還有可能越過 C 點進而到達 D 點。

但是有了動量加速後,這時 (10) 是一個動力學方程,牛頓力學的所有東西都可以搬到這裡來。從 A 點出發,開始速度為 0,然後慢慢下降,勢能轉化為動能,然後經過 B 點後慢慢上升,動能轉化為勢能,如果摩擦力比較小,那麼到達 C 點後還有動能,那它就能直接到達 D 點去了。這是能量守恒保證的,哪怕沒有噪聲也可以。而在 sgd 中,要靠大學習率、小 batch size(增強噪聲)才能達到類似的效果。

是以,我們還可以說:

Momentum 加速為“越過”不那麼好的極小值點提供了來自動力學的可能性。

那麼 λ 應該要怎麼選呢?直接讓 λ=0 或 β=1 不成嗎?

前面說到,λ>0 這一項相當于摩擦力,用來消耗能量,如果沒有這一項,不管學習率多小,隻要不為零,那麼 Momentum 算法不會停留在極小值點,會一直動下去。就好比如果沒有摩擦力的話,單擺就會不斷擺動,不會停止,這是能量守恒決定的,能量守恒告訴我們,在能量的最低點(也就是我們期望的最小值點)時,動能是最大的,也就是速度是最快的,說白了,算法是根本停不下來。但是如果有摩擦力消耗掉能量,能量不再守恒,那麼單擺最終停留在能量的最低點。

是以,引入 λ 對算法的收斂來說是必須的,同時從 (15) 我們有 β<1。但是,λ 也不能過大,過大的摩擦力會導緻運動沒到達最低點就停止了,為了保證加速效果的存在,我們還有 β>0。

最後,從 (16) 式的 β 的定義可以看到,當固定 λ 時(也就是固定摩擦系數),如果學習率 α 降低(意味着 ε 也降低),那麼 β 應該随之升高,其中提升的比例可以進行簡單的估算。由 (16) 我們得到近似,進而可以反解出 λ,然後代入新的 α,就可以算出新的 β。

這樣我們就得到,SGD+Momentum 的優化器中 β 的一個供參考的調參方案:

在使用 SGD+Momentum 時,如果降低學習率,那麼應當輕微提升。當學習率從 α 降到 rα 時,β 可以考慮提升到。

Nesterov動量

Momentum 算法本質上在數值求解 (10),而求解 (10) 并不隻有 (13),(14) 這種顯式的疊代格式,還有隐式的疊代。比如我們可以将 (10) 近似為:

從動力學角度看優化算法SGD:一些小啟示

設:

從動力學角度看優化算法SGD:一些小啟示

就得到:

從動力學角度看優化算法SGD:一些小啟示

這是一種隐式的疊代公式,理論上為了求 θn+1 我們還需要解一個非線性方程組。但近似來看,隻需要将 θn+1 用 θn+βvn 近似,得到:

從動力學角度看優化算法SGD:一些小啟示

如果将括号裡邊的 β/2 替換成 β,那麼就是标準的帶 Nesterov 動量的 GD 算法,然而我覺得上式似乎更加合理,因為 Nesterov 算法想着用 θn+1 處的梯度代替 θn 處的梯度,以賦予算法“前瞻能力”,但事實上還是有偏了,直覺上用 (θn+θn+1)/2 處的梯度更加“中肯”一些。

從誤差分析來看,其實不管是标準的 Momentum 還是 Nesterov 版本,都是一個二階算法,精确度相同(隻是一個常數級的差别)。但理論上 Nesterov 是一個隐式的疊代,穩定域更廣一些,是以通常能得到更好的效果。

怎麼用 tf 等架構實作 (20) 式呢?注意 (20) 涉及到了将 L(θ) 先對 θ 求導,然後将 θ 替換成(我這裡的 Nesterov)或 θn+βvn(标準的 Nesterov),這個操作在我們看來應當是很簡單的,但是在 tf 等架構下就有點繁瑣了。

因為這些架構雖然是有自動求導功能,但它們終究隻是一個數值計算架構,而不是符号計算系統,是以結果隻是一個數值導數。當我們求出 θ 的導數時,結果是一個張量,是一個确定的數,要将 θ 替換成就有點難辦了。當然不是不可能,但終究沒有 Momentum 版的一步到位來得簡單。

于是為了便于實作,我們設(以标準的 Nesterov 為例):

從動力學角度看優化算法SGD:一些小啟示

那麼可以得到新的疊代公式:

從動力學角度看優化算法SGD:一些小啟示

這就是主流架構的 Nesterov 算法的實作方式,比如 Keras 的,這樣就免除了自變量替換的過程。随着疊代越來越靠近極小值點,動量 v 會越來越小,是以 Θ 和 θ 最終将會等價的——就算有一點誤差也不打緊,因為我們用動量的根本目的是為了加速,而選擇模型還是看 valid 集的效果。

Kramers方程

前面讨論的隻是全量梯度下降的動量加速方法,最後簡單分析一下随機梯度下降下的情形。跟前面一樣的假設,引入随機梯度後,我們可以認為 (10) 變成了帶随機力的方程:

從動力學角度看優化算法SGD:一些小啟示

這稱為“Kramers方程”,跟朗之萬方程一樣,都是随機動力學裡邊的核心成果。它的靜态分布為:

從動力學角度看優化算法SGD:一些小啟示

其中 η=θ˙,而 θ 的邊緣分布就是 (9) 式,是以前面的純 SGD 的分析在 Momentum 和 Nesterov 算法中同樣成立。

思考回顧

本文希望通過動力學的方式來分析 SGD 的相關内容。對于文章開頭提出的一些問題,本文并不能準确地給出答案,但我估計能夠有點啟發。盡管文章比較冗長,公式略多,但是大學學過數值計算的讀者,應該都不難看懂的。如果有什麼疑問,歡迎繼續留言讨論。

原文釋出時間為:2018-07-09

本文作者:蘇劍林

本文來自雲栖社群合作夥伴“

PaperWeekly

”,了解相關資訊可以關注“

”。

繼續閱讀