AIGC: PNDM (Pseudo Numerical Method for Diffusion Models) 筆記
又是一種新的采樣方法,又是一個新的公式地獄?
Runge-Kutta 方法
Runge-Kutta 方法是一種在歐拉方法的基礎上,比歐拉方法精度更高的解常微分方程(Ordinary Differential Equation) 的數(shù)值解法(Numerical Method)。
其一般的形式為
?有其固定的形式,A, B, C,... 則是待定系數(shù)。這里有多少個?
?就代表了多少階?Runge-Kutta.?有關 Runge-Kutte 的公式推導,鏈接將放在文章末尾。
論文里面使用的是4階?Runge-Kutta 方法:
Linear Multistep 方法
Linear Multistep 和?Runge-Kutta 差不多,都是 ODE 的數(shù)值解法,其一般形式為:
論文里面采用的形式為:
ODE 與數(shù)值解
之前在 DDIM?的筆記里面,最后一節(jié)里面也給出了當??時,DDIM 的?ODE 形式,在這里,論文里面對于公式做了一些變形:
至于公式是怎么來的,不是特別重要,故省略步驟了。
有了上述的 ODE 公式以后,可以套用一些數(shù)值解法進行求解。但是論文發(fā)現(xiàn),數(shù)值解法下如果大幅減少步數(shù)(提速)會引入大量的噪音。
針對這種情況,研究團隊做了調查,發(fā)現(xiàn)問題來源有兩個。
首先,上述 ODE 公式和??只在一小片弧形的區(qū)域里面明確定義(well-defined),在這塊弧形區(qū)域之外,將沒有足夠的樣本讓?
?去貼合噪音,而傳統(tǒng)的數(shù)值法都是沿著直線計算的,所以會引入誤差。

其次,線性計劃下的?,當 t 趨近于 0 時,ODE 的值將會趨于無窮,于是違反了數(shù)值解法的先決條件。
解決方法
針對以上問題,論文里面提出了相應的解決方案。
針對第一點,論文提出,應該在一個流形上去求解(把弧線拉直,或者說把直線拉彎)。這里,我們將傳統(tǒng)的數(shù)值解法(即 Runge-Kutta, Linear Multistep 等等)分為兩部分——梯度部分(Gradient Part) 和線性的轉移部分(Transfer Part)
. 如果轉移部分不是線性的,那么這種數(shù)值解法論文里面稱作偽數(shù)值方法(Pseudo Numerical Method)。
很明顯,如果我們的目標分布是弧形的話,我們不能使用線性的轉移方法。并且,如果我們的梯度部分如果是精確的(即,有足夠的數(shù)據(jù)去衡量噪音 ),那么我們的轉移部分也應該盡量地貼合流形。
所以,在這里如果假設?, 且我們的噪音
是精確的,即?
, 那么根據(jù) DDIM 的逆向過程:
?
(注意這里?)
可以推導得出,對于任意的 , 有:
所以,得出的結論就是,如果??是精確的,那么?
?也是精確的。
如果將上面逆向過程的式子,兩邊同時減去?, 那么就得到了如下的形式:
然后我們對公式做一下變形,將??拆分成?
, 把等式左邊的?
?移到等式右邊,所以:
進一步化簡一下就得到了論文里面的形式:
所以,這就是我們轉移部分的新公式,并且我們把這個公式命名為?。而?
則是梯度部分。
由于以上的公式是由 DDPM/DDIM 轉換過來的,所以具備的一個特性是,當 t 趨向于 0 時, 將會越來越精確。于是順帶著解決了上面的第二個問題。

梯度部分
如果只是上面的部分的話,其實沒有什么特別的地方。因為整個公式其實是 DDIM 逆向過程的變形(說了那么多,原來都是白說了?。?/span>。在這里,論文認為,梯度部分的計算可以借用傳統(tǒng)的數(shù)值方法。
例如,在 linear multistep 方法下,我們有:
論文里面把這種方法稱作 PLMS(Pseudo?Linear Multistep)。
由于 LMS 依賴于前三步,所以最初的三步需要用 Runge-Kutta 方法來算出來。Runge-Kutta 方法也有,稱作 PRK,但是太長了不搬過來了,詳見原論文。

Second-order PNDM,每一步的計算利用的是2步的數(shù)據(jù),但是原理差不多。只不過用的是2階 Runge-Kutta 方法以及 2步形式的 Linear Multistep. 因為大同小異,就不搬過來了,內容見論文附錄 A.3.?

這里是從官方的 Github上面 F-PNDM 摘錄的上述算法的代碼,以及一些個人加入的注釋
一些推薦參考的資料
Runge-Kutte 的資料(英文),Numerical Approximations of Solutions to First-Order Equations -- Other Numerical Methods -- The Runge-Kutta Method 小節(jié),里面還有例子
:https://www.sciencedirect.com/science/article/abs/pii/B9780128047767000024
Diffusers, 目前來說注釋最完整,最容易理解的代碼庫:https://github.com/huggingface/diffusers/tree/main
官方的 PNDM Github, 里面還有 FON, 歐拉方法等其他采樣方法:https://github.com/luping-liu/PNDM/tree/master

完。