2022年7月份,Stable Diffusion一经问世就震惊全球,相较于之前的模型,Stable Diffusion成功的解决了细节以及计算效率问题,通过算法迭代将AI绘图的精细度提升到艺术品的级别,并将生产效率提升到了秒级,大大方便了广大创作者,甚至没有绘画基础的小白也可以使用Stable Diffusion来创作出属于自己的作品。
Stable Diffusion爆火之后,好多技术人员开始研究它的网络结构、关键组件。最近由于某些原因,我的研究需要用到Stable Diffusion,于是就研究了一下它的网络结构。下图为官方论文中给出的网络结构。通过查找资料,我发现有好多人都在讲Pixel Space、Latent Space以及Conditioning,但是对于网络结构中的一些关键组件(例如switch、crossattention等)讲解的却不多。于是我想通过本篇文章跟大家聊聊Stable Diffusion中的一些关键组件,本篇以switch为主。
网络模块解析
- Pixel Space(像素空间)(上图中左侧粉色区域):
- 这里是图像的原始像素表示,可以是真实世界中的照片等RGB图像。
- 同时也是最终生成的图像空间,是生成图像的最终输出形式,用户所看到的图像就是在像素空间中呈现的。
- Latent Space(潜在空间)(上图中浅绿色区域):
- 这里是模型将输入数据(如RGB图像)转换为潜在空间的表示,模型将输入数据编码到一个低维表示的空间(如从将图像从512*512转换为64*64),在这个空间中,数据的复杂性被降低,以便模型处理,以及在生成过程中使用。
- Conditioning(条件)(上图右侧灰色框部分):
- 条件是指根据某些额外输入来控制生成过程趋向于我们想要的效果。
- 这里的条件包括Semantic Map(语义映射)、Text(文本描述)、Representations(表示)和Images(图像)。
- Diffusion Process(扩散过程):
- 扩散过程是Stable Diffusion的核心,涉及逐步向数据中添加噪声,使其复杂分布过渡到简单分布。
- Denoising U-Net(去噪U-Net):
- 这是Stable Diffusion中用于去噪的主要网络结构。它通过逐步去除噪声来生成图像。这里的去噪和上面的加噪都是根据马尔科夫链来进行推理的。
- Concat(连接):
- Concat是将不同来源的特征或数据合并到一起的操作。
- 在网络中,concat操作通常用于将编码器的输出与去噪U-Net的中间特征相结合,增强生成图像的特征表达。
- Skip Connection(跳跃连接)
- 跳跃连接是深度学习中常用的技术,用于连接网络中的不同层,以促进信息流动并减少梯度消失问题。
- 在Stable Diffusion中,跳跃连接可能用于将编码器的输出直接连接到去噪U-Net的深层,增强特征的传递。
- Cross-Attention(交叉注意力):
- 交叉注意力是一种注意力机制,用于将文本描述与图像特征相结合
- 它允许模型在生成图像时,根据文本描述的重点区域生成相应的图像特征。
- Switch(选择器):
- 选择器在网络中用于控制不同类型输入的流动和处理。
- 根据生成过程的不同阶段,选择器可以调整对文本描述、图像特征或其他条件信息的关注度。
Switch详解
在上面的阐述中,switch
用于在网络中控制不同类型输入的流动和处理,以及在生成过程的不同阶段对conditioning
的关注度做出调整。不知道大家有没有这样一个疑问,就是它是怎么根据生成过程做出调整的,又是怎么来区分不同阶段的。下面来为大家做出解答:
首先来说一下Stable Diffusion 的调节机制,它允许模型根据文本提示生成图像。这是通过接受调节输入修改内部扩散模型来实现的。在这个过程中switch
用于在不同类型的调节输入之间进行控制。它主要作用在以下方面:
-
控制调节输入
switch
可以根据当前的生成阶段和输入类型,动态调整模型的注意力和权重分配。例如,如果当前阶段需要更多关注文本描述,switch
会增强文本嵌入对生成过程的影响。 -
动态调整生成过程
在生成图像的过程中,
switch
可以根据需要调整去噪U-Net的工作方式。例如,在某些阶段,模型可能需要更多地关注图像的局部细节,而switch
可以调整网络的注意力,使其更专注于这些细节。 -
整合不同类型的输入
switch
可以将文本描述、图像特征和其他类型的输入整合到生成过程中。通过这种方式,模型可以根据不同的输入类型生成相应的图像。
而在图像生成过程动态调整不同类型的输入以控制生成过程的阶段,它具体的实现方式为:
- 对于文本输入:
- 语言模型嵌入:首先,文本输入通过预训练的语言模型(如BERT、CLIP)转换为文本嵌入(向量)
- 注意力机制:文本嵌入通过注意力机制(如多头注意力)映射到U-Net层,增强文本提示对生成图像的控制。
- 交叉注意力机制:在U-Net中,文本嵌入与图像特征通过交叉注意机制结合,进一步增强文本对图像生成的影响。
- 对于图像输入:
- 图像编码器:图像输入通过VAE编码器或其他图像编码器转换为潜在特征。
- 空间转换器:图像特征通过空间转换器(Spatial Transformer)和交叉注意力(CrossAttention)机制,增强图像特征在生成过程中的使用。
- 对输入的动态调整:
- 调度算法:Stable Diffusion使用调度算法(如PNDM、DDIM、K-LMS等)来控制生成过程中的噪声预测和去除,这些算法动态调整U-Net预测的噪声强度,从而控制生成过程的进度。
- 条件输入的整合:不同类型的调节输入(如文本、图像、语义映射等)通过
switch
机制整合到生成过程中。switch
根据当前的生成阶段和输入类型,动态调整模型的注意力和权重分配,确保生成的图像符合预期。
- 模型结构中的
switch
- U-Net模块:在Stable Diffusion的U-Net模型中,
switch
机制通过ResNetBlock、Spatial Transformer等模块实现。这些模块能够根据输入类型和生成阶段,调整网络的注意力和特征处理方式。 - CrossAttnDownBlock、CrossAttnUpBlock和CrossAttnMidBlock:这些模块在U-Net的编码器和解码器中起到关键作用,通过"switch"机制动态调整特征的传递和处理。
- U-Net模块:在Stable Diffusion的U-Net模型中,
具体示例
switch
的工作原理:假设你是一位导演,正在拍摄一部电影。在拍摄过程中,你需要根据剧情的需要,调整摄像机的焦点和度。switch
在Stable Diffusion中的作用就像导演一样,它根据生成图像的当前阶段和目标,调整网络的注意力,确保生成的图像符合预期。
以一个具体的示例来说明switch
是如何在图像生成过程中发挥作用的。假设我们的任务是让Stable Diffusion帮我们生成一张海滩日落的图像,以下是switch
如何动态调整网络注意力的详细过程:
- 初始阶段:设定基调
- 输入:一个随机噪声向量和文本描述词“生成一幅海滩日落的图像”
swich
作用:将文本描述转换为文本嵌入(Text Embedding),并将这些嵌入与噪声向量相结合,初始化生成过程。( 在这个过程中关注整体效果,减少对细节的关注)- 生成过程:去噪U-Net开始从噪声向量中去除噪声,生成初步的图像,这时图像还非常模糊,只有一些基本的颜色和形状。
- 中间阶段:构建背景
- 生成过程:去噪U-Net继续工作,图像开始显示出海滩和天空的轮廓。
switch
作用:在这个阶段,我们希望生成的图像有一个清晰的海滩和天空背景。因此,switch
会调整网络的注意力,更多地关注整体的背景特征,而不是细节。(在这个过程中调整网络的注意力,确保背景特征被正确生成。)- 具体操作:
switch
会减少对文本嵌入的依赖,更多地依赖于图像的潜在特征,确保海滩和天空的背景被正确生成。
- 细节生成阶段:添加细节
- 生成过程:随着去噪U-Net的进一步工作,图像开始显示出更多的细节,如沙滩上的脚印、海浪和日落的光线。
switch
作用:在这个阶段,我们需要生成更具体的细节,如日落的颜色和沙滩上的纹理。因此,switch
会增强对文本嵌入的依赖,确保这些细节符合文本描述。(在这个过程中增强对文本嵌入的依赖,确保细节特征被正确生成)- 具体操作:
switch
会增加对文本嵌入的注意力权重,同时减少对整体背景特征的依赖,确保日落的颜色和沙滩的纹理被正确生成。
- 最终调整阶段:微调细节
- 生成过程:图像已经基本生成,但仍需微调一些细节,如日落的光线和沙滩上的阴影。
switch
作用:在这个阶段,switch
会进一步调整网络的注意力,确保生成的图像在视觉上更加逼真。(在这个过程中进一步微调网络的参数,确保生成的图像在视觉上更加逼真)- 具体操作:
switch
可能会微调去噪U-Net的参数,增强对日落光线和沙滩阴影的控制,同时确保整体的海滩和天空背景不受影响。
在中间阶段switch
用于调整网络的注意力,那么什么是注意力呢?switch
又是如何调整注意力的呢?
什么是注意力?
在深度学习模型中,注意力机制是一种让模型能够“集中精力”在某一部分数据上的方法。就像你在做数学题时,可能会更关注那些复杂的计算步骤一样,模型也需要在处理数据时关注最重要的部分。
switch
如何调整注意力?
假设你有一个可以调节音量的收音机。你可以通过旋钮来增大或减小音量,从而更清楚地听到你感兴趣的频道。在Stable Diffusion中,switch
就像这个旋钮,它可以调节模型对不同输入信息的关注度。
它通过调节权重(增加或减少对某些输入信息的关注度)、动态调整(根据生成过程的不同阶段,调整模型的注意力焦点,从整体背景到具体细节)和微调参数(在生成过程的最后阶段,微调网络的参数,确保图像在视觉上更加逼真)的方式来调整注意力。
可能会有同学在问,如何判定什么时候是什么阶段呢?
在Stable Diffusion模型中,生成图像的过程可以被看作是一个逐步细化的过程,从粗糙的噪声到最终的清晰图像。这个过程通常被分为几个阶段:初始阶段、中间阶段、细节生成阶段和最终调整阶段。
如何实现阶段判定
在实际的模型训练和生成过程中,阶段判定通常是由模型内部的算法和参数控制的。
- 扩散步数:生成图像的过程通常被模拟为一个扩散过程,其中图像逐渐从不清晰的噪声状态转变为清晰的图像状态。模型会根据预设的扩散步数来控制生成过程的进度。
- 预设扩散步数:在训练和生成过程中,模型会预先设定一个扩散步数,比如50步或100步。每一步都会使图像更加清晰。
- 判定标准:在每一步中,模型会评估当前图像的状态,并决定是否需要进一步去噪。如果图像已经足够清晰,模型可能会减少去噪的强度,进入下一个阶段。
- 损失函数:损失函数是衡量模型生成图像与目标图像之间差异的指标。在训练过程中,模型会根据损失函数的变化来判断当前的生成阶段,并相应地调整其注意力和参数,以最小化损失函数。
- 训练过程中的判定:在训练过程中,模型会根据损失函数的变化来判断当前的生成阶段。如果损失函数的值在某个阶段突然减小,这可能意味着模型已经生成了大部分图像特征,可以进入下一个阶段。
- 生成过程中的判定:在生成过程中,模型会实时计算损失函数的值,并根据这个值来调整生成策略。例如,如果损失函数的值在某个阶段变得非常小,模型可能会认为已经接近最终图像,开始进行细节调整。
- 条件输入:文本描述或其他条件输入会指导模型在不同阶段关注不同的特征。
- 文本描述的解析:在生成图像之前,模型会解析文本描述,提取关键词和概念。这些关键词会被转换为文本嵌入,用于指导生成过程。
- 阶段判定:在生成过程中,模型会根据文本描述中的关键词来决定在不同阶段关注哪些特征。
以下是如何判定这些阶段的一些标准和特征(以上面的生成落日海滩为例):
- 初始阶段:
- 输入:随机噪声向量和文本描述“海滩日落”。
- 扩散步数:模型从第1步开始,逐步去除噪声,生成基本的图像结构。
- 损失函数:模型计算损失函数的值,评估生成的图像与目标图像的差异。
- 中间阶段:
- 生成过程:随着扩散步数的增加,图像开始显示出海滩和天空的基本轮廓。
- 损失函数:如果损失函数的值在某个阶段显著减小,模型会认为已经生成了大部分特征,开始进入细节生成阶段。
- 细节生成阶段:
- 生成过程:模型根据文本描述中的关键词“海滩”和“日落”,生成更具体的细节,如沙滩上的脚印和日落的光线。
- 条件输入:模型会增强对文本嵌入的依赖,确保生成的图像符合文本描述。
- 最终调整阶段:
- 生成过程:图像已经接近完成,模型开始进行最后的微调,如调整光影效果和增强纹理细节。
- 损失函数:模型会实时计算损失函数的值,并根据这个值来调整生成策略,确保最终生成的图像尽可能接近目标图像。
嵌入的依赖,确保生成的图像符合文本描述。
4. 最终调整阶段:
- 生成过程:图像已经接近完成,模型开始进行最后的微调,如调整光影效果和增强纹理细节。
- 损失函数:模型会实时计算损失函数的值,并根据这个值来调整生成策略,确保最终生成的图像尽可能接近目标图像。
以上就是本篇的所有内容,如有不对之处,欢迎大家批评指正,也欢迎大家在评论区讨论。