生成擴散模型漫談(三):DDPM = 貝葉斯 + 去噪

jasonzhangxianrong發表於2024-07-08

到目前為止,筆者給出了生成擴散模型DDPM的兩種推導,分別是《生成擴散模型漫談(一):DDPM = 拆樓 + 建樓》中的通俗類比方案和《生成擴散模型漫談(二):DDPM = 自迴歸式VAE》中的變分自編碼器方案。兩種方案可謂各有特點,前者更為直白易懂,但無法做更多的理論延伸和定量理解,後者理論分析上更加完備一些,但稍顯形式化,啟發性不足。

貝葉斯定理(來自維基百科)

貝葉斯定理(來自維基百科)

在這篇文章中,我們再分享DDPM的一種推導,它主要利用到了貝葉斯定理來簡化計算,整個過程的“推敲”味道頗濃,很有啟發性。不僅如此,它還跟我們後面將要介紹的DDIM模型有著緊密的聯絡。

模型繪景 #

再次回顧,DDPM建模的是如下變換流程:
\begin{equation}\boldsymbol{x} = \boldsymbol{x}_0 \rightleftharpoons \boldsymbol{x}_1 \rightleftharpoons \boldsymbol{x}_2 \rightleftharpoons \cdots \rightleftharpoons \boldsymbol{x}_{T-1} \rightleftharpoons \boldsymbol{x}_T = \boldsymbol{z}\end{equation}
其中,正向就是將樣本資料$\boldsymbol{x}$逐漸變為隨機噪聲$\boldsymbol{z}$的過程,反向就是將隨機噪聲$\boldsymbol{z}$逐漸變為樣本資料$\boldsymbol{x}$的過程,反向過程就是我們希望得到的“生成模型”。

正向過程很簡單,每一步是
\begin{equation}\boldsymbol{x}_t = \alpha_t \boldsymbol{x}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t,\quad \boldsymbol{\varepsilon}_t\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})\end{equation}
或者寫成$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})=\mathcal{N}(\boldsymbol{x}_t;\alpha_t \boldsymbol{x}_{t-1},\beta_t^2 \boldsymbol{I})$。在約束$\alpha_t^2 + \beta_t^2 = 1$之下,我們有
\begin{equation}\begin{aligned}
\boldsymbol{x}_t =&\, \alpha_t \boldsymbol{x}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t \\
=&\, \alpha_t \big(\alpha_{t-1} \boldsymbol{x}_{t-2} + \beta_{t-1} \boldsymbol{\varepsilon}_{t-1}\big) + \beta_t \boldsymbol{\varepsilon}_t \\
=&\,\cdots\\
=&\,(\alpha_t\cdots\alpha_1) \boldsymbol{x}_0 + \underbrace{(\alpha_t\cdots\alpha_2)\beta_1 \boldsymbol{\varepsilon}_1 + (\alpha_t\cdots\alpha_3)\beta_2 \boldsymbol{\varepsilon}_2 + \cdots + \alpha_t\beta_{t-1} \boldsymbol{\varepsilon}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t}_{\sim \mathcal{N}(\boldsymbol{0}, (1-\alpha_t^2\cdots\alpha_1^2)\boldsymbol{I})}
\end{aligned}\end{equation}
從而可以求出$p(\boldsymbol{x}_t|\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_t;\bar{\alpha}_t \boldsymbol{x}_0,\bar{\beta}_t^2 \boldsymbol{I})$,其中$\bar{\alpha}_t = \alpha_1\cdots\alpha_t$,而$\bar{\beta}_t = \sqrt{1-\bar{\alpha}_t^2}$。

DDPM要做的事情,就是從上述資訊中求出反向過程所需要的$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,這樣我們就能實現從任意一個$\boldsymbol{x}_T=\boldsymbol{z}$出發,逐步取樣出$\boldsymbol{x}_{T-1},\boldsymbol{x}_{T-2},\cdots,\boldsymbol{x}_1$,最後得到隨機生成的樣本資料$\boldsymbol{x}_0=\boldsymbol{x}$。

請貝葉斯 #

下面我們請出偉大的貝葉斯定理。事實上,直接根據貝葉斯定理我們有
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) = \frac{p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})p(\boldsymbol{x}_{t-1})}{p(\boldsymbol{x}_t)}\label{eq:bayes}\end{equation}
然而,我們並不知道$p(\boldsymbol{x}_{t-1}),p(\boldsymbol{x}_t)$的表示式,所以此路不通。但我們可以退而求其次,在給定$\boldsymbol{x}_0$的條件下使用貝葉斯定理:
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) = \frac{p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)}{p(\boldsymbol{x}_t|\boldsymbol{x}_0)}\end{equation}
這樣修改自然是因為$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1}),p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0),p(\boldsymbol{x}_t|\boldsymbol{x}_0)$都是已知的,所以上式是可計算的,代入各自的表示式得到:
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0) = \mathcal{N}\left(\boldsymbol{x}_{t-1};\frac{\alpha_t\bar{\beta}_{t-1}^2}{\bar{\beta}_t^2}\boldsymbol{x}_t + \frac{\bar{\alpha}_{t-1}\beta_t^2}{\bar{\beta}_t^2}\boldsymbol{x}_0,\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2} \boldsymbol{I}\right)\label{eq:p-xt-x0}\end{equation}

推導:上式的推導過程並不難,就是常規的展開整理而已,當然我們也可以找點技巧加快計算。首先,代入各自的表示式,可以發現指數部分除掉$-1/2$因子外,結果是:
\begin{equation}\frac{\Vert \boldsymbol{x}_t - \alpha_t \boldsymbol{x}_{t-1}\Vert^2}{\beta_t^2} + \frac{\Vert \boldsymbol{x}_{t-1} - \bar{\alpha}_{t-1}\boldsymbol{x}_0\Vert^2}{\bar{\beta}_{t-1}^2} - \frac{\Vert \boldsymbol{x}_t - \bar{\alpha}_t \boldsymbol{x}_0\Vert^2}{\bar{\beta}_t^2}\end{equation}
它關於$\boldsymbol{x}_{t-1}$是二次的,因此最終的分佈必然也是正態分佈,我們只需要求出其均值和協方差。不難看出,展開式中$\Vert \boldsymbol{x}_{t-1}\Vert^2$項的係數是
\begin{equation}\frac{\alpha_t^2}{\beta_t^2} + \frac{1}{\bar{\beta}_{t-1}^2} = \frac{\alpha_t^2\bar{\beta}_{t-1}^2 + \beta_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2} = \frac{\alpha_t^2(1-\bar{\alpha}_{t-1}^2) + \beta_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2} = \frac{1-\bar{\alpha}_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2} = \frac{\bar{\beta}_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2}\end{equation}
所以整理好的結果必然是$\frac{\bar{\beta}_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2}\Vert \boldsymbol{x}_{t-1} - \tilde{\boldsymbol{\mu}}(\boldsymbol{x}_t, \boldsymbol{x}_0)\Vert^2$的形式,這意味著協方差矩陣是$\frac{\bar{\beta}_{t-1}^2 \beta_t^2}{\bar{\beta}_t^2}\boldsymbol{I}$。另一邊,把一次項係數拿出來是$-2\left(\frac{\alpha_t}{\beta_t^2}\boldsymbol{x}_t + \frac{\bar{\alpha}_{t-1}}{\bar{\beta}_{t-1}^2}\boldsymbol{x}_0 \right)$,除以$\frac{-2\bar{\beta}_t^2}{\bar{\beta}_{t-1}^2 \beta_t^2}$後便可以得到
\begin{equation}\tilde{\boldsymbol{\mu}}(\boldsymbol{x}_t, \boldsymbol{x}_0)=\frac{\alpha_t\bar{\beta}_{t-1}^2}{\bar{\beta}_t^2}\boldsymbol{x}_t + \frac{\bar{\alpha}_{t-1}\beta_t^2}{\bar{\beta}_t^2}\boldsymbol{x}_0 \end{equation}
這就得到了$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$的所有資訊了,結果正是式$\eqref{eq:p-xt-x0}$。

去噪過程 #

現在我們得到了$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$,它有顯式的解,但並非我們想要的最終答案,因為我們只想透過$\boldsymbol{x}_t$來預測$\boldsymbol{x}_{t-1}$,而不能依賴$\boldsymbol{x}_0$,$\boldsymbol{x}_0$是我們最終想要生成的結果。接下來,一個“異想天開”的想法是

如果我們能夠透過$\boldsymbol{x}_t$來預測$\boldsymbol{x}_0$,那麼不就可以消去$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$中的$\boldsymbol{x}_0$,使得它只依賴於$\boldsymbol{x}_t$了嗎?

說幹就幹,我們用$\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)$來預估$\boldsymbol{x}_0$,損失函式為$\Vert \boldsymbol{x}_0 - \bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)\Vert^2$。訓練完成後,我們就認為
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) \approx p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0=\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)) = \mathcal{N}\left(\boldsymbol{x}_{t-1}; \frac{\alpha_t\bar{\beta}_{t-1}^2}{\bar{\beta}_t^2}\boldsymbol{x}_t + \frac{\bar{\alpha}_{t-1}\beta_t^2}{\bar{\beta}_t^2}\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t),\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2} \boldsymbol{I}\right)\label{eq:p-xt}\end{equation}
在$\Vert \boldsymbol{x}_0 - \bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)\Vert^2$中,$\boldsymbol{x}_0$代表原始資料,$\boldsymbol{x}_t$代表帶噪資料,所以這實際上在訓練一個去噪模型,這也就是DDPM的第一個“D”的含義(Denoising)。

具體來說,$p(\boldsymbol{x}_t|\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_t;\bar{\alpha}_t \boldsymbol{x}_0,\bar{\beta}_t^2 \boldsymbol{I})$意味著$\boldsymbol{x}_t = \bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon},\boldsymbol{\varepsilon}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,或者寫成$\boldsymbol{x}_0 = \frac{1}{\bar{\alpha}_t}\left(\boldsymbol{x}_t - \bar{\beta}_t \boldsymbol{\varepsilon}\right)$,這啟發我們將$\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)$引數化為
\begin{equation}\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t) = \frac{1}{\bar{\alpha}_t}\left(\boldsymbol{x}_t - \bar{\beta}_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\label{eq:bar-mu}\end{equation}
此時損失函式變為
\begin{equation}\Vert \boldsymbol{x}_0 - \bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)\Vert^2 = \frac{\bar{\beta}_t^2}{\bar{\alpha}_t^2}\left\Vert\boldsymbol{\varepsilon} - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon}, t)\right\Vert^2\end{equation}
省去前面的係數,就得到DDPM原論文所用的損失函式了。可以發現,本文是直接得出了從$\boldsymbol{x}_t$到$\boldsymbol{x}_0$的去噪過程,而不是像之前兩篇文章那樣,透過$\boldsymbol{x}_t$到$\boldsymbol{x}_{t-1}$的去噪過程再加上積分變換來推導,相比之下本文的推導可謂更加一步到位了。

另一邊,我們將式$\eqref{eq:bar-mu}$代入到式$\eqref{eq:p-xt}$中,化簡得到
\begin{equation}
p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) \approx p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0=\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)) = \mathcal{N}\left(\boldsymbol{x}_{t-1}; \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \frac{\beta_t^2}{\bar{\beta}_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right),\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2} \boldsymbol{I}\right)\end{equation}
這就是反向的取樣過程所用的分佈,連同取樣過程所用的方差也一併確定下來了。至此,DDPM推導完畢~提示:出於推導的流暢性考慮,本文的$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}$跟前兩篇介紹不一樣,反而跟DDPM原論文一致。)

推導:將式$\eqref{eq:bar-mu}$代入到式$\eqref{eq:p-xt}$的主要化簡難度就是計算
\begin{equation}\begin{aligned}\frac{\alpha_t\bar{\beta}_{t-1}^2}{\bar{\beta}_t^2} + \frac{\bar{\alpha}_{t-1}\beta_t^2}{\bar{\alpha}_t\bar{\beta}_t^2} =&\, \frac{\alpha_t\bar{\beta}_{t-1}^2 + \beta_t^2/\alpha_t}{\bar{\beta}_t^2} = \frac{\alpha_t^2(1-\bar{\alpha}_{t-1}^2) + \beta_t^2}{\alpha_t\bar{\beta}_t^2} = \frac{1-\bar{\alpha}_t^2}{\alpha_t\bar{\beta}_t^2} = \frac{1}{\alpha_t}
\end{aligned}\end{equation}

預估修正 #

不知道讀者有沒有留意到一個有趣的地方:我們要做的事情,就是想將$\boldsymbol{x}_T$慢慢地變為$\boldsymbol{x}_0$,而我們在借用$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0)$近似$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$時,卻包含了“用$\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)$來預估$\boldsymbol{x}_0$”這一步,要是能預估準的話,那就直接一步到位了,還需要逐步取樣嗎?

真實情況是,“用$\bar{\boldsymbol{\mu}}(\boldsymbol{x}_t)$來預估$\boldsymbol{x}_0$”當然不會太準的,至少開始的相當多步內不會太準。它僅僅起到了一個前瞻性的預估作用,然後我們只用$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$來推進一小步,這就是很多數值演算法中的“預估-修正”思想,即我們用一個粗糙的解往前推很多步,然後利用這個粗糙的結果將最終結果推進一小步,以此來逐步獲得更為精細的解。

由此我們還可以聯想到Hinton三年前提出的《Lookahead Optimizer: k steps forward, 1 step back》,它同樣也包含了預估(k steps forward)和修正(1 step back)兩部分,原論文將其詮釋為“快(Fast)-慢(Slow)”權重的相互結合,快權重就是預估得到的結果,慢權重則是基於預估所做的修正結果。如果願意,我們也可以用同樣的方式去詮釋DDPM的“預估-修正”過程~

遺留問題 #

最後,在使用貝葉斯定理一節中,我們說式$\eqref{eq:bayes}$沒法直接用的原因是$p(\boldsymbol{x}_{t-1})$和$p(\boldsymbol{x}_t)$均不知道。因為根據定義,我們有
\begin{equation}p(\boldsymbol{x}_t) = \int p(\boldsymbol{x}_t|\boldsymbol{x}_0)\tilde{p}(\boldsymbol{x}_0)d\boldsymbol{x}_0\end{equation}
其中$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$是知道的,而資料分佈$\tilde{p}(\boldsymbol{x}_0)$無法提前預知,所以不能進行計算。不過,有兩個特殊的例子,是可以直接將兩者算出來的,這裡我們也補充計算一下,其結果也正好是上一篇文章遺留的方差選取問題的答案。

第一個例子是整個資料集只有一個樣本,不失一般性,假設該樣本為$\boldsymbol{0}$,此時$\tilde{p}(\boldsymbol{x}_0)$為狄拉克分佈$\delta(\boldsymbol{x}_0)$,可以直接算出$p(\boldsymbol{x}_t)=p(\boldsymbol{x}_t|\boldsymbol{0})$。繼而代入式$\eqref{eq:bayes}$,可以發現結果正好是$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)$取$\boldsymbol{x}_0=\boldsymbol{0}$的特例,即
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) = p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t, \boldsymbol{x}_0=\boldsymbol{0}) = \mathcal{N}\left(\boldsymbol{x}_{t-1};\frac{\alpha_t\bar{\beta}_{t-1}^2}{\bar{\beta}_t^2}\boldsymbol{x}_t,\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2} \boldsymbol{I}\right)\end{equation}
我們主要關心其方差為$\frac{\bar{\beta}_{t-1}^2\beta_t^2}{\bar{\beta}_t^2}$,這便是取樣方差的選擇之一。

第二個例子是資料集服從標準正態分佈,即$\tilde{p}(\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_0;\boldsymbol{0},\boldsymbol{I})$。前面我們說了$p(\boldsymbol{x}_t|\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_t;\bar{\alpha}_t \boldsymbol{x}_0,\bar{\beta}_t^2 \boldsymbol{I})$意味著$\boldsymbol{x}_t = \bar{\alpha}_t \boldsymbol{x}_0 + \bar{\beta}_t \boldsymbol{\varepsilon},\boldsymbol{\varepsilon}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,而此時根據假設還有$\boldsymbol{x}_0\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,所以由正態分佈的疊加性,$\boldsymbol{x}_t$正好也服從標準正態分佈。將標準正態分佈的機率密度代入式$\eqref{eq:bayes}$後,結果的指數部分除掉$-1/2$因子外,結果是:
\begin{equation}\frac{\Vert \boldsymbol{x}_t - \alpha_t \boldsymbol{x}_{t-1}\Vert^2}{\beta_t^2} + \Vert \boldsymbol{x}_{t-1}\Vert^2 - \Vert \boldsymbol{x}_t\Vert^2\end{equation}
跟推導$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)$的過程類似,可以得到上述指數對應於
\begin{equation}p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) = \mathcal{N}\left(\boldsymbol{x}_{t-1};\alpha_t\boldsymbol{x}_t,\beta_t^2 \boldsymbol{I}\right)\end{equation}
我們同樣主要關心其方差為$\beta_t^2$,這便是取樣方差的另一個選擇。

文章小結 #

本文分享了DDPM的一種頗有“推敲”味道的推導,它藉助貝葉斯定理來直接推導反向的生成過程,相比之前的“拆樓-建樓”類比和變分推斷理解更加一步到位。同時,它也更具啟發性,跟接下來要介紹的DDIM有很密切的聯絡。

轉載到請包括本文地址:https://spaces.ac.cn/archives/9164

更詳細的轉載事宜請參考:《科學空間FAQ》

相關文章