Lecture 14 · 多模态基础模型:CLIP、扩散模型、Flamingo 与通用智能体 · Multimodal Foundation Models

Advances in Foundation Models · Lecture 14。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:Stanford CS324 Winter 2023 Advances in Foundation Models,Syllabus 阅读清单 “Image-Text and Multimodal FMs”:CLIP、DALL·E、DDPM、Latent Diffusion、Imagen、Imagen Video、Make-A-Video、DreamFusion、Point-E、Flamingo、CM3、Gato、VPT、MineDojo。 依据说明:W23 日历上没有专门讲多模态的一次课,这个主题只出现在阅读清单里,所以本讲完全依据清单上的论文来写。文献里的数字都是我在论文原文(CLIP、DALL·E、Flamingo、VPT 的全文,其余论文的摘要)里读到的。Winoground、ARO 两项组合性测试和 classifier-free guidance、DDIM 不在清单上,是我为了讲清楚问题补充的;§9”2023 年之后”也是我补充的。 配套代码 Code:code/lecture14/(PyTorch;4 个脚本 + 1 个模块。代码 01 约 15 秒,02 约 85 秒,03 约 7 秒,04 约 50 秒) 预计阅读时间:3.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说清多模态基础模型要解决的两个基本问题:不同模态怎样放进同一个模型(共享的嵌入空间、统一的 token、交叉注意力),以及训练数据从哪里来(网上弱配对的图文、视频、交错图文网页)。
  2. 写出 CLIP 的对比学习目标(对称 InfoNCE),解释零样本分类为什么可行、提示工程和提示集成在做什么,以及 CLIP 在组合性(属性绑定、关系、词序)上为什么像一个词袋。
  3. 比较图像生成的两条路线:离散 token + 自回归(DALL·E)和扩散(DDPM),写出扩散的前向过程和训练目标,解释 classifier-free guidance 的公式与它在保真度和多样性之间的取舍,以及潜空间扩散和 Imagen 的”文本编码器更重要”。
  4. 说出把图像模型扩展到视频和 3D 的思路(复用一个二维模型作为先验)。
  5. 描述 Flamingo 怎样把一个冻结的语言模型和一个冻结的视觉编码器接起来,做交错图文的少样本学习。
  6. 描述 Gato(一切都是 token)和 VPT(逆动力学模型 + 伪标签)怎样把”行动”纳入基础模型,以及 MineDojo 怎样用网上的知识训练智能体。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 2 讲 §9:有效鲁棒性,以及”CLIP 的鲁棒性来自数据”训练图像的版权与肖像(第 19 讲)
第 3 讲 §2–4:Transformer、编码器与解码器深度伪造与虚假信息(第 18 讲)
第 5 讲 §3–4:上下文学习领域基础模型(蛋白质、代码,第 15 讲)
第 6 讲 §2、§4:探针、冻结主干、adapter

0.3 本讲地图 Map

§1  为什么要多模态:理解、生成、行动;两个基本问题
§2  CLIP:用语言当监督;零样本分类;提示;组合性的短板             ← 代码 01、02
§3  生成图像的两条路:DALL·E 的离散 token 与扩散模型;CFG;潜空间    ← 代码 03
§4  从图像到视频和 3D:把二维模型当作先验
§5  Flamingo:冻结的语言模型 + 冻结的视觉编码器
§6  行动也是一种模态:Gato、VPT、MineDojo                         ← 代码 04
§7  共同的模式
§8  风险与局限
§9  2023 年之后:原生多模态模型
§10–14  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation(只列本讲新增的,其余见第 1 讲 §0.4)

符号含义例子
fI(x)f_I(x)、fT(t)f_T(t)图像编码器、文本编码器(输出归一化成单位向量)余弦相似度 =fI(x)⊤fT(t)= f_I(x)^\top f_T(t)
τ\tau对比学习的温度CLIP 初始 0.07,可学习
x0x_0、xtx_t干净的数据;加了 tt 步噪声之后的数据
αˉt\bar\alpha_t第 tt 步”信号还剩多少”(从 1 降到 0)xt=αˉt x0+1−αˉt ϵx_t = \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon
ϵθ(xt,t,c)\epsilon_\theta(x_t, t, c)噪声预测网络(条件 cc;c=∅c = \varnothing 表示无条件)
wwclassifier-free guidance 的强度w=0w = 0:普通条件生成
IDM逆动力学模型(inverse dynamics model):看前后两帧,猜中间的动作VPT
BC行为克隆(behavior cloning):只看当前画面,模仿专家的动作

0.5 关于数字 · About the numbers

讲义里的实验数字都来自 code/lecture14/ 的实际输出(固定种子、PyTorch 单线程,同一台机器上重复运行逐字相同)。我们没有下载任何图片或模型:图文数据是一个”知道真相”的小世界——10 × 10 的小图上画着有颜色、有形状的物体,配一句模仿网上 alt 文本的描述;扩散模型在二维平面上做;VPT 在一个”采木头”的 7 × 7 网格世界里做。几处结果和我写代码前的预想不一样,最重要的是:在我们的小世界里提示工程几乎没用;batch 越大反而越差(“假负例”);guidance 不是把样本收拢到中心,而是把它们往外推。完整清单在代码 README 的”关于实验结果”里。


1. 为什么要多模态 · Why multimodal

1.1 基础模型不只是语言模型

第 1 讲引用的 Bommasani et al. 报告对”基础模型”的定义里,没有任何一个字说它必须处理文本:在大规模、广泛的数据上(通常用自监督)训练,可以适配到大量下游任务。语言之所以最先成功,是因为文本数据最多、最容易处理、自监督目标(预测下一个词)最自然。但人类的知识和交流远不止文本:图片、视频、声音,以及——对于机器人和智能体——行动。

阅读清单上的论文大致回答三类问题:

方向输入 → 输出代表
理解图像(视频)→ 文本 / 类别 / 嵌入CLIP、Flamingo
生成文本 → 图像 / 视频 / 3DDALL·E、DDPM、Latent Diffusion、Imagen、Make-A-Video、DreamFusion、Point-E
行动观察 → 动作Gato、VPT、MineDojo
统一任意模态的序列 → 任意模态的序列CM3、Gato

1.2 两个基本问题

怎样把不同的模态放进同一个模型? 三种主要做法贯穿整讲:

  1. 共享的嵌入空间(CLIP):图像和文本各有一个编码器,训练让配对的两者在同一个空间里靠近。
  2. 统一的 token 序列(DALL·E、CM3、Gato):把图像(甚至动作)也离散化成 token,和文本 token 拼成一个序列,用一个 Transformer 做下一个 token 预测。
  3. 交叉注意力 / 条件(扩散模型、Flamingo):一个模态的表示作为另一个模型的”条件”,通过交叉注意力或拼接注入。

训练数据从哪里来? 带标注的多模态数据很贵(ImageNet 的 128 万张图要人工打标签)。几乎所有这里的模型都依赖网上天然存在的弱配对:图片和它的 alt 文本(CLIP、DALL·E)、网页里交错出现的图片和文字(Flamingo、CM3)、带字幕或解说的视频(MineDojo)、没有任何标签的游戏视频(VPT)。这些配对有噪声、不完整,但数量是标注数据的几百到几千倍——和第 1 讲”用自监督换规模”是同一个思路。


2. CLIP:用语言当监督 · Contrastive language-image pretraining

2.1 动机:固定类别的监督太窄

传统的图像分类器(ImageNet 上训练的 ResNet)学会的是 1000 个固定的类别。想认第 1001 种东西,就要重新收集、标注、训练。Radford et al.(CLIP,2021)的想法是:网上的图片本来就带着描述它的文字,直接从文字里学,监督的范围就是自然语言能描述的一切。

2.2 训练目标:在一堆描述里认出配这张图的那一句

从网上收集 4 亿对(图片, 文本)。一个 batch 里有 BB 张图和对应的 BB 句文本,两个编码器把它们各自变成单位向量,算出 B×BB \times B 的余弦相似度矩阵;对角线是正确的配对。训练目标是对称的 InfoNCE:

L=12B∑i=1B[−log⁡esii/τ∑jesij/τ−log⁡esii/τ∑jesji/τ],sij=fI(xi)⊤fT(tj).\mathcal{L} = \frac{1}{2B}\sum_{i=1}^{B}\Big[-\log\frac{e^{s_{ii}/\tau}}{\sum_j e^{s_{ij}/\tau}} - \log\frac{e^{s_{ii}/\tau}}{\sum_j e^{s_{ji}/\tau}}\Big],\qquad s_{ij} = f_I(x_i)^\top f_T(t_j) .

每一行是一个 BB 选 1 的分类问题(这张图配哪一句?),每一列也是(这句话配哪张图?)。温度 τ\tau 控制分布的尖锐程度,CLIP 把它作为可学习的参数(初始 0.07)。

为什么用对比,而不是”生成描述”? CLIP 论文图 2 做了对照:用 Transformer 语言模型去生成图片的描述,学得最慢;改成预测描述的词袋,快 3 倍;再换成对比目标,又快 4 倍。生成描述要预测每一个词(包括”a photo of”这些和图无关的词),而对比只要求认出哪一句是对的——任务更容易,信号更集中在”图和文对应”上。代价是 CLIP 不能生成文字;它学到的是一个表示空间。

batch 有多大? CLIP 用了 32,768。直觉是:负例越多,“认出正确的那一句”越难,信号越强。§2.5 会看到这个直觉在小世界里出了问题。同期的 ALIGN(Jia et al. 2021)用了 18 亿对几乎不经过滤的 alt 文本,说明数据量可以弥补噪声。

2.3 零样本分类:把类别名写成一句话

训练完之后,分类不需要任何训练样本:

1. 每个类别写一句提示:"a photo of a {类别名}."
2. 用文本编码器编码每句提示 → 得到 K 个向量(这就是分类器的"权重")
3. 图像编码器编码这张图,和 K 个向量算余弦,选最大的

CLIP 最好的模型在 ImageNet 上零样本准确率 76.2%,和原始的 ResNet-50(用了 128 万张带标签的训练图)一样,而它一张 ImageNet 的训练图都没用。它在 30 多个数据集上测试,覆盖 OCR、视频动作识别、地理定位和各种细粒度分类,很多任务上和有监督的基线相当。

提示工程与提示集成。 类别名本身常常不够:ImageNet 里的 “crane” 可以是鹤也可以是起重机;只有一个词的文本在训练数据里也很少见。CLIP 论文发现:

  • 用 “A photo of a {label}.” 代替只写类别名,ImageNet 上高 1.3 个百分点;
  • 加入数据集相关的上下文(例如 “a photo of a {label}, a type of pet.”)还能更好;
  • 提示集成:每个类别用 80 个不同的模板写 80 句,把文本向量在嵌入空间里平均,再高 3.5 个百分点。在嵌入空间(而不是概率空间)平均的好处是:只需要缓存一组平均后的向量,推理成本和一个提示一样;
  • 两者合起来,ImageNet 上提高了将近 5 个百分点。

零样本 vs 少样本。 在同样的图像特征上训练一个线性分类器(线性探针,第 6 讲 §2.2)需要标注样本。CLIP 论文发现:在 20 个数据集(每类至少有 16 个样本的那些)上平均,零样本 CLIP 相当于在同样的特征上训练的 4-shot 线性探针——用自然语言描述类别,相当于免费拿到了几个标注样本。

鲁棒性。 CLIP 的零样本模型在 ImageNet 的分布偏移版本上表现好得多,把”ImageNet 准确率”和”分布偏移下准确率”之间的差距缩小了最多 75%。第 2 讲 §9 详细讨论过:后来的研究(Fang et al. 2022)发现这种鲁棒性主要来自训练数据的多样性,而不是语言监督本身。

2.4 在小世界里训练一个 CLIP

代码 01 造了一份 5 万对的”网上图文数据”:

  • 图:10 × 10 的三通道小图,画一个物体(4 种颜色 × 4 种形状 × 大 / 小 × 左 / 右),加噪声。
  • 描述:模仿 alt 文本,措辞有 4 种模板(“a photo of a …”、“there is a …”……),而且不完整:只有 80% 提到颜色,30% 提到大小,30% 提到位置。
  • 4 个颜色 × 形状组合(blue square、green cross、red ring、yellow bar)在训练数据里从来没有出现过。
描述:a photo of a yellow ring          描述:a photo of a blue bar
     ·····YYY··                              ··········
     ·····Y·Y··                              BBBBB·····
     ·····YYY··                              ··········

用一个 MLP 图像编码器、一个词袋文本编码器,对称 InfoNCE 训练 2000 步(batch 256),学到的温度从 0.07 降到 0.046。然后不用任何标签,用提示 “a photo of a {颜色} {形状}” 做 16 选 1 的零样本分类:

准确率
训练里见过的 12 个组合0.943
没见过的 4 个组合0.209(颜色对了 0.839,形状对了 0.349)
随机0.063

见过的组合:零样本分类成立。没见过的组合几乎认不出来,而且错得很有规律——颜色多半对,形状错成了训练里和这个颜色一起出现过的形状(blue square → blue ring 102 次)。描述里的每个词模型都见过,但这不保证它能理解这些词的新组合:图像编码器学到的不是”颜色”和”形状”两个独立的特征,而是和训练里见过的组合纠缠在一起的特征。

零样本 vs 线性探针(12 个见过的组合):零样本 0.944;线性探针每类 1 个样本 0.727,4 个 0.905,16 个 0.940,64 个 0.941。这里零样本相当于 16-shot 以上的探针,比 CLIP 论文的”平均相当于 4-shot”还强——我们的类别名和训练描述用的是完全相同的词,没有任何歧义。

提示几乎没用。 换模板对见过的组合几乎没有影响(0.943–0.947),对没见过的组合影响大一些(只写类别名 0.146,4 个模板的集成 0.211)。原因是我们的描述措辞只是在类别词前后加几个固定的词,文本编码器很容易学会忽略它们;CLIP 里提示有用,是因为真实的 alt 文本复杂得多(多义词、类别名和人们的说法不一致)。提示工程的价值取决于提示和训练文本的分布差得有多远。

2.5 batch 越大越好吗?假负例

代码 01 演示 4 固定”看过的样本数”(128,000 对),比较不同的 batch:

batch步数见过的组合每行的”假负例”
1680000.957约 1.2 个
6420000.958约 5.2 个
2565000.949约 21.2 个
10241250.919约 85.2 个

和”CLIP 用 32,768 的超大 batch”似乎相反。原因有两个:

  • 假负例:我们的世界里只有 12 种见过的”颜色 × 形状”,batch 一大,同一个 batch 里就有很多图和正例是同一个组合(batch 1024 时每行约 85 个)。InfoNCE 要求把它们推开,但它们其实也配得上这句描述——训练信号变得自相矛盾。
  • 步数:看过的样本数相同时,大 batch 意味着更新步数少。

CLIP 的 4 亿对数据概念极其多样,同一个 batch 里撞上”同一个意思”的概率小得多;大 batch 在 GPU 上也更高效。“负例越多越好”依赖于负例确实是负的——数据的多样性决定了合适的 batch 大小。(后来的 SigLIP 等工作也专门研究了 batch 大小和损失函数的关系,见 §9。)

同样训练 2000 步,数据量从 1,000 对增加到 5 万对,见过的组合从 0.548 升到 0.943;但没见过的组合一直在 0.17–0.21——更多同样分布的数据不会自动带来组合泛化。

2.6 组合性:CLIP 像一个词袋

“a red square on the left and a blue cross on the right” 和 “a blue square on the left and a red cross on the right” 用的词一模一样,意思完全不同。两项测试专门检查这一点:

  • Winoground(Thrush et al., CVPR 2022):每题两张图、两句话,两句话的词完全相同、只是顺序不同。作者测试的所有当时最好的视觉-语言模型都不比瞎猜好多少。
  • ARO(Yuksekgonul et al., ICLR 2023):5 万多个测试,分属性(attribution)、关系(relation)、词序(order)三类。他们的结论是:这些模型在属性绑定和关系上很弱,对词序几乎不敏感——表现得像一个词袋。他们的解释:现有的检索数据集不需要组合和词序信息就能做好,而对比预训练正是在优化这类检索,所以模型没有理由学会组合。他们提出 NegCLIP:训练时加入”组合感知的困难负例”(例如把描述里的词序打乱),明显提高了词序和组合测试的成绩。

代码 02 在”两个物体”的场景里检验这个解释。每张图左边一个物体、右边一个物体;三种测试都是”正确描述 vs 交换后的描述”二选一(随机 = 0.5):交换两个物体的颜色、交换形状、交换左右。

演示 1:描述总是完整的时候。

文本编码器检索swap_colorswap_shapeswap_side
词袋0.2000.5000.5000.500
GRU(看词序)0.5101.0000.9911.000

词袋编码器在三种测试上都是精确的 0.500:两句话的词完全一样,它给出的向量完全一样——不是学得不好,是根本无法表示这个区别。而一个看词序的编码器,在”每句描述都完整说明谁在左、谁是什么颜色”的数据上,把三种交换都学会了。

演示 2:像网上的 alt 文本——大部分描述只说一个物体。 只有 pp 的描述是完整的,其余是 “a photo of a red square”(只说其中一个物体、不说位置)。GRU 文本编码器:

完整描述的比例 ppswap_colorswap_shapeswap_side
100%1.0000.9911.000
20%0.9970.9730.995
10%0.9940.9890.834
5%0.9740.9730.514
1%0.9710.9660.514

两种能力的命运完全不同。颜色和形状的绑定在 p=1%p = 1\% 时还有 0.97:只说一个物体的描述(“a photo of a red square”)本身就要求把 red 和 square 绑在同一个物体上,这种监督在数据里很多。左右关系却在 p≤5%p \leq 5\% 时掉到瞎猜:只有完整描述才说”谁在左边”,这种描述一少,模型就没有理由去学。同一个 GRU,数据一变结论就变了——问题首先在数据。

演示 3:困难负例。 把完整描述交换后的三种句子也放进负例(NegCLIP 的做法):p=10%p = 10\% 时左右关系从 0.834 提到 0.893;p=5%p = 5\% 时几乎没有帮助(0.514 → 0.542)。困难负例只能加在那一小部分完整描述上——它放大已有的信号,但不能凭空创造信号。


3. 生成图像的两条路 · Two routes to image generation

3.1 路线一:把图像变成 token,自回归地生成(DALL·E)

DALL·E(Ramesh et al. 2021)把文生图变成了一个语言建模问题:

  1. 训练一个离散 VAE(dVAE):把 256 × 256 的图压成 32 × 32 = 1024 个 token,每个 token 从 8192 个”视觉词”里取一个。
  2. 把最多 256 个 BPE 文本 token 和 1024 个图像 token 拼成一个序列,训练一个 120 亿参数的 Transformer 做下一个 token 预测。训练数据是 2.5 亿对图文。
  3. 生成:给定文本,自回归地采样 1024 个图像 token,再用 dVAE 的解码器变回图片。
  4. 重排序:采样很多张(论文里 512 张),用 CLIP 给每张和文本的匹配程度打分,留下最好的几张。

这条路线的好处是”什么都不用新发明”:第 3 讲的 Transformer、第 4 讲的规模定律都直接适用。Google 的 Parti(2022,200 亿参数)把它做得更大。Meta 的 CM3(Aghajanyan et al. 2022)更进一步:直接在网页上训练——保留 HTML 结构、超链接和图像 token,按它们在网页里出现的顺序排列;训练目标是”因果掩码”:从左到右生成,但随机挑出几段长 span 挪到序列末尾再生成,这样被挪走的部分可以看到两边的上下文。同一个模型通过提示就能做文生图、图生文、实体链接等任务。

缺点:图像的 token 很多(1024 个,而文本只有几十个),自回归生成要一个一个地来,很慢;而且离散化会丢失细节。

3.2 路线二:扩散模型——从噪声里一步步”雕”出图像

DDPM(Ho, Jain & Abbeel 2020)的想法来自非平衡热力学:

前向过程(加噪):给一张干净的图 x0x_0 一点一点地加高斯噪声,TT 步之后变成纯噪声。有一个方便的闭式:

xt=αˉt x0+1−αˉt ϵ,ϵ∼N(0,I),x_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1 - \bar\alpha_t}\,\epsilon,\qquad \epsilon \sim \mathcal{N}(0, I),

αˉt\bar\alpha_t 从 1 降到 0,是”信号还剩多少”。代码 03 演示 1(二维数据,余弦调度,T=100T = 100;最后一列是加噪后的点离最近小团中心的平均距离,干净数据是 0.539,纯噪声时 0.962——这时已经看不出 8 个小团了):

第几步αˉt\sqrt{\bar\alpha_t}(信号)1−αˉt\sqrt{1-\bar\alpha_t}(噪声)离最近小团的平均距离
11.0000.0250.539
260.9140.4050.637
510.6920.7220.806
1000.0031.0000.962

训练目标(去噪):随机取一个 tt,按上式加噪,让网络 ϵθ(xt,t)\epsilon_\theta(x_t, t) 预测加进去的噪声:

L=Ex0,t,ϵ∥ϵ−ϵθ(xt,t)∥2.\mathcal{L} = \mathbb{E}_{x_0, t, \epsilon}\big\|\epsilon - \epsilon_\theta(x_t, t)\big\|^2 .

生成(反向过程):从纯噪声 xTx_T 出发,每一步用预测的噪声”减掉一点”,再加一点小的随机噪声,走 TT 步回到 x0x_0。

为什么这比”一步画出一张图”容易?每一步只需要往”更像数据”的方向挪一小步,而且每一步的任务都一样(看着带噪声的图猜噪声)。这个目标也有深刻的理论背景:预测噪声等价于估计数据分布的分数(score,∇xlog⁡p(x)\nabla_x \log p(x))。DDPM 在 CIFAR-10 上达到了 FID 3.17,当时超过了 GAN。

3.3 条件生成与 classifier-free guidance

要按文本生成,就让网络也看到条件:ϵθ(xt,t,c)\epsilon_\theta(x_t, t, c)。但简单地加上条件往往不够——生成的图常常和文本对不上。classifier-free guidance(CFG,Ho & Salimans)的做法:

  1. 训练时以一定概率(例如 10%)把条件换成”空”(c=∅c = \varnothing),同一个网络同时学会有条件和无条件的噪声预测;
  2. 生成时用
ϵ^=(1+w) ϵθ(xt,t,c)−w ϵθ(xt,t,∅).\hat\epsilon = (1 + w)\,\epsilon_\theta(x_t, t, c) - w\,\epsilon_\theta(x_t, t, \varnothing) .

ϵθ(⋅,c)−ϵθ(⋅,∅)\epsilon_\theta(\cdot, c) - \epsilon_\theta(\cdot, \varnothing) 指向”更像条件 cc、更不像一般数据”的方向,w>0w > 0 时沿这个方向多走一些。等价地,它近似从 p(x∣c) p(c∣x)wp(x \mid c)\,p(c \mid x)^w 采样:越大的 ww 越偏向”分类器最有把握”的那些样本。(也有人写成 ϵ∅+s(ϵc−ϵ∅)\epsilon_\varnothing + s(\epsilon_c - \epsilon_\varnothing),s=1+ws = 1 + w。)

代码 03 演示 2 在二维平面上看 CFG 的效果。数据是 4 个类别,每个类别由圆周(半径 2)上两个相对的小团组成;小团之间有重叠,所以按”最近的小团”判类别,真实数据本身也只有 0.908 是”对的”。

采样正确率离团距离两种样子平均半径
真实数据0.9080.5340.9652.07
有条件,w=0w = 00.9040.5540.9522.04
w=1w = 10.9970.4780.9712.21
w=3w = 31.0000.5070.9322.41
w=7w = 71.0000.6520.9182.63

(“两种样子”:一个类别的两个小团是否都生成得出来,1.0 = 各一半。)

  • w=0w = 0 和真实数据几乎一样;w=1w = 1 时正确率就到了 0.997:guidance 生成的样本比真实数据还”典型”。这就是为什么几乎所有文生图模型都用 CFG。
  • 但 guidance 不是把样本”收拢”到中心,而是往外推:平均半径从 2.04 升到 2.63,离团距离先降后升。ϵc−ϵ∅\epsilon_c - \epsilon_\varnothing 指向”这个类别和平均情况的差别”,放大它就是在夸张这个差别——离原点越远,离别的类别也越远。这是我写代码前没预料到的;它对应图像上 guidance 太大时颜色过饱和、对比度过高的现象,Imagen 为此提出了”动态阈值”。
  • 多样性只轻微下降(0.952 → 0.918):这个类别的两个小团对分类器来说同样典型。真实图像里,guidance 会偏向”最典型”的样子,多样性的损失更明显。图像生成界面上的 guidance scale 滑块,就是在保真度和多样性之间取舍。

3.4 让扩散模型更实用:潜空间、更好的文本编码器、更少的步数

潜空间扩散(Latent Diffusion,Rombach et al., CVPR 2022)。 在像素上做扩散很贵:每一步都要处理整张高分辨率图。先训练一个自编码器把图压缩到一个小得多的”潜空间”(例如每边缩小 8 倍),在潜空间里做扩散,最后再解码回像素。文本条件通过交叉注意力注入 U-Net。2022 年 8 月以开放权重发布的 Stable Diffusion 就是这个架构——它让文生图第一次能在消费级 GPU 上运行,也让社区可以在上面微调、加 LoRA(第 13 讲的”补丁”生态在图像模型上同样繁荣)。

DALL·E 2(unCLIP,Ramesh et al. 2022)。 用 CLIP 的空间当”中转站”:一个”先验”模型把文本变成 CLIP 的图像嵌入,一个扩散解码器再把图像嵌入变成图片。

Imagen(Saharia et al. 2022):文本编码器比图像模型更重要。 Imagen 用一个只在文本上预训练、冻结不动的大语言模型(T5-XXL)编码提示,再接一串扩散模型(64 × 64 → 256 → 1024)。他们最重要的发现:把文本编码器做大,比把图像扩散模型做大,对图像质量和图文一致性的提升大得多。Imagen 在 COCO 上零样本 FID 7.27(没在 COCO 上训练),人类评估者认为它的图文一致性和 COCO 原图相当;他们还提出了 DrawBench 这个更难的测试集。这和 §2.6 呼应:理解”a blue cube on top of a red sphere”这样的组合,需要一个真正理解语言的编码器,而不只是一个词袋。

更少的步数。 生成一张图要调用网络几十到上百次(用 CFG 时每步两次)。DDIM(Song et al. 2021)用同一个训练好的网络、不重新训练,确定性地跳着走。代码 03 演示 3(w=3w = 3):

采样方法网络调用次数正确率离团距离两种样子
DDPM 100 步2001.0000.5120.965
DDIM 100 步2000.9750.5550.941
DDIM 20 步400.9990.5620.836
DDIM 5 步100.9900.6680.676
DDIM 2 步40.2642.6980.296

20 步时正确率和离团距离都接近 DDPM 100 步,只用了 1/5 的网络调用;但多样性下降了(0.836),5 步更明显,2 步就崩了。写代码时我还踩了一个坑:DDIM 每一步要先估计 x^0=(xt−1−αˉt ϵ^)/αˉt\hat x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\hat\epsilon)/\sqrt{\bar\alpha_t},而 tt 接近 TT 时 αˉt\sqrt{\bar\alpha_t} 只有 0.003,估计会被放大几百倍;不把 x^0\hat x_0 截断到数据的范围里,2 步的 DDIM 生成的点离原点几十个单位。几乎所有实现都做这个截断(图像里截断到像素范围)。


4. 从图像到视频和 3D · Video and 3D

视频和 3D 的配对数据比图文少得多。2022 年的几篇工作有一个共同的思路:把一个训练好的文生图模型当作先验,只学”多出来”的那一维。

  • Make-A-Video(Singer et al. 2022):不需要任何文本-视频配对数据。从图文配对里学”世界长什么样、怎么描述它”,从没有文字的视频里学”东西怎么动”;在文生图模型上加入时空模块,再接插帧和超分辨率模型生成高帧率高清视频。
  • Imagen Video(Ho et al. 2022):在 Imagen 的基础上,用一串扩散模型——一个基础视频模型加上多个空间超分辨率和时间超分辨率模型——逐级生成高清视频。
  • DreamFusion(Poole et al. 2022):不需要任何 3D 训练数据。随机初始化一个 NeRF(一个表示 3D 场景的神经网络),从随机角度渲染它,用一个冻结的二维文生图扩散模型(Imagen)给渲染图打分——这个损失后来被称为”分数蒸馏采样”(score distillation sampling,SDS)——用梯度下降优化 NeRF,直到从任何角度看都像提示描述的东西。缺点是每个物体都要优化很久。
  • Point-E(Nichol et al. 2022):两步走:先用文生图扩散模型生成一张图,再用另一个扩散模型从这张图生成 3D 点云。质量不如最好的方法,但单张 GPU 上 1–2 分钟就能生成一个(比需要几个 GPU 小时的方法快一到两个数量级)。

这些工作说明了基础模型的”可组合性”:一个在海量图文上学到的模型,可以作为先验或评判者,嫁接到数据稀缺的新模态上。


5. 把视觉接到语言模型上:Flamingo · Visual language models

5.1 问题:语言模型很强,但看不见

到 2022 年,大语言模型已经能做少样本的上下文学习(第 5 讲)。能不能让它”看图”,同时保留这些能力?从零训练一个图文模型太贵,而且会丢掉语言模型的知识。DeepMind 的 Flamingo(Alayrac et al., NeurIPS 2022)的答案是:两个都冻结,只训练中间的”胶水”。

5.2 架构

图像/视频 → 视觉编码器(NFNet-F6,用对比学习预训练,冻结❄)
          → Perceiver Resampler(新训练):把数量不定的视觉特征变成固定数量的视觉 token
                         ↓(作为键和值)
文本 → [ 冻结的 LM 层❄ ]  ← 在层与层之间插入新的 GATED XATTN-DENSE 层:
                              y = y + tanh(α_xattn) · CrossAttn(q = y, kv = 视觉 token)
                              y = y + tanh(α_dense) · FFW(y)
                              α 初始化为 0

几个关键设计:

  • 冻结的语言模型:最大的 Flamingo(80B)建立在 70B 的 Chinchilla 上,所有语言模型层都不训练——保住它的语言能力和知识,也避免灾难性遗忘(第 6 讲 §3.4)。
  • 门控的交叉注意力:新插入的层前面乘一个 tanh⁡(α)\tanh(\alpha),α\alpha 初始化为 0。所以训练刚开始时,整个模型就是原来的语言模型;训练逐渐把视觉信息”打开”。这和 LoRA 把 BB 初始化为 0(第 6 讲 §4.6)是同一个思想:新加的部分从”什么也不做”开始。
  • Perceiver Resampler:不管输入是一张图还是一段视频,都压缩成固定数量的视觉 token,交叉注意力的成本因此可控。
  • 交错的图文数据:从大约 4300 万个网页里抽出图片和文字,保留它们在网页里的相对位置(M3W 数据集);再加上图文配对和视频-文本配对。正是”图、文、图、文”交错出现的训练数据,让模型学会了多模态的上下文学习。

5.3 结果

用法和 GPT-3 一样:在提示里放几个(图片, 问题, 答案)的例子,再放新的图片和问题。Flamingo 在 16 个图像和视频理解任务上测试,在其中 6 个上,仅凭少样本提示(32 个例子)就超过了在数千倍的任务数据上微调过的最好模型。

Flamingo 是”冻结主干 + 轻量适配”(第 6 讲)在多模态上的大规模版本,也是后来几乎所有视觉-语言模型(BLIP-2、LLaVA……)的模板:一个预训练的视觉编码器 + 一个预训练的语言模型 + 一个连接两者的模块。


6. 行动也是一种模态:Gato、VPT、MineDojo · Agents

6.1 Gato:一切都是 token

DeepMind 的 Gato(Reed et al., TMLR 2022)把”统一的 token 序列”推到了极致:文本、图像块、游戏手柄的按键、机械臂的关节力矩,全都序列化成 token,用同一个有 12 亿参数的 Transformer、同一组权重做下一个 token 预测。它能玩 Atari、给图片写描述、聊天、用真实的机械臂堆积木——一共 604 个任务;具体输出文字、力矩还是按键,由上下文决定。

Gato 是一个”概念证明”:多任务、多模态、多”身体”(embodiment)的通用策略可以放在一个网络里。它的局限也很明显:为了实时控制机器人,模型不能太大;它的训练数据是各个任务上专家智能体的轨迹,不是网上的海量数据——这限制了规模化。

6.2 VPT:从没有标签的视频里学会玩 Minecraft

问题:网上有海量的游戏视频,但视频里没有”按了哪个键”。行为克隆(BC)需要(画面, 动作)对。

VPT 的做法(Baker et al., OpenAI 2022):

  1. 雇人玩 Minecraft,记录画面和键盘鼠标操作——约 2000 小时(准确地说 1962 小时);
  2. 用它训练一个逆动力学模型(IDM):看前后的画面,猜中间按了什么。IDM 的按键准确率 90.6%,鼠标移动的 R2R^2 为 0.97;
  3. 从网上搜到约 27 万小时的 Minecraft 视频,筛出约 7 万小时”干净”的,用 IDM 给它们打上伪标签;
  4. 在伪标签数据上做行为克隆,得到一个”基础模型”;再用强化学习微调,第一次让智能体做出了钻石镐——熟练的人类玩家通常要 20 分钟以上(约 24,000 个动作)。

为什么 IDM 比 BC 容易? BC 只看过去的画面,要猜玩家打算做什么——这需要理解意图和长远目标。IDM 是非因果的:它能看到动作的结果(画面往左转了 → 鼠标往左移了)。环境的物理规律远比人类行为的多样性简单,所以 IDM 需要的数据少得多。论文还发现,大约 100 小时的标注就能训练出可用的 IDM。

代码 04 在一个”采木头”的 7 × 7 网格世界里复现这个流程:玩家走到树上、按 mine 砍掉它;专家(“人类玩家”)走向最近的树,有 15% 的时候随便按一个键。IDM 和 BC 用同样的小卷积网络,区别只在输入(IDM 看前后两帧,BC 只看当前一帧)。

演示 1:同样多的带标签数据,谁学得更准?

带标签的局数样本数IDM 准确率BC 准确率
3900.5170.354
103000.6240.492
309000.9130.585
10030000.9590.752

演示 2:完整流程——nn 局带标签的数据训练 IDM,给 500 局”视频”打伪标签,再做 BC;指标是策略自己玩时平均砍到的木头数(满分 5):

nn只用 nn 局做 BC伪标签准确率伪标签的错误里”画面没变”的比例伪标签 BC
30.040.52712%0.14
100.150.63415%0.35
300.620.91653%2.02
1002.680.96391%3.10
500 局都有真标签(上限)3.06

参照:专家自己玩 4.92,每步随机按键 0.35。

  • 同样的数据,IDM 总是比 BC 准。 卷积网络学到的”玩家往上挪了一格 → up”在每个位置都通用;而 BC 要猜专家打算去哪棵树。
  • VPT 流程把少量标签”放大”了。 只用 30 局做 BC,几乎砍不到木头(0.62);用同样的 30 局训练 IDM、给 500 局视频打伪标签再做 BC,得到 2.02;n=100n = 100 时 3.10,和”500 局都有真标签”的上限一样。
  • 伪标签有一个质量门槛。 IDM 只用 3–10 局训练时,伪标签准确率 0.53–0.63,下游的 BC 不比随机按键好。到了 0.9 左右就够用:这时剩下的错误大多发生在”前后两帧完全一样”的步上(这种步只占 22%,却占了 30 局时 53%、100 局时 91% 的错误)——撞墙、空砍、noop 在画面上无法区分,而它们对任务本来就无关紧要。
  • 即使有真标签,BC 也只有 3.06,远低于专家的 4.92。 一步走错,后面的画面就是专家数据里没见过的,错误会累积(分布偏移)。这正是 VPT 在 BC 之后还要用强化学习微调的原因。

6.3 MineDojo:把互联网上的知识变成奖励

MineDojo(Fan et al., NeurIPS 2022 杰出论文奖)走的是另一条路:建立一个包含数千个开放式任务的 Minecraft 模拟环境,和一个”互联网规模”的知识库——Minecraft 的视频、教程、Wiki 页面和论坛讨论。他们在视频和解说文字上训练了一个视频-语言的对比模型 MineCLIP(“视频版的 CLIP”),然后用它当奖励函数:智能体的行为片段和任务描述(例如”shear a sheep”)越匹配,奖励越高。这样就不需要为每个任务手写奖励函数。


7. 共同的模式 · Common patterns

回头看这一讲的十几篇论文,有几个反复出现的模式:

  1. 网上的弱配对数据是燃料。 alt 文本(CLIP、DALL·E)、交错图文网页(Flamingo、CM3)、带解说的视频(MineDojo)、没有标签的视频(VPT)。它们有噪声、不完整,但规模是标注数据无法比的。§2.6 提醒我们:数据里没有的东西(例如很少需要关系的描述),模型也学不会。
  2. 一个模型给另一个模型当标注器、先验或评判者。 CLIP 给 DALL·E 的样本重排序,CLIP 的空间是 DALL·E 2 的中转站,Imagen 是 DreamFusion 的先验,IDM 给 VPT 打伪标签,MineCLIP 给智能体发奖励。第 2 讲的质量分类器、第 7 讲的奖励模型也是同一个思路。
  3. 冻结 + 轻量连接。 Flamingo 冻结语言模型和视觉编码器,Imagen 冻结 T5,DreamFusion 冻结扩散模型。预训练很贵,复用比重训划算,而且冻结能保住已有的能力。
  4. “一切都是 token” vs 专门的模块。 DALL·E、CM3、Gato 把所有模态都变成 token 序列;扩散模型、Flamingo 则为不同模态保留专门的结构。2022 年两条路都有成功的例子;§9 会看到后来的走向。
  5. 语言是通用接口。 用文字描述类别(零样本分类)、用文字描述想要的图(文生图)、用文字描述任务(MineCLIP 的奖励)。语言模型的能力因此成为多模态模型的”放大器”——Imagen 发现文本编码器比图像模型更重要。

8. 风险与局限 · Risks and limitations

  • 数据里的偏见会被继承和放大。 网上的图文数据反映了网上的刻板印象;CLIP 论文自己就报告了模型把某些人群的照片分到冒犯性类别的问题。公开的大规模图文数据集(例如 LAION-5B)后来也被发现含有不当内容,需要更多的审计和过滤(第 2 讲 §9.5、§10)。
  • 生成模型带来深度伪造和虚假信息的风险(第 18 讲),以及训练图像和画风的版权争议(第 19 讲)。
  • 评测很难。 FID 衡量生成图像和真实图像的分布有多接近,CLIP score 衡量图文的匹配程度,但两者都和人类判断不完全一致;Imagen 提出 DrawBench、用人类评估,正是因为自动指标不够。
  • 组合性仍然是短板(§2.6):“两个物体谁在左边""三只猫和两只狗”这类描述,2022 年的模型常常做错。

9. 2023 年之后 · Since 2023

  • 视觉-语言模型成为标配。 2023 年初的 BLIP-2 用一个轻量的 Q-Former 连接冻结的视觉编码器和冻结的语言模型;LLaVA(Liu et al. 2023)用 GPT-4 生成的”视觉指令”数据微调,展示了简单的线性投影 + 指令微调就很有效。2023 年 9 月 GPT-4V 开放了图像输入。Flamingo 的模板(视觉编码器 + 连接模块 + 语言模型)成了主流。
  • 原生多模态。 Google 的 Gemini(2023 年底)从一开始就在多种模态上联合训练;OpenAI 的 GPT-4o(2024 年)在一个模型里端到端地处理文本、图像和音频;Meta 的 Chameleon(2024)把图像和文本都变成 token、“早融合”地训练——DALL·E / CM3 的”一切都是 token”路线以更大的规模回来了。
  • 扩散模型的骨干换成 Transformer。 Diffusion Transformer(DiT,Peebles & Xie 2023)证明了 Transformer 在潜空间扩散里同样遵循规模定律;OpenAI 的视频模型 Sora(2024 年初)用的就是这一类架构。训练目标上,flow matching / rectified flow 一类方法(例如 Stable Diffusion 3)逐渐取代了原始的 DDPM 目标;consistency model 等方法把采样步数压到个位数。
  • 对比学习的改进。 SigLIP(2023)把 softmax 形式的 InfoNCE 换成逐对的 sigmoid 损失,不再需要整个 batch 归一化,在小 batch 上也表现好——和 §2.5 的”batch 不是越大越好”呼应。DataComp(2023)把”怎样筛选图文数据”本身变成了一个基准(第 2 讲 §9.5)。
  • 从视频和网络数据学行动。 VPT 的”逆动力学 + 伪标签”思路被用到机器人上(从人类视频里学动作);视觉-语言-动作模型(VLA,例如 Google 的 RT-2,2023)把机器人动作也当成 token,用视觉-语言模型的权重初始化——Gato 的想法以”在 VLM 上微调”的方式实现了。

哪些结论仍然成立? 用网上的弱配对数据训练、用语言作为接口;对比学习作为视觉表示的主要预训练方法之一;扩散 + CFG 作为图像(和视频)生成的主流;冻结主干 + 轻量连接;伪标签放大少量标注。被修正或补充的:多模态从”把几个预训练模型接起来”走向”从一开始就联合训练”;组合性和计数在更大的模型和更好的数据上有明显进步,但没有完全解决。


10. 小结 · Summary

  1. 多模态基础模型要解决两个问题:怎样把不同模态放进一个模型(共享嵌入空间、统一的 token、交叉注意力),以及数据从哪里来(网上的弱配对)。
  2. CLIP:4 亿对图文,对称 InfoNCE,学到图文共享的空间;把类别名写成提示就能零样本分类(ImageNet 76.2%,和用了 128 万标注的 ResNet-50 相当);提示工程 + 集成约提高 5 个百分点。我们的小世界里:见过的组合零样本 0.943(相当于 16-shot 以上的线性探针),没见过的组合 0.209;提示几乎没用;batch 太大会引入假负例。
  3. 组合性:Winoground、ARO 发现 CLIP 像词袋。我们的实验:词袋编码器在交换测试上是精确的 0.500;看词序的编码器能学会绑定,但只有当数据里有足够多需要关系的描述时才学会左右关系(p≤5%p \leq 5\% 时掉到 0.514);困难负例只能放大已有的信号。
  4. 图像生成:DALL·E 把图像变成 1024 个 token、用 120 亿参数的 Transformer 自回归生成;扩散模型学习预测噪声、一步步去噪。CFG ϵ^=(1+w)ϵc−wϵ∅\hat\epsilon = (1+w)\epsilon_c - w\epsilon_\varnothing 让样本比真实数据还”典型”(0.904 → 1.000),代价是夸张(样本被往外推)和多样性下降。潜空间扩散让它便宜;Imagen 发现文本编码器的规模更重要;DDIM 用更少的步数采样。
  5. 视频和 3D:把文生图模型当作先验——Make-A-Video 不需要文本-视频配对,DreamFusion 不需要 3D 数据。
  6. Flamingo:冻结的 Chinchilla + 冻结的视觉编码器 + 门控交叉注意力(tanh⁡(α)\tanh(\alpha),α\alpha 初始为 0)+ 交错图文数据,少样本提示在 16 个任务中的 6 个上超过微调的最好模型。
  7. 行动:Gato 把 604 个任务塞进一个 12 亿参数的 Transformer;VPT 用约 2000 小时的标注训练 IDM、给 7 万小时视频打伪标签。我们的网格世界里,30 局标注 + 伪标签让 BC 从 0.62 根木头提高到 2.02,100 局时追平真标签的上限。

11. 常见误区 · Common pitfalls

  1. “CLIP 理解了图片的内容。” 它学到的是图和文的匹配;在需要组合、关系、计数的测试上,它常常像一个词袋(Winoground、ARO;代码 02)。
  2. “零样本就是什么都没学过。” 零样本指的是没有用这个任务的标注;模型在预训练时见过大量相关的图文。描述里从没一起出现过的组合,它也认不出来(代码 01:0.209)。
  3. “提示工程总是很重要。” 它的价值取决于提示和训练文本的分布差得有多远;在我们措辞单一的小世界里几乎没用(代码 01 演示 2)。
  4. “对比学习的 batch 越大越好。” 负例里如果有很多其实也配得上的”假负例”,大 batch 反而有害(代码 01 演示 4);CLIP 的大 batch 依赖于数据的多样性。
  5. “guidance 越大,图越好。” guidance 提高和条件的一致性,但会夸张、过饱和、降低多样性(代码 03)。
  6. “扩散模型必须走上千步。” DDPM 训练时用的步数和采样时用的步数可以不同;DDIM 等方法用同一个网络走 20 步就接近 100 步的效果(代码 03 演示 3),后来的方法压到个位数。
  7. “多模态模型都要从零联合训练。” 2022 年最成功的几个(Flamingo、Imagen、DreamFusion)都大量复用了冻结的单模态模型。
  8. “有了伪标签,就不需要人工标注了。” IDM 本身需要标注训练,而且伪标签有质量门槛:太差的伪标签会让下游学不到东西(代码 04:n≤10n \leq 10 时不比随机好)。
  9. “行为克隆有了足够的数据就能达到专家水平。” 即使用真标签,BC 也会因为分布偏移、错误累积而远低于专家(代码 04:3.06 vs 4.92);VPT 还需要强化学习微调。

12. 练习 · Exercises

练习 1(InfoNCE 的极限) batch 大小为 BB 的 InfoNCE(一个方向),如果模型完全随机(所有余弦相等),损失是多少?如果模型完美(正例的 logit 比所有负例大很多),损失是多少?由此解释为什么 InfoNCE 的值可以看成”互信息的下界”的一个估计:I(X;T)≥log⁡B−LI(X; T) \geq \log B - \mathcal{L}。

参考答案

完全随机时每行是 BB 个相等的 logit,−log⁡(1/B)=log⁡B-\log(1/B) = \log B。完美时趋于 0。所以 log⁡B−L\log B - \mathcal{L} 在 0 到 log⁡B\log B 之间;van den Oord et al. 证明了它是图文互信息的一个下界。这也说明 batch 越大,这个下界最高能到的值(log⁡B\log B)越大——这是”大 batch”的理论动机之一;代码 01 演示 4 则说明,当 batch 里有假负例时,这个动机会被抵消。

练习 2(温度) 代码 01 里学到的温度从 0.07 降到 0.046。温度变小意味着什么?如果把温度固定在 1.0,你预测零样本准确率会怎样?

参考答案

温度越小,softmax 越尖锐,模型对”正例比负例好一点点”的惩罚越重,迫使正例的余弦明显高于负例。余弦只在 [−1, 1] 之间,温度 1.0 时 logit 的范围只有 2,softmax 几乎是均匀的,梯度信号很弱,模型很难学好,零样本准确率应该明显下降(具体以你运行的结果为准)。CLIP 把 logit 的缩放(1/τ1/\tau)截断在 100,就是怕温度学得太小导致训练不稳定。

练习 3(提示集成在哪里平均) CLIP 把多个提示的文本向量在嵌入空间里平均,而不是把多个提示各自给出的概率平均。两者有什么区别?哪一种推理更便宜?

参考答案

嵌入空间平均:每个类别得到一个平均后的向量,之后分类只需要一次”图像向量 × K 个类别向量”,和用一个提示的成本相同;平均向量可以提前算好缓存。概率空间平均:每个提示都要单独算一次 softmax 再平均,推理成本是提示数倍。效果上两者不一定相同(嵌入平均后再归一化,相当于在球面上取”中心”),CLIP 论文选择了更便宜的嵌入平均。

练习 4(改代码,预测结果) 把 mm_world.HELD_OUT 改成空集(4 个组合也出现在训练数据里),重新运行代码 01。你预测”没见过的组合”那一行会变成多少?这个实验说明了什么?

参考答案

这时 4 个组合不再是”没见过”的,准确率应该和其他 12 个组合差不多(0.9 以上,具体以你运行的结果为准)。这说明 0.209 不是因为这 4 个组合本身难认,而是因为它们没有出现在训练数据里——组合泛化失败的原因在数据覆盖,而不在任务难度。

练习 5(CFG 的推导) 证明:如果 ϵθ(x,c)≈−σ∇xlog⁡p(x∣c)\epsilon_\theta(x, c) \approx -\sigma\nabla_x\log p(x\mid c)、ϵθ(x,∅)≈−σ∇xlog⁡p(x)\epsilon_\theta(x, \varnothing) \approx -\sigma\nabla_x\log p(x),那么 ϵ^=(1+w)ϵc−wϵ∅\hat\epsilon = (1+w)\epsilon_c - w\epsilon_\varnothing 对应的分布是 p(x∣c) p(c∣x)wp(x \mid c)\,p(c\mid x)^w。

参考答案

(1+w)∇log⁡p(x∣c)−w∇log⁡p(x)=∇log⁡p(x∣c)+w[∇log⁡p(x∣c)−∇log⁡p(x)](1+w)\nabla\log p(x\mid c) - w\nabla\log p(x) = \nabla\log p(x\mid c) + w[\nabla\log p(x\mid c) - \nabla\log p(x)]。由贝叶斯公式 log⁡p(c∣x)=log⁡p(x∣c)+log⁡p(c)−log⁡p(x)\log p(c\mid x) = \log p(x\mid c) + \log p(c) - \log p(x),所以 ∇log⁡p(x∣c)−∇log⁡p(x)=∇log⁡p(c∣x)\nabla\log p(x\mid c) - \nabla\log p(x) = \nabla\log p(c\mid x)。合起来是 ∇log⁡[p(x∣c) p(c∣x)w]\nabla\log[p(x\mid c)\,p(c\mid x)^w]。ww 越大,越偏向”隐式分类器 p(c∣x)p(c\mid x) 最有把握”的区域——在代码 03 里就是离别的类别最远的地方,所以样本被往外推。

练习 6(改代码,预测结果) 把代码 03 的 p_uncond 从 0.1 改成 0(训练时从不丢掉条件),再跑演示 2。你预测 w=3w = 3 时会发生什么?

参考答案

网络从没学过”空”类别,ϵθ(x,t,∅)\epsilon_\theta(x, t, \varnothing) 是一个没训练过的嵌入给出的、没有意义的预测;ϵc−ϵ∅\epsilon_c - \epsilon_\varnothing 不再指向”类别特有的方向”,而是一个任意的方向,放大它会让样本跑偏,正确率和离团距离都可能变差(具体以你运行的结果为准)。这说明 CFG 的前提是同一个网络同时学会有条件和无条件的预测。

练习 7(Flamingo 的门控) Flamingo 的门控交叉注意力是 y←y+tanh⁡(α)⋅CrossAttn(y,x)y \leftarrow y + \tanh(\alpha)\cdot\text{CrossAttn}(y, x),α\alpha 初始为 0。如果去掉门控(直接 y←y+CrossAttn(y,x)y \leftarrow y + \text{CrossAttn}(y, x)),训练开始时会发生什么?这和第 6 讲的哪种方法的初始化思想一样?

参考答案

去掉门控,随机初始化的交叉注意力从第一步起就往冻结语言模型的残差流里加入随机的扰动,冻结的层看到的输入分布变了,语言模型的输出会被破坏,训练初期损失很高、可能不稳定。有门控时,训练开始时模型完全等于原来的语言模型,视觉信息逐渐”打开”。这和 LoRA 把 BB 初始化为 0(第 6 讲 §4.6)、adapter 的近恒等初始化是同一个思想。

练习 8(概念:为什么 IDM 是非因果的) VPT 的 IDM 能看到动作之后的画面。为什么这让它比 BC 容易?举一个 IDM 也无法区分的例子,并解释这个例子为什么对下游任务影响不大。

参考答案

BC 要从过去的画面推断玩家的意图(要去哪里、要做什么),同一个画面下不同的玩家可能做不同的事;IDM 能看到动作的结果,只需要学环境的”物理”(按 up → 往上走一格),这比意图简单得多,而且几乎是确定性的。IDM 无法区分的例子:撞墙时按 up 和按 noop,画面都没变(代码 04:100 局时 91% 的伪标签错误发生在画面没变的步上)。这些动作本来就不改变世界,对完成任务没有贡献,所以把它们标错,下游的 BC 也学不到什么坏习惯。

练习 9(改代码,预测结果) 把代码 04 的 EXPERT_NOISE 从 0.15 改成 0.5。你预测 IDM 的准确率和 BC 自己玩的成绩会怎样变化?

参考答案

IDM 的准确率应该变化不大:随机动作只要在画面上留下了痕迹,它就看得出来(撞墙、空砍的比例会上升,所以略有下降)。BC 会变差很多:一半的动作是不可预测的噪声,它学到的策略更”犹豫”,自己玩时砍到的木头更少;专家自己的成绩也会下降(具体以你运行的结果为准)。这说明 IDM 对”示范者不完美”更鲁棒——它学的是物理,不是策略。

练习 10(概念:统一 token vs 专门模块) 列出”把所有模态都变成 token 用一个 Transformer”(DALL·E、CM3、Gato)相对于”保留专门结构”(扩散、Flamingo)的两个优点和两个缺点。

参考答案

优点:(1)一个架构、一个训练目标,规模定律和语言模型的基础设施直接适用;(2)任意模态之间可以互相生成、交错,上下文学习自然扩展到多模态。缺点:(1)图像、视频的 token 很多,自回归生成慢,离散化丢细节;(2)不同模态的信息密度差别很大,统一的目标未必对每个模态都最合适(扩散在图像质量上长期领先)。2023 年之后,原生多模态模型在理解上走向统一的 token,生成上很多系统仍然结合了扩散。


13. 延伸阅读 · Further reading

原课阅读清单(Image-Text and Multimodal FMs)

  • Radford et al. Learning Transferable Visual Models From Natural Language Supervision(CLIP). ICML 2021. arXiv:2103.00020
  • Ramesh et al. Zero-Shot Text-to-Image Generation(DALL·E). ICML 2021. arXiv:2102.12092
  • Ho, Jain & Abbeel. Denoising Diffusion Probabilistic Models. NeurIPS 2020. arXiv:2006.11239
  • Rombach et al. High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 2022. arXiv:2112.10752
  • Saharia et al. Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding(Imagen). NeurIPS 2022. arXiv:2205.11487
  • Ho et al. Imagen Video: High Definition Video Generation with Diffusion Models. 2022. arXiv:2210.02303
  • Singer et al. Make-A-Video: Text-to-Video Generation without Text-Video Data. 2022. arXiv:2209.14792
  • Poole et al. DreamFusion: Text-to-3D using 2D Diffusion. 2022. arXiv:2209.14988
  • Nichol et al. Point-E: A System for Generating 3D Point Clouds from Complex Prompts. 2022. arXiv:2212.08751
  • Alayrac et al. Flamingo: a Visual Language Model for Few-Shot Learning. NeurIPS 2022. arXiv:2204.14198
  • Aghajanyan et al. CM3: A Causal Masked Multimodal Model of the Internet. 2022. arXiv:2201.07520
  • Reed et al. A Generalist Agent(Gato). TMLR 2022. arXiv:2205.06175
  • Baker et al. Video PreTraining (VPT): Learning to Act by Watching Unlabeled Online Videos. NeurIPS 2022. arXiv:2206.11795
  • Fan et al. MineDojo: Building Open-Ended Embodied Agents with Internet-Scale Knowledge. NeurIPS 2022. arXiv:2206.08853

补充

  • Ho & Salimans. Classifier-Free Diffusion Guidance. 2022. arXiv:2207.12598
  • Song, Meng & Ermon. Denoising Diffusion Implicit Models(DDIM). ICLR 2021. arXiv:2010.02502
  • Ramesh et al. Hierarchical Text-Conditional Image Generation with CLIP Latents(DALL·E 2). 2022. arXiv:2204.06125
  • Jia et al. Scaling Up Visual and Vision-Language Representation Learning With Noisy Text Supervision(ALIGN). ICML 2021. arXiv:2102.05918
  • Thrush et al. Winoground: Probing Vision and Language Models for Visio-Linguistic Compositionality. CVPR 2022. arXiv:2204.03162
  • Yuksekgonul et al. When and why vision-language models behave like bags-of-words, and what to do about it? ICLR 2023. arXiv:2210.01936
  • Liu et al. Visual Instruction Tuning(LLaVA). NeurIPS 2023. arXiv:2304.08485
  • Peebles & Xie. Scalable Diffusion Models with Transformers(DiT). ICCV 2023. arXiv:2212.09748

14. 下一讲预告 · Next lecture

这一讲把”语言模型的配方”推广到了图像、视频和行动。下一讲把它推广到另一类”语言”:蛋白质序列、RNA、代码、医学和法律文本。第 15 讲(领域基础模型)会讨论:为什么在蛋白质序列上做掩码语言建模,模型就能学到蛋白质的三维结构(共进化与接触图);数据稀缺的领域(例如 RNA 结构,2/13 客座 Raphael Townshend 的方向)怎样用合适的归纳偏置弥补;代码模型为什么要用”能不能通过单元测试”(pass@k)来评测;以及领域预训练和”通用模型 + 适配”之间怎样取舍。代码会在合成的”RNA 家族”序列上训练一个掩码语言模型,从它的注意力里找出哪些位置配对。

← 返回课程目录