扩散模型DDPM的解读

写在前面

  • 本文基于苏剑林老师的文章,在此基础上加了一点点自己的理解,在公式的推导上步骤进行了补全(苏老师写的已经很好了,只不过我把步骤写全了,让零基础的人更能看懂)。
  • 苏老师的文章

1.将生成模型类比为建楼和拆楼

  • 想要做一个像GAN那样的生成模型,它实际上是将一个随机噪声 z z z变换成一个数据样本 x x x的过程。

1.1 类比

  • 随机噪声 z z z类比为砖瓦水泥,样本数据 x x x类比为高楼大厦;
  • z z z到 x x x的变换,相当于 砖瓦水泥建设高楼大厦;
  • 生成模型就是一支用原材料建设高楼大厦的施工队,过程很难;

1.2 换种思路:先拆楼

  • 所以我们换种思路:建楼难,我们就先不建楼,改成拆楼,考虑将高楼大厦一步步地拆为砖瓦水泥,这样我们就知道怎么建楼;
  • 拆楼的过程:设 x 0 x_0 x0​为建好的高楼大厦(数据样本), x T x_T xT​为拆好的砖瓦水泥(随机噪声),假设“拆楼”需要 T T T步,整个过程可以表示为 x = x 0 → x 1 → x 2 → . . . → x T − 1 → x T = z (1) x=x_0\rightarrow x_1\rightarrow x_2\rightarrow...\rightarrow x_{T-1}\rightarrow x_T=z \tag{1} x=x0​→x1​→x2​→...→xT−1​→xT​=z(1)

1.3 建楼的难点

  • 建高楼大厦的难度在于,从原材料 x T x_T xT​到最终高楼大厦 x 0 x_0 x0​的跨度过大,普通人很难理解 x T x_T xT​是怎么一下子变成 x 0 x_0 x0​的,先记住我们的目标生成 x 0 x_0 x0​这个高楼大厦。
  • 当我们知道拆楼的过程 x 1 , x 2 , . . . , x T x_1,x_2,...,x_T x1​,x2​,...,xT​后,就可以知道 x t − 1 → x t x_{t-1}\rightarrow x_t xt−1​→xt​( t − 1 t-1 t−1步到 t t t步时)代表着拆楼的一步;
  • 反过来 x t → x t − 1 x_{t}\rightarrow x_{t-1} xt​→xt−1​就是建楼的一步;
  • 如果能学会两者之间的变换关系 x t − 1 = μ ( x t ) x_{t-1}=\mu(x_t) xt−1​=μ(xt​)(这里是建楼 x t → x t − 1 x_{t}\rightarrow x_{t-1} xt​→xt−1​),那么从 z = x T z=x_T z=xT​开始,反复执行 x T − 1 = μ ( x T ) x_{T-1}=\mu(x_T) xT−1​=μ(xT​)、 x T − 2 = μ ( x T − 1 ) x_{T-2}=\mu(x_{T-1}) xT−2​=μ(xT−1​)、 . . . ... ...,最终就将高楼大厦造出来了 x 0 x_0 x0​。

2. 回到拆楼,怎么拆楼?

  • DDPM做生成模型的过程,其实跟上述“拆楼-建楼”的类比是完全一致的,它也是先反过来构建一个从数据样本渐变到随机噪声的过程,然后再考虑其逆变换,通过反复执行逆变换来完成数据样本的生成。

2.1 拆楼的过程

  • DDPM将“拆楼”的过程建模为 x t = α t x t − 1 + β t ε t , ( ε t ∼ N ( 0 , I ) ) (2) x_t=\alpha_t x_{t-1}+\beta_t \varepsilon_t, (\varepsilon_t \sim N(0, I)) \tag{2} xt​=αt​xt−1​+βt​εt​,(εt​∼N(0,I))(2)
    • α t , β t > 0 \alpha_t,\beta_t>0 αt​,βt​>0且 α t 2 + β t 2 = 1 \alpha_t^2+\beta_t^2=1 αt2​+βt2​=1;(优化了一下原论文的参数)
    • β t \beta_t βt​非常接近0,代表着单步拆楼中对原来楼体的破坏程度;
    • 噪声 ε t \varepsilon_t εt​的引入代表着对原始信号的一种破坏,也就是原材料;
    • 每一步拆楼都将 x t − 1 x_{t-1} xt−1​拆分成 α t x t − 1 \alpha_tx_{t-1} αt​xt−1​的楼体+ β t ε t \beta_t\varepsilon_t βt​εt​的原料。这样想:拆楼,都是在原楼体上拆,这样,原楼体还剩,a*原楼体(a肯定小于1),还有一堆拆下来的砖块等原料。
  • 反复执行这个拆楼步骤:
    x t = α t x t − 1 + β t ε t = α t ( α t − 1 x t − 2 + β t − 1 ε t − 1 ) = ⋅ ⋅ ⋅ = ( α t ⋅ ⋅ ⋅ α 1 ) x 0 + ( α t ⋅ ⋅ ⋅ α 2 ) β 1 ε 1 + ( α t ⋅ ⋅ ⋅ α 3 ) β 2 ε 2 + ⋅ ⋅ ⋅ + α t β t − 1 ε t − 1 + β t ε t (3) \begin{aligned} x_t &=\alpha_t x_{t-1}+\beta_t \varepsilon_t \\ &=\alpha_t(\alpha_{t-1} x_{t-2}+\beta_{t-1} \varepsilon_{t-1})\\ &=···\\ &=(\alpha_t···\alpha_1)x_0+(\alpha_t···\alpha_2)\beta_1\varepsilon_1+(\alpha_t···\alpha_3)\beta_2\varepsilon_2+···+\alpha_t\beta_{t-1}\varepsilon_{t-1}+\beta_{t}\varepsilon_{t} \tag{3} \end{aligned} xt​​=αt​xt−1​+βt​εt​=αt​(αt−1​xt−2​+βt−1​εt−1​)=⋅⋅⋅=(αt​⋅⋅⋅α1​)x0​+(αt​⋅⋅⋅α2​)β1​ε1​+(αt​⋅⋅⋅α3​)β2​ε2​+⋅⋅⋅+αt​βt−1​εt−1​+βt​εt​​(3)
    • 第二项到最后( ( α t ⋅ ⋅ ⋅ α 2 ) β 1 ε 1 + ( α t ⋅ ⋅ ⋅ α 3 ) β 2 ε 2 + ⋅ ⋅ ⋅ + α t β t − 1 ε t − 1 + β t ε t (\alpha_t···\alpha_2)\beta_1\varepsilon_1+(\alpha_t···\alpha_3)\beta_2\varepsilon_2+···+\alpha_t\beta_{t-1}\varepsilon_{t-1}+\beta_{t}\varepsilon_{t} (αt​⋅⋅⋅α2​)β1​ε1​+(αt​⋅⋅⋅α3​)β2​ε2​+⋅⋅⋅+αt​βt−1​εt−1​+βt​εt​)就是多个独立的正态噪声之和。
    • 根据正态分布的叠加性:
      • 如: ( α t ⋅ ⋅ ⋅ α 2 ) β 1 ε 1 ∼ N ( 0 , ( α t ⋅ ⋅ ⋅ α 2 ) 2 β 1 2 ⋅ I ) (\alpha_t···\alpha_2)\beta_1\varepsilon_1 \sim N\left(0,(\alpha_t···\alpha_2)^2\beta_1^2·I \right) (αt​⋅⋅⋅α2​)β1​ε1​∼N(0,(αt​⋅⋅⋅α2​)2β12​⋅I)
      • 所以都是均值为0,方差为 ( α t ⋅ ⋅ ⋅ α 2 ) 2 β 1 2 , ( α t ⋅ ⋅ ⋅ α 3 ) 2 β 2 2 , . . . , α t 2 β t − 1 2 , β t 2 (\alpha_t···\alpha_2)^2\beta_1^2,(\alpha_t···\alpha_3)^2\beta_2^2,...,\alpha_t^2\beta_{t-1}^2,\beta_{t}^2 (αt​⋅⋅⋅α2​)2β12​,(αt​⋅⋅⋅α3​)2β22​,...,αt2​βt−12​,βt2​的正态分布
      • 所有噪声和叠加,就是均值为0,方差为 ( α t ⋅ ⋅ ⋅ α 2 ) 2 β 1 2 + ( α t ⋅ ⋅ ⋅ α 3 ) 2 β 2 2 + . . . + α t 2 β t − 1 2 + β t 2 (\alpha_t···\alpha_2)^2\beta_1^2+(\alpha_t···\alpha_3)^2\beta_2^2+...+\alpha_t^2\beta_{t-1}^2+\beta_{t}^2 (αt​⋅⋅⋅α2​)2β12​+(αt​⋅⋅⋅α3​)2β22​+...+αt2​βt−12​+βt2​的正态分布(这里很容易得出,可以去看一下(常数*一个随机变量)的方差怎么算的,其实就是常数的平方*随机变量的方差)。
      • 用 α t 2 + β t 2 = 1 \alpha_t^2+\beta_t^2=1 αt2​+βt2​=1进行恒等变换(就是所有 β \beta β换成 α \alpha α)就会得,方差为: 1 − ( α t ⋅ ⋅ ⋅ α 1 ) 2 1-(\alpha_t···\alpha_1)^2 1−(αt​⋅⋅⋅α1​)2
      • 递推式就变成了: x t = ( α t ⋅ ⋅ ⋅ α 1 ) x 0 + 1 − ( α t ⋅ ⋅ ⋅ α 1 ) 2 ε ˉ t , ε ˉ t ∼ N ( 0 , I ) (4) x_t=(\alpha_t···\alpha_1)x_0+\sqrt{1-(\alpha_t···\alpha_1)^2}\bar\varepsilon_t,\bar\varepsilon_t \sim N(0,I) \tag{4} xt​=(αt​⋅⋅⋅α1​)x0​+1−(αt​⋅⋅⋅α1​)2 ​εˉt​,εˉt​∼N(0,I)(4)
      • 记 α ˉ t = α t ⋅ ⋅ ⋅ α 2 α 1 \bar\alpha_t=\alpha_t···\alpha_2\alpha_1 αˉt​=αt​⋅⋅⋅α2​α1​, β ˉ t = 1 − ( α t ⋅ ⋅ ⋅ α 1 ) 2 \bar\beta_t=\sqrt{1-(\alpha_t···\alpha_1)^2} βˉ​t​=1−(αt​⋅⋅⋅α1​)2 ​
  • DDPM会选择适当 α t \alpha_t αt​形式,使得 ( α t ⋅ ⋅ ⋅ α 1 ) ≈ 0 (\alpha_t···\alpha_1)\approx 0 (αt​⋅⋅⋅α1​)≈0(记住这里,后面会解释为什么这样),这意味着经过 T T T步的拆楼后,所剩的楼体几乎没有了( x 0 x_0 x0​几乎没有了, x 0 x_0 x0​前面的系数是一堆很小的数相乘),已经几乎全部转化为原材料 ε \varepsilon ε(原论文中, x 0 x_0 x0​前面的系数是 α ˉ t \sqrt{\bar \alpha_t} αˉt​ ​, ε ˉ \bar\varepsilon εˉ前面的系数是 1 − α ˉ t \sqrt{1-\bar\alpha_t} 1−αˉt​ ​,平方和也是1,所以没有影响,这样改动,更美观)。

3.现在开始建楼,怎么建楼?

  • 拆楼是 x t − 1 → x t x_{t-1}\rightarrow x_t xt−1​→xt​的过程,这个过程,我们会得到很多数据对 ( x t − 1 , x t ) (x_{t-1},x_t) (xt−1​,xt​)
  • 现在反过来,建楼就是从这些数据对中学习一个 x t − 1 ← x t x_{t-1}\leftarrow x_t xt−1​←xt​的模型。
  • 设该模型为 x ^ t − 1 = μ ( x t ) \hat x_{t-1}=\mu(x_t) x^t−1​=μ(xt​),容易想到的学习方案就是最小化两者的欧氏距离: ∥ x t − 1 − x ^ t − 1 ∥ 2 = ∥ x t − 1 − μ ( x t ) ∥ 2 (5) \|x_{t-1}-\hat x_{t-1}\|^2=\|x_{t-1}-\mu(x_t)\|^2 \tag{5} ∥xt−1​−x^t−1​∥2=∥xt−1​−μ(xt​)∥2(5)

3.1 楼的形式?

  • 首先拆楼的递推式 x t = α t x t − 1 + β t ε t x_t=\alpha_t x_{t-1}+\beta_t \varepsilon_t xt​=αt​xt−1​+βt​εt​可以移项得到为 x t − 1 = 1 α t ( x t − β t ε t ) x_{t-1}=\frac{1}{\alpha_t}(x_t-\beta_t\varepsilon_t) xt−1​=αt​1​(xt​−βt​εt​)

  • so,我们就会想能不能把 μ ( x t ) \mu(x_t) μ(xt​)设计为和上面移项后的函数的形式大致一样: μ ( x t ) = 1 α t ( x t − β t ϵ θ ( x t , t ) ) (6) \mu(x_t)=\frac{1}{\alpha_t}(x_t-\beta_t\epsilon_\theta(x_t,t)) \tag{6} μ(xt​)=αt​1​(xt​−βt​ϵθ​(xt​,t))(6)

  • 其中 θ \theta θ是训练参数, ϵ θ \epsilon_\theta ϵθ​是预测的是带噪图片所带的噪声,不是随机噪声,将 ( 6 ) (6) (6)其代入到损失函数 ( 5 ) (5) (5),得到进一步的损失函数: ∣ ∣ x t − 1 − μ ( x t ) ∣ ∣ 2 = ∥ x t − 1 − 1 α t ( x t − β t ϵ θ ( x t , t ) ) ∥ 2 = ∥ x t − 1 − x t α t + β t α t ϵ θ ( x t , t ) ∥ 2 = ∥ x t − 1 − α t x t − 1 + β t ε t α t + β t α t ϵ θ ( x t , t ) ∥ 2 = β t 2 α t 2 ∣ ∣ ε t − ϵ θ ( x t , t ) ∣ ∣ 2 (7) \begin{aligned}||x_{t-1}-\mu(x_t)||^2&=\|x_{t-1}-\frac{1}{\alpha_t}(x_t-\beta_t\epsilon_\theta(x_t,t))\|^2 \\&=\|x_{t-1}-\frac{x_t}{\alpha_t}+\frac{\beta_t}{\alpha_t}\epsilon_\theta(x_t,t)\|^2\\ &=\|x_{t-1}-\frac{\alpha_t x_{t-1}+\beta_t \varepsilon_t}{\alpha_t}+\frac{\beta_t}{\alpha_t}\epsilon_\theta(x_t,t)\|^2\\ &=\frac{\beta_t^2}{\alpha_t^2}||\varepsilon_t-\epsilon_\theta(x_t,t)||^2\tag{7}\end{aligned} ∣∣xt−1​−μ(xt​)∣∣2​=∥xt−1​−αt​1​(xt​−βt​ϵθ​(xt​,t))∥2=∥xt−1​−αt​xt​​+αt​βt​​ϵθ​(xt​,t)∥2=∥xt−1​−αt​αt​xt−1​+βt​εt​​+αt​βt​​ϵθ​(xt​,t)∥2=αt2​βt2​​∣∣εt​−ϵθ​(xt​,t)∣∣2​(7)

  • β t 2 α t 2 \frac{\beta_t^2}{\alpha_t^2} αt2​βt2​​代表 l o s s loss loss的权重

  • 下一步就是消去 l o s s loss loss中的 x t x_t xt​

  • x t x_t xt​的表达式用退一步的 x t − 1 x_{t-1} xt−1​表示为: 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 (8) \begin{aligned}x_t&=\alpha_t x_{t-1}+\beta_t \varepsilon_t\\ &=\alpha_t(\bar\alpha_{t-1}x_0+\bar\beta_{t-1}\bar\varepsilon_{t-1})+\beta_t\varepsilon_t\\ &=\bar\alpha_tx_0+\alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t \tag{8}\end{aligned} xt​​=αt​xt−1​+βt​εt​=αt​(αˉt−1​x0​+βˉ​t−1​εˉt−1​)+βt​εt​=αˉt​x0​+αt​βˉ​t−1​εˉt−1​+βt​εt​​(8)

  • 其中 α ˉ t − 1 \bar\alpha_{t-1} αˉt−1​为 α t − 1 ⋅ ⋅ ⋅ α 1 \alpha_{t-1}···\alpha_1 αt−1​⋅⋅⋅α1​, β ˉ t − 1 \bar\beta_{t-1} βˉ​t−1​为 1 − ( α t − 1 ⋅ ⋅ ⋅ α 1 ) 2 \sqrt{1-(\alpha_{t-1}···\alpha_1)^2} 1−(αt−1​⋅⋅⋅α1​)2 ​

  • 最重要的是 ε ˉ t \bar\varepsilon_t εˉt​是由 ε 1 , . . . , ε t − 1 \varepsilon_1,...,\varepsilon_{t-1} ε1​,...,εt−1​叠加的,和 ε t \varepsilon_t εt​是无关的,独立的(这一点非常重要,下面会说为什么要这样做?)

  • 得到的 l o s s loss loss形式为: ∣ ∣ ε t − ϵ θ ( α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t , t ) ∣ ∣ 2 (9) ||\varepsilon_t-\epsilon_\theta(\bar\alpha_tx_0+\alpha_t \bar \beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t,t)||^2 \tag{9} ∣∣εt​−ϵθ​(αˉt​x0​+αt​βˉ​t−1​εˉt−1​+βt​εt​,t)∣∣2(9)

  • 为什么要得到 ( 8 ) (8) (8)中的 x t x_t xt​,不能直接用 ( 4 ) (4) (4)的 x t = ( α t ⋅ ⋅ ⋅ α 1 ) x 0 + 1 − ( α t ⋅ ⋅ ⋅ α 1 ) 2 ε ˉ t x_t=(\alpha_t···\alpha_1)x_0+\sqrt{1-(\alpha_t···\alpha_1)^2}\bar\varepsilon_t xt​=(αt​⋅⋅⋅α1​)x0​+1−(αt​⋅⋅⋅α1​)2 ​εˉt​给出的 x t x_t xt​吗?

    • 不行, ε ˉ t \bar\varepsilon_t εˉt​和 ε t \varepsilon_t εt​有关联,非独立,因为之前我们已经sample了,所以在给定 ε t \varepsilon_t εt​的情况下,不能独立采样 ε ˉ t \bar\varepsilon_t εˉt​,看 ( 8 ) (8) (8)下面的解释。

4.还有什么问题?方差可能会太大

4.1 为什么会有方差大的风险?

  • 损失函数可能方差过大的风险,从 ( 9 ) (9) (9)中就可以看出,需要对四个变量进行sample:
    • 1.从训练样本中采样一个 x 0 x_0 x0​
    • 2.从正态分布 N ( 0 , I ) N(0,I) N(0,I)中采样 ε ˉ t − 1 \bar\varepsilon_{t-1} εˉt−1​和 ε t \varepsilon_t εt​
    • 3.从 1 ∼ T 1\sim T 1∼T中采样一个 t t t
  • 要采样的随机变量越多,就越难对损失函数做准确的估计,反过来说就是每次对损失函数进行估计的波动(方差)过大了。

4.2 想方设法让随机变量变少点

  • 对于 α t β ˉ t − 1 ε ˉ t − 1 + β t ε t \alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t αt​βˉ​t−1​εˉt−1​+βt​εt​,由正态分布的叠加性,相当于单个随机变量 β ˉ t ε ∣ ε ∼ N ( 0 , I ) \bar\beta_t \varepsilon |\varepsilon\sim N(0,I) βˉ​t​ε∣ε∼N(0,I),其中 ε ∼ N ( 0 , I ) \varepsilon\sim N(0,I) ε∼N(0,I)

  • 所以我们只要保证系数为 α t β ˉ t − 1 \alpha_t\bar\beta_{t-1} αt​βˉ​t−1​和 β t \beta_t βt​就可以

  • 构造出 β t ε ˉ t − 1 − α t β ˉ t − 1 ε t \beta_t\bar\varepsilon_{t-1}-\alpha_t\bar\beta_{t-1}\varepsilon_t βt​εˉt−1​−αt​βˉ​t−1​εt​,经过简单的计算得出 β ˉ t w ∣ w ∼ N ( 0 , I ) \bar\beta_t w|{w \sim N(0,I)} βˉ​t​w∣w∼N(0,I),其目的就是希望凑出下面那个期望,且为0,这样就能保证是独立的正态随机变量了

  • 并且可以验证 E [ ε w T ] = 0 \mathbb{E}[\varepsilon w^T]=0 E[εwT]=0,验证方法可以用 E ( β ˉ t β ˉ t ε w T ) = . . . E( \bar\beta_t\bar\beta_t\varepsilon w^T)=... E(βˉ​t​βˉ​t​εwT)=...展开就ok

    • 由 E ( x y ) = E ( x ) E ( y ) + C o v ( x , y ) E(xy)=E(x)E(y)+Cov(x,y) E(xy)=E(x)E(y)+Cov(x,y)得
    • E [ ε w T ] = E ( ε ) E ( w T ) + C o v ( ε , w T ) = 0 \mathbb{E}[\varepsilon w^T]=E(\varepsilon) E(w^T) + Cov(\varepsilon,w^T)=0 E[εwT]=E(ε)E(wT)+Cov(ε,wT)=0
    • 对于均值为0的高斯随机变量,不相关等价于独立
    • 两个相互独立的正态随机变量。
  • 反过来将 ε t \varepsilon_t εt​用 ε , w \varepsilon,w ε,w重新表示出来:
    { α t β ˉ t − 1 ε ˉ t − 1 + β t ε t = β ˉ t ε β t ε ˉ t − 1 − α t β ˉ t − 1 ε t = β ˉ t (10) \begin{aligned} \begin{cases} \alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t=\bar\beta_t \varepsilon \tag{10}\\ \beta_t\bar\varepsilon_{t-1}-\alpha_t\bar\beta_{t-1}\varepsilon_t=\bar\beta_t\\ \end{cases} \end{aligned} {αt​βˉ​t−1​εˉt−1​+βt​εt​=βˉ​t​εβt​εˉt−1​−αt​βˉ​t−1​εt​=βˉ​t​​​(10)

  • ( 10 ) (10) (10)中的方程组第一个式子记为 ( 1 ) (1) (1),第二个式子记为 ( 2 ) (2) (2)

  • 求解过程:

    • ( 1 ) ∗ β t (1)*\beta_t (1)∗βt​得 ( 3 ) (3) (3)
    • ( 2 ) ∗ α t β ˉ t − 1 (2)*\alpha_t\bar\beta_{t-1} (2)∗αt​βˉ​t−1​得 ( 4 ) (4) (4)
    • ( 4 ) − ( 3 ) (4)-(3) (4)−(3),就是为了将 ε ˉ t − 1 \bar\varepsilon_{t-1} εˉt−1​消掉: β t 2 ε t + α t 2 β ˉ t − 1 2 ε t = β ˉ t β t ε − β ˉ t α t β ˉ t − 1 w (11) \beta_t^2\varepsilon_t+\alpha_t^2\bar\beta_{t-1}^2\varepsilon_t=\bar\beta_t\beta_t\varepsilon-\bar\beta_t\alpha_t\bar\beta_{t-1}w \tag{11} βt2​εt​+αt2​βˉ​t−12​εt​=βˉ​t​βt​ε−βˉ​t​αt​βˉ​t−1​w(11)
  • 由上式 ( 11 ) (11) (11),即解得: ε t = β ˉ t β t ε − β ˉ t α t β ˉ t − 1 w β t 2 + α t 2 β ˉ t − 1 2 = ( β t ε − α t β ˉ t − 1 w ) β ˉ t β t 2 + α t 2 β ˉ t − 1 2 = β t ε − α t β ˉ t − 1 w β ˉ t (12) \varepsilon_t=\frac{\bar\beta_t\beta_t\varepsilon-\bar\beta_t\alpha_t\bar\beta_{t-1}w}{\beta_t^2+\alpha_t^2\bar\beta_{t-1}^2}=\frac{(\beta_t\varepsilon-\alpha_t\bar\beta_{t-1}w)\bar\beta_t}{\beta_t^2+\alpha_t^2\bar\beta_{t-1}^2}=\frac{\beta_t\varepsilon-\alpha_t\bar\beta_{t-1}w}{\bar\beta_t} \tag{12} εt​=βt2​+αt2​βˉ​t−12​βˉ​t​βt​ε−βˉ​t​αt​βˉ​t−1​w​=βt2​+αt2​βˉ​t−12​(βt​ε−αt​βˉ​t−1​w)βˉ​t​​=βˉ​t​βt​ε−αt​βˉ​t−1​w​(12)

  • 上式 ( 12 ) (12) (12)代入到 ( 9 ) (9) (9)式 ∥ ε t − ϵ θ ( α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t , t ) ∥ 2 \|\varepsilon_t-\epsilon_\theta(\bar\alpha_tx_0+\alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t,t)\|^2 ∥εt​−ϵθ​(αˉt​x0​+αt​βˉ​t−1​εˉt−1​+βt​εt​,t)∥2(这里面 α t β ˉ t − 1 ε ˉ t − 1 + β t ε t \alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t αt​βˉ​t−1​εˉt−1​+βt​εt​已经等于 β ˉ t ε \bar\beta_t\varepsilon βˉ​t​ε,看不懂的,可以看一下上面的标准正态分布叠加)
    得
    E ε ˉ t − 1 , ε t ∼ N ( 0 , I ) [ ∣ ∣ ε t − ϵ θ ( α ˉ t x 0 + α t β ˉ t − 1 ε ˉ t − 1 + β t ε t , t ) ∣ ∣ 2 ] = E w , ε ∼ N ( 0 , I ) [ ∥ β t ε − α t β ˉ t − 1 w β ˉ t − ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 ] (13) \begin{aligned}\mathbb{E}_{{\bar\varepsilon_{t-1},\varepsilon_t}\sim N(0,I)}\left[||\varepsilon_t-\epsilon_\theta(\bar\alpha_tx_0+\alpha_t\bar\beta_{t-1}\bar\varepsilon_{t-1}+\beta_t\varepsilon_t,t)||^2 \right]\\ =\mathbb{E}_{{w,\varepsilon}\sim N(0,I)}\left[\left\|\frac{\beta_t\varepsilon-\alpha_t\bar\beta_{t-1}w}{\bar\beta_t}-\epsilon_\theta(\bar\alpha_tx_0+\bar\beta_t\varepsilon,t)\right\|^2 \right] \end{aligned} \tag{13} Eεˉt−1​,εt​∼N(0,I)​[∣∣εt​−ϵθ​(αˉt​x0​+αt​βˉ​t−1​εˉt−1​+βt​εt​,t)∣∣2]=Ew,ε∼N(0,I)​[∥∥∥∥​βˉ​t​βt​ε−αt​βˉ​t−1​w​−ϵθ​(αˉt​x0​+βˉ​t​ε,t)∥∥∥∥​2]​(13)

  • 现在损失函数关于 w w w只是二次的,所以我们可以展开然后将它的期望直接算出来:

∥ ⋅ ∥ 2 = ( β t β t ˉ ε ) 2 − 2 α t β ˉ t − 1 β t β t ˉ ε w + ( α t β ˉ t − 1 β t ˉ w ) 2 + 2 α t β ˉ t − 1 w β t ˉ ϵ θ − 2 β t ε β t ˉ ϵ θ + ϵ θ 2 (14) \|·\|^2=(\frac{\beta_t}{\bar{\beta_t}}\varepsilon)^2-\frac{2\alpha_t\bar{\beta}_{t-1}\beta_t}{\bar{\beta_t}}\varepsilon w+(\frac{\alpha_t\bar{\beta}_{t-1}}{\bar{\beta_t}}w)^2+\frac{2\alpha_t\bar{\beta}_{t-1}w}{\bar{\beta_t}}\epsilon_{\theta}-\frac{2\beta_t\varepsilon}{\bar{\beta_t}}\epsilon_{\theta}+\epsilon_{\theta}^2 \tag{14} ∥⋅∥2=(βt​ˉ​βt​​ε)2−βt​ˉ​2αt​βˉ​t−1​βt​​εw+(βt​ˉ​αt​βˉ​t−1​​w)2+βt​ˉ​2αt​βˉ​t−1​w​ϵθ​−βt​ˉ​2βt​ε​ϵθ​+ϵθ2​(14)

  • 结果是展开模长后,得到关于 w w w的常数项、一次项、二次项。
    • 常数项的积分直接积出来,一次项的积分为0(均值为0),二次项的积分得到一个与训练参数无关的常数。
  • 这里几个公式,可以对上面解释:
    • 对二次项的积分得到一个与训练参数无关的常数: E ( X 2 ) = D ( X ) + [ E ( X ) ] 2 E(X^2)=D(X)+[E(X)]^2 E(X2)=D(X)+[E(X)]2,可以求 w w w的二次项的期望,求出来是常数
    • 也可以用积分求对 ∫ x 2 f ( x ) d x \int x^2f(x)dx ∫x2f(x)dx详情见我之前的笔记
    • 一次项的积分为0:
    • E ( ε w ) = 0 E(\varepsilon w)=0 E(εw)=0之前证过了
  • ( 14 ) (14) (14)式化简得: ∥ ⋅ ∥ 2 = ( β t β t ˉ ε ) 2 − 2 β t ε β t ˉ ϵ θ + ϵ θ 2 + C (15) \|·\|^2=(\frac{\beta_t}{\bar{\beta_t}}\varepsilon)^2-\frac{2\beta_t\varepsilon}{\bar{\beta_t}}\epsilon_{\theta}+\epsilon_{\theta}^2+C \tag{15} ∥⋅∥2=(βt​ˉ​βt​​ε)2−βt​ˉ​2βt​ε​ϵθ​+ϵθ2​+C(15)
    • 其中 C C C为常数
  • 显然这是一个 ( a − b ) 2 (a-b)^2 (a−b)2公式,所以可以继续化简: ∥ ⋅ ∥ 2 = ( β t β t ˉ − ϵ θ ) 2 + C (16) \|·\|^2=(\frac{\beta_t}{\bar{\beta_t}}-\epsilon_{\theta})^2+C\tag{16} ∥⋅∥2=(βt​ˉ​βt​​−ϵθ​)2+C(16)
  • 继续将常数提取出来,简化: ( β t β ˉ t ) 2 E ε ∼ N ( 0 , I ) [ ∥ ε − β ˉ t β t ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 ] + C (17) (\frac{\beta_t}{\bar \beta_t})^2 \mathbb{E}_{\varepsilon \sim N(0,I)}\left[\left\|\varepsilon-\frac{\bar \beta_t}{\beta_t}\epsilon_{\theta(\bar\alpha_t x_0+\bar\beta_t\varepsilon ,t)}\right\|^2 \right]+C \tag{17} (βˉ​t​βt​​)2Eε∼N(0,I)​[∥∥∥∥​ε−βt​βˉ​t​​ϵθ(αˉt​x0​+βˉ​t​ε,t)​∥∥∥∥​2]+C(17)
  • 我们只关心有用的项,所以将常数和系数(权重)丢掉,最终我们得到了DDPM最终所用的损失函数: ∥ ε − β ˉ t β t ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) ∥ 2 (18) \left\|\varepsilon-\frac{\bar \beta_t}{\beta_t}\epsilon_{\theta(\bar\alpha_t x_0+\bar\beta_t\varepsilon ,t)}\right\|^2 \tag{18} ∥∥∥∥​ε−βt​βˉ​t​​ϵθ(αˉt​x0​+βˉ​t​ε,t)​∥∥∥∥​2(18)
    • 原论文中的 ϵ θ \epsilon_{\theta} ϵθ​就是这里的 β ˉ t β t ϵ θ \frac{\bar \beta_t}{\beta_t}\epsilon_{\theta} βt​βˉ​t​​ϵθ​
  • 以上就是整个训练过程

5.怎么生成的

  • 训练完之后,就可以从一个随机噪声 x T ∼ N ( 0 , I ) x_T\sim N(0,I) xT​∼N(0,I)出发执行 T T T步 ( 6 ) (6) (6)式 μ ( x t ) = 1 α t ( x t − β t ϵ θ ( x t , t ) ) \mu(x_t)=\frac{1}{\alpha_t}(x_t-\beta_t\epsilon_{\theta(x_t,t)}) μ(xt​)=αt​1​(xt​−βt​ϵθ(xt​,t)​): x t − 1 = 1 α t ( x t − β t ϵ θ ( x t , t ) ) (19) x_{t-1}=\frac{1}{\alpha_t}(x_t-\beta_t\epsilon_{\theta(x_t,t)}) \tag{19} xt−1​=αt​1​(xt​−βt​ϵθ(xt​,t)​)(19)
  • 这对应于自回归解码中的Greedy Search(贪心搜索),如果要进行随机采样,需要补噪声项: x t − 1 = 1 α t ( x t − β t ϵ θ ( x t , t ) ) + σ t z , z ∼ N ( 0 , I ) (20) x_{t-1}=\frac{1}{\alpha_t}(x_t-\beta_t\epsilon_{\theta(x_t,t)})+\sigma_tz,z\sim N(0,I) \tag{20} xt−1​=αt​1​(xt​−βt​ϵθ(xt​,t)​)+σt​z,z∼N(0,I)(20)
  • 一般的让 σ t = β t \sigma_t=\beta_t σt​=βt​,即正向和反向的方差保持同步。
  • 这个采样过程跟传统扩散模型的朗之万采样不一样的地方在于:DDPM的采样每次都从一个随机噪声出发,需要重复迭代T步来得到一个样本输出;朗之万采样则是从任意一个点出发,反复迭代无限步,理论上这个迭代无限步的过程中,就把所有数据样本都被生成过了。所以两者除了形式相似外,实质上是两个截然不同的模型。
  • 从这个生成过程中,我们也可以感觉到它其实跟Seq2Seq的解码过程是一样的,都是串联式的自回归生成,所以生成速度是一个瓶颈,DDPM设了 T = 1000 T=1000 T=1000,意味着每生成一个图片,需要将 ϵ θ ( x t , t ) \epsilon_{\theta(x_t,t)} ϵθ(xt​,t)​反复执行 1000 1000 1000次,因此DDPM的一大缺点就是采样速度慢,后面会有提高DDPM的采样速度
  • 图片生成+自回归模型+很慢,但DDPM不一样,它通过“拆楼”的方式重新定义了一个自回归方向,而对于所有的像素来说则都是平权的、无偏的,所以减少了Inductive Bias的影响,从而提升了效果。
  • 此外,DDPM生成的迭代步数是固定的 T T T

6.超参的设置

  • 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​=1−T0.02t​ ​

  • 这是一个单调递减的函数,那为什么要选择单调递减的 α t \alpha_t αt​呢?

  • 其实这两个问题有着相近的答案,跟具体的数据背景有关。简单起见,在重构(建楼)的时候我们用了欧氏距离 ∣ ∣ x t − 1 − μ ( x t ) ∣ ∣ 2 ||x_{t-1}-\mu(x_t)||^2 ∣∣xt−1​−μ(xt​)∣∣2作为损失函数,而一般DDPM做图片生成,欧氏距离并不好(在VAE中就是欧氏距离来重构,往往得到模糊的结果,除非输入输出的两张图片非常接近才能得到比较清晰的结果),所以选择尽可能大的 T T T(这样 α t \alpha_t αt​减少的慢),正是为了使得输入输出尽可能相近,减少欧氏距离带来的模糊问题。

  • 选择单调递减的 α t \alpha_t αt​也有类似的考虑,当 t t t比较小时, x t x_t xt​还比较接近真实图片,所以我们要缩小 x t − 1 x_{t-1} xt−1​和 x t x_t xt​的差距,以便更适用欧氏距离 ∥ x t − 1 − μ ( x t ) ∥ 2 \|x_{t-1}-\mu(x_t)\|^2 ∥xt−1​−μ(xt​)∥2,因此要用较大的 α t \alpha_t αt​;当 t t t比较大时, x t x_t xt​已经比较接近纯噪声了,噪声用欧式距离无妨,所以可以稍微增大 x t − 1 x_{t−1} xt−1​与 x t x_t xt​的差距,即可以用较小的 α t \alpha_t αt​。

  • 那么可不可以一直用较大的 α t \alpha_t αt​呢?

  • 可以是可以,但是要增大 T T T。注意在 ( 4 ) (4) (4)式时,我们说过应该有 α ˉ T ≈ 0 \bar\alpha_T≈0 αˉT​≈0,而我们可以直接估算 log ⁡ α ˉ T = ∑ t = 1 T log ⁡ α t = 1 2 ∑ t = 1 T log ⁡ ( 1 − 0.02 t T ) < 1 2 ∑ t = 1 T ( 1 − 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(1-\frac{0.02t}{T}\right)=-0.005(T+1) logαˉT​=t=1∑T​logαt​=21​t=1∑T​log(1−T0.02t​)<21​t=1∑T​(1−T0.02t​)=−0.005(T+1)

    • 这里用到高数中最简单的放缩( l n x < x lnx<x lnx<x)
  • 代入 T = 1000 T=1000 T=1000大致是 α ˉ T ≈ e − 5 \bar\alpha_T ≈ e^{-5} αˉT​≈e−5,这个其实就刚好达到 ≈ 0 ≈0 ≈0的标准。

  • 所以从头到尾都用较大的 α t \alpha_t αt​,那么必然要更大得到 T T T才能使得 α ˉ T ≈ 0 \bar\alpha_T ≈ 0 αˉT​≈0

  • 建楼模型里 ϵ θ ( α ˉ t x 0 + β ˉ t ε , t ) \epsilon_{\theta(\bar\alpha_t x_0+\bar\beta_t\varepsilon ,t)} ϵθ(αˉt​x0​+βˉ​t​ε,t)​中,我们在输入显式地写出了 t t t,这是因为原则上不同的t处理的是不同层次的对象,所以应该用不同的重构模型,即应该有 T T T个不同的重构模型才对,于是我们共享了所有重构模型的参数,将t作为条件传入, t t t是转换成(通过Transformer)位置编码后,直接加到残差模块上去的。