在文章《生成擴散模型漫談(一):DDPM = 拆樓 + 建樓》中,我們為生成擴散模型DDPM構建了“拆樓-建樓”的通俗類比,並且藉助該類比完整地推導了生成擴散模型DDPM的理論形式。在該文章中,我們還指出DDPM本質上已經不是傳統的擴散模型了,它更多的是一個變分自編碼器VAE,實際上DDPM的原論文中也是將它按照VAE的思路進行推導的。
所以,本文就從VAE的角度來重新介紹一版DDPM,同時分享一下自己的Keras實現程式碼和實踐經驗。
多步突破 #
在傳統的VAE中,編碼過程和生成過程都是一步到位的:
\begin{equation}\text{編碼:}\,\,x\to z\,,\quad \text{生成:}\,\,z\to x\end{equation}
這樣做就只涉及到三個分佈:編碼分佈$p(z|x)$、生成分佈$q(x|z)$以及先驗分佈$q(z)$,它的好處是形式比較簡單,$x$與$z$之間的對映關係也比較確定,因此可以同時得到編碼模型和生成模型,實現隱變數編輯等需求;但是它的缺點也很明顯,因為我們建模機率分佈的能力有限,這三個分佈都只能建模為正態分佈,這限制了模型的表達能力,最終通常得到偏模糊的生成結果。
為了突破這個限制,DDPM將編碼過程和生成過程分解為$T$步:
\begin{equation}\begin{aligned}&\text{編碼:}\,\,\boldsymbol{x} = \boldsymbol{x}_0 \to \boldsymbol{x}_1 \to \boldsymbol{x}_2 \to \cdots \to \boldsymbol{x}_{T-1} \to \boldsymbol{x}_T = \boldsymbol{z} \\
&\text{生成:}\,\,\boldsymbol{z} = \boldsymbol{x}_T \to \boldsymbol{x}_{T-1} \to \boldsymbol{x}_{T-2} \to \cdots \to \boldsymbol{x}_1 \to \boldsymbol{x}_0 = \boldsymbol{x}
\end{aligned}\label{eq:factor}\end{equation}
這樣一來,每一個$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$和$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$僅僅負責建模一個微小變化,它們依然建模為正態分佈。可能讀著就想問了:那既然同樣是正態分佈,為什麼分解為多步會比單步要好?這是因為對於微小變化來說,可以用正態分佈足夠近似地建模,類似於曲線在小範圍內可以用直線近似,多步分解就有點像用分段線性函式擬合複雜曲線,因此理論上可以突破傳統單步VAE的擬合能力限制。
聯合散度 #
所以,現在的計劃就是透過遞迴式分解$\eqref{eq:factor}$來增強傳統VAE的能力,每一步編碼過程被建模成$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$,每一步生成過程則被建模成$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,相應的聯合分佈就是:
\begin{equation}\begin{aligned}&p(\boldsymbol{x}_0, \boldsymbol{x}_1, \boldsymbol{x}_2, \cdots, \boldsymbol{x}_T) = p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_2|\boldsymbol{x}_1) p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \\
&q(\boldsymbol{x}_0, \boldsymbol{x}_1, \boldsymbol{x}_2, \cdots, \boldsymbol{x}_T) = q(\boldsymbol{x}_0|\boldsymbol{x}_1)\cdots q(\boldsymbol{x}_{T-2}|\boldsymbol{x}_{T-1}) q(\boldsymbol{x}_{T-1}|\boldsymbol{x}_T) q(\boldsymbol{x}_T)
\end{aligned}\end{equation}
別忘了$\boldsymbol{x}_0$代表真實樣本,所以$\tilde{p}(\boldsymbol{x}_0)$就是資料分佈;而$\boldsymbol{x}_T$代表著最終的編碼,所以$q(\boldsymbol{x}_T)$就是先驗分佈;剩下的$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$、$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$就代表著編碼、生成的一小步。(提示:經過考慮,這裡還是沿用本網站介紹VAE一直用的記號習慣,即“編碼分佈用$p$、生成分佈用$q$”,所以這裡的$p$、$q$含義跟DDPM論文是剛好相反的,望讀者知悉。)
在《變分自編碼器(二):從貝葉斯觀點出發》中筆者就提出,理解VAE的最簡潔的理論途徑,就是將其理解為在最小化聯合分佈的KL散度,對於DDPM也是如此,上面我們已經寫出了兩個聯合分佈,所以DDPM的目的就是最小化
\begin{equation}KL(p\Vert q) = \int p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \log \frac{p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0)}{q(\boldsymbol{x}_0|\boldsymbol{x}_1)\cdots q(\boldsymbol{x}_{T-1}|\boldsymbol{x}_T) q(\boldsymbol{x}_T)} d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_T\label{eq:kl}\end{equation}
這就是DDPM的最佳化目標了。到目前為止的結果,都跟DDPM原論文的結果一樣的(只是記號略有不同),也跟更原始的論文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》一致。接下來,我們就要將$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$、$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$具體形式定下來,然後簡化DDPM的最佳化目標$\eqref{eq:kl}$。
分而治之 #
首先我們要知道,DDPM只是想做一個生成模型,所以它只是將每一步的編碼建立為極簡單的正態分佈:$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})=\mathcal{N}(\boldsymbol{x}_t;\alpha_t \boldsymbol{x}_{t-1}, \beta_t^2 \boldsymbol{I})$,其主要的特點是均值向量僅僅由輸入$\boldsymbol{x}_{t-1}$乘以一個標量$\alpha_t$得到,相比之下傳統VAE的均值方差都是用神經網路學習出來的,因此DDPM是放棄了模型的編碼能力,最終只得到一個純粹的生成模型;至於$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$,則被建模成均值向量可學習的正態分佈$\mathcal{N}(\boldsymbol{x}_{t-1};\boldsymbol{\mu}(\boldsymbol{x}_t), \sigma_t^2 \boldsymbol{I})$。其中$\alpha_t,\beta_t,\sigma_t$都不是可訓練引數,而是事先設定好的值(怎麼設定我們稍後討論),所以整個模型擁有可訓練引數的就只有$\boldsymbol{\mu}(\boldsymbol{x}_t)$。(提示:本文$\alpha_t,\beta_t$的定義跟原論文不一樣。)
由於目前分佈$p$不含任何的可訓練引數,因此目標$\eqref{eq:kl}$中關於$p$的積分就只是貢獻一個可以忽略的常數,所以目標$\eqref{eq:kl}$等價於
\begin{equation}\begin{aligned}&\,-\int p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \log q(\boldsymbol{x}_0|\boldsymbol{x}_1)\cdots q(\boldsymbol{x}_{T-1}|\boldsymbol{x}_T) q(\boldsymbol{x}_T) d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_T \\
=&\,-\int p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \left[\log q(\boldsymbol{x}_T) + \sum_{t=1}^T\log q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)\right] d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_T
\end{aligned}\end{equation}
由於先驗分佈$q(\boldsymbol{x}_T)$一般都取標準正態分佈,也是沒有引數的,所以這一項也只是貢獻一個常數。因此需要計算的就是每一項
\begin{equation}\begin{aligned}&\,-\int p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \log q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_T\\
=&\,-\int p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \log q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_t\\
=&\,-\int p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) \log q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t) d\boldsymbol{x}_0 d\boldsymbol{x}_{t-1}d\boldsymbol{x}_t
\end{aligned}\end{equation}
其中第一個等號是因為$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$至多依賴到$\boldsymbol{x}_t$,因此$t+1$到$T$的分佈可以直接積分為1;第二個等號則是因為$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$也不依賴於$\boldsymbol{x}_1,\cdots,\boldsymbol{x}_{t-2}$,所以關於它們的積分我們也可以事先算出,結果為$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)=\mathcal{N}(\boldsymbol{x}_{t-1};\bar{\alpha}_{t-1} \boldsymbol{x}_0, \bar{\beta}_{t-1}^2 \boldsymbol{I})$,該結果可以參考下一節的式$\eqref{eq:x0-xt}$。
場景再現 #
接下來的過程就跟上一篇文章的“又如何建”一節基本上是一樣的了:
1、除去最佳化無關的常數,$-\log q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t)$這一項所貢獻的就是$\frac{1}{2\sigma_t^2}\left\Vert\boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t)\right\Vert^2$;
2、$p(\boldsymbol{x}_{t-1}|\boldsymbol{x}_0)$意味著$\boldsymbol{x}_{t-1} = \bar{\alpha}_{t-1}\boldsymbol{x}_0 + \bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1}$,$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$又意味著$\boldsymbol{x}_t = \alpha_t \boldsymbol{x}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t$,其中$\bar{\boldsymbol{\varepsilon}}_{t-1},\boldsymbol{\varepsilon}_t\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$;
3、由$\boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\varepsilon}_t\right)$則啟發我們將$\boldsymbol{\mu}(\boldsymbol{x}_t)$引數化為$\boldsymbol{\mu}(\boldsymbol{x}_t) = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)$。
這一系列變換下來,最佳化目標等價於
\begin{equation}\frac{\beta_t^2}{\alpha_t^2\sigma_t^2}\mathbb{E}_{\bar{\boldsymbol{\varepsilon}}_{t-1},\boldsymbol{\varepsilon}_t\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}),\boldsymbol{x}_0\sim \tilde{p}(\boldsymbol{x}_0)}\left[\left\Vert \boldsymbol{\varepsilon}_t - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t, t)\right\Vert^2\right]\end{equation}
隨後按照“降低方差”一節做換元,結果就是
\begin{equation}\frac{\beta_t^4}{\bar{\beta}_t^2\alpha_t^2\sigma_t^2}\mathbb{E}_{\boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I}),\boldsymbol{x}_0\sim \tilde{p}(\boldsymbol{x}_0)}\left[\left\Vert\boldsymbol{\varepsilon} - \frac{\bar{\beta}_t}{\beta_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \bar{\beta}_t\boldsymbol{\varepsilon}, t)\right\Vert^2\right]\label{eq:loss}\end{equation}
這就得到了DDPM的訓練目標了(原論文透過實驗發現,去掉上式前面的係數後實際效果更好些)。它是我們從VAE的最佳化目標出發,逐步簡化積分結果得到的,雖然有點長,但每一步都是有章可循的,有計算難度,但沒有思路上的難度。
相比之下,DDPM的原論文中,很突兀引入了一個$q(\boldsymbol{x}_{t-1}|\boldsymbol{x}_t,\boldsymbol{x}_0)$(原論文記號)來進行裂項相消,然後轉化為正態分佈的KL散度形式。整個過程的這一步技巧性太強,顯得太過“莫名其妙”,對筆者來說相當難以接受。
超參設定 #
這一節我們來討論一下$\alpha_t,\beta_t,\sigma_t$的選擇問題。
對於$p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})$來說,習慣上約定$\alpha_t^2 + \beta_t^2=1$,這樣就減少了一半的引數了,並且有助於簡化形式,這其實在上一篇文章我們已經推導過了,由於正態分佈的疊加性,在此約束之下我們有
\begin{equation}p(\boldsymbol{x}_t|\boldsymbol{x}_0) = \int p(\boldsymbol{x}_t|\boldsymbol{x}_{t-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) d\boldsymbol{x}_1\cdots d\boldsymbol{x}_{t-1} = \mathcal{N}(\boldsymbol{x}_t;\bar{\alpha}_t \boldsymbol{x}_0, \bar{\beta}_t^2 \boldsymbol{I})\label{eq:x0-xt}\end{equation}
其中$\bar{\alpha}_t = \alpha_1\cdots\alpha_t$,而$\bar{\beta}_t = \sqrt{1-\bar{\alpha}_t^2}$,這樣一來$p(\boldsymbol{x}_t|\boldsymbol{x}_0)$就具有比較簡約的形式。可能讀者又想問事前是怎麼想到$\alpha_t^2 + \beta_t^2=1$這個約束呢?我們知道$\mathcal{N}(\boldsymbol{x}_t;\alpha_t \boldsymbol{x}_{t-1}, \beta_t^2 \boldsymbol{I})$意味著$\boldsymbol{x}_t = \alpha_t \boldsymbol{x}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t,\boldsymbol{\varepsilon}_t\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$,如果$\boldsymbol{x}_{t-1}$也是$\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$的話,我們就希望$\boldsymbol{x}_t$也是$\sim \mathcal{N}(\boldsymbol{0},\boldsymbol{I})$,所以就確定了$\alpha_t^2+\beta_t^2=1$了。
前面說了,$q(\boldsymbol{x}_T)$一般都取標準正態分佈$\mathcal{N}(\boldsymbol{x}_T;\boldsymbol{0}, \boldsymbol{I})$。而我們的學習目標是最小化兩個聯合分佈的KL散度,即希望$p=q$,那麼它們的邊緣分佈自然也相等,所以我們也希望
\begin{equation}q(\boldsymbol{x}_T) = \int p(\boldsymbol{x}_T|\boldsymbol{x}_{T-1})\cdots p(\boldsymbol{x}_1|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) d\boldsymbol{x}_0 d\boldsymbol{x}_1\cdots d\boldsymbol{x}_{T-1} = \int p(\boldsymbol{x}_T|\boldsymbol{x}_0) \tilde{p}(\boldsymbol{x}_0) d\boldsymbol{x}_0 \end{equation}
由於資料分佈$\tilde{p}(\boldsymbol{x}_0)$是任意的,所以要使上式恆成立,只能讓$p(\boldsymbol{x}_T|\boldsymbol{x}_0)=q(\boldsymbol{x}_T)$,即退化為與$\boldsymbol{x}_0$無關的標準正態分佈,這意味著我們要設計適當的$\alpha_t$,使得$\bar{\alpha}_T\approx 0$。同時這再次告訴我們,DDPM是沒有編碼能力了,最終的$p(\boldsymbol{x}_T|\boldsymbol{x}_0)$可以說跟輸入$\boldsymbol{x}_0$無關的。用上一篇文章的“拆樓-建樓”類比就是說,原來的樓已經被完全拆成原材料了,如果用這堆材料重新建樓的話,可以建成任意樣子的樓,而不一定是拆之前的樣子。DDPM取了$\alpha_t = \sqrt{1 - \frac{0.02t}{T}}$,關於該選擇的性質,我們在上一篇文章的“超參設定”一節也分析過了。
至於$\sigma_t$,理論上不同的資料分佈$\tilde{p}(\boldsymbol{x}_0)$來說對應不同的最優$\sigma_t$,但我們又不想將$\sigma_t$設為可訓練引數,所以只好選一些特殊的$\tilde{p}(\boldsymbol{x}_0)$來推導相應的最優$\sigma_t$,並認為由特例推匯出來的$\sigma_t$可以泛化到一般的資料分佈。我們可以考慮兩個簡單的例子:
1、假設訓練集只有一個樣本$\boldsymbol{x}_*$,即$\tilde{p}(\boldsymbol{x}_0)$是狄拉克分佈$\delta(\boldsymbol{x}_0 - \boldsymbol{x}_*)$,可以推出最優的$\sigma_t = \frac{\bar{\beta}_{t-1}}{\bar{\beta}_t}\beta_t$;
2、假設資料分佈$\tilde{p}(\boldsymbol{x}_0)$服從標準正態分佈,這時候可以推出最優的$\sigma_t = \beta_t$。
實驗結果顯示兩個選擇的表現是相似的,因此可以選擇任意一個進行取樣。兩個結果的推導過程有點長,我們後面再擇機討論。
參考實現 #
這麼精彩的模型怎麼可以少得了Keras實現?下面提供筆者的參考實現:
Github地址:https://github.com/bojone/Keras-DDPM
注意,筆者的實現並非嚴格按照DDPM原始開原始碼來進行,而是根據自己的設計簡化了U-Net的架構(比如特徵拼接改為相加、去掉了Attention等),使得可以快速出效果。經測試,在單張24G視訊記憶體的3090下,以blocks=1,batch_size=64
訓練128*128大小的CelebA HQ人臉資料集,半天就能初見成效。訓練3天后的取樣效果如下:
在除錯過程中,筆者總結出瞭如下的實踐經驗:
1、損失函式不能用mse,而必須用歐氏距離,兩者的差別是mse在歐氏距離基礎上除以圖片的$\text{寬}\times\text{高}\times\text{通道數}$,這會導致損失值過小,部分引數的梯度可能會被忽略為0,從而導致訓練過程先收斂後發散,該現象也經常出現於低精度訓練中,可以參考《在bert4keras中使用混合精度和XLA加速訓練》;
2、歸一化方式可以用Instance Norm、Layer Norm、Group Norm等,但不要用Batch Norm,因為Batch Norm存在訓練和推理不一致的問題,可能出現訓練效果特別好,預測效果特別差的問題;
3、網路結構沒有必要照搬原論文,原論文是為了刷SOTA發論文,照搬的話肯定是又大又慢的,只需要按照U-Net的思路設計自編碼器,就基本上可以訓練出個大概效果了,因為就相當於是個純粹的迴歸問題,還是很好訓練的;
4、關於引數$t$的傳入,原論文用了Sinusoidal位置編碼,筆者發現直接換為可訓練的Embedding,效果也差不多;
5、按照以往搞語言模型預訓練的習慣,筆者用了LAMB最佳化器,它更方便調學習率,基本上$10^{-3}$的學習率可以適用於任意初始化方式的模型訓練。
綜合評價 #
結合《生成擴散模型漫談(一):DDPM = 拆樓 + 建樓》和本文的介紹,想必讀者都已經對DDPM有自己的看法了,能基本看出DDPM優點、缺點以及相應的改進方向在哪了。
DDPM的優點很明顯,就是容易訓練,並且生成的圖片也清晰。這個容易訓練是相對GAN而言的,GAN是一個$\min\text{-}\max$過程,訓練中的不確定性很大,容易崩潰,而DDPM就純粹是一個迴歸的損失函式,只需要純粹的最小化,因此訓練過程非常平穩。同時,經過“拆樓-建樓”的類比,我們也可以發現DDPM在通俗理解方面其實也不遜色於GAN。
不過,DDPM的缺點也很明顯。首先最突出的就是取樣速度太慢,需要執行模型$T$步(原論文$T=1000$才能完成取樣),可以說這比GAN的一步到位的取樣要慢上$T$倍,後面有很多工作對這一點進行改進;其次,在GAN中,從隨機噪聲到生成樣本的訓練是一個確定性的變換,隨機噪聲是生成結果的一個解耦的隱變數,我們可以進行插值生成,或者對之編輯以實現控制生成等,但是DDPM中生成過程是一個完全隨機的過程,兩者沒有確定性的關係,這種編輯生成就不存在了。DDPM原論文雖然也演示了插值生成效果,但那只是在原始圖片上進行插值的,然後透過噪聲來模糊圖片,讓模型重新“腦補”出新的圖片,這種插值很難做到語義上的融合。
除了針對上述缺點來做改進外,DDPM還有其他一些可做的方向,比如目前演示的DDPM都是無條件的生成,那麼很自然就想到有條件的DDPM的,就好比從VAE到C-VAE、從GAN到C-GAN一樣,這也是當前擴散模型的一個主流應用,比如用Google的Imagen就同時包含了用擴散模型做文字生成圖片以及做超解析度,這兩者本質上就是條件式擴散模型了;再比如,目前的DDPM是為連續型變數設計的,但從其思想來說應該也是適用於離散型資料的,那麼離散型資料的DDPM怎麼設計呢?
相關工作 #
說到DDPM的相關工作,多數人會想到傳統擴散模型、能量模型等工作,又或者是去噪自編碼器等工作,但筆者接下來想說的不是這些,而是本部落格之前介紹過的、甚至可以認為DDPM就是它的特例的《強大的NVAE:以後再也不能說VAE生成的影像模糊了》。
站在VAE的視角來看,傳統VAE生成的圖片都偏模糊,而DDPM只能算是(筆者所瞭解到的)第二個能生成清晰影像的VAE,第一個正是NVAE。翻看NVAE的形式,我們可以發現它跟DDPM有非常多的相似之處,比如NVAE也是引入了一大堆隱變數$z=\{z_1,z_2,\dots,z_L\}$,這些隱變數也呈遞迴關係,所以NVAE的取樣過程跟DDPM也是很相似的。
從理論形式來說,DDPM可以看成是一個極度簡化的NVAE,即隱變數的遞迴關係僅僅建模為馬爾可夫式的條件正態分佈,而不是像NVAE的非馬爾科夫式,生成模型也只是同一個模型的反覆迭代,而不是NVAE那樣用一個龐大的模型同時用上了$z=\{z_1,z_2,\dots,z_L\}$,但NVAE在利用眾多$z=\{z_1,z_2,\dots,z_L\}$之時,也加入了引數共享機制,這跟同一個模型反覆迭代也異曲同工了。
文章小結 #
本文從變分自編碼器VAE的角度推導了DDPM,在這個視角之下,DDPM是一個簡化版的自迴歸式VAE,跟之前的NVAE很是相似。同時本文分享了自己的DDPM實現程式碼和實踐經驗,以及對DDPM做了一個比較綜合的評價。
轉載到請包括本文地址:https://spaces.ac.cn/archives/9152
更詳細的轉載事宜請參考:《科學空間FAQ》