DDPM = 拆楼 + 建楼

  • 下面将从 “拆楼-建楼” 的通俗类比中介绍生成扩散模型 DDPM,在这个视角中,我们可以通过较为 “大白话” 的描述以及比较少的数学推导,来得到跟原始论文一模一样的结果。总的来说,下文说明了 DDPM 也可以像 GAN 一样找到一个形象类比,它既可以不用到 VAE 中的 “变分”,也可以不用到 GAN 中的 “概率散度”、“最优传输”,从这个意义上来看,DDPM 甚至算得上比 VAE、GAN 还要简单

拆楼 (加噪)

  • 拆楼:通过 T T T 步加噪,由样本数据 x \boldsymbol x x (高楼) 得到随机噪声 z \boldsymbol z z (原料)
    x = x 0 → x 1 → x 2 → ⋯ → x T − 1 → x T = z \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} x=x0x1x2xT1xT=z
  • 该怎么拆
    x t = α t x t − 1 + β t ε t , ε t ∼ N ( 0 , I ) \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}) xt=αtxt1+βtεt,εtN(0,I)其中有 α t , β t > 0 \alpha_t,\beta_t > 0 αt,βt>0 α t 2 + β t 2 = 1 \boldsymbol {\alpha_t^2 + \beta_t^2=1} αt2+βt2=1 (注意到,当 α t 2 + β t 2 = 1 {\alpha_t^2 + \beta_t^2=1} αt2+βt2=1 时,假如 x t − 1 ∼ N ( 0 , I ) \boldsymbol{x}_{t-1}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xt1N(0,I),则有 x t ∼ N ( 0 , I ) \boldsymbol{x}_{t}\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xtN(0,I). 这可能是施加这一约束的直观原因). β t \beta_t βt 通常很接近于 0. 反复执行这个拆楼的步骤,我们可以得到:
    x t =   α t x t − 1 + β t ε t =   α t ( α t − 1 x t − 2 + β t − 1 ε t − 1 ) + β t ε t =   ⋯ =   ( α t ⋯ α 1 ) x 0 + ( α t ⋯ α 2 ) β 1 ε 1 + ( α t ⋯ α 3 ) β 2 ε 2 + ⋯ + α t β t − 1 ε t − 1 + β t ε t ⏟ 多个相互独立的正态噪声之和 \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} xt====αtxt1+βtεtαt(αt1xt2+βt1εt1)+βtεt(αtα1)x0+多个相互独立的正态噪声之和 (αtα2)β1ε1+(αtα3)β2ε2++αtβt1εt1+βtεt式中花括号所指出的部分,正好是多个独立的正态噪声之和,其均值为 0,方差则分别为 ( α t ⋯ α 2 ) 2 β 1 2 + ( α t ⋯ α 3 ) 2 β 2 2 + ⋯ + α t 2 β t − 1 2 + β t 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 (αtα2)2β12+(αtα3)2β22++αt2βt12+βt2. 由于 α t 2 + β t 2 = 1 \alpha_t^2 + \beta_t^2=1 αt2+βt2=1,由数学归纳法可以很容易得到
    ( α t ⋯ α 1 ) 2 + ( α t ⋯ α 2 ) 2 β 1 2 + ( α t ⋯ α 3 ) 2 β 2 2 + ⋯ + α t 2 β t − 1 2 + β t 2 = 1 (\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 (αtα1)2+(αtα2)2β12+(αtα3)2β22++αt2βt12+βt2=1也就是说, t t t 步加噪其实就相当于如下式所示的单步加噪
    x t = ( α t ⋯ α 1 ) ⏟ 记为 α ˉ t x 0 + 1 − ( α t ⋯ α 1 ) 2 ⏟ 记为 β ˉ t ε ˉ t , ε ˉ t ∼ N ( 0 , I ) \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}) xt=记为αˉt (αtα1)x0+记为βˉt 1(αtα1)2 εˉt,εˉtN(0,I)这就为计算 x t \boldsymbol{x}_t xt 提供了极大的便利。另一方面,DDPM 会选择适当的 α t α_t αt 形式,使得 α ˉ T ≈ 0 \bar{\alpha}_T\approx 0 αˉT0,这意味着经过 T T T 步的拆楼后,所剩的楼体几乎可以忽略了,已经全部转化为原材料 ε \boldsymbol{\varepsilon} ε

建楼 (生成)

  • 建楼时,只需根据拆楼公式 x t − 1 → x t \boldsymbol{x}_{t-1}\to \boldsymbol{x}_t xt1xt 构建如下的建楼公式 μ ( x t ) \boldsymbol{\mu}(\boldsymbol{x}_t) μ(xt): x t → x t − 1 \boldsymbol{x}_t\to \boldsymbol{x}_{t-1} xtxt1
    μ ( x t ) = 1 α t ( x t − β t ϵ θ ( x t , 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) μ(xt)=αt1(xtβtϵθ(xt,t))其中 μ ( x t ) \boldsymbol{\mu}(\boldsymbol{x}_t) μ(xt) 即为我们想要的生成模型,同时通过这种参数化的表达还显式地引入了残差结构。可以看到,该生成模型主要就是对 t t t ( 1 ≤ t ≤ T 1\leq t\leq T 1tT) 步的噪声 ε t \boldsymbol\varepsilon_t εt 进行建模。注意到 ϵ θ ( x t , t ) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) ϵθ(xt,t) 中,我们在输入中显式地写出了 t t t,这是因为原则上不同的 t t t 处理的是不同层次的对象,所以应该用不同的重构模型,即应该有 T T T 个不同的重构模型才对,于是我们共享了所有重构模型的参数,将 t t t 作为条件传入。按照论文附录的说法, t t t 是转换成 Transformer 升级之路:1、Sinusoidal 位置编码追根溯源 介绍的位置编码后,直接加到残差模块上去的
  • 训练时的损失函数
    ∥ x t − 1 − μ ( x t ) ∥ 2 = β t 2 α t 2 ∥ ε t − ϵ θ ( x t , t ) ∥ 2 \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 xt1μ(xt)2=αt2βt2εtϵθ(xt,t)2其中 β t 2 α t 2 \frac{\beta_t^2}{\alpha_t^2} αt2βt2 代表 loss 的权重,可以暂时忽略。也就是说,我们只需随机采样一个时间步 t t t 以及对应的 x t \boldsymbol x_t xt ε t \boldsymbol\varepsilon _t εt,就可以计算损失函数,进而优化生成模型
  • 正常来说采样 x t \boldsymbol x_t xt 需要进行 t t t 步加噪,即采样 t t t 个噪声,我们可以 t t t 步加噪等价地表示为单步加噪的形式
    x t = α t x t − 1 + β t ε t = α t ( α ˉ t − 1 x 0 + β ˉ t − 1 ε ˉ t − 1 ) + β t ε t = α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t \begin{aligned}\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{aligned} xt=αtxt1+βtεt=αt(αˉt1x0+βˉt1εˉt1)+βtεt=αˉtx0+αtβˉt1εˉt1+βtεt注意到,这里不直接写为 x t = α ˉ t x 0 + β ˉ t ε ˉ t \boldsymbol{x}_t=\bar{\alpha}_{t}\boldsymbol{x}_0 + \bar{\beta}_{t}\bar{\boldsymbol{\varepsilon}}_{t} xt=αˉtx0+βˉtεˉt 是因为我们已经事先采样了 ε t \boldsymbol{\varepsilon}_t εt,而 ε t \boldsymbol{\varepsilon}_t εt ε ˉ t \bar\boldsymbol{\varepsilon}_t εˉt 不是相互独立的,所以给定 ε t \boldsymbol{\varepsilon}_t εt 的情况下,我们不能完全独立地采样 ε ˉ t \bar \boldsymbol{\varepsilon}_t εˉt.
  • 由此得到如下的损失函数
    ∥ ε t − ϵ θ ( α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t , t ) ∥ 2 \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 εtϵθ(αˉtx0+αtβˉt1εˉt1+βtεt,t)2在计算上述损失函数时,我们需要采样 4 个随机变量
    • (1) 从所有训练样本中采样一个 x 0 \boldsymbol{x}_0 x0
    • (2) (3) 从正态分布 N ( 0 , I ) \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) N(0,I) 中采样 ε ˉ t − 1 , ε t \bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t εˉt1,εt
    • (4) 从 1 ∼ T 1∼T 1T 中采样一个 t t t

降低方差

  • 理论上,现在利用上述损失函数就能完成 DDPM 的训练,但它在实践中可能有方差过大的风险,从而导致收敛过慢等问题。这是因为计算上述损失函数需要采样 4 个随机变量,要采样的随机变量越多,就越难对损失函数做准确的估计,反过来说就是每次对损失函数进行估计的波动 (方差) 过大了
  • 很幸运的是,我们可以通过一个积分技巧来 ε ˉ t − 1 , ε t \bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t εˉt1,εt 合并成单个正态随机变量,从而缓解一下方差大的问题

ε ˉ t − 1 , ε t \bar{\boldsymbol{\varepsilon}}_{t-1}, \boldsymbol{\varepsilon}_t εˉt1,εt 合并成单个正态随机变量

  • 由于正态分布的叠加性,我们知道
    α t β ˉ t − 1 ε ˉ t − 1 + β t ε t ⇔ β ˉ t ε ∣ ε ∼ N ( 0 , I ) β t ε ˉ t − 1 − α t β ˉ t − 1 ε t ⇔ β ˉ t ω ∣ ω ∼ N ( 0 , I ) \alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t\Leftrightarrow \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\Leftrightarrow \bar{\beta}_t\boldsymbol{\omega}|\boldsymbol{\omega}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) αtβˉt1εˉt1+βtεtβˉtεεN(0,I)βtεˉt1αtβˉt1εtβˉtωωN(0,I)(证明: ( α t β ˉ t − 1 ) 2 + β t 2 = α t 2 ( 1 − α ˉ t − 1 2 ) + β t 2 = 1 − α ˉ t 2 = β ˉ t 2 (\alpha_t\bar{\beta}_{t-1})^2 + \beta_t^2=\alpha_t^2(1-\bar\alpha_{t-1}^2)+\beta_t^2=1-\bar\alpha_{t}^2=\bar\beta_{t}^2 (αtβˉt1)2+βt2=αt2(1αˉt12)+βt2=1αˉt2=βˉt2). 此外可以验证 E [ ε ω ⊤ ] = 0 \mathbb{E}[\boldsymbol{\varepsilon}\boldsymbol{\omega}^{\top}]=\boldsymbol{0} E[εω]=0,所以 ε , ω \boldsymbol{\varepsilon},\boldsymbol{\omega} ε,ω两个相互独立的正态随机变量. (证明: E [ β ˉ t β ˉ t ε ω ⊤ ] = E [ ( α t β ˉ t − 1 ε ˉ t − 1 + β t ε t ) ( β t ε ˉ t − 1 − α t β ˉ t − 1 ε t ) ⊤ ] \mathbb{E}[\bar{\beta}_t\bar{\beta}_t\boldsymbol{\varepsilon}\boldsymbol{\omega}^{\top}] = \mathbb{E}[(\alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t)(\beta_t \bar{\boldsymbol{\varepsilon}}_{t-1} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\varepsilon}_t)^{\top}] E[βˉtβˉtεω]=E[(αtβˉt1εˉt1+βtεt)(βtεˉt1αtβˉt1εt)] ε t {\boldsymbol{\varepsilon}}_{t} εt ε ˉ t − 1 \bar{\boldsymbol{\varepsilon}}_{t-1} εˉt1 为相互独立的标准正态随机变量)
  • 接下来,我们反过来将 ε t \boldsymbol{\varepsilon}_t εt ε , ω \boldsymbol{\varepsilon},\boldsymbol{\omega} ε,ω 重新表示出来
    { α t β ˉ t − 1 ε ˉ t − 1 + β t ε t = β ˉ t ε β t ε ˉ t − 1 − α t β ˉ t − 1 ε t = β ˉ t ω \left\{\begin{aligned} \alpha_t\bar{\beta}_{t-1}\bar{\boldsymbol{\varepsilon}}_{t-1} + \beta_t \boldsymbol{\varepsilon}_t = \bar{\beta}_t\boldsymbol{\varepsilon}\\ \beta_t \bar{\boldsymbol{\varepsilon}}_{t-1} - \alpha_t\bar{\beta}_{t-1} \boldsymbol{\varepsilon}_t = \bar{\beta}_t\boldsymbol{\omega} \end{aligned}\right. {αtβˉt1εˉt1+βtεt=βˉtεβtεˉt1αtβˉt1εt=βˉtω消掉 ε ˉ t − 1 \bar{\boldsymbol{\varepsilon}}_{t-1} εˉt1 后可得
    ε t = ( β t ε − α t β ˉ t − 1 ω ) β ˉ t β t 2 + α t 2 β ˉ t − 1 2 = β t ε − α t β ˉ t − 1 ω β ˉ t \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} εt=βt2+αt2βˉt12(βtεαtβˉt1ω)βˉt=βˉtβtεαtβˉt1ω将上式代入损失函数可得
      E ε ˉ t − 1 , ε t ∼ N ( 0 , I ) [ ∥ ε t − ϵ θ ( α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t , t ) ∥ 2 ] =   E ω , ε ∼ N ( 0 , I ) [ ∥ β t ε − α t β ˉ t − 1 ω β ˉ t − ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 ] = β t 2 β ˉ t 2   E ω , ε ∼ N ( 0 , I ) [ ∥ ε − β ˉ t β t ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) − α t β ˉ t − 1 ω β t ∥ 2 ] \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] \\ =&\frac{\beta_t^2}{\bar\beta_t^2}\,\mathbb{E}_{\boldsymbol{\omega}, \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}\left[\left\| \boldsymbol{\varepsilon} -\frac{\bar\beta_t}{\beta_t} \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \bar{\beta}_t\boldsymbol{\varepsilon}, t)- \frac{\alpha_t\bar{\beta}_{t-1} \boldsymbol{\omega}}{{\beta}_t}\right\Vert^2\right] \end{aligned} ==Eεˉt1,εtN(0,I)[εtϵθ(αˉtx0+αtβˉt1εˉt1+βtεt,t)2]Eω,εN(0,I)[βˉtβtεαtβˉt1ωϵθ(αˉtx0+βˉtε,t)2]βˉt2βt2Eω,εN(0,I)[εβtβˉtϵθ(αˉtx0+βˉtε,t)βtαtβˉt1ω2]由于 E ω , ε ∼ N ( 0 , I ) [ ω ⊤ ω ] = d \mathbb{E}_{\boldsymbol{\omega}, \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}[\boldsymbol{\omega}^\top\boldsymbol{\omega}]=d Eω,εN(0,I)[ωω]=d ( d d d 为噪声维度), E ω , ε ∼ N ( 0 , I ) [ ε ⊤ ω ] = 0 \mathbb{E}_{\boldsymbol{\omega}, \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}[\boldsymbol{\varepsilon}^\top\boldsymbol{\omega}]=0 Eω,εN(0,I)[εω]=0 E ω , ε ∼ N ( 0 , I ) [ ϵ θ ⊤ ( α ˉ t x 0 + β ˉ t ε , t ) ω ] = 0 \mathbb{E}_{\boldsymbol{\omega}, \boldsymbol{\varepsilon}\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})}[\boldsymbol{\epsilon}^\top_{\boldsymbol{\theta}}(\bar{\alpha}_t\boldsymbol{x}_0 + \bar{\beta}_t\boldsymbol{\varepsilon}, t)\boldsymbol{\omega}]=0 Eω,εN(0,I)[ϵθ(αˉtx0+βˉtε,t)ω]=0,因此上述损失函数其实可以写为
    β t 2 β ˉ t 2 E ε ∼ N ( 0 , I ) [ ∥ ε − β ˉ t β t ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 ] + 常数 \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{常数} βˉt2βt2EεN(0,I)[εβtβˉtϵθ(αˉtx0+βˉtε,t)2]+常数再次省掉常数和损失函数的权重,我们得到 DDPM 最终所用的损失函数
    ∥ ε − β ˉ t β t ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 \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 εβtβˉtϵθ(αˉtx0+βˉtε,t)2训练时只需采样 t t t, x 0 \boldsymbol{x}_0 x0, ϵ \boldsymbol{\epsilon} ϵ 即可 (提示:原论文中的 ϵ θ \boldsymbol{\epsilon}_{\boldsymbol{\theta}} ϵθ 实际上就是这里的 β ˉ t β t ϵ θ \frac{\bar{\beta}_t}{\beta_t}\boldsymbol{\epsilon}_{\boldsymbol{\theta}} βtβˉtϵθ,所以大家的结果是完全一样的)

递归生成

  • 训练完之后,我们就可以从一个随机噪声 x T ∼ N ( 0 , I ) \boldsymbol{x}_T\sim\mathcal{N}(\boldsymbol{0}, \boldsymbol{I}) xTN(0,I) 出发执行 T T T 步下式来进行生成
    x t − 1 = 1 α t ( x t − β t ϵ θ ( x t , t ) ) \boldsymbol{x}_{t-1} = \frac{1}{\alpha_t}\left(\boldsymbol{x}_t - \beta_t \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t)\right) xt1=αt1(xtβtϵθ(xt,t))这对应于自回归解码中的 Greedy Search。如果要进行 Random Sample,那么需要补上噪声项:
    x t − 1 = 1 α t ( x t − β t ϵ θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) \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}) xt1=αt1(xtβtϵθ(xt,t))+σtz,zN(0,I)一般来说,我们可以让 σ t = β t \sigma_t=\beta_t σt=βt,即正向和反向的方差保持同步 (这点在 “Random Sample - 方差选取” 一节中解释)
  • 从这个生成过程中,我们也可以感觉到它其实跟 Seq2Seq 的解码过程是一样的,都是串联式的自回归生成,所以生成速度是一个瓶颈,DDPM 设了 T = 1000 T=1000 T=1000,意味着每生成一个图片,需要将 ϵ θ ( x t , t ) \boldsymbol{\epsilon}_{\boldsymbol{\theta}}(\boldsymbol{x}_t, t) ϵθ(xt,t) 反复执行 1000 次,因此 DDPM 的一大缺点就是采样速度慢,后面有很多工作都致力于提升 DDPM 的采样速度

超参设置

  • 在 DDPM 中, T = 1000 T=1000 T=1000,可能比很多读者的想象数值要大,那为什么要设置这么大的 T T T
  • α t \alpha_t αt 是一个单调递减的函数
    α t = 1 − 0.02 t T \alpha_t = \sqrt{1 - \frac{0.02t}{T}} αt=1T0.02t 为什么要选择单调递减的 α t \alpha_t αt

  • 其实这两个问题有着相近的答案,跟具体的数据背景有关。简单起见,在重构的时候我们用了欧氏距离作为损失函数,而一般我们用 DDPM 做图片生成,以往做过图片生成的读者都知道,欧氏距离并不是图片真实程度的一个好的度量,VAE 用欧氏距离来重构时,往往会得到模糊的结果,除非是输入输出的两张图片非常接近,用欧氏距离才能得到比较清晰的结果 (这是因为同一个噪声可能对应多张图像,如果使用欧氏距离,就会使得噪声生成结果和多张图像都有一点相似,多张图像叠加在一起就会使得生成图像比较模糊)
  • 选择尽可能大的 T T T,正是为了使得输入输出尽可能相近,减少欧氏距离带来的模糊问题
  • 选择单调递减的 α t α_t αt 也有类似考虑。当 t t t 比较小时, x t \boldsymbol{x}_t xt 还比较接近真实图片,所以我们要缩小 x t − 1 \boldsymbol{x}_{t-1} xt1 x t \boldsymbol{x}_t xt 的差距,以便更适用欧氏距离,因此要用较大的 α t α_t αt;当 t t t 比较大时, x t \boldsymbol{x}_t xt 已经比较接近纯噪声了,噪声用欧式距离无妨,所以可以稍微增大 x t − 1 \boldsymbol{x}_{t-1} xt1 x t \boldsymbol{x}_t xt 的差距,即可以用较小的 α t α_t αt. 那么可不可以一直用较大的 α t α_t αt?可以是可以,但是要增大 T T T。这是因为我们想要使得 α ˉ T ≈ 0 \bar\alpha_T\approx0 αˉT0,而我们可以直接估算
    log ⁡ α ˉ T = ∑ t = 1 T log ⁡ α t = 1 2 ∑ t = 1 T log ⁡ ( 1 − 0.02 t T ) < 1 2 ∑ t = 1 T ( − 0.02 t T ) = − 0.005 ( T + 1 ) \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) logαˉT=t=1Tlogαt=21t=1Tlog(1T0.02t)<21t=1T(T0.02t)=0.005(T+1)代入 T = 1000 T=1000 T=1000 大致是 α ˉ T ≈ e − 5 \bar{\alpha}_T\approx e^{-5} αˉTe5,这个其实就刚好达到 ≈ 0 ≈0 0 的标准。所以如果从头到尾都用较大的 α t α_t αt,那么必然要更大的 T T T 才能使得 α ˉ T ≈ 0 \bar{\alpha}_T\approx 0 αˉT0

References

  • 苏剑林. (Jun. 13, 2022). 《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼 》[Blog post]. Retrieved from https://kexue.fm/archives/9119
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值