模型与参数

CLIP 模型:你的文字是怎么变成画面的

又称 clip, text encoder, 文本编码器, clip score, t5 编码器

CLIP 模型是一对编码器,一个读文字、一个读图像,训练目标是让一句描述和它对应的图落在同一个共享嵌入空间里的同一个位置。图像生成模型用的是它的文本编码器,把提示词变成能操纵生成过程的一串数字。

共享嵌入空间里放着什么

拿几亿组图文配对训练一个网络,配对的靠近就给奖励、不配对的靠近就罚,最后你会得到一件很有用的产物:一套坐标系,里面「黄金时刻」这个短语,就落在真实拍摄于黄金时刻的照片旁边。CLIP 模型给你的就是这套坐标系。

由此有两个结果。第一,你可以靠比较位置来量化一张图和一句描述的匹配程度,这就是基准测试和某些自动重排里用的 clip score。第二,也是你每天在用的那一半:文本编码器能把提示词变成一个向量,而生成模型知道怎么跟着它走。

提示词为什么是那副脾气

流传的大部分提示词玄学,其实都源自同一个性质。对比式训练奖励的是「大意对了」,所以编码器最终把一句话当成一袋带权重的概念,而不是一棵解析出来的语法树。三个常见症状都从这来。

  • 属性串味。 「黄色雨衣旁边一辆红色自行车」出来可能是红色雨衣。颜色都在嵌入里,只是绑定很松。
  • 否定失效。 「不要文字」「没有帽子」都是在往里加名词,不是在减。
  • 空间关系弱。 「在上面」「在后面」「在左边」经常互换,因为方位短语携带的信号量比物体本身小得多。
  • 同义堆叠没有加成。 把「超高清、8K、极致细节」并列写三个,模型看到的方向几乎是同一个。

真正有效的解法是「拆开」:一个主体只挂一个关键属性,主体数量压低,句子摆不平的事情交给模型自己的控件(反向提示词、权重语法、局部重绘再跑一遍)。

77 token 窗口,和取代它的东西

原版编码器读到第 77 个 token 就停。界面会替你把长提示词切段混合,所以在老权重上写两百词提示词,得到的往往是一个含糊的平均值,而不是一个精确的场景。

现在的旗舰模型基本已经翻篇。它们用 T5 编码器或者干脆用一个语言模型当文本编码器,有时再并行挂一个 CLIP 补视觉锚定。窗口从 77 个 token 拉到几百,编码器也真的有句法,所以写一句完整的话比写一串逗号分隔的 tag 更管用。如果你的提示词习惯是在 SD 1.5 上练出来的,这是最值得改掉的一条。

把编码器和生成器分开看

结果不对的时候,先判断是哪一半出的问题。内容跑偏,属性互换、从句被丢、方位词被无视,这是文本编码的问题,把提示词写短、把属性拆开就有救。内容对但画得差,手指糊成一团、材质发面、运动不稳,这是生成器和它训练数据的问题,提示词怎么改都白改。分清你面对的是哪一种,决定了你要跑三次测试还是三十次。

这个效果的提示词

一条能稳定出效果的起点。主体和场景可以换,技术性的那几句留着。

A woman in a yellow raincoat holding a green umbrella, standing beside a red bicycle, overcast afternoon light, 50mm

试一下:CLIP 模型

打开生成器,参数已经预填好。

常见问题

CLIP 是什么的缩写?
Contrastive Language-Image Pre-training,对比式图文预训练。关键词是「对比」:它在几亿组图文配对上训练,学的是把匹配的一对拉近、把不匹配的推远,而不是从一个固定类别表里给图打标签。
CLIP 模型会画图吗?
不会,它只负责读。文本编码器把提示词变成一个向量,真正画图的是另一个网络(U-Net 或扩散 Transformer),它一边生成一边参考这个向量。画糊了去怪 CLIP,是怪错了组件。
77 token 上限是怎么回事?
原版 CLIP 文本编码器只接 77 个 token,约六十个英文单词,超出的部分被静默丢弃。工具的绕法是把长提示词切段再做平均,这也是老模型上超长提示词越写越糊、而不是越写越细的原因。
为什么提示词里写「不要文字」「没有帽子」没用?
因为对比式训练出来的文本编码器对否定的把握很弱。这两句话都把「文字」和「帽子」这两个概念塞进了嵌入里,结果常常是你排除的东西照样出现。要排除就用反向提示词那个输入框,那里的排除是机制层面做的。
CLIP 模型和 T5 编码器有什么区别?
T5 是纯文本训练的语言模型,上下文窗口长得多,也真的懂句法。新一代图像模型用 T5 或 LLM 当编码器,有时和 CLIP 并行使用。实际差别是:完整句子和空间关系变得管用了,堆 tag 反而没那么重要。

相关术语