fortran迭代尤拉演算法 常微分方程與優化演算法

2021-10-11 08:15:32 字數 2092 閱讀 2579

本文分享一下我們對常微分方程(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。輸出格式 將輸出資訊輸出到指定的檔案中 一行乙個整數表示...