文本编译器
Stable Diffusion 目前使用的Text Encoder(文本编译器)是 CLIP 模型即Contrastive Language Image Pre-training(对比语言图像预训练)。
CLIP 是 OpenAI 训练的一种模型,广泛用于文本-图像匹配(例如在 Stable Diffusion 这样的 AI 生成模型中)。在这个系统中,文本会被 CLIP 编码器转换为固定长度的向量序列,其中 最大长度为 77。
为什么是77个等长向量?
1.固定的 token 上限:
-
CLIP 使用 Transformer 作为文本编码器,并对文本进行 Tokenization(分词) 处理。
-
为了保证输入的 统一长度,CLIP 规定 文本最大 token 长度为 77,即输入的文本最多可以拆分成 77 个 token。
2.包含特殊标记(Special Tokens):
-
Token 序列的 首个 token 是 起始 token (<start_of_text> 或 [SOS])。
-
Token 序列的 最后一个 token 是 终止 token (<end_of_text> 或 [EOS])。
-
即使文本长度不足 77 个 token,剩余部分会用 填充 token(Padding) 补足,使其仍然是 77 个 token 的向量序列。
3.与 Transformer 结构匹配:
-
CLIP 的 Transformer 编码器 使用固定的序列长度,以便进行高效的批量计算(Batch Processing)。
-
77 这个数值是 OpenAI 设定的 一个经验性值,保证了模型可以适应 大多数文本输入,又不会占用过多的计算资源。
为什么每个向量有 768 维?
1. CLIP 使用 ViT-B/32 作为视觉编码器,文本编码器也遵循了 ViT(Vision Transformer) 的特征维度设定。
2. Transformer 模型的隐藏层维度通常设定为 768,类似于 BERT-base(它的隐藏层也是 768 维)。
3. 每个 token 的表示是一个 768 维的向量,这样可以 更容易适配 Transformer 的多层自注意力机制(Self-Attention)。
所以CLIP 的 Text Encoder 会输出 77 × 768 维的文本特征矩阵,并被用于图像-文本匹配或者扩散模型的文本条件输入。故 Stable Diffusion的提示词会分为77个token,每一个是768维的等长向量。
例如:
提示词输入的是 ”画一个小狗“。
-
你输入 “画一个小狗”,CLIP 先进行 分词(Tokenization)。
-
每个 token 变成一个 768 维向量,最终组成一个 77 × 768 的特征矩阵。
-
这个矩阵被输入到 AI 生成模型,用于理解你的 Prompt 并生成图像。