跳至主要內容

扩散模型(Diffusion model)

原创Xenny约 1194 字大约 5 分钟深度学习深度学习无监督学习扩散模型

扩散模型(Diffusion model)

  • GAN的本质是将生成器的分布逼近真实分布。VAE则是训练两个分布q,pq, p分别表示从真实数据到噪声和噪声到生成数据的映射。

    扩散模型和VAE类似,也是一套从真实数据到噪声的分布以及噪声到生成数据的分布,但是在扩散模型中将这个过程分成了TT步。

    四种生成方式
    四种生成方式

    扩散模型包含两个部分:扩散和和逆扩散过程。

扩散

  • 在这个过程中,原始图像x0\mathbf{x}_0会被添加TT次噪声,使得xTx_T符合标准正态分布。

    但是这里的加噪声不是直接在上一张图片上“增加”(即修改数值)噪声值,而是定义一个均值和上一步图像有关的正态分布,再从该分布中采样得到下一张图像。即

    xtN(μt(xt1),σt2I)(1) \mathbf{x}_t \sim \mathcal{N}(\mu_t(\mathbf{x}_{t-1}), \sigma_t^2\mathbf{I})\tag{1}

    大部分的扩散模型将这个正态分布设置为

    xtN(1βtxt1,βtI)(2) \mathbf{x}_t \sim \mathcal{N}(\sqrt{1-\beta_t}\mathbf{x}_{t-1}, \beta_t\mathbf{I})\tag{2}

    其中βt<1\beta_t < 1,且{β}i=1T\{\beta\}_{i=1}^T一般为一个递增序列,目的是为了随着tt的增加,xt\mathbf{x}_t越来越接近纯噪声N(0,I)\mathcal{N}(0,\mathbf{I})。 同时我们可以推导得到通项公式使得能够从x0\mathbf{x}_0直接计算xt\mathbf{x}_t

    ϵt1\epsilon_{t-1}为标准正态分布,有xt=1βtxt1+βtϵt1\mathbf{x}_t = \sqrt{1-\beta_t}\mathbf{x}_{t-1} + \sqrt{\beta_t}\epsilon_{t-1},则

    xt=1βtxt1+βtϵt1=1βt(1βt1xt2+βt1ϵt2)+βtϵt1=(1βt)(1βt1)xt2+(1βt)βt1ϵt2+βtϵt1=(1βt)(1βt1)xt2+1(1βt)(1βt1)ϵ(3) \begin{aligned} \mathbf{x}_t &= \sqrt{1-\beta_t}\mathbf{x}_{t-1} + \sqrt{\beta_t}\epsilon_{t-1} \\ &= \sqrt{1-\beta_t}(\sqrt{1-\beta_{t-1}}\mathbf{x}_{t-2} + \sqrt{\beta_{t-1}}\epsilon_{t-2}) + \sqrt{\beta_t}\epsilon_{t-1} \\ &= \sqrt{(1-\beta_t)(1-\beta_{t-1})}\mathbf{x}_{t-2} + \sqrt{(1-\beta_t)\beta_{t-1}}\epsilon_{t-2} + \sqrt{\beta_t}\epsilon_{t-1}\\ &= \sqrt{(1-\beta_t)(1-\beta_{t-1})}\mathbf{x}_{t-2} + \sqrt{1-(1-\beta_t)(1-\beta_{t-1})}\epsilon \end{aligned}\tag{3}

    αt=1βt,αtˉ=i=1tαi\alpha_t = 1-\beta_t, \bar{\alpha_t} = \prod_{i=1}^t{\alpha_i},我们最终可以得到通项公式

    xt=αtˉx0+1αtˉϵ(4) \mathbf{x}_t = \sqrt{\bar{\alpha_t}}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha_t}}\epsilon\tag{4}

逆扩散

  • 逆扩散便是使用神经网络学习每一步的噪声分布,我们希望能够得到每一次加噪声的逆操作,这样便可以实现从噪声中生成一张接近真实分布的图像。

    βt\beta_t足够小(还没看是多足够)时,每一步的去噪声也满足正态分布,即我们可以从一个正态分布中的得到上一步的图像。

    xt1N(μ~t,β~tI)(5) \mathbf{x}_{t-1} \sim \mathcal{N}(\tilde{\mu}_t, \tilde{\beta}_t\mathbf{I})\tag{5}

    其中,μ~t,β~t\tilde{\mu}_t,\tilde{\beta}_t由步骤tt,和xt\mathbf{x}_t决定。

计算

  • 当我们已知x0\mathbf{x}_0时,每个步骤的方差β~t\tilde{\beta}_t可由贝叶斯公式直接计算。

    令第tt步的加噪分布为q(xtxt1)q(\mathbf{x_t}|\mathbf{x}_{t-1}),由贝叶斯公式有

    q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)(6) q(\mathbf{x}_{t-1}|\mathbf{x}_t,\mathbf{x}_0) = q(\mathbf{x_t}|\mathbf{x}_{t-1},\mathbf{x}_0)\frac{q(\mathbf{x_{t-1}}|\mathbf{x}_0)}{q(\mathbf{x_t}|\mathbf{x}_0)}\tag{6}

    联立式 (4), (6),可得

    β~t=1αˉt11αˉtβtμ~t=1αt(xt1αt1αˉtϵt)(7) \begin{aligned} \tilde{\beta}_t &= \frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\cdot \beta_t\\ \tilde{\mu}_t &= \frac{1}{\sqrt{\alpha_t}}(\mathbf{x}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_t) \end{aligned}\tag{7}

    此时我们可以发现,只有ϵt\epsilon_t为未知量,所以对于神经网络只需拟合噪声ϵθ(xt,t)\epsilon_{\theta}(\mathbf{x}_t,t)

损失函数

  • 对于一轮训练,损失函数即为拟合的噪声与真实噪声的差值

    L=ϵtϵθ(xt,t)2(8) \mathcal{L} = \lVert \epsilon_t - \epsilon_\theta(\mathbf{x}_t, t)\rVert ^2 \tag{8}

总结

  1. 本质上还是训练一个接近真实分布的分布。

  2. 实际写代码训练时,每个epoch随机选取一个TT,扩散到第TT步得到xT\mathbf{x}_T再逆扩撒得到x0\mathbf{x}_0

    扩散可以通过预计算α\alpha的方式直接一步到位,逆扩散需要每步单独进行,所以扩散模型训练时间较慢。

  3. 和其他生成模型一样,扩散模型本身是一种方法,并不关心具体神经网络,可以在具体任务中设计更适合的网络架构。