Thanks for Arena.ai

把这段时间的一些基础概念总计一下。

Token

Token起源于NLP,本意是”词元“,指的是将输入的文本序列转换为token序列,这个过程为tokenization化。在CLIP文本编码器里面,经过BPE分词后,可能token数目并非77,但是token的数目最多为77,多余的会被截断,少于77的用 [PAD] 补齐到 77,长文本暴力截断到 77(实际内容最多 75 个 token + [SOT] + [EOT]

ViT里面的token和NLP里面的不同,ViT是先将一个原始图像(224*224)切片为16*16的正方形(patch_token),一共可以得到14*14=196个patch token。

VAE编码器里面的token是通过下采样得到的,经过编码器压缩后的“潜在表示单元”,并且带有概率的性质。

三者在Transformer架构中得到了统一,因为transformer架构的输入格式都是[Batch_size,序列长度,特征维度]

CLIP编码器

clip编码器分为文本编码器和图像编码器。

对于文本编码器,其输入是一段文本(prompt经过token化之后,最多77个token);对于图像编码器,其输入是一个图像(reference image,经过了预处理,为224*224)。

输出分为两个层级:

  • 文本编码器的输出

    • 序列级输出:文本编码器经过tokenization之后,最多有77个token,最后会输出一个[Batch_size,77,768]维度的张量,每一个token对应一个768维的向量。
    • 全局文本向量:[Batch_size,768],来自于某一个特殊的Token,比如 EOS.再经过 projection 后变成 [batch_size, 512] 用于对比学习
  • 图像编码器的输出

    • 序列级输出:输出维度为[Batch_size,patch_token数+1,768],多加的一个是CLS token.
    • 全局图像向量:[batch_size, 1024](通常取 CLS token),再经过 projection 后变成 [batch_size, 512] 用于对比学习

    U-Net中注意力机制的注入

每一个需要注意力机制的模块,自注意力机制中的Q,K,V来自于特征图(这也是”自“的由来),交叉注意力机制中的Q来自于特征图,但是$K$和$V$来自CLIP文本编码器得到的序列。

因为diffusion中每一个block的分辨率/特征图维度不同,依次每一次cross attention的时候,随机初始化的$W^Q$维度不同,$W^K,W^V$是要和CLIP编码后的序列做运算,所以$W^K,W^V$每一次都是相同维度的。

DDPM、DDIM、Latent

  • DDPM:逐步去噪,质量好但慢,马尔可夫

  • DDIM:加速采样,确定性映射,可跳步,非马尔可夫

  • Latent Diffusion:在压缩空间做扩散,效率大幅提升,使大规模文生图成为可能

    Stable Diffusion = VAE + Latent space + DDIM/DPM-Solver 采样