本文分享一下我們對常微分方程(ordinary differential equation,簡稱ode)與優化演算法的關係的一些理解。概括地說,就是某些優化演算法可以表示成對應常微分方程的離散形式。這裡,我們不做常微分方程的解的存在性討論,而只是給出示意性的描述。
我們首先用梯度下降和nesterov加速演算法來舉例說明常微分方程與優化演算法的關係。最後分享一下我們對如何利用這一關係指導演算法設計的經驗。
梯度下降是用得最多的優化演算法之一。讓我們回顧一下這個演算法。假設函式
我們知道
在點的梯度為在
處的值增加最快的方向。因此,為在
處減少最快的方向。為求解
,梯度下降法從乙個任意的給定點
開始,沿著
的方向走到點
,再沿著
的方向前進到點
,接著用相似的方式前進,直到某個停止條件滿足為止。停止條件可以是到達了指定的最大行駛步數,或者是前進過程中兩個相鄰的點
和(分別表示前進
次與次到達的點)之間的距離非常的接近(表示在
處沿著的方向行進,不再能減少
的值,亦即,我們到了
的最小值附近)。
下面,我們寫出梯度下降的迭代公式。記
為前進次到達的點,那麼我們有
其中,為沿
方向行進的步長。接下來,我們推導
所對應的常微分方程。我們將
變形,得到
觀察,我們可知
為下列常微分方程的有限差分下的顯式尤拉離散:
這一節,我們介紹演算法
的加速演算法。一般地,演算法
具有一階收斂性。牛頓法可以達到二階的收斂性(可以理解為比演算法
更快)。因此理論上牛頓法更快速。但牛頓法需要求解函式
的二階導數,在高維度以及
不可以求二次導數的情況下,會顯得不太適用。
一般地,用
的一階導數,我們能得到一階收斂性,用
的二階導數,可以得到二階收斂性,想要得到更高階收斂性,我們需要
更高階導數的資訊。
nesterov提出了加速的辦法,使得我們可以只用函式
的梯度的情況下,達到高階的收斂速度。具體地,nesterov演算法設定起點
,,並使用下列公式生成迭代序列:
其中為選取的步長。nesterov證明了當
的梯度是
—lipschitz連續且
時,nesterov演算法具有二階收斂性。
下面,我們來推導演算法
所對應的ode。下面的推導來自於**:
a differential equation for modeling nesterov's accelerated gradient method: theory and insights[1]。由公式
,我們可以得到
我們假設序列
是由函式
離散取值得到的,並且有關係
,即為函式
在點的近似值。因此,使用泰勒公式,我們有
類似地,我們有
以及因此,我們從
中得到整理,我們得到
我們讓趨近於
,得到等式即為演算法
對應的常微分方程。
我們需要注意是,演算法的ode形式與離散形式並不完全等價,這是因為對ode進行離散後,離散演算法較ode有了誤差。這些誤差累積導致最後離散的演算法不收斂。因此,我們需要根據每個ode的具體形式,設計適合的離散演算法。
在很多時候,我們初始想出來的優化演算法並不收斂,程式設計實現的時候總不能得到滿意的結果,這個時候,找到演算法的ode形式,再用其他方式重新離散ode,能讓我們得到更多的備選演算法方案。例如,**a variational perspective on accelerated methods[2]中,針對類似
的ode用不同的方法離散,能得到不同的加速演算法。
[1]
a differential equation for modeling nesterov's accelerated gradient method:
[2]
a variational perspective on accelerated methods:
尤拉函式演算法
尤拉函式 1 2 尤拉函式 3小於或等於n的正整數中,與n互質的數的數目4 5 include6 define n 3000005 7 int64 ans n 8void init 打表法 916 17int euler int n 直接求法 1826 27 28if n 1 ret n 1 29 ...
演算法之 尤拉公式
看傅利葉變換的時候,一直奇怪,冪指數是怎麼對映成三角函式的?學習了一下尤拉公式,果然很神奇,用到了自然常數e,圓周率 虛數i,三角函式sin cos,指數,還有泰勒展開 倒不是演算法有多難,只是涉及基礎太多,經常被卡住,總結如下 泰勒展開是用多項式逼近原函式,這麼做是因為像sin x 這樣的函式,如...
演算法提高 尤拉函式
說明 2016.4.5 已更新試題,請重新提交自己的程式。問題描述 給定乙個大於1,不超過2000000的正整數n,輸出尤拉函式,phi n 的值。如果你並不了解尤拉函式,那麼請參閱提示。輸入格式 在給定的輸入檔案中進行讀入 一行乙個正整數n。輸出格式 將輸出資訊輸出到指定的檔案中 一行乙個整數表示...