CLIP文本编码器

CLIP(Contrastive Language-Image Pre-training)是OpenAI开发的多模态模型,实现了文本和图像的联合表示。它是文本到图像生成中连接语言和视觉的桥梁,理解CLIP对于掌握AI绘画至关重要。

预计阅读时间:45分钟·难度:中级·更新:2024年12月

什么是CLIP

CLIP是OpenAI于2021年发布的多模态预训练模型,它通过对比学习在4亿个图文对上训练,实现了文本和图像的统一表示空间,是现代AI绘画系统的核心组件之一。

核心能力

📝 文本编码

将自然语言文本转换为高维向量表示

🖼️ 图像编码

将图像转换为相同维度的向量表示

🔗 语义对齐

使相似语义的文本和图像在向量空间中距离较近

🎯 零样本分类

无需微调即可进行开放世界的图像分类

为什么CLIP重要?

在CLIP出现之前,图像模型和语言模型是分离的世界:

❌ CLIP之前
  • • 图像分类需要定义固定类别
  • • 文本模型无法理解图像内容
  • • 跨模态检索需要复杂训练
  • • 无法处理开放世界概念
✅ CLIP之后
  • • 开放世界的图像理解
  • • 文本直接描述图像内容
  • • 简单的相似度计算即可检索
  • • 任意概念都能被理解

💡 关键突破

CLIP证明了大规模对比学习可以实现强大的跨模态理解能力,它的成功启发了后续的DALL-E、Stable Diffusion等一系列生成模型。可以说,没有CLIP就没有今天的AI绘画。

CLIP的诞生背景

OpenAI在开发CLIP时的核心洞察:

  • 数据规模:传统的图像标注数据集太小(如ImageNet只有1000类),无法覆盖真实世界的概念
  • 自然监督:互联网上的图片天然带有文本描述(alt text、标题等),是天然的监督信号
  • 对比学习:通过对比正负样本对,可以学习到更鲁棒的表示

模型架构

CLIP采用双编码器架构,分别处理文本和图像,将它们映射到相同的向量空间。

文本编码器

架构设计

  • 基础架构:Transformer编码器
  • 参数量:63M(ViT-B/32)到 358M(ViT-L/14)
  • 输入处理:BPE分词,最长77个token
  • 输出维度:512或768维嵌入向量

文本处理流程

输入文本 → BPE分词 → 添加[SOS][EOS] → 填充到77 token → Transformer编码 → 取[EOS]位置的输出 → 投影到嵌入空间

图像编码器

CLIP支持两种图像编码器架构:

ResNet系列
  • • ResNet-50、ResNet-101
  • • 经典CNN架构
  • • 计算效率较高
  • • 适合资源受限场景
ViT(Vision Transformer)
  • • ViT-B/32、ViT-L/14、ViT-H/14
  • • 图像切分为patch
  • • 效果通常更好
  • • 当前主流选择

对比学习机制

CLIP的核心是对比学习目标函数,这是理解CLIP的关键。

训练过程
  1. 1. 批次准备:取N个图文对(一个batch)
  2. 2. 独立编码:文本和图像分别通过各自的编码器
  3. 3. 相似度计算:计算所有文本-图像对的余弦相似度,形成N×N矩阵
  4. 4. 正负样本:对角线是正样本对(匹配的图文),其余N²-N个是负样本
  5. 5. 优化目标:最大化正样本相似度,最小化负样本相似度
为什么对比学习有效?
  • 自监督特性:无需人工标注,利用天然配对关系
  • 大量负样本:大batch size确保模型学习区分细微差异
  • 语义对齐:模型被迫学习真正的语义关联而非表面模式

训练方法

训练数据

CLIP在4亿个图文对上训练,数据来源广泛:

数据来源
  • • 互联网图片及alt文本
  • • 社交媒体图文内容
  • • 产品图片和描述
  • • 新闻图片和标题
数据处理
  • • 过滤低质量配对
  • • 平衡各类主题
  • • 文本清洗和规范化
  • • 图像resize到统一尺寸

训练细节

参数说明
Batch Size32,768超大batch确保足够负样本
训练步数~32,000步完整训练周期
优化器AdamW带权重衰减的Adam
学习率5e-4带余弦衰减
图像分辨率224×224 / 336×336取决于模型版本
训练时长~2周256张V100 GPU

💡 为什么需要大规模数据?

对比学习需要大量的负样本来学习有效的表示。4亿图文对确保了模型能够学习到丰富的视觉-语言对应关系,覆盖真实世界中的各种概念。

训练技巧

  • 温度系数:可学习的温度参数,调节softmax的平滑度
  • 梯度累积:模拟超大batch size
  • 混合精度:使用FP16加速训练
  • 数据增强:随机裁剪、颜色抖动等

在Stable Diffusion中的应用

在Stable Diffusion中,CLIP的文本编码器被用作文本理解模块,是连接用户意图和图像生成的桥梁。

工作流程

1

文本输入

用户输入提示词(Prompt)

2

分词处理

CLIP分词器将文本转换为77个token序列

3

文本编码

CLIP文本编码器输出条件嵌入向量

4

Cross-Attention

嵌入向量通过注意力机制注入UNet的每一层

5

引导生成

文本嵌入引导图像朝着期望方向生成

不同SD版本使用的CLIP

模型CLIP版本嵌入维度特点
SD 1.5OpenAI CLIP ViT-L/14768最广泛使用
SD 2.0/2.1OpenCLIP ViT-H/141024更强的理解能力
SDXL双编码器2048最强文本理解
SD3T5 + CLIP ×3多编码器支持长提示词

Token限制与处理

CLIP文本编码器有77个token的限制,这是理解提示词工作机制的关键。

Token限制详解

为什么是77?

CLIP训练时使用的最大序列长度,包含1个[SOS]和1个[EOS]token,实际可用75个token。

短提示词处理

用0填充到77个token,填充部分不影响生成。

长提示词处理

截断到77个token,后面的词会被丢弃。建议将重要内容放在前面。

SD3的改进

SD3引入T5编码器,支持更长的提示词(最多77×3=231个token)。

⚠️ 提示词长度建议

虽然有77个token限制,但研究表明超过约75个词后,CLIP的理解能力会下降。建议将核心内容放在前面,保持提示词简洁有力。可以使用权重语法强调重要词汇。

进阶用法

文本反转(Textual Inversion)

通过训练新的token嵌入来表示特定概念:

原理

冻结CLIP其他参数,只训练一个新token的嵌入向量,使其代表特定概念。

应用

  • • 代表特定风格(如"油画风格")
  • • 代表特定角色或人物
  • • 代表特定物体或概念

使用

训练后保存为.pt或.safetensors文件,使用时加载到提示词中。

负面提示词机制

CLIP也支持负面提示词,这是控制生成结果的重要工具。

工作原理

正向嵌入引导图像向期望方向生成,负向嵌入则引导图像远离不想要的特征。

CFG公式

prediction = uncond + scale × (cond - uncond)

当使用负面提示词时,uncond被替换为negative embedding

常用负面词

low quality, blurry, distorted, bad anatomy, ugly, watermark, text, signature

Skip Layer CLIP

使用不同层的CLIP输出可以获得不同的效果:

CLIP_skip = 1(最后层)

标准输出,语义最完整,推荐默认使用

CLIP_skip = 2(倒数第二层)

更多细节信息,某些模型效果更好

更高skip值

可能获得不同的风格效果,但通常不稳定

加权提示词

通过语法调整词语权重:

(word:1.5)

增强该词的影响(1.5倍)

(word:0.8)

减弱该词的影响(0.8倍)

[word1|word2]

交替使用两个词(每步切换)

实用技巧

💡 CLIP实用技巧总结

  • 提示词顺序:重要的词放在前面,CLIP对前面的token更敏感
  • 简洁有力:75个词以内效果最佳,避免冗余描述
  • 使用CLIP Interrogator:分析喜欢的图片,学习其提示词结构
  • 调整CLIP_skip:某些模型skip=2效果更好,可以测试
  • 善用权重:用(word:weight)调整关键词的影响力
  • 使用Embedding:Textual Inversion可以保存特定概念
  • 负面提示词:合理使用负面词可以避免常见问题

常见问题

Q: 为什么同样的提示词在不同模型效果不同?

A: 不同模型使用不同版本的CLIP,嵌入维度和训练数据都有差异,需要针对特定模型优化提示词。

Q: 提示词超过77个token怎么办?

A: 使用SDXL或SD3支持更长提示词,或者精简提示词保留核心内容。也可以使用分段生成。

Q: 如何让模型理解特定概念?

A: 使用Textual Inversion训练embedding,或者使用LoRA微调模型。也可以在提示词中详细描述概念特征。

----