当前位置:   article > 正文

Stable Diffusion学习笔记_马尔科夫链的反向过程是

马尔科夫链的反向过程是

目录

1. 扩散模型

2. DDPM 和 DDIM

3. Latent Diffusion Models

4. Stable Diffusion Models

参考链接


1. 扩散模型

扩散模型包括两个过程:前向过程和反向过程,其中前向过程即扩散过程。前向过程和反向过程都是一个参数化的马尔可夫链(Markov chain),其中反向过程可以用来生成数据。

扩散过程

扩散过程即对数据逐渐增加高斯噪音直至数据变成随机噪音的过程。

q(x_t|x_{t-1})=N(x_t;\sqrt{1-\beta _t}x_{t-1},\beta _tI)\{\beta_t\}^T_{t=1}即每一步采用的方差,variance schedule或noise schedule,介于0-1之间,满足\beta_1<\beta_2<...<\beta_T。所以在一个设计好的variance schedule下,如果T足够大,则x_T将完全丢失原始数据从而变成一个随机噪声(DDPM采用的是一个线性的variance schedule)。整个扩散过程即一个马尔可夫链:

q(x_{1:T}|x_0)=\prod_{t=1}^{T}q(x_t|x_{t-1})

扩散过程可以对原始数据x_0任意t步的x_t进行采样,即q(x_t|x_0)=N(x_t;\sqrt{\overline{\alpha_t}}x_0,(1-\overline{\alpha}_t)I)

定义\alpha _t=1-\beta _t\overline{\alpha}_t=\prod_{i=1}^{t}\alpha_i,通过重参数技巧,得到:

x_t=\sqrt{\alpha _t}x_{t-1}+\sqrt{1-\alpha _t}\epsilon _{t-1} \\ =\sqrt{\alpha_t}(\sqrt{\alpha _{t-1}}x_{t-2}+\sqrt{1-\alpha _{t-1}}\epsilon _{t-2})+\sqrt{1-\alpha_t}\epsilon_{t-1} \\ =\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\sqrt{\sqrt{\alpha_t-\alpha_t\alpha_{t-1}}^2+\sqrt{1-\alpha_t}^2}\overline{\epsilon}_{t-2} \\ =\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_t\alpha_{t-1}}\overline{\epsilon}_{t-2} \\ =... \\ =\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\epsilon

注:\overline{\epsilon}_{t-2} merges two Gaussians (*),以此类推。该推导过程利用了两个方差不同的高斯分布N(0,\sigma _1^2I)和 N(0,\sigma _2^2I)相加等于一个新的高斯分布N(0, (\sigma _1^2+\sigma_2^2)I)

 反向过程

反向过程即去噪过程,也定义为马尔可夫链,有一系列用神经网络参数化的高斯分布组成。

p_\theta(x_{0:T})=p(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1},x_t)

p_\theta(x_{t-1}|x_t)=N(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t))

其中p(x_T)=N(x_T;0,I)p_\theta(x_{t-1}|x_t)是参数化的高斯分布,其均值和方差由训练网络得到,即扩散模型的训练目标(用神经网络p_\theta(x_{t-1}|x_t)拟合真实分布q(x_{t-1}|x_t))。 

对于DDPM,前向过程(扩散过程)和反向过程(生成过程)都是一个马尔可夫链。前向即不断增加高斯噪声,控制噪声的权重随着迭代越来越大,最后在T时刻近似于随机噪声。反向过程即不断去噪,其马尔可夫链与前向的主要区别是,其t-1时刻的高斯分布的均值和方差由训练模型获得。

优化目标

基于变分推断来得到variational lower bound (VLB) 作为最大化优化目标。最终得到的优化目标即让网络预测的噪音和真实的噪音一致。

L_{t-1}^{simple}=E_{x_0,\epsilon \sim N(0,I)}[\left \| \epsilon -\epsilon _\theta(\sqrt{\overline{\alpha}_t}x_0+\sqrt{1-\overline{\alpha}_t}\epsilon,t) \right \|^2]

2. DDPM 和 DDIM

DDPM (Denoising Diffusion Probabilistic Models) 采用的模型是一个基于残差模块和注意力模块的UNet模型。U-Net属于encoder-decoder架构,其中encoder分成不同的stages,每个stage都包含下采样模块来降低特征的空间大小,然后decoder和encoder相反,是将encoder压缩的特征逐渐恢复。

U-Net在decoder模块中还引入了skip connection,即concat了encoder中间得到的同维度特征,利于网络优化。DDPM所采用的U-Net每个stage包含2个residual block,而且部分stage还加入了self-attention模块增加网络的全局建模能力。

另外,扩散模型其实需要的是T个噪声预测模型,实际处理时,我们可以增加一个time embedding(类似transformer中的position embedding)来将timestep编码到网络中,从而只需要训练一个共享的U-Net模型。具体地,DDPM在各个residual block都引入了time embedding。

DDIM (Denoising Diffusion Implicit Models) 和DDPM训练目标相同,特点之一是不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪声生成样本的过程是一个确定的过程(中间没有加入随机噪声)。

分析DDPM的优化目标会发现其只依赖于边缘分布q(x_t|x_0),而不是直接作用于联合分布q(x_{1:T}|x_0)。即DDPM这个隐变量模型可以有很多推理分布来选择,只要推理分布满足边缘分布条件(扩散过程的特性)即可,而且这些推理过程并不一定要是马尔卡夫链。但值得注意的一个点是,要得到DDPM的优化目标,还需要知道分布q(x_{t-1}|x_t,x_0),之前在根据贝叶斯公式推导这个分布时是知道分布q(x_t|x_{t-1})的,而且依赖了前向过程的马尔卡夫链特性。如果要解除对前向过程的依赖,那么就需要直接定义这个分布q(x_{t-1}|x_t,x_0)。 基于上述分析,DDIM论文中将推理分布定义为:

q_\sigma (x_{1:T}|x_0)=q_\sigma(x_T|x_0)\prod_{t=2}^{T}q_{\sigma}(x_{t-1}|x_t,x_0)

具体参考:

扩散模型之DDPM - 知乎“What I cannot create, I do not understand.” -- Richard Feynman 近段时间最火的方向无疑是 基于文本用AI生成图像,继OpenAI在2021提出的文本转图像模型DALLE之后,越来越多的大公司卷入这个方向,如谷歌在今…https://zhuanlan.zhihu.com/p/563661713icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/563661713扩散模型之DDIM - 知乎“What I cannot create, I do not understand.” -- Richard Feynman 上一篇文章 扩散模型之DDPM介绍了经典扩散模型DDPM的原理和实现,对于扩散模型来说,一个最大的缺点是需要设置较长的扩散步数才能得到好的效…https://zhuanlan.zhihu.com/p/565698027icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/565698027

3. Latent Diffusion Models

High-Resolution Image Synthesis with Latent Diffusion Models

项目路径:GitHub - CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models

背景

GANs的良好结果大多局限于变异性相对有限的数据,因为它们的对抗学习过程不容易扩展到建模复杂的多模态分布。而扩散模型是基于似然的模型,不像GANs那样会表现出模式崩溃和训练不稳定性,而且通过大量利用参数共享,它们可以对自然图像的高度复杂分布建模。

DM训练和推理需要强大的机器资源(训练DM通常需要数百个GPU天,例如在《Diffusion Models Beat GANs on Image Synthesis》中提及模型需要使用V100训练150 - 1000天,同样推理也耗费时间,在单个A100 GPU上生成50k个样本大约需要5天)。为了在有限的计算资源上进行DM训练,同时保持其质量和灵活性,该论文提出将DM应用于强大的预训练自编码器的潜在空间,在复杂性降低和细节保留之间达到一个近乎最佳的点,极大地提高了视觉保真度。且通过在模型架构中引入交叉注意层,将DM转化为强大而灵活的生成器,用于一般条件输入,如文本或边界框,并以卷积方式实现高分辨率合成。

模型结构

Figure 1. LDMs模型结构

Latent Diffusion Models首先需要一个训练好的自编码模型实现编解码操作(感知压缩),利用编码器将图片压缩到潜在空间进行diffusion操作,最后再用解码器恢复到原始像素空间。扩散模型具体为time-conditional UNet结构,并引入条件机制,通过cross-attention的方式实现多模态训练。

1. Perceptual Image Compression

感知压缩模型由一个通过结合感知损失和基于patch的对抗目标来训练得到的自动编码器组成。其中编码器\varepsilon将输入图片编码到潜在空间z=\varepsilon (x),解码器从潜在编码重构图片\widetilde{x}=D(z)(在p(z)分布空间采样并解码到图像空间)。基于该压缩模型可以得到一个高效低维的潜在空间,其中高频的难以察觉的细节被抽象出来,只保留重要基础的特征。与高维像素空间相比,这个空间更适合基于似然的生成模型,因为它们现在可以专注于数据的重要语义,且在低维、计算效率更高的空间中训练。

避免任意高方差的潜在空间(避免潜在表示空间出现高度的异化),使用两种正则化方式:KL-reg和VQ-reg(Stable Diffusion主要采用KL方法)。

2. Latent Diffusion Models

扩散模型是通过逐步去噪正态分布变量来学习数据分布p(x)的概率模型,对应于学习长度为T的固定马尔可夫链的反向过程:L_{DM}=E_{x,\epsilon \sim N(0,1),t}[\left \| \epsilon - \epsilon_\theta (x_t,t)\right \|_2^2]

潜在表征的生成建模(降噪过程)利用特定于图像的归纳偏差,从2D卷积层构建底层UNet,并使用重加权界限进一步将目标集中在感知上最相关的位置上。相比之前的工作依赖于学习空间z的任意1维顺序来对其分布进行自回归建模,导致忽略了z的大部分固有结构,该论文的压缩模型更好地保留了x的细节。对应的目标函数改为:L_{LDM}=E_{\varepsilon (x),\epsilon \sim N(0,1),t}[\left \| \epsilon - \epsilon_\theta (z_t,t)\right \|_2^2]

UNet噪声预测器基本操作:转换latents;每层都是基于之前层的输出进行操作;某些输出(通过残差连接)将其馈送到网络后面的处理中。

带文本的UNet噪声预测器主要修改部分就是新增文本信息输入,在ResNet块之间增加一个注意力层。ResNet块没有直接看到文本内容,而是通过注意力层将文本在latents中的表征合并起来,然后下一个ResNet就可以在这一过程中利用上一模块的文本信息。

3. Conditioning Mechanisms

与其他类型的生成模型相似,扩散模型原则上能够建模形式为p(z|y)的条件分布,通过条件去噪自动编码器\epsilon _\theta (z_t,t,y)实现,并为通过输入y(如文本、语义映射或其他图像到图像的翻译任务等)控制合成过程铺平了道路。

论文通过使用交叉注意机制来增强DMs的底层UNet主干,从而使其成为更灵活的条件图像生成器。具体为引入一个特定领域的编码器\tau _\theta来预处理各种模态的条件输入y,再通过交叉注意层(即Q和KV分别来自不同的序列,z_ty)将y的编码映射到UNet的中间层,Attention(Q,K,V)=softmax(QK^T/\sqrt{d})V

在图像条件对的基础上,LDMs损失:L_{LDM}=E_{\varepsilon (x),y,epsilon \sim N(0,1),t}[\left \| \epsilon - \epsilon_\theta (z_t,t,\tau_\theta(y))\right \|_2^2]

4. Stable Diffusion Models

项目路径v1版本:https://github.com/CompVis/stable-diffusion

项目路径v2版本:https://github.com/Stability-AI/stablediffusion

Stable Diffusion是潜在空间的文图扩散模型(即LDMs的y输入为文本条件)。

Stable Diffusion v1 refers to a specific configuration of the model architecture that uses a downsampling-factor 8 autoencoder with an 860M UNet and CLIP ViT-L/14 text encoder for the diffusion model. The model was pretrained on 256x256 images and then finetuned on 512x512 images.

Stable Diffusion v2以上为在之前模型的基础上finetune到更大分辨率768x768。

代码理解

1. pad输入pair (原图和mask),使其长、宽为32的整数倍,在图片下方及右侧填充pad_h和pad_w像素,填充值为0。

  1. def pad_image(input_image):
  2. pad_w, pad_h = np.max(((2, 2), np.ceil(
  3. np.array(input_image.size) / 64).astype(int)), axis=0) * 64 - input_image.size
  4. im_padded = Image.fromarray(
  5. np.pad(np.array(input_image), ((0, pad_h), (0, pad_w), (0, 0)), mode='edge'))
  6. return im_padded

2. 初始化随机输入编码size = (num_sample, 4, h // 8, w // 8),预处理image、mask和prompt。

  1. start_code = prng.randn(num_samples, 4, h // 8, w // 8)
  2. start_code = torch.from_numpy(start_code).to(
  3. device=device, dtype=torch.float32)
  4. with torch.no_grad(), \
  5. torch.autocast("cuda"):
  6. batch = make_batch_sd(image, mask, txt=prompt,
  7. device=device, num_samples=num_samples)
  8. c = model.cond_stage_model.encode(batch["txt"])

注:downsampling factor f选择数值8为根据实验经验所得。LDMs论文提到了选取不同的下采样因子{1, 2, 4, 8, 16, 32}进行实验 (single NVIDIA A100 and 2M steps),证明:1) 小下采样因子LDM-{1,2}会导致训练进展缓慢,2) 过大的f值又会导致在相对较少的训练step后保真度停滞。论文将此归因于 1) 将大部分感知压缩留给了扩散模型和 2) 第一阶段过强的压缩导致信息丢失,从而限制了可达到的模型质量。最终根据实验结果选择8作为下采样参数最佳。

参考链接

Stable Diffusion原理解读 - 知乎

Jay Alammar再发新作:超高质量图解Stable Diffusion,看完彻底搞懂「图像生成」原理-51CTO.COM

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/768757
推荐阅读
相关标签
  

闽ICP备14008679号