ViT · CLIP · SAM · GLIP · Stable Diffusion — 从视觉Transformer到扩散生成的完整知识体系
基于视频内容提炼的模型演进、时长分布、架构对比与核心流程
从ViT(2020)到SAM(2023),Transformer架构在视觉与多模态领域的关键里程碑
7个部分的视频时长(分钟)与对应字幕字数对比
从参数量、训练数据、零样本能力、多模态融合、开源度、工业落地六个维度对比
前向过程逐步加噪至纯噪声,反向过程在文本条件引导下逐步去噪生成图像
核心模型、关键技术与下游任务之间的关联关系
本讲是多模态入门的第一课,主题是 ViT(Vision Transformer,视觉 Transformer)模型初探。在此之前,如果你有一点计算机视觉(CV)的基础,就会知道:传统上我们做视觉任务,不管是 ResNet、VGG 还是 YOLO,底层用的都是 CNN(卷积神经网络)。而 ViT 这篇工作带来的最大冲击,就是彻底不用 CNN,完全用 Transformer 来做视觉。
老师在开篇就强调,别看这个方法"看起来简单",它实际上引领了一个新的时代。今天虽然以图像分类为例,但 Transformer 除了图片分类,还可以做图片生成、多模态理解、目标检测、图像分割等一系列任务。理解了 ViT,就拿到了通往整个多模态大模型世界的第一把钥匙——因为后面要讲的 CLIP、SAM 等模型,底层几乎都是同一套 Transformer 架构。
值得一提的是,ViT 的思想其实并不"新":它把 NLP(自然语言处理)领域早已成熟的 Transformer Encoder 直接搬到了图像领域。如果你对 NLP 很熟,就会觉得这张架构图异常亲切——现在 NLP 领域流行的各类大语言模型,底层技术组件都是 Transformer。ViT 做的事情,就是把这套原本只处理文字的组件,第一次系统性地用到了 CV 上。
在看整图之前,先把"一层 Transformer"拆开。回顾 Transformer Encoder 的经典结构:输入一个 Embedding 序列,先经过 LayerNorm(层归一化),然后进入它的核心——多头自注意力(Multi-Head Self-Attention, MSA);做完注意力之后,再经过一个小的 Dropout,接着 LayerNorm,然后接一个全连接的 MLP,再稍微 Dropout 一下。这一整套(Norm → MSA → 残差 → Norm → MLP → 残差)就是一层 Transformer。
老师特别提示:刚接触时觉得抽象很正常,等到写代码时很快就能建立直观感受。这里先记住几个关键部件的名字即可:多头自注意力(MSA)、MLP、LayerNorm、残差连接,后面看真实模型结构时会一一对应上。
ViT 用 Transformer 做图像分类的思路,本质上是把图像翻译成 Transformer 能读懂的序列。整体流程如下图所示。
从左到右看这张图:最左边是一张输入图像,首先被切分成若干个小方块(Patch);这些 Patch 经过一个 Linear Projection of Flattened Patches(展平后线性投影),变成一串粉色的向量;在这串向量的最前面,额外拼上一个可学习的 [class] token(图中带 0 的那个位置);再给每个位置加上 Position Embedding;于是就得到了一串"Patch + 位置 + 类别令牌"组成的向量序列。这串序列被送入多层堆叠的 Transformer Encoder,最后取出最前面那个 0 号位置的输出向量,通过一个 MLP Head 分类头,输出诸如 Class / Bird / Ball / Car 之类的类别。
老师在图旁反复强调一句话:"它全程整个模型没有用任何 CNN。" 从切分、编码到特征提取、分类,全部由 Transformer 完成——这正是 ViT 区别于以往所有视觉模型的根本所在。
第一步是图像切分。老师举了个具体例子:假设输入图像是 900×900,把它切成 3 行 3 列共 9 个方块,每个小方块就是 300×300。
这里有一个与 CNN 的关键区别需要特别注意:CNN 是有感受野的,相邻卷积窗口之间是有交集的;而 ViT 切出来的这些方块之间没有任何交集,是彼此独立的小块。
但是,每个 Patch 本质上还是一堆像素点。如果直接把一个 300×300 的像素块拉平成向量,那就是 300×300 = 9 万维的向量,维度实在太长了。所以 ViT 会再通过一个线性投影(乘一个权重矩阵 W),把这 9 万维的像素向量降维到一个固定的 D 维向量(也就是图里那串粉色向量)。这一步就是 Patch Embedding:既完成了图像切分,又把每个 Patch 压缩成 Transformer 友好的定长向量。
Transformer 本身有一个天生的缺点:它对位置并不敏感。也就是说,如果把这串 Patch 的顺序打乱、重新排列,Transformer 是察觉不出差异的——因为自注意力在计算时本身是"置换不变"的。但对图像而言,Patch 谁在上、谁在下、谁在左、谁在右,显然承载着重要的语义。
为此,ViT 会对每一个位置的 Patch 向量,再加上一个 Position Embedding(位置编码)。原理很直观:每个位置都对应一个可学习的位置向量,把它加到该位置的图像向量上;一旦位置发生变化,加出来的最终向量就会跟着变化,于是模型就"知道"了每个 Patch 原本在图中的位置。这样就克服了 Transformer 对位置不敏感的缺点。
位置编码具体怎么构造?老师在课上梳理了四类方法:
实际工程中能用的主要是 1-D 和 2-D 两种。一个有趣的细节是:2-D 位置编码虽然更"符合图像直觉",但最后发现它的效果其实并没有 1-D 好,所以 ViT 最终大量采用了把图像当成一维序列的 1-D 位置编码。老师评价:"这就是一个开山之作。"
除了 Patch 向量和位置编码,ViT 还会特别地在序列最前面再构造一个 0 号位置、一个特定的向量。这个向量不对应任何图像块,它专门用来代表整张图的分类特征,这就是 Class Token(分类令牌 / 可学习分类嵌入)。
串起上面所有部件后,我们就得到了一整串向量。把它送进多层堆叠的 Transformer Encoder,每一层都会输出一组新的向量。那么最终用哪个向量来代表这张图做分类呢?答案是:取最前面那个 0 号位置(即 Class Token 位置)的输出向量,把它作为整幅图像的代表,再通过一个 MLP(全连接层)映射到类别,得到最终的分类结果。这种"用一个特殊令牌吸收全局信息、最后拿它做判决"的做法,是 ViT 设计上的点睛之笔。
ViT 并非单一模型,而是有三个不同规模的版本:Base 版、Large 版和 Huge 版,它们的参数量依次递增。老师特意指出:虽然 Huge 听起来吓人,但如果你对 NLP 大模型有所了解就会发现,相比 NLP 那种动辄几个 G 参数的大模型,ViT 的参数其实已经小了很多。
在效果上,ViT 先在大规模的 JFT 数据集上做预训练,再迁移到 ImageNet 等标准分类数据集上微调。结果显示,它的效果已经能和 ResNet 等经典 CNN 模型非常接近。但要注意一个权衡:在效果接近的同时,ViT 的参数量其实比 ResNet 更大——也就是说,同等效果下,Transformer 要比 CNN 更费参数。老师借此提醒:比较模型时不能只看效果,还得对比参数量、计算量这些工程指标,面试时尤其如此。
老师用了一个很形象的比喻:汽车刚刚出现的时候,速度还不如马车,但汽车的发明依然是重大创新,因为它开创了一种全新的模式。 ViT 当时的效果只是"接近"ResNet,并未全面超越,但它代表了一个新方向。要理解这个新方向,就要把 Transformer 和 CNN 放到一起对比。
| 对比维度 | CNN(ResNet/VGG 等) | Transformer(ViT) |
|---|---|---|
| 感受野 | 局部感受野,每个位置只和周边信息交互;要建模远距离关系必须把网络做很深 | 第一层自注意力就能让图中相距很远的两个位置直接交互,全局特征建模更好 |
| 降维方式 | 需要配合池化(Pooling)不断降低特征维度 | 根本没有池化这个概念,分辨率/序列长度由 Patch 切分决定 |
| 参数利用 | 卷积核参数在整张图上滑动共享,相对省参数 | 参数不共享,参数量大,主要大在多头自注意力(MSA)部分 |
| 算力依赖 | 早年硬件即可支撑 | 计算量大,能落地依赖近年强大算力;2019 年后才真正兴起 |
| 多模态兼容 | 视觉用 CNN、文本用 Transformer,两套"基础栈"难以融合 | 视觉与文本都用 Transformer,天然同构,极易打通做多模态 |
关于"局部 vs 全局":CNN 每个位置的信息只能跟它周边的信息做交互,如果远处的两个信息要发生联系,就必须把网络堆得很深、靠一层一层传播来建立联系。而 Transformer 不一样——图中左上角和右下角这两块离得很远的区域,在第一次自注意力计算时就能直接建立全局联系,所以它的全局特征建模天然更强。
关于参数:CNN 每次卷积用的是同一组共享参数,所以相对节约;而 Transformer 的参数不能共享,参数量更大,并且参数主要大在 MSA(多头自注意力)这一块。也正因为如此,ViT 能在图像分类上实用化,背后离不开强大算力的支撑。老师特别强调一个规律:很多新方法其实很早就被提出来了,只是当年的硬件条件不支持,根本用不起来,直到算力发展到一定程度才真正爆发。
老师认为这篇论文之所以这么红,最大优势并不是单纯的分类精度,而是它让 CV 和 NLP 可以用同一套 Transformer 底座打通。Transformer 早已是 NLP 的标配——现在的各类大语言模型全是 Transformer。如果图像端还在用 CNN,那么"文本用 Transformer、图像用 CNN"两套基础栈要融合起来,就像"我用 Python 写代码、你用 Java 写代码,两个人的工程要 merge、联调,难度非常大"。而一旦图像也全部换成 Transformer,两边"编程语言一模一样",联调就非常容易,于是才能顺畅地做多模态、一起"搞大事情"。
那么现实中什么时候还用 CNN?老师给出的判断很务实:纯 CV 场景,仍然首选 CNN,因为 CNN 便宜、占用硬件资源少;但只要你要做多模态,基本上就得上 Transformer。这也是为什么本讲的主题不叫"图像分类",而叫"多模态"——ViT 在 CV 里起到的正是一个桥接两个模态的作用。
在代码演示中,老师先加载图像处理器:把像素值从 0~255 归一化到 0~1,并把图像 resize 到固定大小,这些都是视觉模型的标准预处理。随后加载预训练模型,放到 GPU 上推理:拿一张 COCO 数据集中的飞机图片,模型正确输出"飞机/航班";再换一张大象图片,模型细分为"印度象 / 亚洲象",分类相当准确。
打印模型结构后可以清楚地看到 ViT 的层级:最前面是 Patch Embedding;紧接着是 12 层串联在一起的 ViT Block(Transformer Encoder),每一层里面就是 Attention(自注意力)、全连接(MLP)、LayerNorm 等部件,和前面讲的结构一一对应;最后把 768 维的特征通过全连接层映射到 1000 类(ImageNet 的类别数)。这里老师还补充了一个细节:在图像自注意力里,Q、K、V 共用同一套向量,因为这是 self-attention。
在微调环节,老师以 CIFAR-100(100 类)为例讲了一个非常重要的迁移学习直觉:
训练门槛方面,老师提到这块模型并不大,消费级的 4090 显卡就能跑起来,而且 CV 模型对显存的要求普遍没有 NLP 那么高。演示中准确率从 0.46 一路爬到 0.64,最终在测试集上达到约 0.851,只训练了五六个小时。一个工程注意点:因为我们改动了模型结构(替换了分类头),训练后就不能再用 HuggingFace 自带的方式加载模型,而要用纯 PyTorch 的方式加载权重。
老师进一步把视野拓宽:Transformer 不只用于分类,在目标检测里也被大量使用,代表就是 DETR(课中以谐音提及)。它里面同样没有 CNN,虽然名字蹭了"DETR",但和传统 YOLOv5/YOLOv7 并没有任何关系。
它的处理方式和图像分类几乎一模一样:还是把图像切成很多 Patch,区别只在于最后解码时,要同时预测目标的类别和框的位置。但有一个新问题:分类时切成 9 块就输出 9+1=10 个结果,是一一对应的;而一张图里到底有几个目标是不确定的——可能是 10 个、也可能是 50 个,无法和 Patch 一一对应。为此 DETR 额外加入了 100 个可学习的"虚拟节点"(object queries),并默认一张图里被检测的目标不超过 100 个,每个虚拟节点负责预测一个目标的位置和类别。老师也客观评价:DETR 是在"逼近"YOLO,但毕竟 Transformer 才出现几年,还没办法和深耕多年的 CNN 硬扛——"汽车刚出现的时候,也是没有马车快的",它代表的是一种新方向。
课的最后,老师演示了多模态是怎么靠统一 Transformer 架构打通的:一张图片经过视觉 Transformer 变成一个向量,一段文字(如"一个小女孩靠着蓝色栅栏")经过标准的 NLP Transformer(BERT 类模型)也变成一个向量,然后求两个向量的相似度。但真正的"杀手锏"在于深度融合:把图像侧 Transformer 的输出注入到 NLP Transformer 里——借助 Attention 的 Q/K/V 三要素,让图像向量提供 K 和 V,文本向量作为 Q,用 Q 和 K 算出权重、再加权 V,于是文本侧就"注入"了视觉信息。正因为两边都是 Transformer、结构同构,这种融合才能做到无缝衔接;如果图像端是 CNN,这一步就会非常难办。
老师给出的结论非常明确:未来做 CV,不要再纯卷 CV 了——纯卷 CV 很难发文章、难出成果;一定要朝多模态方向走,而做多模态一定是 Transformer 的天下。 这也正是把 ViT 放在多模态入门第一课的原因。至于 ViT 原论文中还提供过一种 Hybrid(混合)架构——先用 CNN 主干(如 ResNet)提取出特征图,再把特征图切成 Patch 送入 Transformer——它可以看作 CNN 与 Transformer 过渡阶段的折中方案,但随着纯 Transformer 路线在大规模数据上被验证,主流逐渐统一到了纯 ViT 路线。
ViT 的核心思想可以一句话概括:把图像切成 Patch,线性投影成向量,加上位置编码和一个 Class Token,然后整串喂给标准 Transformer Encoder,最后取 Class Token 的输出做分类。它彻底抛弃了 CNN,用全局自注意力建模长距离依赖,代价是更费参数、更吃算力。它在分类精度上刚出现时只是"追平"ResNet,但其真正的历史意义在于:让视觉和 NLP 共享同一套 Transformer 底座,从而打通了多模态。工程上,微调时应冻结底层、只改高层与分类头;现实中纯视觉小任务仍可用便宜的 CNN,但一旦要做多模态,就必然是 Transformer 的天下。
本讲讲解 CLIP 模型。老师对它的评价极高,称它是一个"已经成为基座"的模型——今天各种多模态大模型的基础,几乎都建立在 CLIP 这类思路之上,因此它也是多模态入门绕不开的一课。
从表面上看,CLIP 做的事情仍然是图像分类,和 ResNet、VGG 这些经典分类模型好像区别不大。但一旦理解了它的原理,你就会惊叹于它强大的多模态能力:它能把图像信息和文本信息彻底打通。可以说,CLIP 正是对 ResNet、VGG 这些经典模型的一次"升级改造"——它精准地针对经典分类模型的几个固有痛点开刀。
要理解 CLIP 的巧妙,先得知道 VGG、CNN、ResNet 这类经典模型共同的"毛病"。课件把问题列得很清楚:
CLIP 的提出,正是为了系统性地解决这些问题。
CLIP 的本质是一种对比学习(Contrastive Learning)框架。它要做的事可以概括为:把文本和图像同时映射到同一个向量空间里,让"配对"的图文在空间中离得近、"不配对"的图文离得远。这就是所谓的图文对齐(Image-Text Alignment)。
一旦文本和图像被投射到了同一个共享空间,模型学到的就不再是"某几个固定类别",而是一种通用的图文匹配能力:它理解的是"图和文到底相不相似",而不是"这张图属于第几个类别"。这个视角的转变,正是后面一切优势(零样本、可扩展、泛化强)的根源。
CLIP 在结构上非常巧妙,它是一个典型的双塔(Two-Tower)架构。
两个塔分别是:
也就是说,CLIP 与其说是一个"具体模型",不如说更像一套框架:两个塔里面填什么骨干网络,并没有硬性规定,只要最后吐出来的向量维度一致、能在一起算相似度就行。
训练时,假设一个 BatchSize = N,里面有 N 个"文本-图像"对。每个文本对应一个向量,每个图像也对应一个向量,于是我们可以算出一个 N×N 的图文相似度矩阵。
关键在于标签从哪来:只有第 i 号文本和第 i 号图像才是真正配对的(它们本来就是同一个样本),所以相似度矩阵的对角线元素(I₁-T₁、I₂-T₂……)目标为 1;而所有非对角线元素(比如第 2 号文本说"这是只猫"、第 1 号图像是只狗)目标都为 0。
这和传统分类模型有本质区别:正负样本不是事先逐条人工标注好的,而是在一个 batch 内部自动构造出来的。我们事先只需要准备"文本-图像对"这种粗标注;至于谁是正样本、谁是负样本,靠"对角线配对"这个规则在 batch 里自动生成。又因为每个 batch 是随机采样的,所以构造出来的训练样本天然也具有随机性——老师认为这其实是好事:样本越随机、越多样,模型见过的东西就越丰富。
老师专门把"BatchSize 选多大"作为一个面试高频问题来讲,因为这里面有正负样本极度不平衡的考量。
实际中文微调时,老师把 BatchSize 取到了 200,正是为了在"负样本足够多"和"假负样本比例可控"之间取得平衡。
训练完成后,真正被训练的就是这两个 Encoder——目标是把文本和图像投射到同一个向量空间:图文匹配则向量距离近,不匹配则距离远。
在损失函数上,CLIP 用的是对比损失(InfoNCE 形式的对称交叉熵)。具体地,对前面那个 N×N 的相似度矩阵:一方面按"行"做 softmax,让每张图在 N 个文本中正确命中它配对的那一个(图像→文本方向);另一方面按"列"做 softmax,让每段文本在 N 张图中正确命中它配对的那一张(文本→图像方向);两个方向的交叉熵再求平均。老师在代码里也指出,损失函数最终就是要"逼"相似度矩阵收敛到对角线为 1、其余为 0的样子。
需要补充的一个细节是:在把相似度送入 softmax 之前,会除以一个可学习的温度系数 τ(temperature)。这个 τ 控制着相似度分布的"尖锐程度"——τ 越小,模型对相似度差异越敏感、越敢下判断;τ 越大,分布越平滑。它是 CLIP 训练中一个重要的可调/可学习参数。
训练好之后怎么用?这是 CLIP 最惊艳的部分。假设现在给一张摩托车的图片,要判断它属于哪一类。我们不再让模型直接输出类别,而是:
演示中,摩托车图片在"一辆黑色摩托车"这条文本上的相似度几乎为 1,而在另一条毫不相干的文本上概率极低,于是被正确分类。
这个做法的革命性在于:训练时哪怕只见过 1000 类,推理时你想填什么类别就填什么类别,完全不受训练类别限制。你甚至可以输入一个训练时根本没出现过的新概念——比如"独角兽"——模型仍可能给出一个相对较高的得分(它大致能联想到"一只脚的马")。这就是所谓的零样本分类(Zero-Shot Classification)。老师一语点破本质:CLIP 是把"分类问题"转化成了"检索/匹配问题"——不再是从固定标签表里选一个,而是从任意一堆文本描述里检索最匹配的那个。
既然零样本分类依赖"人工写的类别描述",那描述写得好不好,就直接影响效果。这就是 Prompt Engineering(提示模板工程)的由来。CLIP 论文里常用的提示模板是 "a photo of a {label}"——把具体类别词(如 dog、airplane、car)填进这个模板里,而不是孤零零地只给一个单词。
背后的原因是 CLIP 的训练数据来自"网页图文对",训练时见到的文本大多是完整的句子式描述,而不是孤立标签。所以推理时用"一张……的照片"这种句式去贴合训练分布,识别效果会比直接扔一个词好得多。在后面做中文适配时,这套"把类别词套进自然语言模板"的思路同样适用。
老师把 CLIP 和经典 ResNet 拉出来做了对比,结论非常有说服力:
在 17 个数据集上的 PK 中,CLIP 大部分情况下都超过 ResNet。最值得强调的是:CLIP 是完全零样本——它在这些新数据集上根本不做任何训练,就能赢;而 ResNet 还得在新数据集上专门微调,结果微调完都打不过 CLIP 的零样本。这直观证明了 CLIP 极强的泛化能力。
老师把这种泛化能力的工程价值讲得很接地气:如果你在公司给老板做分类项目,直接下载一个 ResNet,很可能公司的业务类别和 ImageNet 差别巨大,你只能辛苦地自己标数据、微调;而用 CLIP 这种泛化强、又支持新类别扩展的模型,往往能很快地把问题解决掉。
大模型推理普遍偏慢,但 CLIP 的双塔结构带来一个工程红利:候选文本(甚至候选图库)的向量完全可以提前离线算好并缓存。真正上线时,来了一张新图,只需要现场算一次图像向量,再和已缓存的文本向量求一次相似度即可。把最耗时的"编码"环节全部离线化,在线环节就只剩下一次轻量的相似度计算,延迟大大降低——这是 ResNet 那种"直接出类别"的模型所不具备的。老师还分享:团队正是基于对 CLIP 的改造,在第三届人工智能大赛(厦门)中靠图文匹配任务拿了二等奖。
打印 CLIP 的模型结构可以看到,它分成两块:文本模块是一个典型的 self-attention 结构,约 12 层 Transformer(类似 GPT/BERT),最后输出一个 768 维向量;视觉模块同样是一个 Transformer,最后也输出 768 维向量。也就是说,文本塔和图像塔全都是 Transformer 架构——这再次印证了上一讲的观点:做多模态时,大量模型已经不用 CNN、全都转向 Transformer,就是因为它和 NLP 天然好结合。单论图像识别,CNN 并不输给 Transformer;但论"跨模态结合能力",Transformer 明显更强。
老师还演示了把英文 CLIP 适配到中文的过程。问题在于:从 HuggingFace 下载的原版 CLIP 是为英文训练的,而我们日常要用中文。适配时有一个关键判断——只是语言换了,图像特征并没有变。所以微调时应当冻结住图像 Encoder,只训练文本 Encoder:图像那侧已经学好的视觉特征不需要动,只要让文本侧学会"用中文描述去对齐这些已经学好的图像特征"即可。训练同样走标准 PyTorch 流程,BatchSize 取 200,损失就是前面讲的 CLIP 对比损失。
效果上,老师用"正样本得分减去错误匹配得分"作为指标:微调前,原生英文 CLIP 在中文上这个值平均只高出约 0.29;经过中文微调后,这个得分平均高出约 0.6,中文对齐能力明显增强。
老师总结 CLIP 强大的两个核心原因(也是面试重点):
但 CLIP 并非完美,老师也客观列出了它的局限——这些局限本身就是很好的论文改进方向:
| 局限 | 具体表现 |
|---|---|
| 仍打不过专用监督模型 | 它只是比 ResNet 好,但在很多任务上仍干不过专门微调过的传统分类模型;毕竟是零样本学习,具体业务上仍有调优空间 |
| 细粒度分类能力弱 | "这是花、这是车"没问题,但要区分牡丹/玫瑰/月季、奔驰/宝马这类过于细分的系列就搞不定,特征相对粗糙 |
| 分布漂移/OCR 场景差 | 当推理场景数据与训练数据差异很大时(如 OCR,每个人字体差异都很大),效果会明显下降 |
| 文本理解能力有限 | 面对新概念、新词汇,尤其是网络用语,它理解不了;文本侧能力还不够强 |
| 训练数据"脏" | 图文对来自网络图搜(类似百度图片搜索),越往后相关性越差、数据越脏;很多视觉内容(如内涵图/meme)根本没法用一句话讲清楚,CLIP 处理不了 |
关于结构灵活性,老师还回答了一个常见疑问:两个 Encoder 的结构不需要相同、可以完全独立——下面用 CNN、上面用 BERT 都没问题,唯一要求是两边最后输出的向量维度一致、能在一起算相似度。正是这种灵活性,让 CLIP 更像一套可拼装的框架。老师也展望:文本侧的这些短板,未来很可能通过接入大语言模型(如 Llama 一类)来解决,这也是一个值得做的研究方向。
CLIP 用一个双塔对比学习框架解决了经典监督分类模型的痛点:文本塔(BERT/GPT)和图像塔(ResNet/ViT)各自编码,在一个 batch 内以"对角线为正、其余为负"自动构造样本,用对称交叉熵(含温度系数 τ)把图文对齐到同一向量空间。它的革命性在于把分类变成了检索/匹配:推理时用 "a photo of a {label}" 这类提示模板,即可对任意新类别做零样本分类,泛化能力远超需要微调的 ResNet,还能离线预计算向量、支持图文检索。它的软肋是细粒度分类弱、分布漂移/OCR 差、文本理解有限、训练数据偏脏——但瑕不掩瑜,CLIP 已成为几乎所有现代多模态模型的基座。
什么是多模态?多模态指的是图像、视频、文字等不同的信息表征形式。我们希望通过同一套模型,把图像、文字、视频全部融合在一起——给一张图片让模型判断它和某段文字是否匹配,给一段文字让模型生成对应的图片,或者反过来给一张图片生成文字描述。这些都属于多模态大模型的范畴。
近年来,NLP(自然语言处理)和 CV(计算机视觉)都在朝着多模态方向演进,而且两条路最终都走通了,真正实现了"殊途同归"。多模态大模型的基本结构并不神秘,其基石仍然是 Transformer。Transformer 的核心就是多头注意力(Multi-Head Attention)和 MLP(多层感知机)。从 BERT 到 GPT-3、GPT-4,都是这个结构在起作用。这很像芯片的制造——最基础的就是与门和非门两个逻辑单元,但不断叠加组合之后,就能形成运算能力超强的芯片。大模型也是同样的套路:用一个最简单的 Transformer 结构不断叠加,形成一个非常大的模型来解决非常多的问题。
Transformer 原本是 NLP 领域的标配结构。在 NLP 中,输入是词向量(Word Embedding),每个词对应一个向量。那么如何把 Transformer 用到 CV 中呢?关键在于:只要把图像也转成向量的形式,输入给 Transformer,就可以用它来做 CV 了。这正是 ViT(Vision Transformer)的核心突破。
AI 本身并不分什么 NLP 和 CV。之所以现在会分,只是因为技术还达不到通用智能的水平,所以把文本和图像分开来各自研究。通过 Transformer 这个结构,NLP 和 CV 实际上已经被统一起来了。以后再过几年,NLP 和 CV 可能都不存在了,一上来就是多模态大模型。
ViT 是 Facebook 提出的经典模型。它的做法非常直接:
ViT 最牛的地方在于:它完全没有用 CNN。在 CV 领域,以前所有的模型——ResNet、VGG 等等——都离不开 CNN。而 ViT 用 Transformer 直接把 CNN 取代了,并且和以前 CNN 那些模型打成平手。这就证明了一件事:不需要 CNN,用 Transformer 也能做 CV。而 Transformer 是 NLP 的标配,这就意味着靠 Transformer 这个结构,可以把 CV 和 NLP 统一起来。
既然 Transformer 可以做图像分类,那能不能做目标检测呢?答案是肯定的。CV 中目标检测的主流技术是 YOLO,它本质上分成两个模块:一个是主干模型(Backbone,用各种 CNN 如 Darknet、ResNet、VGG 提取特征),另一个是检测头。
用 Transformer 做目标检测的思路是:一张图片分成很多小区域后经过多层 Transformer Encoder 提取特征,然后在 Decoder 阶段,模型假设图片中最多有 100 个目标,每个候选目标位置对应一个向量,通过 Transformer 的 Encoder-Decoder 结构进行解码(这很像 T5 或 BART 这类序列到序列模型)。解码完成后,每个预测位置输出三个东西:是否有目标、目标的类别、目标的位置框。这样就用 Transformer 完成了目标检测任务。
这类模型进一步证明了:通过 Transformer 结构可以取代 CNN。做 CV 的时候直接用 NLP 的技术就可以了。从本质上说,AI 不分 NLP 和 CV,这种区分只是历史阶段性的产物——因为之前技术不够,做这两件事各有各的困难,所以分成两拨人各自攻关。但最后发现这两个东西本质上是一回事,就统一了。
前面讲的 ViT 和 DETR 本质上还是单模态任务(纯图像),只是用了 NLP 的方法。而图文匹配是真正的多模态任务——给一张图和一段文本,判断这两者是否匹配。
CLIP(Contrastive Language-Image Pre-training)的框架非常经典:
这本质上是一个度量学习问题。当 N 较大时,负样本数量远多于正样本,存在正负样本不均衡的问题。为了解决这个问题,不需要对所有负样本都训练,而是应该采集困难负样本——即那些相似度较高、模型不太好区分的负样本。这就像考完试后把做错的题再复习一遍,哪里不行补哪里。如果某些负样本已经能很好区分了,就没必要再花精力训练。
CLIP 最大的优点是它的零样本(Zero-Shot)泛化能力。用传统方法(如 ResNet)做图像分类时,假设你分 100 个类,模型预测时只能在这 100 个类里面选。如果来了一个不在这 100 个类里的新物种(比如狮虎兽——狮子和老虎杂交的后代),ResNet 就分不出来,因为它的输出层固定了 100 个类别。
而 CLIP 完全不同。它有一个文字 Encoder,你输入任何文字,它都能生成对应的向量。把候选类别的名称套入一个模板句子(比如"这张照片是一张{}的照片"),通过文字 Encoder 生成 N 个类别向量,然后和图片向量算余弦距离,找最近的那个就是分类结果。如果来了一个狮虎兽,你只要在候选里写上"狮虎兽",它一样能生成对应的向量,而且这个向量会介于老虎(Tiger)和狮子(Lion)之间,模型照样能正确匹配。
这背后的关键差异是:ResNet 并不理解类别的名称到底是什么——"汽车""狗"这些标签对它来说只是编号,训练时并没有用到文字本身的语义信息。而 CLIP 真正用到了文字的语义信息,所以它能泛化到训练时没见过的新类别。实验表明,CLIP 在标准图片上和 ResNet 打平,但在卡通、素描等非标准网络图片上,准确率远超 ResNet——后者会迅速下降,而 CLIP 的泛化能力依然很强。
CLIP 的本质优势不在于网络结构有多复杂,而在于它把文字的语义信息引入了视觉模型。传统分类模型只是在做标定——"这东西是第 37 类",它并不理解"37"对应的是什么。而 CLIP 让模型真正理解了"猫""狗"这些词的含义,因此才能面对全新的类别时依然做出正确判断。这正是多模态预训练的威力。
文本生成图片(Text-to-Image)是另一个经典的多模态任务。它的训练分为两个阶段:
Stage 1:图像 Token 化(无损压缩)。把一张图片通过一个编码器编码成一个向量(即 Token),这个向量类似于 NLP 中的一个单词。然后再通过解码器把这个 Token 恢复成一张图片。这看似是"白折腾"——编码了又解码回来——但意义在于:原图有非常巨大的表示空间(200×200 的图片,每个像素 3 通道各 256 种取值,可能的组合数是 256³ 的天文数字),而压缩后的 Token 只有几千到几万维。这就是在做图像的压缩与特征提取——希望这个 Token 能够无损地代表图片信息。训练目标就是让恢复出的图片和原始图片的 L2 距离越小越好。
Stage 2:自回归生成。有了图像编码器之后,任意图片都可以被编码成一系列 Token(当作单词看待)。然后训练一个类似 GPT 的自回归语言模型:输入一段文字描述(如"戴黑色贝雷帽的狗"),让这个模型预测出对应的图像 Token 序列。训练时需要的标签就是"一张图片对应的文字描述"——只要图片和文字是匹配的对就行。
推理时,输入一段文字,通过训练好的自回归模型按概率采样预测出多个可能的图像 Token 组合(因为 GPT 式模型每个 Token 都带有概率分布,可以用 Beam Search、Top-k、Top-p、贪心等多种解码策略采样),每个 Token 序列通过 Stage 1 的解码器还原成图片,再用 CLIP 计算图片和文字的相似度,把相似度最高的(或按概率采样)选出来作为最终生成结果。这种架构也可以反过来做图生文——输入图片的 Token,用另一个方向的 GPT 预测文字描述。
BridgeTower 是另一种典型的图文匹配模型。它使用标准的 Transformer 结构,左边处理文字、右边处理图片,在做 Token 的过程中,文字会用到图片的信息,图片也会用到文字的信息,通过 Cross-Attention 层层迭代,最后做一个 0-1 的图文匹配二分类。
而 GPT-4 相比 GPT-3 最大的突破就是支持图文混合输入。GPT-3 只能输入文字,而 GPT-4 可以直接甩一张图片上去,然后问它"这张图有什么可笑之处"。它的做法是把图片也转成 Token(或向量),和文字 Token 拼在一起,像正常 GPT 一样进行训练和推理。图文融合有两种方式:一种是文字 Token 加图像 Token,另一种是文字 Embedding 加图像 Embedding。不管哪种方式,最终都是以向量形式输入给 Transformer——Token 和向量之间本质上就是一个映射关系。GPT-4 能够理解图片的内容,比如发现一个人把显示器的线当成手机充电线插到手机上这种不符合常理的事情,这就是多模态大模型的能力体现。
整体而言,多模态大模型做了两件事:一是把图像转成 Token(或向量),二是把这些 Token 直接输入 Transformer。这样就能完成图像和文字的匹配、理解、生成等各种任务。NLP 和 CV 的区分只是历史阶段性的产物,从 Transformer 出现之后,这两条路又开始殊途同归了。与其说"多模态",不如说 NLP 把 CV 给吸收了——就像两家公司合并,NLP 是大股东。
本章围绕"Transformer 如何一统 NLP 和 CV"这一主线展开:ViT 首次证明了纯 Transformer 架构(不依赖 CNN)可以在图像分类上与 CNN 打成平手,核心在于把图像切成 Patch 后线性投影为词向量,加上位置编码和 [ CLS ] 标记即可复用 BERT 式架构;DETR 进一步把 Transformer Encoder-Decoder 用到目标检测,用集合预测取代了 anchor 设计;CLIP 通过大规模图文对比学习实现了零样本分类,其关键优势在于真正利用了文字语义而非简单类别编号;文本生成图片采用两阶段范式(先 VQ 式图像 Token 化,再 GPT 式自回归生成 + CLIP 重排序);最终 GPT-4 证明了图文混合输入的大模型已经可以理解图像内容。从 ViT 到 CLIP 再到 GPT-4,贯穿始终的技术逻辑就是:把一切模态都变成向量,然后交给 Transformer。
SAM 的全称是 Segment Anything Model(分割一切模型),来源于 Meta AI(Facebook)在 2023 年 4 月发布的一篇论文。学术圈有个潜规则:论文标题越简单越牛逼,大道至简——"分割一切"这四个字本身就彰显了野心。SAM 的出现让大家看到了希望:视觉大模型很可能也会诞生一个类似于 ChatGPT 那样的里程碑式产品。虽然视觉大模型出现得更早(ResNet、ViT 都先于语言大模型),但论发展速度反而是 NLP 后来居上——因为 NLP 的互联网文本数据量极其庞大。SAM 标志着视觉大模型开始步步紧追。
SAM 做的任务是图像分割——给一张图片,把图片中的各个区域一个个挑出来。它最令人震撼的地方在于:你上传一张随便拍的照片(比如讲师演示时上传了一张特朗普的照片),用鼠标在不同位置点一下——点在美国国旗上,国旗就被精确抠出来了;点在脸上,人脸就出来了;点在话筒上、衣服上、窗户上、甚至背景的汉字上,都能被分割出来。而且它的速度极快,基本是实时交互的。最关键的是:它可以对训练时没见过的东西也进行强有力的分割,这才是它"分割一切"的真正含义。
在讲 SAM 之前,先回顾一下计算机视觉的四大任务技术路线:目标分割 → 目标检测 → 目标识别 → 目标跟踪。目标分割是像素级地对前景和背景进行分类,把背景剔除;目标检测是定位目标、确定位置和大小(如 YOLO 画方框);目标识别是定性地判断目标是什么;目标跟踪则是在视频中追踪目标的运动轨迹(如体育赛事中追踪球员)。
分割任务的发展经历了几个阶段:
这种"训练时没见过就用不了"的问题,在企业落地时尤其痛:公司的数据往往很特殊,拿了模型也不好直接用;找人标注又贵又没人愿意标。所以现在行业迫切需要零样本学习(Zero-Shot Transfer)——实验室里训练好的模型,拿到公司场景直接就能用,几乎不需要额外标注数据。SAM 对标 ChatGPT 的核心就在于它突破了两件事:零样本泛化和提示机制(Promptable)。
SAM 要实现零样本泛化,需要回答三个问题,对应三个设计出发点:
四种提示方式中,点提示(Point)就是鼠标点一个或多个位置;框提示(Box)是画一个矩形框;掩码提示(Mask)是涂一块区域(本质上是密集点的集合);文本提示(Text)是最酷的——比如输入"帮我找一只黑色耳朵的猫",它就直接把那只猫框出来。不过目前文本提示功能还不太成熟,没有完全开源;点、框、掩码三种通过图像交互的方式已经开源了。
SAM 的模型结构分成三个核心组件:
(1)图像编码器(Image Encoder):对输入图像进行特征提取。传统做法通常用 CNN,但 SAM 这里用的是 ViT(Vision Transformer)。为什么不用 CNN 而用 Transformer?因为最终要做特征融合和多模态交互。如果只是单纯处理图像,CNN 没问题;但如果要和提示等其他模态融合,用 Transformer 这种通用性接口更好——就像手机充电器,用通用接口(Type-C)才能混用。Transformer 已经成为不管 NLP 还是 CV 的事实标准。当然,如果是做传统视觉任务,CNN 依然有性能优势。
(2)提示编码器(Prompt Encoder):把各种形式的提示全部编码成向量序列(Vector Token)。具体来说:
这几种提示可以同时输入——你既给点、又给框、又给文本,一股脑塞进去,最终都统一为向量序列。
(3)掩码解码器(Mask Decoder):这是一个轻量级的 Transformer 解码器。它接收图像特征(来自 Image Encoder)和提示特征(来自 Prompt Encoder),外加一个可学习的输出 Token(表示目标特征)。通过多层双向注意力机制进行特征融合:先让目标 Token 自注意力,再让提示 Token 作为 Query 去和图像特征做交叉注意力(图像特征做 Key 和 Value),然后反过来让图像特征做 Query、提示 Token 做 Key-Value 再做一次注意力。这样融合后,图像特征里融入了提示信息,提示特征里也融入了图像信息。最后通过两次卷积把图像尺寸恢复回来,输出一张与原图同尺寸的掩码图——每个像素点都带一个得分,表示该像素属于分割目标的概率(比如剪刀上的像素趋向于 0.99,背景趋向于 0.01)。
你点一个点,SAM 不会只给一个结果,而是给三个候选 Mask。这是因为物体之间存在遮挡和嵌套关系——比如一个人穿了衣服,你点在衣服上,模型其实不确定你是想分割衣服还是整个人。所以它同时给出多个可能:比如点在剪刀上,它可能输出(a)整个一把剪刀,(b)剪刀的两个指环部分,(c)剪刀的一个指环部分。三个结果中每个都附带一个 IoU(Intersection over Union)得分,表示预测掩码与目标掩码的交并比——交集越大得分越高,1.0 就是完全准确。训练时只有 IoU 最高的那个结果参与反向传播,其他差得远的直接忽略("只训练好学生"),这样做是为了加快收敛速度。
SAM 使用两种损失函数:
IoU 损失:真实掩码和预测掩码的交集除以并集,取对数后取负。交集越大损失越小,这是一种几何损失函数,在目标检测(如 YOLO)中也广泛使用。
Focal Loss:分割任务面临一个严重的问题——类别极度不均衡。比如一张 100×50 的图片有 5000 个像素点,但属于剪刀的可能只有 200 个,剩下 4800 个都是背景。如果用传统二分类交叉熵损失,大量简单负样本(背景)会主导梯度,模型很难学到好的参数。Focal Loss 在标准交叉熵基础上加了一个调制因子 (1−p)^γ:γ=0 时就是普通交叉熵;γ 越大,越聚焦于难分的样本。例如 γ=2 时,一个预测概率为 0.1 的难样本权重是 0.01,而预测概率为 0.5 的样本权重是 0.25——难样本的权重被放大了 25 倍,从而把训练重心放在难分样本上。这也不是 SAM 的首创,而是借鉴了已有的解决类别不均衡的经典技术。
SAM 真正强的地方不仅在于模型架构——它的架构其实更像是"现有技术的大杂烩"(ViT 提特征、CLIP 处理文本、标准注意力机制、标准图像分割损失),而是在于它通过巧妙的设计把这些技术整合起来,并构建了一套自动化数据引擎,最终搞出了 11 亿个高质量掩码。
| 阶段 | 方式 | 做法 |
|---|---|---|
| 第一阶段:辅助手动 | 人工修正 | 先用小规模数据集训练一个粗糙版 SAM,用它标注新数据,人工修正后重新训练模型,反复迭代。模型越来越好,数据越来越多。 |
| 第二阶段:半自动 | 人工补漏 | 用训练好的 SAM 自动分割数据,把模型能分好的保留,分不出来的困难样本交给人工标注,标完再重新训练。这一阶段主要提升模型的召回率——准确率够了但可能漏了很多,人工补上漏网之鱼。 |
| 第三阶段:全自动 | 规则筛选 | 用训练好的 SAM 在新图像上自动分割,通过预设规则(IoU 要足够高、置信度要足够高)筛选出高质量结果作为训练样本,再重新训练模型。此时完全不需要人工。 |
最终,这套数据引擎对 1100 万张图像总共生成了 11 亿(1.1B)个高质量掩码,这就是著名的 SA-1B 数据集。这个过程很像郭靖的"左脚踩右脚向天飞"——模型是左脚,数据是右脚,互相踩着越飞越高。前两个阶段因为模型还不够准,需要人工辅助一下;到了第三阶段模型足够准了,就可以大规模自动化标注了。对于想要做零样本泛化的大模型来说,高质量数据极其重要,而纯人工标注成本太高,所以打造一个好的数据引擎是非常必要的。论文中还提到一个"歧义感知模型"(具体实现未开源),它的作用是判断标注点是否有歧义——比如点在"人穿衣服"的衣服位置,搞不清是指人还是指衣服,歧义就大;而点在美国国旗上,歧义就小。系统会尽量选择那些没有歧义的点作为标准标注结果。
SAM 并不是万能的,它也有几个明显的局限:
SAM 自 2023 年 4 月发布后不到半年,就已经催生了大量应用场景:
这些应用大多还处于探索阶段,但一篇论文发布不到半年就能衍生出这么多可能性,说明 SAM 能引发的场景是无穷的。虽然现在就说它是"CV 领域的 ChatGPT"可能还早了一点,但这确实是一个明确的趋势——它是文本和图像结合的重要节点,也是多模态大模型发展的里程碑。
SAM 之所以重要,不是因为它发明了什么全新的网络结构——恰恰相反,它的每个组件(ViT、CLIP、注意力、Focal Loss、IoU Loss)都是已有技术。它的真正创新在于:提出了"可提示分割"这个通用任务范式,并通过一个三阶段数据引擎把模型和数据互相迭代滚雪球,最终用 11 亿掩码训练出了一个零样本泛化的视觉基础模型。这和 NLP 领域 GPT 的成功逻辑一脉相承——大规模多样化数据 + 通用提示接口 + Transformer 架构 = 基础模型。
SAM(Segment Anything Model)是 Meta AI 于 2023 年 4 月发布的视觉分割基础模型。它的核心贡献在于:第一,定义了可提示分割任务——支持点、框、掩码、文本四种提示方式,用户可以通过自然交互指定要分割的物体;第二,设计了三组件架构——ViT 图像编码器负责特征提取、提示编码器把各种 Prompt 统一编码为向量序列、轻量 Transformer 解码器通过交叉注意力融合图像与提示特征并输出逐像素掩码概率;第三,构建了三阶段数据引擎(人工辅助→半自动补漏→全自动规则筛选),滚雪球式地从 1100 万张图像中产出 11 亿个高质量掩码,即 SA-1B 数据集。训练中使用 IoU 损失和 Focal Loss 解决分割任务的类别极度不均衡问题,每个提示输出三个候选掩码以应对物体嵌套遮挡。SAM 实现了 CV 领域梦寐以求的零样本泛化——对从未见过的物体也能准确分割,被视为视觉大模型对标 ChatGPT 的重要里程碑。
本章节的主角是 GLIP(Grounded Language-Image Pre-training,接地语言-图像预训练),它是当年刚发布不久、思路非常新的一个计算机视觉模型。它的表面任务和经典做法一样——做目标检测,但卢菁老师在开篇就特别强调:GLIP 与大家熟悉的 YOLO 那一套之间"最主要是差异,不是差距",意思是它的整体思路完全换了一条赛道,而不是在老路上做得更准一点。
为了把 GLIP 讲清楚,课程先用两讲的篇幅做技术铺垫:先回顾 Transformer 是如何从 NLP 被"搬"到计算机视觉的(ViT),再讲两条用 Transformer 做目标检测的路线(YOLOS 与 DETR),指出它们共同的致命缺陷——必须事先知道所有类别;最后才引出 GLIP,看它是如何通过"把分类问题重新定义为短语接地(Phrase Grounding)匹配问题",一举实现开放词汇、零样本(zero-shot)检测的。这也是 GLIP 被称为"目标检测新范式"的原因。
在经典的计算机视觉里,不管是做图像分类还是目标检测,大家用的都是 CNN 那一脉(ResNet、VGG 等)。但卢老师指出,游戏规则已经开始变化:在多模态领域、以及最近的 CV 大模型里,大量使用了一个源自 NLP 的技术——Transformer,来做视觉。
这样做的最大好处并不是"视觉精度立刻涨多少",而是:CV 和 NLP 从此具备了共同的对话基础。既然两边都用 Transformer 作为底座,做多模态融合时就有了统一的建模语言,文本编码器和图像编码器可以天然地放在一起交互。这正是后面 CLIP、GLIP 这类图文统一模型能够成立的前提。
用 Transformer 做视觉,最经典的入门工作就是 Facebook(Meta)提出的 ViT(Vision Transformer)。它的做法非常"暴力美学":
卢老师特别点评了 ViT 的实际效果:它在 ImageNet 等基准上"只能说是在无限地逼近 CNN,但可能还是超过不了 CNN",而且计算量偏大。那为什么还要用它?原因就在于前面说的——它能和 NLP 很好地结合,这是 CNN 给不了的红利。课程还给出了 ViT 不同规模(ViT-Base / Large / Huge)的参数量配置,以及在多个分类基准上与 BiT-L、Noisy Student 等 CNN 骨干的对比表,可以看到 ViT-Huge 在大规模预训练数据(JFT)加持下才逐渐追上甚至反超。
目标检测是个经典任务:给一张图,既要框出物体的位置(一个矩形框),又要判断框里是什么类别。经典方案大家耳熟能详——YOLO v1 一路到 YOLO v7。下面两条 Transformer 路线虽然也带"YOLO"的名字,但卢老师笑着提醒:"它虽然也叫 YOLO,但其实跟之前的已经没有半毛钱关系了,整体思路完全改变了。"
YOLOS(You Only Look at One Sequence)是华中科技大学 2021 年的工作,完全由中国学者做出。它的流程是:
关键点:YOLOS 完全不用 CNN,特征提取、交互、检测头全部由纯 Transformer 完成;它是一个纯 encoder 架构。
另一条路线是 DETR(DEtection TRansformer)。它的思路和 YOLOS"基本上是差不多的",差别只在两点:第一,DETR 先用一个 CNN 提取一部分图像特征,再把特征和位置向量加起来送入 Transformer;第二,DETR 采用 encoder + decoder 的双塔架构,而 YOLOS 是纯 encoder。两者共同强调的一点是:用 Transformer 来做目标检测,从而天然具备和 NLP 结合的能力。
无论是 YOLOS 还是 DETR,都有一个共同的致命缺点:必须事先知道所有类别。如果训练时用的是 COCO 数据集(80 类),那部署时就只能检测这 80 类;一旦出现第 81 类,模型直接检测不出来。这在工业上非常不灵活——把模型拿到公司里,公司要检测的东西和 COCO 不一样,就得自己重新标数据、重新训练,成本极高。
正是为了解决上述缺陷,GLIP 出场了。它最大的优点就是 zero-shot / 零样本学习——训练时没见过的类别,推理时照样能检测出来。
卢老师用一个直观例子说明:一张"橘猫在黄色树前跳篱笆"的图配上对应描述句,可以看到不同颜色的高亮框和文本中的词是高度对齐的——橘红色框对应"猫",绿色框对应"篱笆",检测框的响应强度和文本中相应词的出现位置几乎完全重合。这说明图片上的内容和文本上的内容是可以对应起来的,这正是 GLIP 的出发点。
以"一个拿吹风机、戴护目镜的女人"为例,GLIP 的具体做法是:
这里有两个关键设计:其一,视觉向量和文本向量之所以能直接算相似度,是因为它们都用 CLIP 那一套特征提取器提的——CLIP 本来就干了一件事:把文本和图像映射到同一个向量空间;其二,匹配是靠语义向量而不是靠类别编号,所以把 prompt 从 "woman" 换成 "girl" 也照样能匹配上,因为二者在向量空间里本来就很接近。
GLIP 相比传统检测(包括 YOLOS 这一套)最大的出发点是:通过短语匹配的方式来做检测,而不是分类的方式。分类路线一旦遇到训练集里没有的新类别就彻底失效;而匹配路线因为"理解了文本本身的含义",来一个新类别(哪怕是同义词、别名)都能照样匹配。
第一,能把各种异构检测数据集全部打通。平时做检测手里有 COCO、Visual Genome、Objects365 等一大堆数据集,它们的类别体系互不相通。但 GLIP 最终没有"类别"这个硬概念了,全部是文本匹配,于是不同数据集的样本可以混在一起训练,数据量可以做得非常大。
第二,天然嵌入开放词汇检测(Open-Vocabulary Detection)。以前用 YOLO 只能在 COCO 那 80 类上玩,拿到公司里就得重新标数据;用 GLIP 之后几乎"拿来就能用"——因为它是在理解文本语义,bicycle、单车、自行车、脚踏车这种别名它都能对上。所谓 zero-shot,本质上是因为模型见多识广:训练时见过的图文对足够多,推理时遇到的"新东西"对它来说其实并不新。
训练时的损失由两部分组成:
推理时则很直观:把图切成很多小块、把所有可能的类别(狗、猫、单车、房子、湖水……)全部以文本形式穷举出来,算每个区域向量与每个类别文本向量的相似度,得分高的那个就是检测结果。
不久之后推出的 GLIP v2 在模型结构上几乎没有变化,只是在损失函数里加了两块:
zero-shot 对数据量要求极高,但人工标注永远是稀缺的。GLIP 的做法是一个典型的"左脚踩右脚往上飞"自举循环:
| 代际 | 代表模型 | 骨干架构 | 建模方式 | 能否检测新类别 |
|---|---|---|---|---|
| 第一代 | YOLO v1 ~ v5 | CNN | 固定类别分类 | 不能,类别被锁死 |
| 第二代 | YOLOS / DETR | Transformer(DETR 保留 CNN 提特征) | 固定类别分类 | 不能,不理解类别语义 |
| 第三代 | GLIP | Transformer + CLIP 特征 + 图文融合 | 短语接地匹配 | 能,开放词汇 / zero-shot |
第二代 Transformer 检测器虽然容易和 NLP 结合,但仍然把类别当成一个个编号符号,并不理解文本语义;GLIP 借助 CLIP 把视觉和文本拉进同一向量空间,把"分类问题"彻底转成"匹配问题",让模型真正理解类别的语义。落到工程上,公司自己的特殊检测目标几乎不用再标数据,prompt 一改就能用——这就是它被称为多模态检测新范式的底气。
本章沿着"ViT 把 Transformer 引入视觉 → YOLOS/DETR 用 Transformer 做检测 → 二者都被类别锁死 → GLIP 用图文匹配打破锁死"这条主线展开。核心要点:①Transformer 做视觉的根本动机是让 CV 与 NLP 共享对话基础;②YOLOS 纯 encoder、N+100 个可学习 det token,DETR 多了 CNN 提特征和 decoder;③GLIP 用 CLIP 式双编码器 + 跨模态多头注意力融合,把每个候选框和文本短语做向量内积匹配;④损失=定位损失+对比匹配损失,v2 再加跨图负样本和掩码建模;⑤通过自举式数据增强把训练集越滚越大,最终实现开放词汇零样本检测。
本章节是全课程内容最密集的部分,共 11 个视频(P20-P30),约 132 分钟,系统讲解了当前计算机视觉领域最具颠覆性的生成式 AI 技术——Stable Diffusion(稳定扩散)以及背后的扩散模型(Diffusion Model)原理。课程从"什么是扩散模型"这一基础问题出发,逐步深入到前向加噪过程、反向去噪过程、DDPM 训练目标、潜空间扩散架构、U-Net 去噪网络、文本条件注入机制,最后落地到 HuggingFace Diffusers 库的代码调用与手写数字生成的完整实战。
正如课程开篇所言:"这是目前 CV 领域里最厉害的图像技术"。Stable Diffusion 通过文本即可生成以假乱真的图像,包括人物肖像、艺术画作、设计素材等,基本已经达到了以假乱真的效果。课程并不满足于教大家如何"使用"现成工具——"光调个包其实没有什么技术含量"——而是带大家探寻模型背后的原理,理解它是如何从一团随机噪声中"无中生有"地创造出信息的。
计算机视觉领域的生成式模型经历了四代重要演进:最早是 GAN(生成对抗网络),大约在 2016 年左右出现;随后是 VAE(变分自编码器),流行于 2017-2018 年;接着是 Flow-Based Models(流模型);最后就是今天的主角——扩散模型(Diffusion Model)。
值得注意的是,扩散模型的理论其实提出得非常早,距今已有近十年历史。但真正让它在工业界大规模落地的,是 2022 年的一篇关键论文(即 DDPM,Denoising Diffusion Probabilistic Models)。这篇论文让扩散模型能够产生大量高质量图像,甚至有潜力取代人类插画师的部分工作。
虽然扩散模型涉及的数学极其复杂——课程展示了论文中随意摘录的公式,"第一次看的时候头也很大"——但它的代码实现却非常简单。作者看完论文后思考两三天,就基本不动地复现了代码,总共不到 70 行(含 import)。这正是扩散模型的特点:数学上繁琐绕人,工程上简洁优雅。
所有四代生成模型做的其实都是同一件事:学习真实数据的概率分布,然后从学到的分布中采样生成新样本。
以"狗"的图像为例:现实中所有狗的照片在高维空间中构成一个概率分布 p(x),正脸照集中在某些区域,侧脸、斜脸在另一些区域。这是一个客观存在的事实分布。我们希望训练一个神经网络模型,让它产生的分布 q(x) 尽可能逼近这个真实分布。
这个任务之所以困难,有两大原因:
为了简化问题,生成模型采用了一个共同策略:先从一个简单的标准正态分布 N(0,1) 出发,通过一个神经网络 f,将简单分布中的每个点 z 映射到目标空间,得到一个新的生成分布。如果这个映射做得足够好,生成分布就会非常接近真实数据分布。之后只需要从标准正态分布中随机采样一个 z,通过网络 f(z) 就能生成一张新图片。
但扩散模型在这里走了一条独特的路:它不是"一步到位"地从噪声直接生成图像——那相当于给你一堆拆迁后的砖头,让你反推出原来的大楼长什么样,难度太大。扩散模型的思路是把这个过程拆成无数小步骤,每一步只做一点点改变,就像一块砖一块砖地拆楼,再一块砖一块砖地重建。
前向过程是一个固定的马尔可夫链,不需要学习。给定一张真实图像 x₀,我们逐步向它添加高斯噪声:
x₁ = √(α₁) · x₀ + √(1-α₁) · ε₁
x₂ = √(α₂) · x₁ + √(1-α₂) · ε₂
……
xₜ = √(αₜ) · xₜ₋₁ + √(1-αₜ) · εₜ
其中 ε 是从标准正态分布 N(0,1) 采样的噪声,αₜ 是控制噪声幅度的超参数(βₜ = 1-αₜ 表示每步添加的噪声量)。课程中用一个通俗的比喻:就像对一只猫的图像"一点一点地进行模糊",不是一下子把它变成纯噪声,而是慢慢模糊,越来越模糊,直到最后完全看不出原来是什么。
关键的数学技巧在于:通过递推展开,xₜ 可以直接由原始图像 x₀ 一步算出:
xₜ = √(ᾱₜ) · x₀ + √(1-ᾱₜ) · ε
其中 ᾱₜ = α₁ · α₂ · … · αₜ 是所有 α 的累积乘积。这意味着我们不需要真的一步步加噪,可以直接从 x₀ 采样任意时刻 t 的 xₜ,大大提高了训练效率。
α 的取值策略是一个重要的超参数设计。在手写数字实验中,T=200 步,α 从 0.99 线性递减到 0.9——刚开始保留 99% 的原始信息(加噪很少),到最后一步只保留 90%(加噪很多)。噪声是逐渐加大的,不是每步等量添加。这种线性调度是原始论文的做法,但课程指出:"如果你有发论文的需求,这个地方是一个很大的创新点"——找到更好的加噪权重策略,本身就可以发一篇好论文。
反向过程才是扩散模型学习的核心。我们从标准正态分布中采样一张纯噪声图片 xₜ,希望通过神经网络一步步去噪,最终恢复出 x₀。
课程用了一个生动的比喻:让一个小学生直接跳到院士位置难度极大,但如果拆成"小学→初中→高中→大学→硕士→博士→院士",每一步都不难。扩散模型也是如此:每次只恢复前一时刻的图片,迭代 T 次后最终得到清晰图像。
最直观的想法是:训练一个网络,输入 xₜ,直接输出 xₜ₋₁。但实践发现这样做网络很难收敛。于是 DDPM 做了一个关键改进:不直接预测图像,而是预测噪声 ε。
为什么预测噪声反而更好?因为 xₜ = √(ᾱₜ)·x₀ + √(1-ᾱₜ)·ε,当模型预测出添加的噪声 ε 后,就可以通过已知的权重系数(都是固定超参数),用纯数学公式反算出 xₜ₋₁。这样网络只需要做"信号拆解"——就像把两个人合唱的歌声分开一样,从加噪图像中分离出原始信号和噪声成分。
"机器学习能否预测噪声?"这是扩散模型最反直觉的地方。直觉上,噪声是随机变量,预测随机变量是不可能的——"你要是能预测随机变量,直接去预测彩票不就行了?"但实际上模型并不是在预测一个真正的随机变量,因为 xₜ 本身是由已知的 x₀ 和随机 ε 混合而成的,网络做的本质是信号分离:从混合信号中把原始图像部分和噪声部分拆解开来。
训练过程非常简洁:
采样(生成)过程:
Stable Diffusion 的整体架构可以分为两大块:
课程中一个关键问题是:为什么要先把图像压缩到潜空间,而不是直接在像素空间做扩散?原因在于计算效率。如果直接对高分辨率图像(如 512×512)做扩散,每一步都要在如此大的像素空间上进行去噪计算,成本极高。
Stable Diffusion 采用了 Latent Diffusion(潜空间扩散) 的思路:先用一个 VAE(变分自编码器)把图像压缩到低维潜空间,在潜空间里做扩散去噪,最后再用 VAE 解码器还原回像素空间。
如图所示,整个流程是:随机噪声 → Diffusion 扩散模型 → 压缩特征 → Image Decoder → 最终图像。课程特别强调:"噪声是没有信息的,从噪声到压缩特征才是真正产生信息的过程";而从压缩特征到图像的解码器,"只不过是把一个低维特征变成高维特征,主要是恢复工作",不产生新信息。
VAE 的作用是把高维图像压缩到低维潜空间。以一张 64×64 的图像为例,图像本身存在大量冗余信息——"很多像素其实你没有它也能够猜出来,比如猫中间挖掉一块,见得多了你也能猜出来是什么"。
Encoder 将 64×64 的图像压缩到比如 32 维的潜空间特征,Decoder 再从这个压缩特征恢复回 64×64 的图像。如果压缩后还能恢复回去,说明保留下来的都是核心信息,冗余信息在压缩过程中被去掉了。
Encoder 和 Decoder 是成对训练的,但 Stable Diffusion 推理时主要用的是 Decoder——Encoder 更像是"做几何题的辅助线",训练出来但推理时不直接用。之所以必须先压缩再恢复,是因为"恢复大尺寸图片难度太大",在压缩特征空间做扩散要高效得多。课程作者也提到,自己写过代码验证:如果生成的图片很小,确实可以不用 Decoder,直接在像素空间做扩散也没问题。
U-Net 是扩散模型的核心网络结构,最早用于目标分割领域。它的形状像一个字母"U":
原始 U-Net 输入输出尺寸相同(如 572×572 → 572×572),这正好满足扩散模型的需求:输入一张加噪图像,输出同样尺寸的噪声预测图。
Stable Diffusion 中的 U-Net 做了重要改良:它不再使用经典的 CNN 结构,而是采用了 Transformer Block(具体为 Baseline Transformer Block)来做特征提取。这个 Transformer Block 内部包含两个关键注意力机制:
课程特别澄清了一个容易搞混的点:Cross-Attention 注入的是文本信息,Self-Attention 处理的是图像自身信息。如果不提供任何外部条件,模型也能随机生成图片,只是不能按照你想要的内容生成;只有文本时就是纯文生图;文本加参考图时,两者会融合在一起生成。
以"一个宇航员骑马"(an astronaut riding a horse)为例,完整的生成流程是:
关于为什么每次生成的图片都不一样:因为初始噪声是随机采样的,"无论怎么随机,最终生成的东西其实都是跟提示词有一定关联的"。如果想要可复现的结果,可以通过设置随机种子(seed)来控制。
调度器决定了每一步具体如何从 xₜ 计算出 xₜ₋₁。原始 DDPM 需要走 1000 步,非常慢。后续提出的 DDIM、PLMS 等调度器可以在几乎不损失质量的前提下大幅减少采样步数——课程演示中只走了 50 步就生成了不错的结果。调度器是 Stable Diffusion Pipeline 中的重要组件。
课程演示了如何使用 HuggingFace 生态的 Diffusers 库调用 Stable Diffusion v1.5。代码结构非常简洁:加载模型 → 放到 GPU 上 → 生成图片 → 保存图片。核心调用方式如下:
# 加载 Stable Diffusion 管道模型(以 v1.5 为例)
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
# 文生图:输入文本提示词,一步调用即可
image = pipe(
prompt="a photo of Donal Trump", # 文本提示词
num_inference_steps=50 # 去噪步数,默认50
).images[0]
image.save("trump.png")
其中 num_inference_steps=50 就是课程中提到的"走了 50 步"恢复图片——数值越大生成越精细但越慢。课程现场演示了多次生成:每次输入相同的"Trump"提示词,由于初始随机噪声不同,生成的肖像各不相同,但都具有特朗普的特征。还尝试了"Japanese dog"(日式犬)等提示词,展现了模型的创意生成能力。
除了调用现成 Pipeline,课程还完整从零实现了一个扩散模型,任务是生成手写数字"8"(基于 MNIST 数据集)。这部分代码虽然规模小,但完整复现了扩散模型的所有核心环节。
第一步:配置噪声调度。总共 T=200 步,单步保留率 α 从 0.99 线性递减到 0.9。开始时 α 大(加噪少),后面 α 小(加噪多)。代码中还预计算了累积 ᾱ(alpha_bar)以及对应的 sqrt 系数,供训练时直接查表使用。
# 噪声调度配置(config.py 核心逻辑)
T = 200
beta_start = 0.01 # 对应 alpha 最大 0.99
beta_end = 0.1 # 对应 alpha 最小 0.9
# 线性调度:beta 从 0.01 线性增加到 0.1
betas = np.linspace(beta_start, beta_end, T)
alphas = 1.0 - betas
# 累积 alpha_bar = alpha1 * alpha2 * ... * alphaT
alpha_bars = np.cumprod(alphas, axis=0)
# 预计算训练用系数
sqrt_alphas_bar = np.sqrt(alpha_bars)
sqrt_one_minus_alphas_bar = np.sqrt(1.0 - alpha_bars)
第二步:制造训练样本。从 MNIST 中只保留数字 8 的图片,归一化到 [0,1]。每张原图生成 100 个训练样本:随机采样一个时刻 t,随机采样标准正态噪声 ε,然后用一步公式计算加噪后的图像 xₜ。训练数据总量约 6.4GB,运行时即时生成即可。
# 训练样本构造核心逻辑
x_0 = original_image # 原始手写数字 8
t = random.randint(1, T) # 随机采样一个时刻
epsilon = np.random.randn(*x_0.shape) # 随机采样标准正态噪声
# 一步直接得到 x_t:x_t = sqrt(alpha_bar_t)*x_0 + sqrt(1-alpha_bar_t)*epsilon
x_t = sqrt_alphas_bar[t] * x_0 + sqrt_one_minus_alphas_bar[t] * epsilon
# 训练目标:输入 x_t 和 t,预测噪声 epsilon
model_input = x_t
model_target = epsilon
第三步:构建 U-Net 模型。输入是加噪图像 xₜ(28×28×1)加上时间步 t 的嵌入。时间信号先通过一个长 Embedding 层变成与图像同尺寸的特征图,再与输入图像逐像素相加,使图像同时具备时间和内容信息。之后经过标准的卷积+池化下采样,再经反卷积上采样恢复尺寸,跳跃连接传递细节。模型输出与输入尺寸相同的噪声预测图。
# U-Net 核心结构伪代码
# 1. 时间嵌入:将时间步 t 转换为与图像同尺寸的特征图
t_embedding = TimeEmbedding(t) # 1->hidden->28x28x1
# 2. 图像与时间特征逐元素相加
x = input_image + t_embedding # 同时包含图像和时间信息
# 3. 下采样:卷积 + 池化,尺寸逐步缩小
down1 = ConvBlock(x) # 28x28 -> 14x14
down2 = ConvBlock(down1) # 14x14 -> 7x7
# ...
# 4. 上采样:反卷积逐步恢复尺寸,跳跃连接拼接下采样特征
up1 = ConvTranspose(down2) + skip(down1) # 7x7 -> 14x14
up2 = ConvTranspose(up1) + skip(down0) # 14x14 -> 28x28
# 5. 输出与输入同尺寸的噪声预测
noise_pred = OutputConv(up2) # 28x28x1
第四步:训练与生成。在有 GPU 的机器上大约 1 小时即可训练完成,无 GPU 约 5-6 小时。生成时从纯噪声开始,逐步预测噪声、计算去噪后的图像,每一步的中间结果都保存下来。最终可以清晰看到:从完全随机的噪声开始,数字"8"的轮廓逐步浮现,最终生成与真实手写数字无异的图像。
扩散模型的代码实现出乎意料地简洁:生成训练数据、搭建 U-Net、训练、采样生成——核心代码加起来不过几十行。数学推导虽然繁琐,但工程实现抓住"预测噪声"这个核心后就变得非常直观。这也印证了课程开头的论断:"它虽然数学极其复杂,但是代码实现非常容易。"
Stable Diffusion 作为开源模型,已经催生出繁荣的应用生态。基于基础文生图能力,衍生出多种任务范式:
模型社区方面,Civitai( Civitai 模型共享平台)和 HuggingFace 上有大量社区训练的衍生模型,可以直接下载使用。课程也提到,Stable Diffusion 本身参数量约 10 亿(1B),相比语言模型(如 6B 级别)已经小很多,商用时通常还需要在开源基础上做进一步精调。
扩散模型的本质是把一个看似不可能的任务(从纯噪声一步生成高质量图像)分解成了无数个简单的子任务。前向过程用固定的加噪公式把训练数据变成成对的"加噪图-噪声"样本,反向过程让 U-Net 学会从加噪信号中分离出噪声成分,再通过数学公式反推出去噪一步后的图像。真正产生信息的环节是"噪声→压缩特征"的扩散过程,而 VAE 解码器只负责把已经成型的潜特征还原为像素图像。Cross-Attention 则优雅地解决了文本条件注入的问题——让图像特征在去噪的每一步都"看到"文本信息。
本章节完整覆盖了 Stable Diffusion 从理论到实践的知识体系:(1)生成模型四代演进脉络 GAN→VAE→Flow→Diffusion,以及它们共同的目标——学习真实数据分布;(2)扩散模型前向过程通过马尔可夫链逐步加噪,利用累积 α_bar 实现单步直接采样;(3)反向过程的核心创新是预测噪声而非预测图像,本质是信号分离任务;(4)Stable Diffusion 采用潜空间扩散,VAE 负责图像压缩与重构,U-Net(Transformer Block + Self/Cross-Attention)是核心去噪网络;(5)CLIP 文本编码器将提示词转为嵌入向量,经 Cross-Attention 注入 U-Net;(6)代码层面,无论是调用 HuggingFace Pipeline 还是从零手写 MNIST 扩散模型,核心逻辑都简洁清晰。扩散模型虽然数学推导繁琐,但抓住"逐步去噪、预测噪声"这个主线后,整个知识脉络就变得明晰了。
这一组内容是卢菁老师以个人视角,对多模态大模型行业、计算机视觉未来方向、以及大模型岗位招聘与面试所做的一系列"输出型"分享。它不像前面章节那样逐行推导模型,更像是一位从业者站在行业一线的观察笔记。本章节按"宏观趋势 → CV 技术方向 → 数据与产业现实 → 个人发展与求职"四个层次整理,帮助读者在掌握 GLIP、CLIP、SAM 等具体模型之后,抬头看清路该往哪儿走。
卢老师开门见山地抛出一个问题:多模态 AI 如今正处在技术方向发散探索的阶段,它会不会像当年 NLP 那样,最终被一个"大力出奇迹"的超级大模型一统江湖?他的个人判断是——这种结局的可能性极大,但要走到那一步,路径可能非常漫长,并没有这么快。
OpenAI、谷歌这类 AI 大厂已经在发力研发下一代多模态混合预训练模型,把文本、图像、甚至视频放在一起混合训练。卢老师判断,这类通用大模型在不久的将来会展现出远超 GPT-4 的多模态能力;按照以往经验,OpenAI 在多模态超级大模型的竞争中再次胜出,是大概率事件。
但在文本以外的多模态领域,仍然存在较大变数,主要有三座大山:
卢老师给出了一个很有洞察力的"维度拆解":文本是一维时间序列上的编码语言信息;图像是典型的二维空间信息;视频可以理解为二维空间信息与时间序列的组合,即三维信息;而 3D 动画进一步升级为三个空间维度与时间序列的组合,也就是我们认为的四维信息。理论上,3D 动画是对真实时空的终极映射,而文本、图像甚至视频,都只是真实时空在低维度上的投影。
GPT 等大语言模型建立起了一种有可能通往 AGI 的智能方式,但要把这种智能方式扩展到三维、四维的时空范围,复杂度的增长是指数级别的。因此在视频、3D 动画序列等比图文更复杂的动态领域,技术收敛到一个大一统方向的时间周期可能相当长——卢老师保守估计要 3 到 5 年,甚至必须发明新的算法设计来解决复杂度爆炸问题。
卢老师也给出了乐观的一面:一是模态间的知识迁移——让 AI 更深入地理解训练数据丰富的低维图文信息,在一定程度上可以帮助它更快地从高维信息中学习知识;二是基于"脚手架"的工程化产品——快速推出可用的多模态产品,通过平台级、工业级产品建立起用户场景、数据、工程、科研之间的联动关系,这也是加速技术迭代的好思路。最后他总结:好消息和坏消息同时并存,多模态 AI 的发展趋势其实极难预测;回顾过去数十年 AI 的发展,也根本没有人能准确预言科研的高峰与低谷,一切都取决于从业者自己的努力。
针对经常被问到的"CV 未来方向是什么",卢老师给出了三个他个人看好的方向。
随着 GPT、SAM 等大模型出现,计算机视觉和自然语言处理的结合越来越紧密——我们可以通过简单的文字描述,生成或分析复杂的图像内容。他举例:OpenAI 的图像生成模型可以根据输入文本或图像片段,生成连贯、逼真的图像补全样本;Meta AI 的 SAM 系列则是基于自然语言提示的图像分割模型,可以根据用户输入的任意单词或短语,分割出图像中对应的对象,而不需要额外的训练数据或标注。这类工作展示了"语言驱动视觉"的强大潜力,也是比较容易出成果、容易出圈的方向。
人工标注数据始终是稀缺资源,而无监督 / 自监督学习不依赖人工标注,可以利用海量未标注数据来学习图像的结构与特征,从而提升模型的泛化能力和鲁棒性。卢老师举了两类代表:
这些方法在很多任务上已经表现出与有监督方法相媲美、甚至超越的效果,为 CV 提供了摆脱"堆标注"的新思路。
第三个方向是同时利用多种类型、多种来源的数据进行视觉任务学习,充分利用数据之间的互补性与一致性,提升模型在不同场景、不同任务、不同领域下的性能与泛化能力。卢老师以大规模预训练+微调路线为例:在数亿张图片、上万个类别的大规模数据集上做预训练,再在目标数据集上微调,就能迁移到各种下游场景。这正是今天"预训练大模型 + 下游微调"范式在 CV 领域的缩影。
除了技术本身,卢老师也聊到两个很现实的产业判断。
第一,做大模型爬数据要趁早。他对比了搜索引擎爬虫和大模型爬虫:搜索引擎时代,多数网站还求着被收录;而大模型公司不仅数量上已经超过搜索引擎公司,还争分夺秒地想在一个月内爬遍全网,产生的请求量极大。更关键的是,大模型拿走数据却不给网站导流,反而会把网站的用户吸走——一旦大模型比官网自己的搜索更好用,内容网站就再也不会欢迎爬虫了。可以预见,大型网站一定会用"内容仅登录可见""大量手机号限制"等手段封死爬虫;等到那时,新玩家可能连训练语料都买不到,优质数据本身就会变成成功大模型最深的技术壁垒。
第二,他在一段随想里推演了 AI 与人类远期关系的一种可能性:AI 未必会用暴力消灭人类,更可能是通过让人逐渐依赖它的产出、沉溺于它提供的娱乐、丧失劳动与社交能力,最终在"温柔乡"里让人类自然地失去存续动力。这段分享与其说是技术判断,不如说是提醒从业者:在狂奔做产品的同时,也要想一想技术终点意味着什么。
这一部分是卢老师亲自做社招、校招面试官之后,对"大模型方向人才风向标"的一手总结,对应届生和转岗者极具参考价值。他一共讲了七点。
有大模型方向论文的硕士、博士其实很少;而很多论文还在模型架构上做排列组合——在本来就价值不大的方向上过度优化网络结构,最后只换来几个百分点的提升。卢老师直言这类"水论文"现在已经吸引不了面试官眼球,原因有二:一是真没多大作用,有时候直接暴力调参、刷点反而效果更好;二是明明有更简单的方法可以做得更好,却为了发论文故意做得花里胡哨。他的结论是:在大模型时代,"大力出奇迹"和朴素简单才是价值,唯一没用的就是把稀奇古怪的方法组合起来去解决一个不常见的问题。
有大模型训练经验的人很少,有 65B 以上模型全量预训练经验的更是凤毛麟角。这背后是硬件现实:大部分人手里的卡可能还是 32GB 显存的 V100,数量也不多;7B 全量微调起步就要 8 张 40G 的 A100,65B 全量至少要上百张卡,多数实验室和公司根本不具备条件。所以大家做的大多是 LoRA、P-tuning 这类"边角料"方法,天花板有限。更重要的是,大模型训练本质是团队工程,每个人只负责拧一颗螺丝钉,能一个人把整个链路从零跑通的人,在猎头市场上会被抢爆。
大模型目前仍处于黑盒阶段,谁能把模型评测做得又快、又准、又好,谁就能和同行显著拉开差距。但评测本身坑很深、属于"投入产出比不明显"的方向,很可能搞半天白折腾,所以真正做好的人极少。为什么它关键?因为基础大模型训练耗时耗力,如果不能在训练前用评测方法提前检验思路,实验速度就会比别人慢半拍,所有时间成本最终都折算成 GPU 机时——实验慢,就等于少了 GPU。这个问题至今除了 OpenAI,各家都没有彻底解决,因此是一个值得投入的核心方向。
有些人为了追"新奇特",选了偏门模型还信誓旦旦下结论,在面试里显得非常不专业。卢老师给出的主流共识是:LLaMA 系列的微调潜力最好;中文和数学推理场景下,Qwen、ChatGLM 等 LLaMA 变种都可以一试。选型不紧跟开源社区、和主流认知有偏差,面试时就会"鸡同鸭讲",没法在同一个层次上交流。
从简历看,整个行业目前仍处在探索阶段,能在真实生产线上线的大模型应用非常少,多数还停留在"试试看""玩玩"或 demo 状态。实际落地必然会撞上一堆坑:幻觉问题严重、内容安全/风控问题解决不了、资源消耗与成本太高、推理延迟太大无法做实时服务。任何一个问题单拎出来都能讲半天,而能把这些问题逐个解决、真正把模型扎在生产线上的人极少——当然,卢老师半开玩笑地补了一句:真能做到这些,其实也不用找工作了,直接去创业就行。
尽管落地难,大模型岗位的需求依然很旺盛,优秀简历非常抢手:除了垂直创业公司,很多 AIGC 应用公司在具体落地上发力,大公司也来势汹汹——以前做搜索、广告、推荐、2C 相关的部门都和大模型天然契合,正在摩拳擦掌分一杯羹。但要注意,大公司项目往往带有"玩票"性质,搞不出来大不了当练手;创业公司搞不出就真黄了。几乎每个大厂都有大量大模型 HC,投递时一定要仔细分辨对方是玩票性质,还是真有决心长期落地,主要看团队有没有坚决做落地、长期投入的规划。
关于大家最关心的"面试八股文频率高不高",卢老师给了一个很实用的判断标准:如果你的简历扎实、有相对丰富的大模型经验,面试官基本不会问八股——因为面试时间最多一小时,聊新经验、聊心得都来不及,根本没时间扯虚的;反过来,如果简历比较虚、没有相关经验,但教育背景和过往经历不错,面试官想考察你的潜力和可塑性,这时才会考:潜力主要看算法题(LeetCode 一类),基础则对应八股文。
从这七点风向可以反推出两条不同的发展路径:想走研究者路线,就别再在小网络结构上"螺蛳壳里做道场",而要去啃模型评测、预训练、对齐这些真正卡脖子、又少有人做深的硬问题;想走工程师路线,则要珍惜任何一个能从 0 到 1 解决幻觉、风控、延迟、成本并真正上线落地的机会——哪怕它不发论文,在招聘市场上也比十篇"排列组合"论文值钱。
卢菁老师的这组分享可以浓缩为三句话:趋势上,多模态最终会被超级大模型大一统,但视频、3D 等高维领域因数据、对齐、算力三座大山,收敛还需 3-5 年,模态间知识迁移与脚手架产品是两条加速路径;技术上,CV 的未来在语言驱动的生成与理解、无监督/自监督表征学习、以及大规模多模态预训练+微调这三个方向;求职上,市场最缺全量预训练经验、模型评测经验和真正落地过系统的人,论文要追真问题不要做排列组合,选型要跟主流,面试则"简历够硬就聊实战,简历偏虚才考算法和八股"。对从业者而言,与其焦虑传统 CV 岗位被冲击,不如尽快把自己的技术栈升级到"Transformer + 多模态 + 工程落地"的新三角上。