51-33 LDM 潜在扩散模型论文精读 + DDPM 扩散模型代码实现

High-Resolution Image Synthesis with Latent Diffusion Models,LDM 论文是继 VAE、DDPM、DDIM 后,性能较好的工作,于 2022 年 3 月公布。具体说来,以前的扩散模型 DM 是基于原始像素级别的,Latent Diffusion Models ,LDMs 是两阶段 Two-Stage 模型。即先对图片进行压缩,将图片表示为压缩的潜像空间(Latent Space,而不是原始像素空间),减少计算复杂度,然后输入扩散模型。LDM 模型在主干网络 UNet 中引入 Cross-Attention,可以输入多模态,实现灵活的图片生成控制。

Preliminary work

要复现扩散模型相关论文,公式推理工作量比较大,有时特别气馁。贝叶斯、马尔可夫链、朗之万-蒙特卡洛抽样、KL 散度、重参数化等基础知识经常用到。

图 1.1,GAN、VAE、Flow-Base、DM 等几种主流生成模型架构示意图

图 1.2,AutoEncoder, AE 自编码器模型。Autoencoder 包括 encoder 和 decoder 两部分。encoder 把高维的输入空间(input space) x 变换到低维的隐空间(latent space) Z 中。decoder 把低维的隐空间 z 变换到原来的高维的输入空间 x 中。

图 1.3,Variational AutoEncoder, VAE 变分自编码器模型。encoder 不再直接输出隐向量 z,而是输出隐向量 z 的分布:均值 μ 与标准差 σ,再从这个分布中采样得到隐向量 z。AE 模型将输入 encoder 变成隐空间里单个点,而 VAE 则是将输入 encoder 变成隐空间里的分布(distribution)。

图 1.4,Vector Quantized-Variational AutoEncoder,VQ-VAE 向量化变分自编码器模型。输入向量经过 encoder 得到 ,然后在 Codebook,也就是 VQ-VAE 学习的离散 Discrete 隐空间中,寻找与 最接近的隐向量 ,将这个隐向量 作为 输入 decoder。

图 1.5,Denoising Diffusion Probabilistic Models,DDPM 去噪扩散概率模型,论文作者简称为扩散模型。DDPM 前向加高斯噪声、反向去掉高斯噪声过程示意图如上。

**扩散模型 DDPM 这篇论文复现工程比较耗时,找了一堆包括公式推导文档,然不得要领。建议大家除了看原论文外,多看几遍本文末尾引用的第 1、2 两篇内容。通过这,相信大家可以节省很多时间,学到可以一些工程技术。**复现效果如下:

图 1.6,原始数据添加噪声,正向扩散过程示意图

图 1.7,逆向去噪过程示意图

复现代码如下:(感恩原文作者的奉献精神,真不容易!!!)

#1、原始数据分布

python 复制代码
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_s_curve
import torch

s_curve,_ = make_s_curve(10**4,noise=0.1)
s_curve = s_curve[:,[0,2]]/10.0

print("shape of s:",np.shape(s_curve))

data = s_curve.T

fig,ax = plt.subplots()
ax.scatter(*data,color='blue',edgecolor='white');

ax.axis('off')

dataset = torch.Tensor(s_curve).float()

#2、确定超参数的值

python 复制代码
num_steps = 100

#制定每一步的beta
betas = torch.linspace(-6,6,num_steps)
betas = torch.sigmoid(betas)*(0.5e-2 - 1e-5)+1e-5

#计算alpha、alpha_prod、alpha_prod_previous、alpha_bar_sqrt等变量的值
alphas = 1-betas
alphas_prod = torch.cumprod(alphas,0)
alphas_prod_p = torch.cat([torch.tensor([1]).float(),alphas_prod[:-1]],0)
alphas_bar_sqrt = torch.sqrt(alphas_prod)
one_minus_alphas_bar_log = torch.log(1 - alphas_prod)
one_minus_alphas_bar_sqrt = torch.sqrt(1 - alphas_prod)

assert alphas.shape==alphas_prod.shape==alphas_prod_p.shape==\
alphas_bar_sqrt.shape==one_minus_alphas_bar_log.shape\
==one_minus_alphas_bar_sqrt.shape
print("all the same shape",betas.shape)

#3、扩散过程任意时刻采样

python 复制代码
#计算任意时刻的x采样值,基于x_0和重参数化
def q_x(x_0,t):
    """可以基于x[0]得到任意时刻t的x[t]"""
    noise = torch.randn_like(x_0)
    alphas_t = alphas_bar_sqrt[t]
    alphas_1_m_t = one_minus_alphas_bar_sqrt[t]
    return (alphas_t * x_0 + alphas_1_m_t * noise) #在x[0]的基础上添加噪声
    

#4、正向扩散过程

python 复制代码
num_shows = 20
fig,axs = plt.subplots(2,10,figsize=(28,3))
plt.rc('text',color='black')

#共有10000个点,每个点包含两个坐标
#生成100步以内每隔5步加噪声后的图像
for i in range(num_shows):
    j = i//10
    k = i%10
    q_i = q_x(dataset,torch.tensor([i*num_steps//num_shows]))#生成t时刻的采样数据
    axs[j,k].scatter(q_i[:,0],q_i[:,1],color='red',edgecolor='white')
    axs[j,k].set_axis_off()
    axs[j,k].set_title('$q(\mathbf{x}_{'+str(i*num_steps//num_shows)+'})$')

#5、逆扩散过程

python 复制代码
import torch
import torch.nn as nn

class MLPDiffusion(nn.Module):
    def __init__(self,n_steps,num_units=128):
        super(MLPDiffusion,self).__init__()
        
        self.linears = nn.ModuleList(
            [
                nn.Linear(2,num_units),
                nn.ReLU(),
                nn.Linear(num_units,num_units),
                nn.ReLU(),
                nn.Linear(num_units,num_units),
                nn.ReLU(),
                nn.Linear(num_units,2),
            ]
        )
        self.step_embeddings = nn.ModuleList(
            [
                nn.Embedding(n_steps,num_units),
                nn.Embedding(n_steps,num_units),
                nn.Embedding(n_steps,num_units),
            ]
        )
    def forward(self,x,t):
#         x = x_0
        for idx,embedding_layer in enumerate(self.step_embeddings):
            t_embedding = embedding_layer(t)
            x = self.linears[2*idx](x)
            x += t_embedding
            x = self.linears[2*idx+1](x)
            
        x = self.linears[-1](x)
        
        return x

#6、训练误差函数

python 复制代码
def diffusion_loss_fn(model,x_0,alphas_bar_sqrt,one_minus_alphas_bar_sqrt,n_steps):
    """对任意时刻t进行采样计算loss"""
    batch_size = x_0.shape[0]
    
    #对一个batchsize样本生成随机的时刻t
    t = torch.randint(0,n_steps,size=(batch_size//2,))
    t = torch.cat([t,n_steps-1-t],dim=0)
    t = t.unsqueeze(-1)
    
    #x0的系数
    a = alphas_bar_sqrt[t]
    
    #eps的系数
    aml = one_minus_alphas_bar_sqrt[t]
    
    #生成随机噪音eps
    e = torch.randn_like(x_0)
    
    #构造模型的输入
    x = x_0*a+e*aml
    
    #送入模型,得到t时刻的随机噪声预测值
    output = model(x,t.squeeze(-1))
    
    #与真实噪声一起计算误差,求平均值
    return (e - output).square().mean()

#7、逆扩散采样函数

python 复制代码
def p_sample_loop(model,shape,n_steps,betas,one_minus_alphas_bar_sqrt):
    """从x[T]恢复x[T-1]、x[T-2]|...x[0]"""
    cur_x = torch.randn(shape)
    x_seq = [cur_x]
    for i in reversed(range(n_steps)):
        cur_x = p_sample(model,cur_x,i,betas,one_minus_alphas_bar_sqrt)
        x_seq.append(cur_x)
    return x_seq

def p_sample(model,x,t,betas,one_minus_alphas_bar_sqrt):
    """从x[T]采样t时刻的重构值"""
    t = torch.tensor([t])
    
    coeff = betas[t] / one_minus_alphas_bar_sqrt[t]
    
    eps_theta = model(x,t)
    
    mean = (1/(1-betas[t]).sqrt())*(x-(coeff*eps_theta))
    
    z = torch.randn_like(x)
    sigma_t = betas[t].sqrt()
    
    sample = mean + sigma_t * z
    
    return (sample)

#8、与训练,打印损失 loss及中间重构效果

python 复制代码
seed = 1234

class EMA():
    """构建一个参数平滑器"""
    def __init__(self,mu=0.01):
        self.mu = mu
        self.shadow = {}
        
    def register(self,name,val):
        self.shadow[name] = val.clone()
        
    def __call__(self,name,x):
        assert name in self.shadow
        new_average = self.mu * x + (1.0-self.mu)*self.shadow[name]
        self.shadow[name] = new_average.clone()
        return new_average
    
print('Training model...')
batch_size = 128
dataloader = torch.utils.data.DataLoader(dataset,batch_size=batch_size,shuffle=True)
num_epoch = 4000
plt.rc('text',color='blue')

model = MLPDiffusion(num_steps)#输出维度是2,输入是x和step
optimizer = torch.optim.Adam(model.parameters(),lr=1e-3)

for t in range(num_epoch):
    for idx,batch_x in enumerate(dataloader):
        loss = diffusion_loss_fn(model,batch_x,alphas_bar_sqrt,one_minus_alphas_bar_sqrt,num_steps)
        optimizer.zero_grad()
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(),1.)
        optimizer.step()
        
    if(t%100==0):
        print(loss)
        x_seq = p_sample_loop(model,dataset.shape,num_steps,betas,one_minus_alphas_bar_sqrt)
        
        fig,axs = plt.subplots(1,10,figsize=(28,3))
        for i in range(1,11):
            cur_x = x_seq[i*10].detach()
            axs[i-1].scatter(cur_x[:,0],cur_x[:,1],color='red',edgecolor='white');
            axs[i-1].set_axis_off();
            axs[i-1].set_title('$q(\mathbf{x}_{'+str(i*10)+'})$')

#9、演示扩散过程和逆扩散过程

python 复制代码
import io
from PIL import Image

imgs = []
for i in range(100):
    plt.clf()
    q_i = q_x(dataset,torch.tensor([i]))
    plt.scatter(q_i[:,0],q_i[:,1],color='red',edgecolor='white',s=5);
    plt.axis('off');
    
    img_buf = io.BytesIO()
    plt.savefig(img_buf,format='png')
    img = Image.open(img_buf)
    imgs.append(img)

#10、输出生成图片

python 复制代码
reverse = []
for i in range(100):
    plt.clf()
    cur_x = x_seq[i].detach()
    plt.scatter(cur_x[:,0],cur_x[:,1],color='red',edgecolor='white',s=5);
    plt.axis('off')
    
    img_buf = io.BytesIO()
    plt.savefig(img_buf,format='png')
    img = Image.open(img_buf)
    reverse.append(img)

DDPM 模型把扩散模型带入了一个新高度,即扩散模型可以 Work 了,属于此领域的开山之作。但是训练和推理时间还是蛮长,潜在扩散模型 LDM 便应运而生。本文由深圳季连科技有限公司AIgraphX自动驾驶大模型团队编辑。如有错误,欢迎在评论区指正。

Abstract

通过将图像形成过程分解为去噪自动编码器的序列应用,扩散模型(Diffusion models,DM) 在图像数据及其他方面实现了最先进的合成结果。此外,它们的方法允许一种引导机制来控制图像生成过程,而无需重新训练。然而,由于这些模型通常直接在像素空间中操作 ,因此优化功能强大的DM 通常会消耗数百个 GPU 天,并且由于序列评估,推理成本高昂。**为了能够在有限的计算资源上进行DM训练,同时保持质量和灵活性,我们应用了强大预训练自动编码器潜在空间。**与之前工作相比,在这种表示上训练扩散模型,首次能够在降低复杂性和保留图像细节之间达到最佳点,极大地提高了视觉逼真度。通过在模型结构中引入跨注意力层,我们将扩散模型变成强大而灵活的生成器。可用文本或边界框等作为条件输入,并以卷积方式实现高分辨率合成。我们的潜在扩散模型(LDM)在图像修复和类条件图像合成方面获得了最先进的分数,并在各种任务上具有高度竞争力的性能,包括文本到图像合成、无条件图像生成和超分辨率,同时与基于像素的 DM 相比,显著降低了计算要求。

图 1.8,较少下采样实现高质量图像生成。由于扩散模型对空间数据提供了良好的归纳偏差,我们不需要在潜在空间中对相关生成模型进行大量的空间降采样,但仍然可以通过合适的自编码模型大大降低数据维数。我们用 f 表示空间下采样因子。

1. Introduction

图像合成是计算机视觉领域最近发展最引人注目,也是计算需求最大的领域之一。特别是在复杂自然场景高分辨率合成,目前主要由基于似然的模型主导,这可能在自回归 (AR) transformer 模型中包含数十亿参数。相比之下,GAN 有希望的结果已被证明主要局限于可变性相对有限数据,因为对抗性学习过程不容易扩展到对复杂多模态分布进行建模。最近,基于去噪自编码器层次结构构建的扩散模型 DM 在图像合成及以上方面取得了令人印象深刻的结果,并定义了类条件图像合成和超分辨率的最好技术。此外,与其他类型的生成模型相比,即使是无条件的 DM 也可以很容易地应用于诸如修复和着色或基于笔画合成等任务。作为基于似然的模型,它们不像 GAN 那样表现出模式崩溃和训练不稳定性,并且通过大量利用参数共享,它们可以对自然图像高度复杂分布进行建模,而无需像 AR 模型中那样涉及数十亿参数。

**Democratizing High-Resolution Image Synthesis.**DM 属于基于似然性的模型,其模式覆盖行为使它们倾向于花费过多的容量来建模难以察觉的数据细节。尽管重新加权的变分目标旨在通过对初始去噪步骤进行欠采样来解决这个问题,但 DM 在计算上仍然要求很高,因为训练和评估这样的模型需要在 RGB 图像的高维空间中重复函数评估(和梯度计算)。尽管重新加权的变分目标(如DDPM)旨在通过对初始去噪步骤进行欠采样来解决这个问题,但DM 仍然需要计算,因为训练和评估这样的模型,需要在RGB图像高维空间中重复函数评估(和梯度计算)。例如,训练最强大的 DM 通常需要数百个 GPU 天,并且对输入空间噪声版本重复评估也会使推理昂贵。因此,在单个 A100 GPU 上生成 50k 个样本大约需要 5 天。这对研究界和用户通常有两个后果:首先,训练这样的模型需要大量计算资源,只有一小部分领域可用,并留下巨大的碳足迹。其次,评估已经训练好的模型在时间和内存上也很昂贵,因为相同的模型架构必须按顺序运行大量步骤。

为了增加这类功能强大的模型可访问性,同时减少其显著的资源消耗,需要一种降低训练和采样计算复杂度的方法。因此,在不损害其性能情况下减少 DM 计算需求是提高其可访问性的关键。

**Departure to Latent Space.**我们的方法从分析像素空间中已经训练好的扩散模型开始:图 2 显示了训练模型失真率权衡。

图 2,感知和语义压缩说明。数字图像大多数 bits 对应于难以察觉的细节。虽然 DM 允许通过最小化损失项来抑制这种语义上无意义信息,但梯度(在训练期间)和神经网络骨干(训练和推理)仍然需要在所有像素上进行评估,从而导致多余的计算和不必要的昂贵优化和推理。我们提出潜在扩散模型 LDM 作为一个有效生成模型,有一个单独的轻度压缩阶段,消除不可察觉的细节。数据和图像来自 DDPM。

备注:以上解释简言之,我们的感知(perceptual)图片压缩不会丢失太多语义信息,但减少了计算量。

与任何基于似然的模型一样,学习大致可以分为两个阶段:首先是一个感知压缩阶段,它去除了高频细节,但仍然学习了语义变化。在第二阶段,实际的生成模型,学习数据的语义和概念组合(语义压缩)。因此,我们的目标是首先找到一个感知上等价但计算更合适的空间,在该空间中,我们将训练扩散模型进行高分辨率图像合成。

按照常见的做法,我们将训练分为两个不同的阶段:首先,我们训练一个自编码器,它提供一个低维(从而高效)表示空间,该表示空间在感知上等价于数据空间。重要的是,与之前工作相比,我们不需要依赖过多空间压缩,因为我们在学习到的潜在空间中训练 DM,相对于空间维度表现出更好的缩放特性。降低的复杂性还提供了通过单个网络从潜在空间实现高效的图像生成。我们将得到的模型类称为潜在扩散模型 LDM。

这种方法的一个显著优点是,我们只需要训练通用自动编码阶段一次。因此可以将其用于多个 DM训练或探索可能完全不同的任务。这使得能够有效地探索各种图像到图像和文本到图像任务的大量扩散模型。对于后者,我们设计了一种将 transformer 连接到 DM 的 UNet 主干网络,并实现任意类型基于 token 的条件机制,参见第 3.3 节。

总之,我们的工作做出了以下贡献:

  1. 与纯基于 transformer 的方法相比,我们的方法更优雅地扩展到高维数据,因此 (a) 在压缩级别上工作,这提供了比以前工作更真实、更详细的重建(见图 1.8)和(b)可以有效地应用于百万像素图像的高分辨率合成。
  2. 我们在多个任务(无条件图像合成、修复、随机超分辨率)和数据集上实现了具有竞争力的性能,同时显着降低了计算成本。与基于像素的扩散方法相比,我们还显着降低了推理成本。
  3. 我们表明,与之前同时学习编码器/解码器架构和基于分数的先验的工作相比,我们的方法不需要对重建和生成能力进行精细加权。这确保了极其真实的重建,并且需要对潜在空间进行很少的正则化。
  4. 我们发现,对于超分辨率、修复和语义合成等密集条件任务,我们的模型可以以卷积方式应用,并渲染 ~10242*1024 一致大像素的图像。
  5. 此外,我们设计了一种基于交叉注意的通用条件反射机制,实现了多模态训练。我们用它来训练 class-conditional, text-to-image and layout-to-image 模型。
  6. 最后,我们在 https:///github.com/CompVis/latent-diffusion 上发布了预训练的潜在扩散和自动编码模型。除了DMs的训练之外,它还可以用于各种任务。

Generative Models for Image Synthesis. 图像的高维性质对生成建模提出了独特的挑战。

  • 生成对抗网络(GAN)允许高效地采样具有良好感知质量的高分辨率图像,但难以优化并捕获完整的数据分布。
  • 相比之下,基于似然的方法强调良好的密度估计,这使得优化的行为更加良好。
  • 变分自动编码器(VAE)和基于流的模型能够有效地合成高分辨率图像,但样本质量与GANs不相上下。
  • 虽然自回归模型 (ARM) 在密度估计、计算要求的架构和顺序采样过程,将它们限制为低分辨率图像方面实现了强大的性能。
  • 由于基于像素的图像表示包含几乎察觉不到的高频细节,最大似然训练在建模它们时花费了不成比例的容量,导致训练时间很长。

为了扩展到更高的分辨率,几种两阶段方法使用 ARM 来建模压缩的潜像空间,而不是原始像素。

最近,**扩散概率模型(DM)**在密度估计和样本质量方面取得了最先进的结果。当这些模型的底层神经骨干网络被实现为 UNet 时,这些模型的生成能力源于对类似图像数据归纳偏差的自然拟合。当使用重新加权的目标进行训练时,通常可以实现最佳合成质量。在这种情况下,DM 对应于有损压缩器,并允许以图像质量换取压缩能力。然而,在像素空间中评估和优化这些模型的缺点是推理速度低,训练成本非常高。虽然前者可以通过高级采样策略[和分层方法部分解决,但对高分辨率图像数据进行训练总是需要计算昂贵的梯度。我们用我们提出的 LDM 解决了这两个缺点,其工作在低维的压缩潜空间上。这使得训练在计算上更便宜,并且加快了推理速度,几乎没有降低合成质量(见图 1.8)。

**Two-Stage Image Synthesis.**为了缓解单个生成方法的缺点,许多研究通过两阶段方法将不同方法的优势组合成更高效、性能更好的模型。

  • VQ-VAEs,VideoGPT 使用自回归模型在离散化潜在空间上学习富有表现力的先验。
  • Zero-Shot Text-to-lmage Generation 通过学习离散图像和文本表示的联合分布,将这种方法扩展到文本到图像生成。
  • Network-to-Network Translation with Conditional Invertible Neural Network 使用条件可逆网络来提供不同领域潜在空间之间的通用传输。
  • 与VQ-VAEs不同,VQGANs 采用具有对抗性和感知目标的第一阶段,将自回归transformer缩放到更大图像。

然而,可行的 ARM 训练所需的高压缩率,引入了数十亿可训练参数,限制了这种方法的整体性能,更少的压缩是以高计算成本为代价的。我们的工作优化了这种权衡,因为我们提出的 LDM 由于其卷积主干而更温和地扩展到高维潜在空间。因此,我们可以自由地选择在学习强大的第一阶段之间最佳调节的压缩水平,而不会在保证高保真重建的同时将太多的感知压缩留给生成扩散模型(见图 1.8)。

虽然基于分数的先验方法存在联合(Score-based Generative Modeling in Latent Space)或单独(D2C: Diffusion-Denoising Models for Few-shot Conditional Generation)学习编码/解码模型,但前者仍然需要在重建和生成能力之间进行困难的加权,并且被我们的方法(第 4 节)所超越,而后者则专注于高度结构化图像,如人脸。

3. Method

为了减少训练扩散模型对高分辨率图像合成的计算需求,我们观察到,尽管扩散模型允许通过对相应的损失项进行欠采样来忽略感知上不相关的细节,但它们仍然需要在像素空间中进行昂贵的函数评估,这导致计算时间和能源资源的巨大需求。

我们建议通过引入压缩与生成学习阶段的显式分离来规避这个缺点(见上图 2)。为了实现这一点,我们使用了一个自动编码模型,该模型学习了一个在感知上等同于图像空间的空间,但计算复杂度显著降低。

这种方法有几个优点:

  1. 通过离开高维图像空间,我们获得了计算效率更高的 DM,因为采样是在低维空间上进行的。
  2. 我们利用从其 UNet 架构继承的 DM 的归纳偏差,这使得它们对具有空间结构的数据特别有效,因此减轻了对先前方法所需激进、质量降低的压缩级别需求。
  3. 最后,我们获得了通用压缩模型,其潜在空间可用于训练多个生成模型,也可用于其他下游应用,例如单图像 CLIP 引导的合成。

可视化描述见图 3。

图 3,通过串联或通过更通用的交叉注意力机制来调节 LDM。

备注:Latent Diffusion Models,LDMs 分两阶段。第一,图 3 左半部分(红色),对图片进行压缩,将图片压缩为隐变量表示(Latent),减少计算复杂度;第二,扩散模型,图 3 中间绿色部分。此外引入了 Cross-Attention 机制,图右半部分,方便文本、图片、语义图等对扩散模型进行施加影响,从而生成图片,比如根据文本生成我们想要的图片。

3.1. Perceptual Image Compression

我们的感知压缩模型基于之前的工作(Taming Transformers for High-Resolution lmage Synthesis),由一个由感知损失(The Unreasonable Effectiveness of Deep Features as a Perceptual Metric)和一个 patch-based 对抗目标(Vector-quantized lmage Modeling with lmproved VQGAN)组合训练的自动编码器组成。

这确保了通过增强局部真实性将重建限制在图像流形内,并避免了仅依赖于像素空间损失(如 L2 或 L1 范数)而引入的模糊性。

更准确地说,给定 RGB 空间图像 ,编码器 编码为潜在表示 ,解码器 从潜在空间重建图像,给出 ,其中

重要的是编码器采用图像下采样因子 。我们研究了不同下采样因子 ,其中

为了避免任意高方差的潜在空间,我们尝试了两种不同的正则化。第一个变体 KL-reg,对学习的潜在标准法线施加轻微的 KL 惩罚,类似于 VAE。 另外一种 VQ-reg,在解码器中使用矢量量化层。该模型可以解释为 VQGAN,但量化层被解码器吸收。

因为我们后续的 DM 旨在与学习的潜在空间 二维结构一起工作,可以使用相对温和的压缩率并实现非常好的重建。这与之前的作品形成对比,这些工作依赖于学习空间 的任意一维排序来自回归建模其分布,从而忽略了 大部分固有结构。因此,我们的压缩模型更好地保留了 的细节(见表 8)。

备注:上面整段话简言之。给定图片 ;编码器 将图片转换为隐变量 ;编码器会对图片 进行下采样(压缩),下采样因子为 ,实验证明 为 4 和 8 比较好。解码器 将图片隐变量恢复为图片 。实验了两种正则,KL-reg和VQ-reg。这个编码器/解码器,我们可以只训练一次,适用于不同的 DM 模型训练。

3.2. Latent Diffusion Models

Diffusion Models 是概率模型,旨在通过逐渐去噪正态分布变量来学习数据分布 ,这对应于学习长度为 T 的固定马尔可夫链的反向过程。对于图像合成,最成功的模型 [DDPM] 依赖于 上变分下界的重新加权变体,这反映了去噪分数匹配 score-matching。这些模型可以解释为一个等加权的去噪自编码器序列 ,经过训练以预测其输入 的去噪变体,其中 是输入 的噪声版本。相应的目标方程简化为(附录 B 节)

t 从 { 1,...,T } 均匀抽样。

Generative Modeling of Latent Representations 通过我们训练有素的感知压缩模型,包括 ,我们现在可以访问一个有效的、低维的潜在空间,在这个空间中,高频的、不可察觉的细节被抽象掉了。与高维像素空间相比,该空间更适合基于似然的生成模型,因为它们现在可以 (i) 专注于数据的重要语义 bits,以及 (ii) 在低维、计算效率更高的空间训练。

与之前在高度压缩的离散潜在空间中依赖自回归、基于注意力 transformer 模型工作不同,我们可以利用模型提供的特定于图像的归纳偏差。这包括主要从 2D 卷积层构建底层 UNet 能力,并使用重新加权边界进一步将目标集中在感知最相关的 bits 上。现在目标方程为:

模型网络主干 被实现为时间条件 UNet 网络。由于前向过程是固定的, 可以在训练期间从 有效地获得,来自 的样本可以通过一次 解码到图像空间。

3.3. Conditioning Mechanisms

与其他类型的生成模型类似,扩散模型原则上能够对 形式的条件分布进行建模。这可以通过条件去噪自动编码器 来实现,并通过文本、语义图或其他图像到图像转换任务等输入 控制合成过程。

然而,在图像合成的背景下,将DM的生成能力与类别标签或输入图像的模糊变体之外的其他类型的条件相结合,是迄今为止尚未探索的研究领域。

我们通过使用交叉注意力机制增强其底层的UNet主干,将DM转化为更灵活的条件图像生成器,这对于基于注意力的多模态输入模型是有效的。

为了从不同模态(如语言提示)中预处理 ,我们引入了一个特定领域编码器 ,它将 投影到中间表示 ,然后通过 交叉注意层映射到UNet 中间层,其中

这里, 是 UNet 网络的中间表示, 是可学习的投影矩阵。

基于图像条件对,我们通过以下目标函数学习条件 LDM。

其中 都通过等式 (3) 联合优化。这种调节机制是灵活的,因为 可以用特定领域的专家参数化,例如 unmasked transformers,当 是文本提示时。

备注:简言之。通过在 LDM 模型 UNET 网络中引入Cross-Attention,实现灵活的图片生成控制。对不同输入模态,可以有效学习基于注意力模型。多模态如文本(条件控制)输入 ,采用特定的编码器 ,其将 转换为中间表达 ,然后再通过 Cross-Attention 输入到 UNET 网络。

4. Experiments

备注:本章摘要了原论文部分内容。

LDM 为各种图像模态基于扩散图像合成,提供了灵活和易于计算的手段,我们在以下经验中展示了这一点。首先,我们分析了 LDM 模型在训练和推理方面与基于像素的扩散模型相比的增益。有趣的是,我们发现在 VQ 正则化潜在空间中训练的 LDM 有时可以获得更好的样本质量,即使 VQ 正则化第一阶段模型的重建能力稍微落后于连续模型。

我们列出了本节介绍所有结果的体系结构、实现、训练和评估的详细信息。

4.1. On Perceptual Compression Tradeoffs

本节分析了具有不同下采样因子 f∈{1,2,4,8,16,32}(缩写为 LDM-f,其中 LDM-1 对应于基于像素的 DM)的 LDM 的行为。总之如下图,LDM-4 和 -8 为实现高质量合成结果提供了最佳条件。

表 8 显示了用于 LDM 的第一阶段模型的超参数和重建性能。

4.2. Image Generation with Latent Diffusion

如下图,LDM 模型效果很好。

4.3. Conditional Latent Diffusion

4.3.1 Transformer Encoders for LDMs

通过在 LDM 中引入基于交叉注意的条件,我们为扩散模型以前未探索的多模态打开了大门。对于文本到图像的图像建模,我们训练了一个 1.45B 参数 KL 正则化 LDM,其条件是 LAION-400M 上的语言提示。我们使用 BERT-tokenizer 并将 τθ 实现为 transformer ,通过多头交叉注意(第 3.3 节)推断映射到 UNet 的潜在代码。这种特定领域的专家组合用于学习语言表示和视觉合成会产生一个强大的模型,该模型可以很好地推广到复杂的、用户定义的文本提示。实现效果如图5。

我们的模型改进了强大的 AR 和基于 GAN 的方法,参见表 2。

4.3.2 Convolutional Sampling Beyond 256^2

图 9,在 256^2 分辨率上训练的 LDM 可以推广到更大的分辨率(此处:512×1024),用于空间条件任务,如景观图像的语义合成。

4.4. Super-Resolution with Latent Diffusion

根据低分辨率图片生成高分辨率图片

4.5. Inpainting with Latent Diffusion

图 11,可以将图片部分修复。

5. Limitations & Societal Impact

局限性虽然与基于像素的方法相比,LDM 显著减少了计算需求,但它们的序列采样过程仍然比GANs 慢。此外,当需要高精度时,LDM 的使用可能是值得怀疑的:尽管在 f = 4 自动编码模型中,图像质量的损失非常小(见图 1.8),但它们的重建能力可能成为像素空间中需要高精度任务的瓶颈。我们认为超分辨率模型(第4.4节)在这方面有一定的局限性。

社会影响 像图像这样的媒体生成模型是一把双刃剑,使用时需要尊重法律和伦理等。

6. Conclusion

我们提出了潜在扩散模型 LDM,可以在不降低其质量情况下显著提高训练和采样效率,简单有效。基于以上特征和交叉注意条件机制,我们的实验可以在没有任务特定架构情况下,与最先进的方法相比,在广泛的条件图像合成任务中显示出良好的结果。

7. References

1,What are Diffusion Models? | Lil'Log

2,Denoising Diffusion Probabilistic Model 扩散模型与代码实现

LDM 论文名称:High-Resolution Image Synthesis with Latent Diffusion Models

LDM 代码地址:https://github.com/CompVis/latent-diffusion

相关推荐
不知名靓仔7 小时前
Stable Diffusion:最全详细图解
stable diffusion
程序员X小鹿10 小时前
限时免费!国产Sora快手可灵Web网页端及全新功能上线!国货之光!
aigc
小鹿会议播报11 小时前
【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)
大数据·运维·人工智能·ai·机器人·自动化·智慧城市
HealthScience14 小时前
DALL-E、Stable Diffusion 等 20+ 图像生成模型综述
stable diffusion
byzy15 小时前
【论文笔记】BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation
论文阅读·深度学习·目标检测·计算机视觉·自动驾驶
技能咖18 小时前
谈谈创意设计中的AI、AGI、AIGC
人工智能·aigc·agi
多恩Stone18 小时前
【扩散模型(三)】IP-Adapter 源码详解1-输入篇
人工智能·pytorch·python·深度学习·aigc
代码讲故事20 小时前
RAG 工业落地方案框架(Qanything、RAGFlow、FastGPT、智谱RAG)细节比对!CVPR自动驾驶最in挑战赛赛道,全球冠军被算力选手夺走了
人工智能·机器学习·自动驾驶·cvpr·fastgpt·rag·qanything
路有瑶台21 小时前
【自动驾驶仿真在做什么——初学者总结(陆续补充)】
自动驾驶·自动驾驶仿真
会python的小孩1 天前
有哪些好的 Stable Diffusion 提示词(Prompt)可以参考?
人工智能·windows·tcp/ip·ai作画·stable diffusion·prompt