扩散模型DDPM的解读

DDPM

  • 写在前面
  • 1.将生成模型类比为建楼和拆楼
    • 1.1 类比
    • 1.2 换种思路:先拆楼
    • 1.3 建楼的难点
  • 2. 回到拆楼,怎么拆楼?
    • 2.1 拆楼的过程
  • 3.现在开始建楼,怎么建楼?
    • 3.1 楼的形式?
  • 4.还有什么问题?方差可能会太大
    • 4.1 为什么会有方差大的风险?
    • 4.2 想方设法让随机变量变少点
  • 5.怎么生成的
  • 6.超参的设置

写在前面

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

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=x0x1x2...xT1xT=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 xt1xt( t − 1 t-1 t1步到 t t t步时)代表着拆楼的一步
  • 反过来 x t → x t − 1 x_{t}\rightarrow x_{t-1} xtxt1就是建楼的一步
  • 如果能学会两者之间的变换关系 x t − 1 = μ ( x t ) x_{t-1}=\mu(x_t) xt1=μ(xt)这里是建楼 x t → x t − 1 x_{t}\rightarrow x_{t-1} xtxt1),那么 z = x T z=x_T z=xT开始反复执行 x T − 1 = μ ( x T ) x_{T-1}=\mu(x_T) xT1=μ(xT) x T − 2 = μ ( x T − 1 ) x_{T-2}=\mu(x_{T-1}) xT2=μ(xT1) . . . ... ...最终就将高楼大厦造出来了 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=αtxt1+βtεt,(εtN(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} xt1拆分成 α t x t − 1 \alpha_tx_{t-1} αtxt1楼体+ β 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=αtxt1+βtεt=αt(αt1xt2+βt1εt1)==(αtα1)x0+(αtα2)β1ε1+(αtα3)β2ε2++αtβt1εt1+β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βt1εt1+β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ε1N(0,(αtα2)2β12I)
      • 所以都是均值为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βt12,β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βt12+β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,εˉtN(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 xt1xt的过程,这个过程,我们会得到很多数据对 ( x t − 1 , x t ) (x_{t-1},x_t) (xt1,xt)
  • 现在反过来,建楼就是从这些数据对中学习一个 x t − 1 ← x t x_{t-1}\leftarrow x_t xt1xt的模型
  • 该模型 x ^ t − 1 = μ ( x t ) \hat x_{t-1}=\mu(x_t) x^t1=μ(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} xt1x^t12=xt1μ(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=αtxt1+βtεt可以移项得到为 x t − 1 = 1 α t ( x t − β t ε t ) x_{t-1}=\frac{1}{\alpha_t}(x_t-\beta_t\varepsilon_t) xt1=αt1(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)=αt1(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} xt1μ(xt)2=xt1αt1(xtβtϵθ(xt,t))2=xt1αtxt+αtβtϵθ(xt,t)2=xt1αtαtxt1+β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} xt1表示为: 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=αtxt1+βtεt=αt(αˉt1x0+βˉt1εˉt1)+βtεt=αˉtx0+αtβˉt1εˉt1+βtεt(8)

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

  • 最重要的是 ε ˉ t \bar\varepsilon_t εˉt是由 ε 1 , . . . , ε t − 1 \varepsilon_1,...,\varepsilon_{t-1} ε1,...,εt1叠加的,和 ε 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ϵθ(αˉtx0+αtβˉt1εˉt1+β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} εˉt1 ε t \varepsilon_t εt
    • 3. 1 ∼ T 1\sim T 1T中采样一个 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βˉt1εˉt1+β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βˉt1 β 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εˉt1αtβˉt1εt,经过简单的计算得出 β ˉ t w ∣ w ∼ N ( 0 , I ) \bar\beta_t w|{w \sim N(0,I)} βˉtwwN(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βˉt1εˉt1+βtεt=βˉtεβtεˉt1αtβˉt1ε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βˉt1 ( 4 ) (4) (4)
    • ( 4 ) − ( 3 ) (4)-(3) (4)(3),就是为了将 ε ˉ t − 1 \bar\varepsilon_{t-1} εˉt1消掉: β 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βˉt12εt=βˉtβtεβˉtαtβˉt1w(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βˉt12βˉtβtεβˉtαtβˉt1w=βt2+αt2βˉt12(βtεαtβˉt1w)βˉt=βˉtβtεαtβˉt1w(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ϵθ(αˉtx0+αtβˉt1εˉt1+β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βˉt1εˉt1+β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εˉt1,εtN(0,I)[εtϵθ(αˉtx0+αtβˉt1εˉt1+βtεt,t)2]=Ew,εN(0,I)[βˉtβtεαtβˉt1wϵθ(αˉtx0+βˉ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βˉt1βtεw+(βtˉαtβˉt1w)2+βtˉ2αtβˉt1wϵθβ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 (ab)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ϵθ(αˉtx0+βˉ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ϵθ(αˉtx0+βˉ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) xTN(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)=αt1(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} xt1=αt1(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} xt1=αt1(xtβtϵθ(xt,t))+σtz,zN(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=1T0.02t

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

  • 其实这两个问题有着相近的答案,跟具体的数据背景有关。简单起见,在重构(建楼)的时候我们用了欧氏距离 ∣ ∣ x t − 1 − μ ( x t ) ∣ ∣ 2 ||x_{t-1}-\mu(x_t)||^2 xt1μ(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} xt1 x t x_t xt的差距,以便更适用欧氏距离 ∥ x t − 1 − μ ( x t ) ∥ 2 \|x_{t-1}-\mu(x_t)\|^2 xt1μ(xt)2,因此要用较大的 α t \alpha_t αt;当 t t t比较大时, x t x_t xt已经比较接近纯噪声了,噪声用欧式距离无妨,所以可以稍微增大 x t − 1 x_{t−1} xt1 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 αˉT0,而我们可以直接估算 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=1Tlogαt=21t=1Tlog(1T0.02t)<21t=1T(1T0.02t)=0.005(T+1)

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

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

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

你可能感兴趣的:(人工智能,算法,python)