文生图模型之Stable Diffusion

1. Latent Diffusion Models

论文地址

解决问题:

如何在保证生成质量的前提下降低DM的训练和推理成本

解决思路

作者发现,之前的DM把大量计算浪费在一些难以察觉的图像细节当中,因此提出Encode-Decode结构,利用Encode提取图像的语义信息latent,latent的尺寸远小于原图(一般4-8倍综合效果较好),然后再利用DM去做生成,最后将生成结果输出给decode恢复成图像形态。
在这里插入图片描述

Tips

  1. 相比于其他encode-decode结构,ldm对E-D的要求不高,不需要太强的生成和恢复能力,但是实测下来,细节的控制和生成还是取决于E-D,这也是LDM的瓶颈
  2. 训练encode-decode网络时采用感知loss和path-based gan loss,不使用l1/l2 loss是为了避免生成结果模糊
  3. 训练encode-decode网络时虽然采用KL正则让结果分布趋向于标准高斯,但是KL正则系数小,结果分布的标准差可能不是0,所以需要对结果进行rescale再输入dm网络,下一章SD中有详细描述
  4. LDM中condition包含text,semantic,layout等,做法是提取特征转换成token然后concat在一起,然后通过cross-attention输入到网络中,将condition信息加入time-steps对效果也有提升,但是增加了许多运算成本,作者没有采用
    在这里插入图片描述
  5. LDM也可用于超分任务,但是训练数据制作时要特别注意,获取低分辨率要采用不同的下采样方式,并添加jpg压缩噪声,相机噪声,高斯模糊,高斯噪声等以充分模拟现实场景

2. Stable Diffusion

参考文章地址
SD网络结构清晰解析

解决问题:

利用文本生成图片,进一步衍生到inpainting功能

解决思路:

autoencoder

在这里插入图片描述

CLIP text encoder

tokenizer最大长度为77(CLIP训练时所采用的设置),当输入text的tokens数量超过77后,将进行截断,如果不足则进行paddings,这样将保证无论输入任何长度的文本(甚至是空文本)都得到77x768大小的特征

问题:当输出超长prompt会分段处理?每段的权重如何处理?

UNet

text condition将通过CrossAttention模块嵌入进来,此时Attention的query是UNet的中间特征,而key和value则是text embeddings。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

SD图生图

在这里插入图片描述

SD Inpainting

第一种形式:
在这里插入图片描述
第二种形式:
在这里插入图片描述

SD loss函数

原文地址
在这里插入图片描述
在这里插入图片描述

3. SDXL

论文解析地址
原论文地址

解决问题:

改进文生图效果

解决思路:

整体改进

在这里插入图片描述
PS:模型将更多的参数放在低维度的UNet中,以减少运算量

增加坐标尺寸输入信息

增加坐标尺寸作为输入,充分利用低分辨率数据的同时,避免低分辨率图片带来的模型,且可减少局部图生成的问题,训练时采用不同分辨率混合训练
在这里插入图片描述

增加refiner model

在这里插入图片描述
offset-noise
SDXL在多尺度微调阶段采用了offset-noise,这个技术主要是为了解决SD只能生成中等亮度的图像,而无法生成纯黑或者纯白的图像.
简单来说,之所以会出现这个问题,是因为训练和测试过程的不一样,SD所使用的noise scheduler其实在最后一步并没有将图像完全变成随机噪音,这使得训练过程中学习是有偏的,但是测试过程中,我们是从一个随机噪音开始生成的,这种不一致就会出现一定的问题。offset-noise是一个解决这个问题的简单方法,你只需要在训练过程中给采用的噪音加上一定的offset即可

4. SD 3.0

论文解析地址
原论文地址

解决问题:

如何进一步提高文生图生成质量及可控性,解决目前文字生成,细节生成不好等问题

解决思路

集众家之大成,提出新的生成方案:

改进的RF

SD3论文中认为不同时间步的任务难度是不一样:两边相对容易,而中间是比较难的。所以,设计了一些新的采样方法来提高中间时间步的权重。

多模态DiT

采用了一个多模态DiT。多模态DiT的一个核心对图像的latent tokens和文本tokens拼接在一起,并采用两套独立的权重处理,但是在attention时统一处理。整个架构图如下所示:
在这里插入图片描述

改进的autoencoder: SD3使用16通道的autoencoder, 即encode的输出channel是16。要注意,虽然增加通道并不会对生成模型(UNet或者DiT)的参数带来大的影响(只需要修改网络第一层和最后一层的通道数),但是会增加任务的难度,当通道数从4增加到16,网络要拟合的内容增加了4倍,这也意味模型需要增加参数来提供足够的容量。

文本编码器
SD3的text encoder包含3个预训练好的模型:

  • CLIP ViT-L:参数量约124M OpenCLIP
  • ViT-bigG:参数量约695M
  • T5-XXL encoder:参数量约4.7B

MM-DiT
MM-DiT和DiT一样也是处理图像latent空间,这里先对图像的latent转成patches,这里的patch size=2x2,和DiT的默认配置是一样的。patch embedding再加上positional embedding送入transformer中。 这里的重点是如何处理前面说的文本特征。对于CLIP pooled embedding可以直接和timestep embedding加在一起,并像DiT中所设计的adaLN-Zero一样将特征插入transformer block。
在这里插入图片描述
对于序列的text embeddings,常规的处理方式是增加cross attention层来处理,其中text embeddings作为attention的keys和values,比如SD的UNet以及PIXART-α(基于DiT)。但是SD3是直接将text embeddings和patch embeddings拼在一起处理,这样不需要额外引入cross-attention。由于text和image属于两个不同的模态,这里采用两套独立的参数来处理,即所有transformer层的学习参数是不共享的,但是共用一个self-attention来实现特征的交互。这等价于采用两个transformer模型来处理文本和图像,但在attention层连接,所以这是一个多模态模型,称之为MM-DiT。MM-DiT和之前文生图模型的一个区别是文本特征不再只是作为一个条件,而是和图像特征同等对待处理。
在这里插入图片描述
QK-Normalization
为了提升混合精度训练的稳定性,MM-DiT的self-attention层还采用了QK-Normalization。当模型变大,而且在高分辨率图像上训练时,attention层的attention-logit(Q和K的矩阵乘)会变得不稳定,导致训练出现NAN。这里的解决方案是采用RMSNorm(简化版LayerNorm)对attention的Q和K进行归一化。

变尺度位置编码
MM-DiT的位置编码和ViT一样采用2d的frequency embeddings(两个1d frequency embeddings进行concat)。SD3先在256x256尺寸下预训练,但最终会在以1024x1024为中心的多尺度上微调,这就需要MM-DiT的位置编码需要支持变尺度。SD3采用的解决方案是插值+扩展。
在这里插入图片描述
在这里插入图片描述
timestep schedule的shift
对高分辨率的图像,如果采用和低分辨率图像的一样的noise schedule,会出现对图像的破坏不够的情况,一个解决办法是对noise schedule进行偏移,对于RF模型来说,就是timestep schedule的shift。
在这里插入图片描述

模型scaling

  • transformer一个比较大的优势是有好的scaling能力:当增大模型带来性能的稳定提升。论文中也选择了不同规模大小的MM-DiT进行实验,不同大小的网络深度分别是15,18,21,30,38,其中最大的模型参数量为8B。结论是MM-DiT同样表现了比较好的scaling能力,当模型变大后,性能稳步提升
  • 另外一个结论是validation loss可以作为一个很好的模型性能的衡量指标,它和文生图模型的一些评测指标如CompBench和GenEval,以及人类偏好是正相关的。
  • 更大的模型不仅性能更好,而且生成时可以用较少的采样步数,比如当步数为5步时,大模型的性能下降要比小模型要低。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值