CLIP文本编码器
CLIP(Contrastive Language-Image Pre-training)是OpenAI开发的多模态模型,实现了文本和图像的联合表示。它是文本到图像生成中连接语言和视觉的桥梁,理解CLIP对于掌握AI绘画至关重要。
什么是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. 批次准备:取N个图文对(一个batch)
- 2. 独立编码:文本和图像分别通过各自的编码器
- 3. 相似度计算:计算所有文本-图像对的余弦相似度,形成N×N矩阵
- 4. 正负样本:对角线是正样本对(匹配的图文),其余N²-N个是负样本
- 5. 优化目标:最大化正样本相似度,最小化负样本相似度
为什么对比学习有效?
- • 自监督特性:无需人工标注,利用天然配对关系
- • 大量负样本:大batch size确保模型学习区分细微差异
- • 语义对齐:模型被迫学习真正的语义关联而非表面模式
训练方法
训练数据
CLIP在4亿个图文对上训练,数据来源广泛:
数据来源
- • 互联网图片及alt文本
- • 社交媒体图文内容
- • 产品图片和描述
- • 新闻图片和标题
数据处理
- • 过滤低质量配对
- • 平衡各类主题
- • 文本清洗和规范化
- • 图像resize到统一尺寸
训练细节
| 参数 | 值 | 说明 |
|---|---|---|
| Batch Size | 32,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的文本编码器被用作文本理解模块,是连接用户意图和图像生成的桥梁。
工作流程
文本输入
用户输入提示词(Prompt)
分词处理
CLIP分词器将文本转换为77个token序列
文本编码
CLIP文本编码器输出条件嵌入向量
Cross-Attention
嵌入向量通过注意力机制注入UNet的每一层
引导生成
文本嵌入引导图像朝着期望方向生成
不同SD版本使用的CLIP
| 模型 | CLIP版本 | 嵌入维度 | 特点 |
|---|---|---|---|
| SD 1.5 | OpenAI CLIP ViT-L/14 | 768 | 最广泛使用 |
| SD 2.0/2.1 | OpenCLIP ViT-H/14 | 1024 | 更强的理解能力 |
| SDXL | 双编码器 | 2048 | 最强文本理解 |
| SD3 | T5 + 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, signatureSkip 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微调模型。也可以在提示词中详细描述概念特征。