跳到主要内容

从「看懂」到「会做」 — 把下一个元素放宽,它就会画了(Emu2)

这一章讲三件事: 一个模型怎么会同时既能回答又能画; 「给它看几个例子它当场就会」这件事到底有多明显(有一个从 33.5 跳到 67.0 的数); 以及一个基础模型要再经过什么,才变成能对话的助手。 它在全书链条里的位置是「把它做大」这条支线的最后一篇,也是通向后半本的桥—— 第 03 章说过「只做过对比的模型永远吐不出一句话」,这一章就是那个换目标的实例。

1. 顶层全景:一条混着图和字的序列

本章的主走查用书里给出的真实训练样本格式1:

<s> A photo of <p>a man</p><coor>【框的位置图 → 64 个数】</coor>
[IMG]【男人这张图 → 64 个数】[/IMG]
sitting next to <p>a dog</p><coor>…</coor>[IMG]【狗这张图 → 64 个数】[/IMG]
[IMG]【整张图 → 64 个数】[/IMG] </s>

模型的任务只有一句话:**把这条序列里的下一个元素预测出来。**
├─ 下一个元素是一个词 → 从词表里挑一个(用分类损失)
└─ 下一个元素是一张图 → 吐出 64 个数(用回归损失)


交给一个独立训练的还原器,变回一张 1024×1024 的图

图说:`<p>` 圈住物体名字,`<coor>` 那一段是**把框画在一张黑图上、再当成一张图编码进来**;
[IMG]…[/IMG] 之间是这张图的 64 个数。**这条序列是书里的原样格式,不是我们编的。**

这一章的全部内容,就是这条序列上的四件事: 怎么把图变成 64 个数(第 3 节)、两种损失怎么分(第 4 节)、 64 个数怎么变回一张图(第 5 节)、以及这套做法带来了什么(第 6 节起)。

2. 先看现象:同一个模型,给不给例子差别有多大

先把结论摆出来,因为它是全章最硬的一个数2:

给它看几个例子某个视觉问答任务上的成绩
0 个(直接问)33.5
4 个67.0
8 个67.8
16 个68.8

这四行是同一个模型、同一批题目、一个参数都没有改。 差别只有一件事:在提问之前,先在输入里贴几道做好的例题。

对照物: 同一项上,一个 800 亿参数的对手在给 16 个例子时是 66.8, 另一个 800 亿参数的是 65.4——而这个模型只有 370 亿参数2

这个现象的名字叫上下文学习:模型不改任何参数,只靠输入里的几个例子,当场学会一个新任务。 而「只给几个例子」这种设定,业内叫少样本—— 第 04 章第 ⑦ 堵墙讲过,下游数据太少是这条线的默认前提; 从这一章起,「每类只给 N 个例子」会成为后面所有实验的标准设定。

注意零样本那一栏只有 33.5,比给例子低了一半。 这说明它并不是「本来就会,例子只是提醒」——例子确实带来了新东西。 (书里没有解释为什么零样本这么低。照实写在这儿。)

3. 怎么让一张图变成序列里的一个元素

先看问题

第 02 章讲过,一句话被切成 token 排成一条序列。图片怎么排进这条序列?

一张 224 的图切成 196 块,如果每块都当一个元素,一张图就占掉 196 个位子—— 两三张图就把序列撑满了(第 04 章第 ② 堵墙)。

做法:压成固定的 64 个

书里的做法分两步3:

  1. 把图切成 8×8 = 64 块,每块内部求平均;
  2. 过一层线性投影,变成语言模型认得的形状。

于是每张图固定占 64 个位子,和它原来多大、多复杂无关。

书里特别提了一句:这比上一代简化了——上一代要在中间加一个专门的转换模块, 这一版直接「切块 + 平均 + 一层投影」就完事3

代价是明摆着的:64 个数要概括整张图。 后面第 8 节会看到,他们在做「助手」那一版时把它加到了 16×16 = 256 个, 理由正是「捕捉更细的空间细节」——这等于承认 64 个不够用。

4. 两种损失:文字那步是「挑一个」,图片那步是「差多远」

这一节是全章的机制核心,必须讲透。

先看问题

「预测下一个元素」听起来统一,但两种元素的答案类型根本不一样:

下一个是一个词下一个是一张图
候选有多少有限的:词表里那 4 万多个,挑一个无限的:它是 64 个连续的数,没有「第几个」可挑
怎么算对错挑对了没有(分类损失)吐出来的 64 个数,和正确答案差多远(回归损失)

一句话讲清这两个词: 分类损失问的是「你从清单里挑对了吗」,答案是离散的; 回归损失问的是「你给出的数和正确答案差多远」,答案是连续的—— 常见做法就是第 06 章那个均方误差。

所以书里的训练目标写的是:文字部分用分类损失,图像部分用回归损失4

走查:这条序列上每一步在干什么

<s> A photo of <p>a man</p> <coor>…</coor> [IMG]〔64 个数〕[/IMG] sitting …
│ │ │ │ │ │ │
│ └────┴────┴──────┴──────────────┘ │
│ 这些位置:预测下一个「词」 │
│ → 从词表里挑,算分类损失 │
│ │
└── 这些位置:预测下一个「图元素」(64 个数)
→ 直接吐 64 个数,和真值比差多远,算回归损失

图说:同一条序列、同一个模型、同一次前向,**只是不同位置用不同的尺子量。**

两个阶段,冻的东西不一样

这里能看到第 05 章那套「分阶段、每阶段冻不同部件」的套路又出现了5:

阶段训什么损失规模
全部一起训只在文字上算损失(先学会看图说话)1.62 亿图文对 + 700 万视频文本对,224 分辨率;之后再用 448 分辨率补 4000 步
冻住视觉编码器,只训中间那层投影和主体文字用分类损失 + 图像用回归损失1.6 亿图文样本 + 38 亿纯文本 token

注意第二阶段掺了 38 亿纯文本 token——和第 05 章第三阶段掺纯文本是同一个理由: 别让它把「怎么好好说话」忘了。

5. 画图交给谁:一个独立训练的「还原器」

先看问题

上一节模型吐出了 64 个数。可用户要的是一张图。

做法:训一个专门把 64 个数变回图的东西

书里管它叫去分词器——这个名字是相对「分词」起的: 把图变成 64 个数是「分词」,把 64 个数变回图就是「去分词」。

关键设计是:它和语言模型完全解耦,单独训6

一张真实照片
│ 过视觉编码器

64 个数
│ 过还原器

一张重建出来的图 ←── 要求它和原照片尽量像

图说:整个训练过程**语言模型完全不参与**。
编码器 + 还原器合起来就是一个「图片压缩–解压」的组合。
书里报的重建相似度是 **0.907**(满分 1),用的还原器底座是一个现成的画图模型。

为什么解耦很重要: 书里说上一代的做法是「还原器每训一步都要语言模型跑一遍复杂的预测」, 而这一版把它拆开单独训,简单得多6

输入 448、输出 1024——还原器顺带把分辨率提上去了6

这个还原器是一个扩散模型。它内部怎么把一堆噪声变成一张图,第 15 章整章讲。 (这是一笔记在总纲兑现表上的债。)

6. 「让它画在指定位置」这件事,不需要新机制

这一节展示了「统一序列」这种设计的真正好处。

先看问题

你想说「把这只狗画在左下角」。位置信息怎么告诉一个只会处理序列的模型?

做法:把框画在一张黑图上,当成一张图塞进去

书里的做法朴素得让人意外:在一张纯黑的图上,按指定位置画出物体的框, 然后把这张黑图当成一张普通图片编码成 64 个数,插进序列里7

这就是走查里那个 <coor>…</coor> 段落。

为什么这一招值得记住: 它没有引入任何新模块、新损失、新机制。 一切能被画成图的东西,都能变成这条序列上的一个元素。 你想加深度图、加草图、加分割掩码,做法完全一样。

7. 一个基础模型,离「能用的助手」还差一轮训练

这一节讲的是全书唯一一处「多模态助手是怎么造出来的」,原书用了一整节。

上面那些做完之后,拿到的是一个基础模型:它会续写混着图和字的序列。 但它不会「听你说话、按你的要求回答」。要做到那个,还得再训一轮,而且分两种。

第一种:能对话的版本

书里的做法有三个具体动作8:

动作做法为什么
标出谁在说话引入 [USER][ASSISTANT] 两个特殊记号,把对话切成固定格式让模型分得清哪段是提问、哪段该由它写
只对答案算损失只有 <Answer> 那一段被监督不去学「怎么提问」,只学「怎么回答」
把图切得更细从预训练的 8×8 = 64 个,加到 16×16 = 256 个为了抓住更细的空间细节

训练规模:批量 768,跑 8000 步,序列长度上限 20488

第二种:能按要求生成图的版本

另一条支线是做可控生成。这里有一个细节很值得记:

他们在这一轮里冻住了视觉编码器,书里给的理由是「防止模型崩塌」9

「崩塌」指的是模型退化成输出千篇一律的东西。 为什么冻住能防止: 因为图像那一路的损失是「让吐出来的 64 个数接近目标」—— 如果编码器本身也能动,模型可以偷懒:把所有图都编码成同一串数,损失照样降下去。 冻住编码器就堵死了这条捷径。(这个解释是我们补的,书里只写了动作和目的。)

另外两个诚实的动作: 回归损失只作用在最后那张图的嵌入上(不是每张); 最后再用 50 万张高质量图文对收尾9

8. 作者的判断与证据

书里给了证据的:

说法证据
上下文学习随例子数增加而变强0 → 4 → 8 → 16 个例子:33.5 → 67.0 → 67.8 → 68.8
370 亿能赢 800 亿在三个数据集上超过两个 800 亿参数的对手
编码器 + 还原器是个好的自编码组合重建相似度 0.907
对话版在多个评测上领先视觉问答 84.9、综合能力 48.5、另一项 703.8
没专门训过视频问答,却赢了专训过的视频问答两项 49.0 与 31.4,书里明说「尽管没有专门在视频问答数据上训练」

必须注意的一处口径: 对话版那几个高分里, 有几项在评测表里带星号,表示「这项任务的训练集样本参与过训练」10这不是作假(论文里标出来了),但它意味着那几个数和「零样本」不是一回事。 读任何一张模型评测表时,都要先找这种标记。

属于作者的推断:

  • 「大规模生成式多模态预训练能带来上下文学习能力」—— 这是全篇的主张,证据是最终模型确实有这个能力; 但书里没有做「换一种预训练目标、其他都不变」的对照实验, 所以「是生成式预训练带来的」这个因果,严格说没有被隔离出来。

9. 边界与局限

① 零样本成绩很低,书里没有解释。 33.5 这个数比给 4 个例子低了一半, 这说明这个模型在「不给例子」的情况下并不好用,而这一点在正文里没有被讨论。

② 64 个数概括一张图,信息肯定丢了。 证据是他们自己在做对话版时把它加到了 256 个。书里没有量化「64 对 256」到底差多少。

③ 生成质量的评分表里,它并非全胜。 在文字与图片一致性这一项上, 它的分数低于同期几个专门的画图模型;书里的正文只强调了它领先的那些项。 照实写在这儿。

④ 这一章的成本同样是「大厂级」。 370 亿参数、两个阶段各两万到三万五千步、 批量最大 12800——书里没有给卡数和天数,但从规模能推断出量级。

10. 可带走的

  1. 一个目标就能同时管看和画:把「预测下一个词」放宽成「预测下一个元素」, 元素可以是词、也可以是图变成的那串数;
  2. 代价是损失要分两种:文字是「从清单里挑一个」(分类损失), 图片是「差多远」(回归损失);
  3. 每张图固定压成 64 个数:切成 8×8 块、块内求平均、过一层线性投影;
  4. 上下文学习是这一章最硬的证据:同一个模型、一个参数不改, 0 个例子 33.5 → 4 个例子 67.0 → 16 个例子 68.8;
  5. 「少样本」这个默认设定从这里正式开始,后面每一章的实验都按它来;
  6. 370 亿赢了 800 亿——参数量不是唯一的胜负手;
  7. 画图交给一个独立训练的还原器,它和语言模型完全解耦,重建相似度 0.907;
  8. 位置控制不需要新机制:把框画在一张黑图上,当成一张普通图片编码进序列;
  9. 基础模型 ≠ 助手:还要再训一轮,只对答案那一段算损失,并把图切得更细(64 → 256);
  10. 可控生成那一版冻住了视觉编码器,理由是防崩塌——堵死「把所有图编成同一串数」这条捷径;
  11. 读评测表先找星号:带星号的项表示该任务的训练集参与过训练,不能当零样本读。

11. 原文地图

主题原书章原文位置
370 亿参数、统一目标「预测下一个多模态元素」4. Generative Multimodal Modelstext/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:65(搜「predicting-the-next-multimodal-element」)
三个部件:视觉编码器 / 主体 / 视觉解码器;8×8 平均 + 线性投影同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:101(搜「eliminating the need for an extra C-Former」)
每张图固定 64 个视觉嵌入、两阶段训练与损失同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:111(搜「fixed size (N=64)」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:115(搜「text classification and image regression losses」)
去分词器:独立训练、448 进 1024 出同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:121(搜「detokenizer」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:125(搜「1024×1024」)
训练样本的真实格式、把框画在黑图上同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:169(搜「image embedding of object localization image」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:171(搜「drawing bounding boxes on a black image」)
对话版:两个特殊记号、只监督答案、16×16同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:151(搜「Only the tokens are supervised」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:157(搜「16 × 16 tokens」)
生成版:冻住视觉编码器防崩塌、50 万高质量对同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:171(搜「freeze the visual encoder to prevent model collapse」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:163(搜「500k high-quality image-text pairs」)
少样本成绩、赢过两个 800 亿模型同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:181(搜「outperforms both Flamingo-80B」) · text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:281(搜「33.5」)
自编码重建相似度 0.907同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:951(搜「0.907 CLIP-I」)
星号:该任务训练集参与过训练同上text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:583(搜「indicates that samples from this task」)

Footnotes

  1. 出处:「4. Generative Multimodal Models Are In-Context Learners」第 169 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:169,搜「image embedding of object localization image」)。这是书里给出的原样训练样本格式,我们只把英文标注换成了中文说明,结构一字未改。

  2. 出处:同上第 181 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:181,搜「outperforms both Flamingo-80B」)与表 4.1 所在的第 281 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:281,搜「33.5」)。表 4.1 里 Emu2(370 亿)在 VQAv2 上 0/4/8/16 个例子分别是 33.5 / 67.0 / 67.8 / 68.8;Flamingo(800 亿)16 个例子是 66.8,IDEFICS(800 亿)是 65.4。书里没有解释零样本为什么这么低。 2

  3. 出处:同上第 101 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:101,搜「eliminating the need for an extra C-Former」)。原文:图像被切成 8×8 块、求平均、再线性投影,从而省掉了上一代那个额外的转换模块。三个部件分别用了一个现成的图文编码器、一个 330 亿参数的语言模型、一个现成的画图模型。 2

  4. 出处:同上第 115 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:115,搜「text classification and image regression losses」)。原文:第二阶段冻住视觉编码器,只调线性投影层与多模态主体,同时使用文本分类损失与图像回归损失。「分类损失 / 回归损失」两个词的白话解释是我们补的(不在书里)。

  5. 出处:同上第 111 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:111,搜「fixed size (N=64)」)与第 115 段。第一阶段:图文对与视频文本对,图注损失只作用在文本 token 上,输入 224×224,1.62 亿图文样本 + 700 万视频文本样本,35200 步;之后换 448 分辨率再训 4000 步。第二阶段:加入交错数据、定位数据与纯文本数据,1.6 亿图文样本 + 38 亿纯文本 token,20350 步。

  6. 出处:同上第 121 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:121,搜「detokenizer」)与第 125 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:125,搜「1024×1024」)。原文:上一代训练视觉解码器时每一步都需要语言模型给出复杂的预测,这一版把它当成「去分词器」独立训练,于是编码器与解码器合起来就是一个图像自编码器;视觉编码器输入 448×448,解码器输出 1024×1024,训练时以 10% 的概率随机丢弃图像嵌入。重建相似度 0.907 见第 951 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:951,搜「0.907 CLIP-I」)。 2 3

  7. 出处:同上第 171 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:171,搜「drawing bounding boxes on a black image」)。原文:物体坐标是「通过在一张黑图的指定位置上画出边界框」来在视觉上表示的。

  8. 出处:同上第 151 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:151,搜「Only the tokens are supervised」)与第 157 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:157,搜「16 × 16 tokens」)。原文:引入 [USER] 与 [ASSISTANT] 两个特殊 token 来区分对话角色,组织成统一格式,只有答案部分被交叉熵损失监督;批量 768、8000 步、序列长度上限 2048;指令微调时把每张图在视觉编码器里的平均池化改成 16×16 个 token,「比预训练时的 8×8 更细」。 2

  9. 出处:同上第 171 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:171,搜「freeze the visual encoder to prevent model collapse」)与第 163 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:163,搜「500k high-quality image-text pairs」)。原文:回归损失只作用在最后那张图的嵌入上;微调期间冻住视觉编码器以防模型崩塌;并通过随机丢弃实体 token 与位置信息、对物体图做随机背景与裁剪来增强鲁棒性。「为什么冻住能防崩塌」这个解释是我们补的,书里只写了动作和目的。 2

  10. 出处:同上第 583 段(text/25-ch04-4-generative-multimodal-models-are-in-context-le.txt:583,搜「indicates that samples from this task」)。原文的表注写着:带星号表示该任务的训练集样本被用于训练过。同一张表里对话版的视觉问答 84.9 就带着这个星号。视频问答那两项(49.0 与 31.4)见同段落上方的正文,原文强调它「尽管没有专门在视频问答数据上训练过」。