每当机器学习(ML)领域出现进展或哪怕是最轻微的转变,巨大的炒作就会随之而来。当涉及到人工智能时,这种热潮最终总是不成比例地增长,疯狂的说法总是随之而来。你可能已经注意到了这一点,最近越来越多的人开始使用Midjourney、ChatGPT、Copilot等等。
然而,这些系统的真相总是更加平淡无奇。机器学习是数学,而ML模型的真正意义并不像一些博主想让你相信的那样深远。它们可能是有益的,在某些情况下,可以改变特定领域的大部分工作流程,但前提是用户,无论是组织还是个人,对其内部运作、限制、能力和潜力有足够的了解。
本文希望能阐明一些扩散模型的工作原理,如非常流行的Midjourney、DALL-E 2和Stable Diffusion,特别是它们的训练方法。这篇文章包括数学表达式,但也以一种易懂的方式描述了每个变量所代表的内容。
正向扩散
所有的扩散模型,包括Midjourney(尽管我们还没有一篇描述它的论文),都是多元素的神经网络,从随机性中创造图像。最初,它们被训练成逐渐将图片变成噪音。这种方法建立了一个由时间段组成的马尔可夫链*,在这个过程中,图片经过一系列的转换,从t=0时的初始纯净状态演变为t=T时的完全噪音,这是最后一步。
*马尔可夫链是一个变量序列,其中一个变量的状态只取决于前一个变量的状态。
时间步数可以从几百到一千或更多,每一步要应用的噪声水平必须预先确定;这被称为噪声时间表。在数学上,这种噪声或前向扩散过程表示为:
q(xt|xt-1) = N(xt; √(1-βt) xt-1, βtI)
q(x0)是我们的真实分布,q(xt∣xt-1)是前向扩散过程,其中xt总是以xt-1为条件。符号N 代表高斯或正态分布,它由均值μ和方差σ^2定义。在这种情况下,平均值由√(1-βt)xt-1表示,其中βt是我们的方差。噪声在每一步从正态分布中取样ϵ∼N**(0,I)**,方差表是预先确定的。
更简单地说,我们在当前步骤上有一个正态分布,其中平均值由√(1-βt)乘以前一步的图像xt-1表示。除了这种重新缩放,我们还在每次迭代时向图像添加少量的噪声βtI。把β想象成一个微小的正标度值,例如0.001,它是故意小的。
所以,这就是在每个时间步长所做的事情。但是,我们也可以为所有将在xt**, x2, x3, ..., xT**序列中产生的样本定义一个联合分布。它将看起来像这样:
q(x1:T|x0) = ∏t=1:T q(xt|xt-1)
正如你所看到的,这个联合分布由条件分布q(xt|xt-1)的乘积∏表示,在时间步数1到T创建,然后给定初始图像x0。
好的,但是我们可以跳过链中的环节,生成任何xt而不经过前面的所有步骤吗?
是的,我们可以。
这是可能的,因为我们使用一个简单的高斯核来扩散数据。为了做到这一点,我们计算标量值αt,它等于1-βt,我们将变量ᾱt定义为αs从t1到t的积。它们可以通过重新参数化来学习,也可以作为超参数保持不变,但它们总是被设计成在最后一步T上使ᾱt接近0。这确保了扩散数据具有正态分布,这对反向生成过程至关重要。
在我们有了内核之后,我们可以直接对任何xt进行采样,因为:
xt = √ᾱt x0 + √(1 - ᾱt**)ε,其中ε** (噪声)是由均值为0的正态分布和身份协方差矩阵I得出。
通俗地说,如果我们需要xt,它代表我们马尔科夫链中的一个随机步骤,考虑到x0、ᾱt和噪声项ε是可用的,我们可以顺利地生成它。
生成过程
现在让我们深入研究反向过程,即模型生成新样本的过程。首先要明白的是,我们不能直接计算去噪分布q(xt-1|xt),因为这需要知道数据集中所有图像的分布。不过,我们可以用贝叶斯法则来说明,这个分布与边际数据分布q(xt-1)和我们在步骤t 的扩散核的乘积成正比**--** q(xt|xt-1):
q(xt-1|xt) ∝q(xt-1) q(xt|xt-1)
但是,乘积和分布仍将是难以解决的。因此,我们需要做的是对条件概率分布进行近似。幸运的是,我们可以通过使用正态分布来做到这一点,因为在前进过程中,噪声注入βt很小。
我们可以将条件概率分布的近似表示为pθ(xt-1∣xt),其中θ 是模型的参数,通过梯度下降迭代优化。
当我们记得我们的马尔科夫链的末端是一个正态分布时,我们可以假设后向过程也将是高斯的。因此,它必须由均值μθ和方差Σθ进行参数化,我们的神经网络将不得不计算这些参数。
这就是过程参数化:Pθ(xt-1∣xt)=N(xt-1;μθ(xt,t),Σθ(xt,t))
在最初的论文《去噪扩散概率模型》中,研究人员发现,就样本质量而言,固定方差Σθ**(xt,t)=σ2tI是一个最佳选择。特别是,他们发现将方差固定为β** 与固定为βt的结果大致相同,因为当我们在过程中增加扩散步骤时,β 和βt 仍然彼此接近,因此,决定分布的实际上是平均值,而不是方差。
注意:在稍后发表的论文《改进的去噪扩散概率模型》中,研究人员也对方差进行了参数化。这有助于提高对数似然率,但并没有提高采样效率。
那么,我们如何确定推导平均值的目标函数呢?
由于q和pθ可以被看作是一个变异自动编码器,一个通过将数据编码到一个潜在空间*,然后再返回到输入空间来逼近数据分布的模型,我们可以使用变异上界(ELBO)目标函数来训练它。它最小化了关于x0的负对数似然。这里,变异下限是每个时间步长的损失之和,损失的每项是两个高斯分布之间的KL分歧**。
*Latent空间是一个压缩的空间,在这个空间中,输入特征由独立的维度表示;它帮助模型容易找到数据对象之间的模式和相似性。
**KL发散是对两个分布之间距离的一种测量。它基本上告诉你,如果你用一个模型分布来近似目标分布,你会损失多少信息。
正如你所记得的,我们可以在任何以x0为条件的噪声水平下对xt 进行采样。由于q(xt|x0)=N(xt;√(α̅t)x0, (1-α̅t)I),我们能够向x0添加和扩展噪声,以获得任何xt。此外,由于 α̅t是βt的函数,即预定的方差,我们可以在训练过程中轻松优化损失函数L 的随机项。
这个属性的另一个重要好处是,我们可以把我们的网络变成一个噪声预测器,而不是一个平均预测器。具体来说,可以对均值进行重新参数化,使模型在步骤t时使用KL发散项中的εθ**(xt, t)**来近似添加噪声。比如:
μθ(xt,t)=(1/√αt)(xt-(βt/√(1-α¯t))εθ(xt,t))。
最后,我们得出目标损失函数Lt的这个方程(在一个随机的时间步长,鉴于噪声是从随机分布N(0,I)中采样的):
||ε - εθ(xt, t)||^2 = ||ε - εθ(√α¯t x0 + √(1-α¯t)ε, t)||^2
其中x0是未被破坏的图像,ϵ是在时间t取样的纯噪声,εθ**(xt, t)是通过我们的神经网络传递近似值xt得到的预测噪声,它是由θ**参数化的。
该网络通过预测和真实噪声之间的平均平方误差进行优化。通过最小化真实和预测误差之间的距离,我们教导模型逐步做出更准确的近似。
因此,综上所述,这里有一连串的训练步骤,使我们的模型,如Midhjourney和稳定扩散,能够从纯噪音中生成图像。
来自原始论文。