当文字遇见图像:CLIP
Radford, Kim, Hallacy, Ramesh, Goh, Agarwal, Sastry, Askell et al. · OpenAI · ICML 2021 · arXiv:2103.00020
你对 AI 说「画一只戴宇航头盔的柯基」,它真画得出来。文字是文字,像素是像素,两种完全不同的东西,凭什么互相听得懂?答案藏在这篇 2021 年的论文里。论文里的名字——对比学习、双编码器、零样本、余弦相似度——你一个都不用记。你只需要会一件事:看图说话。因为你看图说话的方式,就是 CLIP 的全部。
先来打个分
开始之前先玩个小游戏。左边一张简笔画,右边四句话。拖动每句话下面的滑块,给「这句话和这张图配不配」打分——0 分是风马牛不相及,100 分是天作之合。打完点「看 CLIP 怎么打」,没什么大不了的,凭直觉就行。
以前的看图机器:一份写死的菜单
传统的图像分类器像一个食堂窗口:出厂那天菜单就焊死了。经典的 ImageNet 模型认 1000 类,而为了教会它这 1000 类,人们动用了两万五千多名标注员,手工标了一千四百万张图。菜单之外的世界,它一个字都说不出来。下面这台老式分类器只认识三样东西:狗、猫、自行车。点击上面的四张图,把它们逐一喂进去——特别是月亮。
看到月亮的下场了吗?「自行车 51%」——圆的,像车轮。它没有说「以上都不是」的权利:softmax 逼着三个选项加起来等于 100%,菜单上没有的东西,它连错都错得理直气壮。旧分类器的知识焊死在输出层里:想加一道菜,就得重新标注几万张图、重新训练一遍。
然而与此同时,互联网上躺着几十亿张自带文字说明的图片——照片配的推文、商品配的描述、表情包配的吐槽。这些「免费标注」没人用得上,因为没人知道怎么拿嘈杂的句子代替干净的标签。OpenAI 的答案是:别学标签了,学打分。就是你在第一节干的那件事。
两座塔,一张地图
CLIP 的构造简单得让人意外,就两个零件,我们叫它们「塔」——塔就是把任何东西压成一个点的机器。图像塔(一个视觉网络)把一张图压成一个点;文本塔(一个 Transformer)把一句话压成一个点。点,其实是一串数字,也就是一个坐标。关键的一步在出口:两座塔的出口接到同一张地图上——同一个向量空间(真实的 CLIP 是 512 维,本文把它画成 2 维平面,不影响道理)。
从此,「这句话和这张图配不配」这个玄学问题,变成了小学几何题:量一下两个点挨得近不近。你在第一节打的分,就是 CLIP 量出来的距离换算成的分数。
然而刚出厂时,这张地图是一片混沌——两座塔的参数都是随机数,狗的图片可能正好落在「自行车」三个字旁边。怎么把秩序压进这张地图?这就轮到那四亿对图文上场了。
训练:配对的拉近,错配的推远
OpenAI 从网上采集了四亿对「图片 + 它的说明文字」,没有一张是人工标注的。训练时每一步抓一把配对进来——真实的 CLIP 一把抓 32768 对,我们画 4 对就够了——图片做行、文字做列,摆成一个格子阵,每一格填上打分。16 个格子里,只有对角线上的 4 格是真配对。先押注再动手:你猜,训练完成后这个格子阵会变成什么样?
想看一格拔河的真实算术?(可跳过,不影响后面)
以「狗的图片」这一行为例,它对三句文字的打分(余弦相似度)先除以一个可学习的「温度」来放大差距(除以温度 ≈ 乘上 100 左右),再做 softmax 变成比例:
| 狗的图片 × | 「狗」 | 「猫」 | 「自行车」 |
|---|---|---|---|
| 相似度 | 0.91 | 0.42 | 0.10 |
| softmax 后 | 0.99 | 0.01 | 0.00 |
训练目标(交叉熵)要求真配对那格的比例逼近 1——这就是「拉近」;由于比例总和是 1,别的格子只能被压下去——这就是「推远」。同样的计算再按列做一遍(每一列 = 这句文字在找它的图),两个方向的损失加起来求平均,所以叫「对称式」对比损失。整个训练没有一个人工标签,监督信号全部来自「这对图文本来就在同一个网页里」这个事实。
这场拔河在地图上留下了什么?回到第三节那张混沌的地图,亲眼看。
地图上的团圆
拖动训练进度条,盯住两种点:蓝点是图片,橙点是文字。每对图文之间牵了一根细线,注意线的长度:
训练前,狗的图片和「自行车」三个字不清不楚地挤在一起;拖到头,四个概念各占一角,每个角落里蓝点和橙点肩并肩站着。注意抱团的方式:不是图片一堆、文字一堆,而是按「意思」抱团——狗的图片挨着「狗」这个词,比挨着猫的图片还近。同一个意思,不管来自像素还是笔画,最后落在地图上同一个位置。这就是「共同空间」,多模态 AI 的地基。
地图很美,然而它能干活吗?现在做一件旧分类器做梦都不敢想的事:现场组装一个从没训练过的分类器。
零样本:菜单用嘴报
还记得第二节那份焊死的菜单吗?在 CLIP 这里,菜单是用嘴报的。做法直白得像作弊:把你想要的类别词包进一个句子模板——「一张{狗}的照片」——让文本塔把每个句子压成点,再让图像塔把考题图压成点,哪句话的点离图最近,图就属于哪一类。全程没有一秒钟训练,术语叫零样本(zero-shot)——「一张训练样本都不给」的意思。点击词条,随意增删菜单;再点一张图当考题。试试把「月亮」从菜单里删掉,再考它月亮:
玩出那个彩蛋了吗?菜单里没有「月亮」的时候,弯弯的月亮被判成了香蕉——形状上的相似是真实存在的,它诚实地选了地图上最近的那句话。这也暴露了零样本的边界:菜单可以随时改写,但它依然没有「以上都不是」——这一点 CLIP 和老式分类器一样诚实又一样嘴硬。但别忘了刚才发生了什么:你加一个类别只花了一次点击,旧世界里这个动作要花几万张标注图和一轮重新训练。类别菜单不再焊在模型里,而是写在提示词里。
等等——刚才我们悄悄把「狗」包装成了「一张狗的照片」。这层包装纸重要吗?非常重要,重要到论文专门写了一节。
会说话的人占便宜
CLIP 的老师是四亿条网图字幕,而没有谁给自家照片配一个孤零零的单词「dog」——人们写的是完整的句子。所以考试的时候,你的问法越像它见惯的字幕,它越懂你。同一张狗的简笔画,四种问法,从上到下逐个点击,看分数怎么变:
看那条爬升曲线:光秃秃的「狗」只有 0.58;套上「一张…的照片」升到 0.74;而「一张狗的简笔画」冲到 0.88——因为我们这张图本来就是简笔画,问法贴合了图的真实样子。再看最后一条:加了一句图里根本没有的「草地上」,分数反而跌回 0.66。这不是玩具的巧合:论文里,只是给 ImageNet 的类别名套上 "a photo of a {}",准确率就涨 1.3%;再把 80 种模板的结果取平均,又涨 3.5%。对模型说它训练时听惯的话——提示词工程(prompt engineering)不是 ChatGPT 时代的发明,它在这里出生。
零件全齐了:一张图文同居的地图、一场四亿回合的拔河、一份用嘴报的菜单、一套讨模型欢心的话术。这套东西上考场,到底考了多少分?
成绩单:零标注,平手
ImageNet 是看图界的高考。下面两根柱子,请注意它们吃掉的标注数据量:
零样本的 CLIP 追平了吃掉 128 万张人工标注图的有监督 ResNet-50——它自己连一张 ImageNet 的训练图都没见过,只是把 1000 个类别名念了一遍。而且换考卷时差距更狠:把 ImageNet 换成素描版、涂鸦版,背题出身的有监督模型成绩雪崩,CLIP 几乎不掉——它没背过这套题型,它见过的是整个互联网。在论文测的 27 个数据集上,零样本 CLIP 干脆赢下了其中 16 个的有监督基线。
坦白它的软肋更能说明它是什么:在 MNIST 手写数字上,零样本 CLIP 只有 88%,输给最土的像素逻辑回归——因为四亿张网图里几乎没人发手写数字。零标注追平有监督,不是因为它更聪明,而是因为它见过的世界大了几百倍;世界里没有的,它照样不会。
「见过」和「看懂」之间,还有一道缝。最后这个游乐场,专门用来把这道缝扒开。
最后,骗过它
你已经懂了 CLIP。现在菜单固定四项:苹果、狗、猫、iPod。随意组合下面的图和贴纸——试试给苹果贴上一张写着「iPod」的纸条。能让它认错,才说明你真的摸到了它的软肋:
骗过了吧?画面的 95% 依然是那只苹果,一张小纸条就让「iPod」反超。这不是我们玩具的杜撰——2021 年 OpenAI 自己解剖 CLIP 时发现了一模一样的把戏:给青苹果贴上手写的 "iPod",模型言之凿凿地说这是 iPod。原因恰恰是 CLIP 最得意的本事:网图里到处是文字(招牌、包装、截图),于是它学会了读图里的字,而写下来的「iPod」和拍出来的 iPod,在那张共同地图上住得太近了。它看得见一切相关性,但相关不等于理解——图文同居一个空间,是它的超能力,也是它的命门。
回想你这一路亲手做过的事:你给四句话打了分,然后发现这就是 CLIP 的全部工作;你把月亮喂给焊死的菜单,看它理直气壮地答错;你押注了对角线,看着 16 个格子在拔河里各归各位;你拖着地图从混沌走到团圆,蓝点和橙点肩并肩;你一次点击就给分类器加了道菜,又用一句「简笔画」多榨出 0.14 的分数;最后你用一张纸条骗过了它。这张你看着建成的地图,后来成了整个文生图时代的地基——Stable Diffusion 用 CLIP 的文本塔读你的提示词,DALL·E 2 的学名干脆就叫 unCLIP。今天你对 AI 说「一只戴宇航头盔的柯基」而它听得懂,是因为 CLIP 先教会了文字和图像住进同一张地图。而它的第一步,永远是你在第一节做的那件事:看着一张图和一句话,打一个分。