介绍
Stable Diffusion是文生图模型,包括三个大组件,VAE,Clip和Unet。
原理分析
1.Unet的详细结构


上面两张图对应着看,Unet包含三大部分:
①下采样
三个cross attention下采样模块(CrossAttnDownBlock2D)
一个普通下采样模块(DownBlock2D)
②中间
一个中间模块(UnetMidBlock2DCrossAttn)
③上采样
一个普通上采样模块(UpSample2D)
三个cross attention上采样模块(CrossAttnUpBlock2D)
接下来,我们逐个分析每个模块
cross attention下采样模块(CrossAttnDownBlock2D)
来详细看cross attention下采样模块的结构:

很明显,这里面包括三个子块:
① ResnetBlock2D
② Transformer2DModel
③ DownSample2D
一步步来,看每个子模块包含啥
ResnetBlock2D

ResnetBlock2D的输入包括两部分:
① 上一层的latent
② 时间步的embedding
PS:输入输出通道数不一致的时候,残差连接会用一个1x1的卷积
时间步编码模块的结构如下图所示:
接下来看Transformer2DModel子模块

这个模块的输入也是包括两部分:
① 上一层的latent
② 文本的embedding,其shape=2, 77, 768
来看看BasicTransformerBlock块
更进一步拆解,SelfAttention的结构为:
CrossAttention的结构为:
很多面试里会问到Unet中的cross attention,其实是在这里,Q的根源来自图像特征,经过了一些列的中间块处理;KV来自文本
<>
Feedforward就很显而易见了,跟transformer中的类似
接下来看DownSample2D子模块

上面都是cross attention下采样模块(CrossAttnDownBlock2D)
下面分析DownBlock2D

上面分析完了所有下采样,看一眼中间模块
UnetMidBlock2DCrossAttn

最后是上采样的
UpBlock2D模块

UpSample2D
CrossAttnUpBlock2D
注意, 最后一个CrossAttnUpBlock2D没有UpSample2D模块

2.CLIP的详细结构
CLIP这里用到的是文本编码器,结构如下:

CLIPTextEmbeddings
灰色的框框text_inoputs和embedding不是操作,是表示输入输出:

CLIPEncoderLayer
CLIPEncoderLayer就是普通的Transformer 的Encoder层了

总结
- Unet的重点在于哪个cross attention下采样模块,里面包含resblock和transformer相关的block,其中resblock接受时间步嵌入作为输入,transformer模块接受文本嵌入作为输入,这块就是用到了cross attention。Q的根源是来此图像,但是是经过了很多层处理后的latent feature,KV来自文本嵌入。





