生成擴散模型漫談(一):DDPM = 拆樓 + 建樓

jasonzhangxianrong發表於2024-07-08

說到生成模型,VAEGAN可謂是“如雷貫耳”,本站也有過多次分享。此外,還有一些比較小眾的選擇,如flow模型VQ-VAE等,也頗有人氣,尤其是VQ-VAE及其變體VQ-GAN,近期已經逐漸發展到“影像的Tokenizer”的地位,用來直接呼叫NLP的各種預訓練方法。除了這些之外,還有一個本來更小眾的選擇——擴散模型(Diffusion Models)——正在生成模型領域“異軍突起”,當前最先進的兩個文字生成影像——OpenAI的DALL·E 2和Google的Imagen,都是基於擴散模型來完成的。

Imagen“文字-圖片”的部分例子

Imagen“文字-圖片”的部分例子

從本文開始,我們開一個新坑,逐漸介紹一下近兩年關於生成擴散模型的一些進展。據說生成擴散模型以數學複雜聞名,似乎比VAE、GAN要難理解得多,是否真的如此?擴散模型真的做不到一個“大白話”的理解?讓我們拭目以待。

新的起點 #

其實我們在之前的文章《能量視角下的GAN模型(三):生成模型=能量模型》《從去噪自編碼器到生成模型》也簡單介紹過擴散模型。說到擴散模型,一般的文章都會提到能量模型(Energy-based Models)、得分匹配(Score Matching)、朗之萬方程(Langevin Equation)等等,簡單來說,是透過得分匹配等技術來訓練能量模型,然後透過郎之萬方程來執行從能量模型的取樣。

從理論上來講,這是一套很成熟的方案,原則上可以實現任何連續型物件(語音、影像等)的生成和取樣。但從實踐角度來看,能量函式的訓練是一件很艱難的事情,尤其是資料維度比較大(比如高解析度影像)時,很難訓練出完備能量函式來;另一方面,透過朗之萬方程從能量模型的取樣也有很大的不確定性,得到的往往是帶有噪聲的取樣結果。所以很長時間以來,這種傳統路徑的擴散模型只是在比較低解析度的影像上做實驗。

如今生成擴散模型的大火,則是始於2020年所提出的DDPM(Denoising Diffusion Probabilistic Model),雖然也用了“擴散模型”這個名字,但事實上除了取樣過程的形式有一定的相似之外,DDPM與傳統基於朗之萬方程取樣的擴散模型可以說完全不一樣,這完全是一個新的起點、新的篇章。

準確來說,DDPM叫“漸變模型”更為準確一些,擴散模型這一名字反而容易造成理解上的誤解,傳統擴散模型的能量模型、得分匹配、朗之萬方程等概念,其實跟DDPM及其後續變體都沒什麼關係。有意思的是,DDPM的數學框架其實在ICML2015的論文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》就已經完成了,但DDPM是首次將它在高解析度影像生成上除錯出來了,從而引匯出了後面的火熱。由此可見,一個模型的誕生和流行,往往還需要時間和機遇,

拆樓建樓 #

很多文章在介紹DDPM時,上來就引入轉移分佈,接著就是變分推斷,一堆數學記號下來,先嚇跑了一群人(當然,從這種介紹我們可以再次看出,DDPM實際上是VAE而不是擴散模型),再加之人們對傳統擴散模型的固有印象,所以就形成了“需要很高深的數學知識”的錯覺。事實上,DDPM也可以有一種很“大白話”的理解,它並不比有著“造假-鑑別”通俗類比的GAN更難。

首先,我們想要做一個像GAN那樣的生成模型,它實際上是將一個隨機噪聲$\boldsymbol{z}$變換成一個資料樣本$\boldsymbol{x}$的過程:
\begin{equation}\require{AMScd}\begin{CD}
\text{隨機噪聲}\boldsymbol{z}\quad @>\quad\text{變換}\quad>> \quad\text{樣本資料}\boldsymbol{x}\\
@V \text{類比} VV @VV \text{類比} V\\
\text{磚瓦水泥}\quad @>\quad\text{建設}\quad>> \quad\text{高樓大廈}\\
\end{CD}\end{equation}

請叫我工程師

請叫我工程師

我們可以將這個過程想象為“建設”,其中隨機噪聲$\boldsymbol{z}$是磚瓦水泥等原材料,樣本資料$\boldsymbol{x}$是高樓大廈,所以生成模型就是一支用原材料建設高樓大廈的施工隊。

這個過程肯定很難的,所以才有了那麼多關於生成模型的研究。但俗話說“破壞容易建設難”,建樓你不會,拆樓你總會了吧?我們考慮將高樓大廈一步步地拆為磚瓦水泥的過程:設$\boldsymbol{x}_0$為建好的高樓大廈(資料樣本),$\boldsymbol{x}_T$為拆好的磚瓦水泥(隨機噪聲),假設“拆樓”需要$T$步,整個過程可以表示為
\begin{equation}\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}\end{equation}
建高樓大廈的難度在於,從原材料$\boldsymbol{x}_T$到最終高樓大廈$\boldsymbol{x}_0$的跨度過大,普通人很難理解$\boldsymbol{x}_T$是怎麼一下子變成$\boldsymbol{x}_0$的。但是,當我們有了“拆樓”的中間過程$\boldsymbol{x}_1,\boldsymbol{x}_2,\cdots,\boldsymbol{x}_T$後,我們知道$\boldsymbol{x}_{t-1} \to \boldsymbol{x}_t$代表著拆樓的一步,那麼反過來$\boldsymbol{x}_t\to \boldsymbol{x}_{t-1}$不就是建樓的一步?如果我們能學會兩者之間的變換關係$\boldsymbol{x}_{t-1}=\boldsymbol{\mu}(\boldsymbol{x}_t)$,那麼從$\boldsymbol{x}_T$出發,反覆地執行$\boldsymbol{x}_{T-1}=\boldsymbol{\mu}(\boldsymbol{x}_T)$、$\boldsymbol{x}_{T-2}=\boldsymbol{\mu}(\boldsymbol{x}_{T-1})$、...,最終不就能造出高樓大廈$\boldsymbol{x}_0$出來?

該怎麼拆 #

正所謂“飯要一口一口地吃”,樓也要一步一步地建,DDPM做生成模型的過程,其實跟上述“拆樓-建樓”的類比是完全一致的,它也是先反過來構建一個從資料樣本漸變到隨機噪聲的過程,然後再考慮其逆變換,透過反覆執行逆變換來完成資料樣本的生成,所以本文前面才說DDPM這種做法其實應該更準確地稱為“漸變模型”而不是“擴散模型”。

具體來說,DDPM將“拆樓”的過程建模為
\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})\label{eq:forward}\end{equation}
其中有$\alpha_t,\beta_t > 0$且$\alpha_t^2 + \beta_t^2=1$,$\beta_t$通常很接近於0,代表著單步“拆樓”中對原來樓體的破壞程度,噪聲$\boldsymbol{\varepsilon}_t$的引入代表著對原始訊號的一種破壞,我們也可以將它理解為“原材料”,即每一步“拆樓”中我們都將$\boldsymbol{x}_{t-1}$拆解為“$\alpha_t \boldsymbol{x}_{t-1}$的樓體 + $\beta_t \boldsymbol{\varepsilon}_t$的原料”。提示:本文$\alpha_t,\beta_t$的定義跟原論文不一樣。)

反覆執行這個拆樓的步驟,我們可以得到:
\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}_{\text{多個相互獨立的正態噪聲之和}}
\end{aligned}\label{eq:expand}\end{equation}
可能剛才讀者就想問為什麼疊加的係數要滿足$\alpha_t^2 + \beta_t^2 = 1$了,現在我們就可以回答這個問題。首先,式中花括號所指出的部分,正好是多個獨立的正態噪聲之和,其均值為0,方差則分別為$(\alpha_t\cdots\alpha_2)^2\beta_1^2$、$(\alpha_t\cdots\alpha_3)^2\beta_2^2$、...、$\alpha_t^2\beta_{t-1}^2$、$\beta_t^2$;然後,我們利用一個機率論的知識——正態分佈的疊加性,即上述多個獨立的正態噪聲之和的分佈,實際上是均值為0、方差為$(\alpha_t\cdots\alpha_2)^2\beta_1^2 + (\alpha_t\cdots\alpha_3)^2\beta_2^2 + \cdots + \alpha_t^2\beta_{t-1}^2 + \beta_t^2$的正態分佈;最後,在$\alpha_t^2 + \beta_t^2 = 1$恆成立之下,我們可以得到式$\eqref{eq:expand}$的各項係數平方和依舊為1,即
\begin{equation}(\alpha_t\cdots\alpha_1)^2 + (\alpha_t\cdots\alpha_2)^2\beta_1^2 + (\alpha_t\cdots\alpha_3)^2\beta_2^2 + \cdots + \alpha_t^2\beta_{t-1}^2 + \beta_t^2 = 1\end{equation}
所以實際上相當於有
\begin{equation}\boldsymbol{x}_t = \underbrace{(\alpha_t\cdots\alpha_1)}_{\text{記為}\bar{\alpha}_t} \boldsymbol{x}_0 + \underbrace{\sqrt{1 - (\alpha_t\cdots\alpha_1)^2}}_{\text{記為}\bar{\beta}_t} \bar{\boldsymbol{\varepsilon}}_t,\quad \bar{\boldsymbol{\varepsilon}}_t\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})\label{eq:skip}\end{equation}
這就為計算$\boldsymbol{x}_t$提供了極大的便利。另一方面,DDPM會選擇適當的$\alpha_t$形式,使得有$\bar{\alpha}_T\approx 0$,這意味著經過$T$步的拆樓後,所剩的樓體幾乎可以忽略了,已經全部轉化為原材料$\boldsymbol{\varepsilon}$。提示:本文$\bar{\alpha}_t$的定義跟原論文不一樣。)

又如何建 #

“拆樓”是$\boldsymbol{x}_{t-1}\to \boldsymbol{x}_t$的過程,這個過程我們得到很多的資料對$(\boldsymbol{x}_{t-1},\boldsymbol{x}_t)$,那麼“建樓”自然就是從這些資料對中學習一個$\boldsymbol{x}_t\to \boldsymbol{x}_{t-1}$的模型。設該模型為$\boldsymbol{\mu}(\boldsymbol{x}_t)$,那麼容易想到學習方案就是最小化兩者的歐氏距離:
\begin{equation}\left\Vert\boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t)\right\Vert^2\label{eq:loss-0}\end{equation}
其實這已經非常接近最終的DDPM模型了,接下來讓我們將這個過程做得更精細一些。首先“拆樓”的式$\eqref{eq:forward}$可以改寫為$\boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\varepsilon}_t\right)$,這啟發我們或許可以將“建樓”模型$\boldsymbol{\mu}(\boldsymbol{x}_t)$設計成
\begin{equation}\boldsymbol{\mu}(\boldsymbol{x}_t) = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\label{eq:sample}\end{equation}
的形式,其中$\boldsymbol{\theta}$是訓練引數,將其代入到損失函式,得到
\begin{equation}\left\Vert\boldsymbol{x}_{t-1} - \boldsymbol{\mu}(\boldsymbol{x}_t)\right\Vert^2 = \frac{\beta_t^2}{\alpha_t^2}\left\Vert \boldsymbol{\varepsilon}_t - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right\Vert^2\end{equation}
前面的因子$\frac{\beta_t^2}{\alpha_t^2}$代表loss的權重,這個我們可以暫時忽略,最後代入結合式$\eqref{eq:skip}$和$\eqref{eq:forward}$所給出$\boldsymbol{x}_t$的表示式
\begin{equation}\boldsymbol{x}_t = \alpha_t\boldsymbol{x}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t = \alpha_t\left(\bar{\alpha}_{t-1}\boldsymbol{x}_0 + \bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1}\right) + \beta_t \boldsymbol{\varepsilon}_t = \bar{\alpha}_t\boldsymbol{x}_0 + \alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t \end{equation}
得到損失函式的形式為
\begin{equation}\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\label{eq:loss-1}\end{equation}
可能讀者想問為什麼要回退一步來給出$\boldsymbol{x}_t$,直接根據式$\eqref{eq:skip}$來給出$\boldsymbol{x}_t$可以嗎?答案是不行,因為我們已經事先取樣了$\boldsymbol{\varepsilon}_t$,而$\boldsymbol{\varepsilon}_t$跟$\bar{\boldsymbol{\varepsilon}}_t$不是相互獨立的,所以給定$\boldsymbol{\varepsilon}_t$的情況下,我們不能完全獨立地取樣$\bar{\boldsymbol{\varepsilon}}_t$。

降低方差 #

原則上來說,損失函式$\eqref{eq:loss-1}$就可以完成DDPM的訓練,但它在實踐中可能有方差過大的風險,從而導致收斂過慢等問題。要理解這一點並不困難,只需要觀察到式$\eqref{eq:loss-1}$實際上包含了4個需要取樣的隨機變數:

1、從所有訓練樣本中取樣一個$\boldsymbol{x}_0$;

2、從正態分佈$\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$中取樣$\bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t$(兩個不同的取樣結果);

3、從$1\sim T$中取樣一個$t$。

要取樣的隨機變數越多,就越難對損失函式做準確的估計,反過來說就是每次對損失函式進行估計的波動(方差)過大了。很幸運的是,我們可以透過一個積分技巧來將$\bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t$合併成單個正態隨機變數,從而緩解一下方差大的問題。

這個積分確實有點技巧性,但也不算複雜。由於正態分佈的疊加性,我們知道$\alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t$實際上相當於單個隨機變數$\bar{\beta}_t\boldsymbol{\varepsilon}|\boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,同理$\beta_t \bar{\boldsymbol{\varepsilon}}_{t-1} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\varepsilon}_t$實際上相當於單個隨機變數$\bar{\beta}_t\boldsymbol{\omega}|\boldsymbol{\omega}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$,並且可以驗證$\mathbb{E}[\boldsymbol{\varepsilon}\boldsymbol{\omega}^{\top}]=\boldsymbol{0}$,所以這是兩個相互獨立的正態隨機變數。

接下來,我們反過來將$\boldsymbol{\varepsilon}_t$用$\boldsymbol{\varepsilon},\boldsymbol{\omega}$重新表示出來
\begin{equation}\boldsymbol{\varepsilon}_t = \frac{(\beta_t \boldsymbol{\varepsilon} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\omega})\bar{\beta}_t}{\beta_t^2 + \alpha_t^2\bar{\beta}_{t-1}^2} = \frac{\beta_t \boldsymbol{\varepsilon} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\omega}}{\bar{\beta}_t}\end{equation}
代入到式$\eqref{eq:loss-1}$得到
\begin{equation}\begin{aligned}
&\,\mathbb{E}_{\bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}\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] \\
=&\,\mathbb{E}_{\boldsymbol{\omega}, \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}\left[\left\Vert \frac{\beta_t \boldsymbol{\varepsilon} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\omega}}{\bar{\beta}_t} - \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \bar{\beta}_t\boldsymbol{\varepsilon}, t)\right\Vert^2\right]
\end{aligned}\end{equation}
注意到,現在損失函式關於$\boldsymbol{\omega}$只是二次的,所以我們可以展開然後將它的期望直接算出來,結果是
\begin{equation}\frac{\beta_t^2}{\bar{\beta}_t^2}\mathbb{E}_{\boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}\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]+\text{常數}\end{equation}
再次省掉常數和損失函式的權重,我們得到DDPM最終所用的損失函式:
\begin{equation}\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\end{equation}
提示:原論文中的$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}$實際上就是本文的$\frac{\bar{\beta}_t}{\beta_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}}$,所以大家的結果是完全一樣的。)

遞迴生成 #

至此,我們算是把DDPM的整個訓練流程捋清楚了。內容寫了不少,你要說它很容易,那肯定說不上,但真要說非常困難的地方也幾乎沒有——沒有用到傳統的能量函式、得分匹配等工具,甚至連變分推斷的知識都沒有用到,只是藉助“拆樓-建樓”的類比和一些基本的機率論知識,就能得到完全一樣的結果。所以說,以DDPM為代表的新興起的生成擴散模型,實際上沒有很多讀者想象的複雜,它可以說是我們從“拆解-重組”的過程中學習新知識的形象建模。

訓練完之後,我們就可以從一個隨機噪聲$\boldsymbol{x}_T\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})$出發執行$T$步式$\eqref{eq:sample}$來進行生成:
\begin{equation}\boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right)\end{equation}
這對應於自迴歸解碼中的Greedy Search。如果要進行Random Sample,那麼需要補上噪聲項:
\begin{equation}\boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right) + \sigma_t \boldsymbol{z},\quad \boldsymbol{z}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I})\end{equation}
一般來說,我們可以讓$\sigma_t=\beta_t$,即正向和反向的方差保持同步。這個取樣過程跟傳統擴散模型的朗之萬取樣不一樣的地方在於:DDPM的取樣每次都從一個隨機噪聲出發,需要重複迭代$T$步來得到一個樣本輸出;朗之萬取樣則是從任意一個點出發,反覆迭代無限步,理論上這個迭代無限步的過程中,就把所有資料樣本都被生成過了。所以兩者除了形式相似外,實質上是兩個截然不同的模型。

從這個生成過程中,我們也可以感覺到它其實跟Seq2Seq的解碼過程是一樣的,都是串聯式的自迴歸生成,所以生成速度是一個瓶頸,DDPM設了$T=1000$,意味著每生成一個圖片,需要將$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)$反覆執行1000次,因此DDPM的一大缺點就是取樣速度慢,後面有很多工作都致力於提升DDPM的取樣速度。而說到“圖片生成 + 自迴歸模型 + 很慢”,有些讀者可能會聯想到早期的PixelRNNPixelCNN等模型,它們將圖片生成轉換成語言模型任務,所以同樣也是遞迴地進行取樣生成以及同樣地慢。那麼DDPM的這種自迴歸生成,跟PixelRNN/PixelCNN的自迴歸生成,又有什麼實質區別呢?為什麼PixelRNN/PixelCNN沒大火起來,反而輪到了DDPM?

瞭解PixelRNN/PixelCNN的讀者都知道,這類生成模型是逐個畫素逐個畫素地生成圖片的,而自迴歸生成是有序的,這就意味著我們要提前給圖片的每個畫素排好順序,最終的生成效果跟這個順序緊密相關。然而,目前這個順序只能是人為地憑著經驗來設計(這類經驗的設計都統稱為“Inductive Bias”),暫時找不到理論最優解。換句話說,PixelRNN/PixelCNN的生成效果很受Inductive Bias的影響。但DDPM不一樣,它透過“拆樓”的方式重新定義了一個自迴歸方向,而對於所有的畫素來說則都是平權的、無偏的,所以減少了Inductive Bias的影響,從而提升了效果。此外,DDPM生成的迭代步數是固定的$T$,而PixelRNN/PixelCNN則是等於影像解析度($\text{寬}\times\text{高}\times{通道數}$),所以DDPM生成高解析度影像的速度要比PixelRNN/PixelCNN快得多。

超參設定 #

這一節我們討論一下超參的設定問題。

在DDPM中,$T=1000$,可能比很多讀者的想象數值要大,那為什麼要設定這麼大的$T$呢?另一邊,對於$\alpha_t$的選擇,將原論文的設定翻譯到本部落格的記號上,大致上是
\begin{equation}\alpha_t = \sqrt{1 - \frac{0.02t}{T}}\end{equation}
這是一個單調遞減的函式,那為什麼要選擇單調遞減的$\alpha_t$呢?

其實這兩個問題有著相近的答案,跟具體的資料背景有關。簡單起見,在重構的時候我們用了歐氏距離$\eqref{eq:loss-0}$作為損失函式,而一般我們用DDPM做圖片生成,以往做過圖片生成的讀者都知道,歐氏距離並不是圖片真實程度的一個好的度量,VAE用歐氏距離來重構時,往往會得到模糊的結果,除非是輸入輸出的兩張圖片非常接近,用歐氏距離才能得到比較清晰的結果,所以選擇儘可能大的$T$,正是為了使得輸入輸出儘可能相近,減少歐氏距離帶來的模糊問題。

選擇單調遞減的$\alpha_t$也有類似考慮。當$t$比較小時,$\boldsymbol{x}_t$還比較接近真實圖片,所以我們要縮小$\boldsymbol{x}_{t-1}$與$\boldsymbol{x}_t$的差距,以便更適用歐氏距離$\eqref{eq:loss-0}$,因此要用較大的$\alpha_t$;當$t$比較大時,$\boldsymbol{x}_t$已經比較接近純噪聲了,噪聲用歐式距離無妨,所以可以稍微增大$\boldsymbol{x}_{t-1}$與$\boldsymbol{x}_t$的差距,即可以用較小的$\alpha_t$。那麼可不可以一直用較大的$\alpha_t$呢?可以是可以,但是要增大$T$。注意在推導$\eqref{eq:skip}$時,我們說過應該有$\bar{\alpha}_T\approx 0$,而我們可以直接估算
\begin{equation}\log \bar{\alpha}_T = \sum_{t=1}^T \log\alpha_t = \frac{1}{2} \sum_{t=1}^T \log\left(1 - \frac{0.02t}{T}\right) < \frac{1}{2} \sum_{t=1}^T \left(- \frac{0.02t}{T}\right) = -0.005(T+1)\end{equation}
代入$T=1000$大致是$\bar{\alpha}_T\approx e^{-5}$,這個其實就剛好達到$\approx 0$的標準。所以如果從頭到尾都用較大的$\alpha_t$,那麼必然要更大的$T$才能使得$\bar{\alpha}_T\approx 0$了。

最後我們留意到,“建樓”模型中的$\boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \bar{\beta}_t\boldsymbol{\varepsilon}, t)$中,我們在輸入中顯式地寫出了$t$,這是因為原則上不同的$t$處理的是不同層次的物件,所以應該用不同的重構模型,即應該有$T$個不同的重構模型才對,於是我們共享了所有重構模型的引數,將$t$作為條件傳入。按照論文附錄的說法,$t$是轉換成《Transformer升級之路:1、Sinusoidal位置編碼追根溯源》介紹的位置編碼後,直接加到殘差模組上去的。

文章小結 #

本文從“拆樓-建樓”的通俗類比中介紹了最新的生成擴散模型DDPM,在這個視角中,我們可以透過較為“大白話”的描述以及比較少的數學推導,來得到跟原始論文一模一樣的結果。總的來說,本文說明了DDPM也可以像GAN一樣找到一個形象類比,它既可以不用到VAE中的“變分”,也可以不用到GAN中的“機率散度”、“最優傳輸”,從這個意義上來看,DDPM甚至算得上比VAE、GAN還要簡單。

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

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

相關文章