Flamingo:少样本视觉语言模型
本文将探讨 Flamingo——由 DeepMind 开发的用于多模态机器学习研究的开放式视觉语言模型(Visual Language Model,VLM)。
Flamingo 是一种视觉语言模型,能够执行图像描述(Image Captioning)、视觉对话、分类和视觉问答等多模态任务。
1. 什么是 Flamingo?
Flamingo 是一种视觉语言模型(VLM),在广泛的开放式视觉和语言任务的少样本学习中取得了新的最先进水平。
Flamingo 是一种视觉条件自回归文本生成模型,能够摄取与图像和/或视频交错的一系列文本 token,并生成文本作为输出。它通过添加新颖的架构组件,将大型语言模型与强大的视觉嵌入融合,每个模型都经过单独预训练并被冻结。
1.1 输入与输出示例
在深入研究之前,先看一些 Flamingo 可以执行的任务示例。

图 1:80B 参数模型 Flamingo 的输入和输出示例。与大型语言模型一样,Flamingo 可以通过简单地用几个例子来提示(上图),快速适应各种图像和视频理解任务。Flamingo 开箱即用,还能够进行丰富的视觉对话(下图)。

1.2 Flamingo 模型结果概述

图 2:Flamingo 模型结果概述。
- 左:最大的模型在作者考虑的 16 项任务中的 6 项上优于最先进的微调模型,尽管没有使用微调。对于所有已发布少样本结果的 16 项任务,Flamingo 都大幅优于它们,并创下新的少样本最先进水平。
- 中:Flamingo 的表现随着样本数量增加而提高。
- 右:Flamingo 模型的性能随着模型规模增大而提高。
2. 多模态生成建模的挑战
2.1 统一强大的单模态模型
挑战:
- 训练大型语言模型的计算成本极其高昂。
- 作者从预训练的语言模型开始,节省了计算资源。
- 然而,纯文本模型没有内置方法来合并来自其他模态的数据。
- 作者希望在保留原始语言模型知识的同时实现多模态融合。
建议方法:
将交叉注意力层与常规语言自注意力层进行交叉注意力。作者还引入了一种特定的门控机制,以最小化这些新增层在初始化时的影响,从而大大提高了稳定性和最终性能。
2.2 支持图像和视频
挑战:
- 图像和视频(即使是中等分辨率)也是高维的。
- 将它们展平为一维序列(如单模态文本生成中所使用的)成本很高,因为计算量与序列长度呈二次方关系。
- 作者希望以统一的方式处理图像和视频,但这并不简单。
建议方法:
使用 Perceiver 架构,在给定大量不同数量视觉输入特征(最多数千个)的情况下,为每个图像/视频生成少量固定数量的视觉 token(大约一百个)。
2.3 异构训练数据
挑战:
- 大型模型需要庞大的数据集。
- CLIP 和 ALIGN 中使用的配对图像/标题数据集可能不够通用,无法达到 GPT-3 风格的少样本学习。
- 存在基于互联网的大型纯文本数据集,但不适合多模态数据。
- 一种方法是抓取带有图像和文本的网页。尽管数据具有普遍性,但图像和文本往往相关性较弱。
建议方法:
将交错数据集(作者创建的 M3W)与标准配对图像/文本和视频/文本数据集相结合,其中视觉和语言通常更紧密相关。
3. Flamingo 的核心思想
DeepMind 的 Flamingo 可以仅通过几个输入/输出示例执行各种多模态任务(例如图像描述、视觉对话、分类或视觉问答)。这是通过以下关键思想实现的:
- 一种新颖的架构,用于接受任意交错的视觉和文本数据作为输入,并以开放式方式生成输出文本。
- 架构创新和训练策略有效地利用大型预训练的纯视觉和纯语言模型,节省大量计算并保留这些初始模型的优势,同时有效地融合模态。具体来说,作者使用了 Chinchilla,一个 70B 参数的最先进语言模型(在 Flamingo 中被冻结),并训练了 80B 参数的 Flamingo VLM。
- 适应不同尺寸视觉输入的有效方法,使 Flamingo 适用于图像和视频。
4. Flamingo 模型
4.1 模型结构

图 3:Flamingo 模型概述。Flamingo 模型是视觉语言模型(VLM)系列,可以接受与文本交叉输入的视觉数据,并生成自由格式的文本作为输出。其性能的关键是新颖的架构组件和预训练策略。
Flamingo 接受与图像/视频交错的文本并输出自由格式的文本。它可以处理开放式任务(例如视觉问答或图像描述)和封闭式任务(例如分类)。
- 作者的第一个目标是利用预训练的语言模型,避免从头开始训练。具体来说,他们使用了 DeepMind 最近推出的 Chinchilla 模型。这使得 Flamingo 具有强大的生成语言能力,并可以访问存储在语言模型权重中的大量知识。
- 在视觉方面,作者使用类似于 CLIP 的对比文本-图像方法预训练视觉编码器。该模型从给定图像/视频中提取丰富的语义空间特征。
- 第二个目标是和谐地连接这两种模型。为此,作者冻结了这些模型的权重,并通过两个可学习的架构组件将它们连接起来:
- 感知器重采样器(Perceiver Resampler):从视觉编码器接收时空特征(从可变数量的图像或视频获得),并输出一组固定大小的视觉 token。
- 然后,使用视觉 token 通过新初始化的交叉注意力层调节冻结的语言模型,这些层插入在预训练的语言模型层之间,为语言模型提供将视觉信息整合到下一个 token 预测任务中的方法。
Flamingo 模型的一个重要方面是,它可以对文本
其中
该模型通过在不同数据集的混合数据上最大化上述似然来训练。
4.2 视觉编码器:从像素到特征
- 作者使用了 F6 Normalizer-Free ResNet(NFNet),因为它在性能和效率之间提供了良好的权衡。
- 使用 CLIP 所采用的对比损失将视觉编码器预训练为双编码器。
- BERT 用于文本编码器,在预训练后被丢弃。
- 对比相似度计算为图像编码器输出的平均池化与 BERT 模型平均池化输出的点积。
- 与 CLIP 相比,为了简单起见,全局平均池化用于生成视觉嵌入(而不是全局注意力池化)。
- 使用 288×288 像素图像分辨率,联合嵌入空间大小为 1376。
- 最终输出是特征
,进一步展平为 1D,如图 4 所示。 - 对于视频输入,帧以 1 FPS 采样并独立编码,以获得一系列
个特征图 ,然后将其连接起来。
4.3 视觉编码器详细信息
4.3.1 优化
- 使用 Adam 优化器在 512 个 TPUv4 芯片上进行训练。
- 使用相当大的批量大小 16,384,为模型提供大量负样本。
- 颜色增强和随机水平翻转用作数据增强。
- 在零样本图像分类上监控训练过程(如 CLIP,通过提示模板完成):
A photo of a {class}。
表 1:针对不同数据集组合进行的消融研究。

4.3.2 预训练数据
- 在两个图像-文本对数据集的组合上进行训练。
- ALIGN:由 18 亿张图像与替代文本组成,规模大但噪声大。
- LTIP:3.12 亿张图像,具有更清晰、更长的描述。
- 数据与经消融研究证实最有效的累积策略相结合。
这里定义了不同的数据组合策略:
- 累积(Accumulation):计算每个数据集批次的梯度,并在更新参数之前通过加权和将其组合。
- 数据合并(Merging):将每个数据集中的示例合并到每个批次中。
- 循环(Alternation):在每个数据集中交替批次,每批次后更新参数。
4.4 感知器重采样器(Perceiver Resampler)
4.4.1 感知器重采样器伪代码
def perceiver_resampler(
visual_features, # [T, S, d] 视觉特征(T=时间,S=空间)
time_embeddings, # [T, 1, d] 时间位置嵌入
latent_queries, # [R, d] 可学习的潜在查询
num_layers, # Transformer 层数
):
"""Perceiver Resampler 模型。
将可变大小的时空视觉特征重采样为固定数量 R 个视觉 token。
"""
# 添加时间位置嵌入并展平空间和时间维度
visual_features = visual_features + time_embeddings
visual_features = flatten(visual_features) # [T, S, d] -> [T*S, d]
# 应用 Perceiver Resampler 层
for _ in range(num_layers):
# 自注意力 + 交叉注意力
latent_queries = latent_queries + attention(
q=latent_queries,
kv=concat([visual_features, latent_queries])
)
# 前馈网络
latent_queries = latent_queries + ffw(latent_queries)
return latent_queries4.4.2 感知器重采样器结构

图 4:Perceiver Resampler 模块将来自视觉编码器的可变大小的时空视觉特征网格映射为固定数量的输出 token(图中为 5 个),与输入图像分辨率或输入视频帧数无关。该 Transformer 使用一组可学习的潜在向量作为查询,键和值是时空视觉特征与可学习潜在向量的拼接。
- Perceiver Resampler 基于 DeepMind 的论文 Perceiver: General Perception with Iterative Attention。
- Flamingo 模型将来自视觉编码器的可变数量的图像或视频特征作为输入,并输出固定数量的视觉 token。
- 视觉输入被重采样为固定且少量(实际上是 64 个)的输出,以显著降低视觉-文本交叉注意力的计算复杂度。
- 输入到 Perceiver Resampler 的视觉特征首先通过将可学习的时间位置嵌入(
)添加到视频每一帧对应特征的空间网格中获得,如图 4 所示。 - 作者只使用了时间编码,没有使用空间网格位置编码,因为后者没有带来改进。
- 然后这些视觉特征被展平为
。 - 与原始 Perceiver 类似,该模型学习预定义数量的潜在输入查询。
- 这些潜在查询被输入 Transformer 堆栈,并交叉参与展平的视觉特征
。 - 从学习到的潜在变量计算出的键和值被拼接到来自
的键和值上。
4.5 Gated XATTN-DENSE 层
4.5.1 Gated XATTN-DENSE 层伪代码
def gated_xattn_dense(
language_features, # 输入语言特征
visual_features, # 输入视觉特征
alpha_xattn, # 交叉注意力门控参数,初始化为 0
alpha_dense, # 前馈网络门控参数,初始化为 0
):
"""应用一个 Gated XATTN-DENSE 层。"""
# 1. 门控交叉注意力
language_features = language_features + tanh(alpha_xattn) * attention(
q=language_features, kv=visual_features
)
# 2. 门控前馈网络
language_features = language_features + tanh(alpha_dense) * ffw(language_features)
# 3. 冻结的自注意力 + 前馈网络
language_features = language_features + frozen_attention(
q=language_features, kv=language_features
)
language_features = language_features + frozen_ffw(language_features)
return language_features4.5.2 Gated XATTN-DENSE 层结构

图 5:Gated XATTN-DENSE 层。作者插入了新的交叉注意力层,其键和值是在使用语言查询时从视觉特征中获得的;然后在现有的预训练和冻结的语言模型层之间插入密集前馈层,以便根据视觉输入调节语言模型。这些层经过门控,使得语言模型在初始化时保持完整,从而提高稳定性和性能。
- 文本生成由 Transformer 解码器执行,以 Perceiver Resampler 生成的视觉表示
为条件。 - 作者使用最大的 Flamingo 模型所对应的 70B 参数 Chinchilla 作为语言模型。
- 在 Flamingo 训练过程中,预训练的语言模型块被冻结,以保留纯文本语言模型中的信息和文本生成能力。
- 为了根据视觉输入调节语言模型,作者在原始自注意力层之间插入了门控交叉注意力密集层(Gated XATTN-DENSE),如图 5 所示。原始的自注意力层在 Flamingo 训练过程中被冻结,而新插入的交叉注意力层则从头开始训练。
- LayerNorm 应用于所有注意力输入和前馈层(GPT-2 风格)。
- 作者还添加了 tanh 门控机制,以在初始化时保留原始语言模型行为,避免灾难性地改变语言模型学习到的特征。
- 新添加的交叉注意力层的输出乘以
,其中 是初始化为 0 的、特定于层的可学习标量。 - 在训练过程中,由于门控机制,模型可以从完全训练的纯文本模型顺利过渡到视觉语言模型。
4.6 图像/视频的注意力掩码
4.6.1 掩码交叉注意力

图 6:交错的视觉数据和文本支持。给定与图像/视频交错的文本(例如来自网页),作者首先在文本中视觉数据的位置插入
<image>标签,以及特殊标记<BOS>(句子开头)或<EOC>(句子结尾)来处理文本块。图像由视觉编码器和 Perceiver Resampler 独立处理以提取视觉 token。每个文本 token 只交叉关注与最后一个前面图像对应的视觉 token。函数为每个 token 指示最后一个前面图像的索引(如果没有前面的图像则为 0)。在实践中,这种选择性交叉注意力通过掩码交叉注意力机制实现——此处用深蓝色条目(未掩码)和浅蓝色条目(掩码)进行说明。
- 训练数据还包括从网页抓取和处理的交错序列。
- 每个交错示例由文本序列
、图像序列 以及图像在文本中的位置序列组成。 - 基于视觉数据位置,作者定义了一个函数
,为每个文本位置分配出现在该位置之前的最后一个图像或视频的索引(如果该位置之前没有出现视觉数据,则为 0)。 - 函数
定义了哪些视觉输入可用于预测 token:前面 token 的集合 ,以及先前图像或视频的集合 。 - 多图像注意力通过 Gated XATTN-DENSE 层实现,并对来自 Perceiver Resampler 的 token 进行因果掩码。
- 默认情况下,每个 token 只允许关注紧邻其之前出现的图像的视觉 token(此限制提高了性能)。
- 尽管直接注意力集中在单个图像上,但仍然存在对先前图像的因果依赖性(由于文本解码器中的因果自注意力)。
- 此外,实验表明该模型可以在 5 张图像上训练,但最多可以泛化到 32 张图像。
5. 训练数据
Flamingo 使用以下三类数据进行训练:
- 图像-文本对数据
- 视频-文本对数据
- 网页数据(交错)

图 7:训练数据集。不同性质训练数据集的混合。
对应于单个示例的视觉输入数量;对于配对图像(或视频)和文本数据集, ; 是视频帧数量, 是图像的特例; 分别是高度、宽度和颜色通道。
5.1 MultiModal Massive Web(M3W)
- 从 4300 万个网页中提取文本和图像。
- M3W 包含 1.85 亿张图像和 182 GB 文本。
- 使用文本过滤器和图像过滤器删除低质量数据。
- 图像分辨率为 320×320 像素。
- 文本序列长度为 256 个 token。
5.2 图像-文本对数据
- ALIGN 数据集:18 亿个噪声图像-文本对,平均每个图像 12.4 个文本 token。
- LTIP 数据集:3.12 亿个图像-文本对,平均每个图像 20.5 个文本 token。
- 图像分辨率为 320×320 像素。
- 文本序列长度为 32/64 个 token。
5.3 视频-文本对数据
- VTP 数据集:包含 2700 万条短视频。
- 平均时长 22 秒。
- 帧分辨率为 320×320 像素。
- 时间维度为 8(
)。 - 文本序列长度为 32 个 token。
6. Flamingo 训练详情
6.1 损失与优化
- 所有模型均使用 AdamW 进行训练。
- 优化采用线性预热和恒定学习率(衰减并没有带来改进)。
数据集混合权重
- M3W:1.0
- LTIP:0.2
- ALIGN:0.2
- VTP:0.03
6.2 训练目标
模型通过最小化以视觉输入为条件的文本的、数据集特定的负对数似然的加权和来训练:
其中:
表示第 个数据集; 表示第 个数据集的正标量权重。
与视觉编码器预训练类似,调整这些权重很重要,并使用组合数据的累积策略。
6.3 基础设施与实现
- 模型和相关基础设施使用 JAX 和 Haiku 实现。
- 所有训练和评估均在 TPUv4 实例上完成。
- 最大(80B)模型在 16 台设备上的 1536 个芯片上训练了 15 天。
- Megatron 分片用于 Embedding / 自注意力 / 交叉注意力 / 前馈网络。
- ZeRO 阶段 1用于对优化器状态进行分片。
- 激活与梯度保存在
bfloat16中,参数与优化器累加器保存在float32中。
7. 通过少样本上下文学习进行任务适应
- 作者使用由 GPT-3 普及的上下文学习来评估模型快速适应新任务的能力。
- 模型以(图像,文本)或(视频,文本)的形式给出一组支持示例(其中图像或视频是输入视觉效果,文本是预期响应),以及单个视觉查询,模型需要据此做出预测。
- 给定一些支持示例,作者通过拼接支持示例和视觉查询来构建多模态提示,如图 8 所示。

图 8:少样本交错提示生成。给定一些特定于任务的少样本示例(支持示例)和 Flamingo 模型必须进行预测的查询,作者通过在每个相应文本之前交错图像来构建提示。他们引入了一些格式,例如,为所有视觉到文本任务预先考虑
"Output:"作为预期响应前缀,或为视觉问答任务使用"Question: {question} Answer: {answer}"格式提示。
7.1 Prompt Ensembling
- 跨多个提示的集成可用于提高性能。
- 此外,这可以与最近邻的不同排列上的 RICES 相结合。
- 对于给定的答案,对数似然集成在所选少样本提示的六种随机排列上。
7.2 基于检索的上下文示例选择
- 利用大量支持示例可能很困难,因为在提示中容纳所有示例的成本很高,并且如果在训练中使用较少的示例,泛化可能会受到影响。
- 作者使用了 Yang 等提出的基于检索的上下文示例选择(RICES)。
- RICES 通过比较从冻结的预训练视觉编码器中提取的视觉特征,检索支持集中与查询图像相似的图像。
- 提示通过拼接前
个最相似的示例来构建。
7.3 零样本泛化
- 在缺乏少样本示例的情况下,一种方法是使用提示工程(如 CLIP 所示)。
- 验证需要访问大量带注释的示例,因为性能对提示很敏感,因此不能被视为真正的零样本。
- 为了报告零样本性能,作者使用下游任务中的两个示例构建一个提示,在这些任务中删除相应的图像或视频输入,同时保留输出,以便让模型了解预期输出的格式。
- 作者报告说,仅显示一个而不是两个文本示例会使模型产生与单个提供的文本示例类似的输出。
7.4 开放式与封闭式评估
- 在开放式设置中,模型在查询图像之后采样的文本被视为对图像的预测,在第一个
<EOS>token 处停止。 - 使用波束搜索,波束大小为 3。
- 在封闭式设置中,所有可能的输出都独立地附加到查询图像,然后按对数似然对序列进行排序。
8. Flamingo 模型结果
8.1 Flamingo 模型的参数数量
表 2:Flamingo 模型的参数数量。作者重点关注增加冻结语言模型和可训练视觉-文本 Gated XATTN-DENSE 模块的参数数量,同时将冻结视觉编码器和可训练重采样器在不同模型中保持固定且较小的尺寸。括号中给出了 Gated XATTN-DENSE 相对于原始语言模型块的频率。

8.2 定性结果
下面的面板使用作者在论文中提供的示例展示了 Flamingo 如何在各种任务中执行。请注意,所有结果均取自论文,因为该模型不是开源的。
下面的结果展示了最简单的交互形式:提供单个图像,然后以问题或标题开头提供文本提示。即使模型没有以问答形式进行训练,预训练语言模型的能力也允许这种适应。
8.2.1 单张图像样本

单图像样本:灰色框是用户输入,粉色框是 Flamingo 输出。
由于 Flamingo 模型可以接受任意视觉和语言序列形式的输入,因此作者测试了其与交错图像和文本进行扩展对话的能力。有趣的是,即使经过几轮交互,Flamingo 仍然可以成功地关注图像并回答问题。如下面的示例所示,Flamingo 还展示了扎实的 OCR 能力、对分布变化的鲁棒性和复杂推理能力。
8.2.2 Flamingo 对话交互

对话样本。灰色框是用户输入,粉色框是 Flamingo 输出。
Flamingo 还可以集成来自多个帧的信息(例如扫描场景或文本的视频)并响应涉及时间理解的请求。
8.2.3 视频样本

视频样本。这些是模型看到的所有帧。
结论
Flamingo 是一个“通用”模型系列,可应用于图像和视频,以最少的特定任务训练数据来理解任务。仅给出几个示例,单个 Flamingo 模型就可以在多种任务上实现最先进的效果,通常与需要对更多示例进行微调的方法相竞争。
尽管该模型存在一些弱点,例如在分类任务上的表现比对比模型更差,直接继承了语言模型的所有偏见、毒性和弱点,有时在开放式视觉问答任务中出现幻觉和无根据的猜测(更多细节见论文第 6 节),但它为多模态系统提供了一个充满希望的未来:该系统可以在无需明确训练的情况下执行多种任务。未来如何将音频等其他模态集成到这些系统中,也值得持续关注。