从嵌入到生成:一文读懂GENIUS多模态检索革命

发布于:2025-03-28 ⋅ 阅读:(33) ⋅ 点赞:(0)


今天开组会博士师兄讲了NIPS 2023的 Recommender Systems with Generative Retrieval,算是生成式检索范式的开篇。前几天快手发布了 OneRec通过生成替代传统的召回,精排等检索过程,这篇 GENUIS是亚马逊发布的,今天也来学习一下,也许通过生成替代检索已经成为未来的趋势。

1. 背景

1.1 传统检索方法及其问题

📌 什么是 IR(Information Retrieval)?

信息检索(IR)指的是从一个大规模数据库中找出与查询(query)相关的信息。这项技术广泛用于搜索引擎、推荐系统、图像检索、问答系统等。

📌 目前主流方法:Embedding-based Retrieval(嵌入式检索)

大多数现有系统都采用**嵌入-检索(embed-and-retrieve)**的范式。简单来说,它的流程如下:

  1. 把查询和数据库中的内容都编码成向量(embedding)

  2. 在向量空间中进行相似度计算,通常是用余弦相似度;

  3. 找到最相似的内容作为返回结果。

这类方法的学习目标是:“让相似内容的向量靠近,不相似的远离”,这种表示学习通常依赖于“度量学习”(metric learning)方法,如对比损失、triplet loss 等。

⚠️ 存在的问题:扩展性差,计算开销大

当数据库变得庞大时,会遇到几个实际困难:

  • 向量的索引构建和维护开销巨大
  • 最近邻搜索即使用近似算法(如 HNSW、Faiss),也无法避免随着数据量上升而急剧增加的计算成本
  • 每次插入新数据或更新数据,都需要重新处理索引结构,影响系统实时性和灵活性。

1.2 新方向:生成式检索

📌 什么是生成式检索?

生成式检索的思路是:不再寻找“最相似”的那个,而是直接生成目标的ID

就像是在问:“哪个是我要的?”系统会直接输出目标的编号或标识。

灵感来源:Differentiable Search Index(DSI)、SPLADE 等方法,它们把“检索”变成“生成”。

📌 它是如何工作的?

  • 系统接收一个查询(可能是图、文或图文对);
  • 模型直接“生成”目标数据在数据库中的离散ID序列
  • 不再依赖大规模向量比对、索引或向量数据库。

⚠️ 当前生成式方法的局限:

  1. 任务专用性强

目前的生成式检索方法大多只支持文本检索,且为特定任务设计,难以扩展到其他模态或任务中。

  1. 模态覆盖不足

很少有方法支持图像、视频、图文对等多模态数据的统一处理。

  1. 跨模态检索效果不佳

在图文之间进行互检(如用文字找图),生成式方法效果远不如嵌入式方法。

在这里插入图片描述

如图:

📍(a) Embedding-based Retrieval(传统嵌入检索)

  • 查询和候选内容分别经过图像/文本编码器(Vision/Text Encoder);
  • 得到两个向量,计算它们的相似度分数(如 0.6);
  • 最终返回相似度最高的结果。

问题:对大规模数据库来说,计算开销极大。

📍(b) Existing Generative Retrieval(已有生成方法)

  • 查询输入后,模型直接生成一个目标的ID(如 4327)
  • 这个ID是用来在数据库中定位目标数据的;
  • 但是,现有生成模型通常只能支持特定类型的数据(例如图像或文本),无法跨模态使用。

📍© Our GENIUS Framework(本文提出的新方法)

这是核心亮点!GENIUS做了两件重要的事:

  1. 支持任意模态的统一处理

你可以输入图像、文本、图文对等不同形式的查询,并明确查询意图(instruction);

  • 如:“找出描述这张图片的标题”
  • “找出包含这段描述的图像”
  • “找一个图文对和这个文本有关”
  1. 生成的ID带有“模态信息”

ID的第一位编码了模态(image/text/image-text-pair),后面的位表示内容语义;

  • 如 0 9 1 4 表示图像数据;
  • 1 9 1 4 表示文本数据;
  • 2 9 1 4 表示图文对。

这种方式实现了模态解耦语义对齐,使得图像和文本之间可以用同一种机制生成、比较和检索。

2. 核心

✨GENIUS 框架简介:统一多模态的生成式检索新范式

GENeratIve Universal mul- timodal Search (GENIUS)是一个面向未来的信息检索框架,旨在通过生成目标 ID 的方式,统一处理图像、文本及图文对等多模态检索任务,突破传统向量匹配带来的效率与扩展性瓶颈。

与传统“嵌入-匹配”检索方法不同,GENIUS的创新之处在于:

👉 直接从查询中生成目标的离散 ID,并实现模态无关的语义对齐与快速查找。


🧱 Stage 0:编码器预训练(Encoder Pretraining)

使用图文对作为输入,预训练图像编码器文本编码器

加入“instruction”提示,让模型具备理解任务意图的能力;

学习到良好的多模态表征基础。

🧩 Stage 1:训练量化器(Training Quantizer)

使用残差量化(Residual Quantization)将图文内容编码成离散的ID序列

第一个ID位置表示模态类型(如图像=0,文本=1,图文对=2);

后续ID表示语义信息(逐层表示“从粗到细”的语义内容);

使用对比学习确保同语义的不同模态 ID 保持接近。

🔁 Stage 2:训练生成器(Training Decoder)

构建一个自回归解码器(Autoregressive Decoder),输入查询,生成对应目标的离散ID;

结合前述量化器输出的 ID 作为目标进行训练;

引入 Query Augmentation(查询增强)策略,通过查询-目标插值增强泛化能力。


🚀 推理阶段(Inference)

GENIUS 在实际使用时:

  1. 接收图文形式的查询(Query + Instruction);

  2. 编码后生成目标ID(使用 Trie-constrained Beam Search 限定生成空间);

  3. 在数据库中找到候选数据后,可进一步使用嵌入相似度做 reranking,提升准确率。

3. 问题定义

一、任务设置解释

📌 用户的输入(查询)是由两部分组成的:

  1. 查询内容

记作 q c o n q_{con} qcon,可能是图像、文本,或者图文对。

比如:一张图片、或一句话、或一张图+一句描述。

例子:图像 q i q_i qi、文本 q t q_t qt、图文对 ( q i , q t ) (q_i, q_t) (qi,qt)

  1. 检索指令

记作 q i n s t q_{inst} qinst,说明用户希望返回的目标类型和含义。

  • 比如:“找出这张图对应的文字描述”
  • 或者:“找出与这句话相符的图像”
  1. 最终的查询 q 定义为:

q = ( q con , q inst ) q = (q_\text{con}, q_\text{inst}) q=(qcon,qinst)

📌 系统的目标是:返回一个目标 c

这个目标 c 可能是:

  • 一张图 c i c_i ci
  • 一段文本 c t c_t ct
  • 或者图文对 ( c i , c t ) (c_i, c_t) (ci,ct)

二、什么是“生成式检索”?

GENIUS 的思路是:不去匹配数据库中所有内容,而是直接“生成”目标的离散 ID

这个 ID 是一串 token,记作:

T c = ( t 1 c , t 2 c , … , t M c ) T_c = (t_1^c, t_2^c, …, t_M^c) Tc=(t1c,t2c,,tMc)

也就是说,我们的任务目标变成了:

给定查询 q,逐步生成一串离散 token,拼成目标 c 的 ID 序列

三、公式详解
t k c = arg ⁡ max ⁡ t ∈ T log ⁡ p ( t ∣ q , t < k c ; θ ) t_k^c = \arg\max_{t \in \mathcal{T}} \log p(t \mid q, t^c_{<k}; \theta) tkc=argtTmaxlogp(tq,t<kc;θ)

这就是生成过程的解码公式,它表示什么意思呢?逐项解释如下:

  • t k c t_k^c tkc:表示要生成的 ID 序列中第 k 个 token;
  • 𝒯:token 的候选空间(比如所有可能的离散码);
  • q q q:当前的查询(即 q c o n q_{con} qcon + q i n s t q_{inst} qinst);
  • t < k c t^c_{<k} t<kc:表示已经生成出来的前 k–1 个 token;
  • θ θ θ:模型参数,包括编码器和解码器;
  • p ( ⋅ ) p(·) p():给定前文后,下一个 token 的概率分布;

所以整个公式的含义是:

选择使得条件概率最大的 token 作为第 k 个输出,直到完整生成整个目标 ID。

这个过程和语言模型(如 GPT)在生成句子的方式一样,只不过这里我们生成的是离散的 语义 ID 序列


四、生成式检索的优势

相比传统嵌入-匹配范式的几大优势:

传统方法 GENIUS 生成式方法
计算向量相似度 直接生成目标 ID
需要构建索引 不需要索引结构
检索速度依赖数据库规模 生成式解码 + Trie 加速,速度更稳定
多模态处理要切换模型/结构 支持统一模态处理与指令控制
泛化能力弱 结合 Query Augmentation 可适应多样查询表达

🧠 小结归纳

GENIUS 将“搜索”这件事转化成了“生成一个目标ID序列”的任务,避免了大量向量比对与索引维护的代价,同时具备更强的灵活性与多模态适配能力。

4. 方法

4.1 框架

在这里插入图片描述

GENIUS 方法的总体结构,它包括 三个主要训练阶段(Stage 0–2)一个推理阶段(Inference time)

✅ 总体目标:

构建一个能够处理通用、多模态检索任务的生成式框架 —— GENIUS,核心是:根据查询生成目标的离散ID序列


🧩 三个训练阶段对应图中上方三块(Stage 0~2),推理阶段对应图下方一整块

Stage 0:Encoder Pretraining 编码器预训练

🎯 目的:

让图像编码器和文本编码器具备理解输入查询+指令、提取跨模态语义特征的能力。

📦 输入:

图像 q i q_i qi c i c_i ci(来自查询或目标)

文本 q t q_t qt c t c_t ct(查询或目标文本)

指令 q i n s t q_{inst} qinst(如:“找出匹配图像”)

⚙️ 模块结构:

使用 Image Encoder 处理图像;

使用 Text Encoder 编码文本+指令;

将图像表示和文本表示拼接或加权融合(图中“+”);

优化损失函数 L p t L_{pt} Lpt,引导图文对表达对齐。

✅ 输出:

学习到能有效对齐模态与指令语义的表征 ψ i m g ( ⋅ ) ψ_{img(·)} ψimg() ψ t e x t ( ⋅ ) ψ_{text(·)} ψtext(),供后续模块使用。

Stage 1:Training Quantizer 训练量化器

🎯 目的:

将图文内容编码为结构化的离散 ID,用于表示目标数据的位置和语义

📦 输入:

来自 Stage 0 的图文表征 ψ ( ⋅ ) ψ(·) ψ()

对应的 ground-truth 目标。

⚙️ 模块结构:

使用 Residual Quantization(残差量化),将连续向量编码为离散 token:

第一个 token 表示模态类型(如 0=图像,1=文本,2=图文对);

后续 token 表示语义内容

学习目标包括两个 loss:

L c l L_{cl} Lcl:对比学习(语义一致性);

L m s e L_{mse} Lmse:重建误差(精细匹配 token);

✅ 输出:

为每个目标 c 得到一个结构化离散 ID:

z_c = [modality_token, semantic_token_1, semantic_token_2, ...]

Stage 2:Training Decoder 训练生成器(解码器)

🎯 目的:

训练一个自回归生成器,根据查询生成离散 ID 序列,用来预测目标位置。

⚙️ 模块结构:

  1. 输入查询编码 z q z_q zq

  2. 使用 Query Augmentation(插值增强)得到更多变种查询表达;

  3. 使用 Autoregressive Decoder,逐步生成离散 ID(如 [0, 2, 1, 4, 3]);

  4. 目标是复现 quantizer 输出的 z c z_c zc

✅ 特点:

自回归生成方式;

结合增强查询训练,提高泛化能力;

支持不同模态的统一输出。

推理阶段(Inference):统一检索流程

🟨 1. 查询处理

用户输入一个查询(可以是图、文或图文对)+ 指令;

分别通过 Image EncoderText Encoder 提取表示;

表示融合 → 得到查询编码 z q z_q zq

送入 MLP + Decoder,生成候选 ID z ^ q ẑ_q z^q

🧠 使用 Trie-Constrained Beam Search:

限制生成的 token 路径只能是有效 ID(提升速度 & 准确性);

避免生成不存在的组合。

🟨 2. 候选 re-ranking(可选步骤)

对候选 ID 匹配数据库中离线编码好的目标 z c z_c zc

用嵌入距离再次排序,挑选最终结果;

可显著提升精度(尤其 top-1/top-k 的准确率)。

✅ 最终输出:

目标 ID → 数据库中定位 → 返回对应图片、文本或图文对。

🧠 总结:

GENIUS = 编码理解查询(Stage 0)+ 离散化目标表示(Stage 1)+ 生成式预测(Stage 2)+ 结构约束 + re-ranking,构成一个高效、通用、跨模态的生成式检索系统。

4.2 编码器预训练

在这里插入图片描述

🎯 目标:让图文编码器理解“查询 + 指令”如何对应到目标内容

在做生成式检索前,模型必须先能理解:

  • 查询由什么组成(图像、文本、指令);
  • 它想要找到什么样的目标;
  • 查询和目标之间的语义一致性该如何建模。

因此,Stage 0 的核心就是用对比学习方法对编码器进行预训练,使得:

正确的查询和目标的嵌入向量尽量靠近,错误的不靠近。

🧱 编码结构(结合图解释)

📌 输入组成

查询(左侧):

  • 图像 q i q_i qi → 送入 Image Encoder → 得到向量 ψ i m a g e ( q i ) ψ_{image}(q_i) ψimage(qi)
  • 文本内容 q t q_t qt 和检索指令 q i n s t q_{inst} qinst → 送入 Text Encoder → 得到 ψ t e x t ( q t , q i n s t ) ψ_{text}(q_t, q_{inst}) ψtext(qt,qinst)
  • 两者加和得到查询整体表示:

ϕ ( q ) = ψ image ( q i ) + ψ text ( q t , q inst ) \phi(q) = \psi_{\text{image}}(q_i) + \psi_{\text{text}}(q_t, q_{\text{inst}}) ϕ(q)=ψimage(qi)+ψtext(qt,qinst)

目标(右侧):

  • 图像 c i c_i ci ψ i m a g e ( c i ) ψ_{image}(c_i) ψimage(ci)
  • 文本 c t c_t ct ψ t e x t ( c t ) ψ_{text}(c_t) ψtext(ct)
  • 同样加和得到目标整体表示:

ϕ ( c ) = ψ image ( c i ) + ψ text ( c t ) \phi(c) = \psi_{\text{image}}(c_i) + \psi_{\text{text}}(c_t) ϕ(c)=ψimage(ci)+ψtext(ct)


🧮 损失函数公式解析:对比学习损失(Contrastive Loss)

L pt = − log ⁡ exp ⁡ ( ⟨ ϕ ( q ) , ϕ ( c + ) ⟩ / τ ) ∑ c ′ ∈ C exp ⁡ ( ⟨ ϕ ( q ) , ϕ ( c ′ ) ⟩ / τ ) \mathcal{L}{\text{pt}} = -\log \frac{\exp\left( \langle \phi(q), \phi(c^+) \rangle / \tau \right)}{\sum{c{\prime} \in \mathcal{C}} \exp\left( \langle \phi(q), \phi(c{\prime}) \rangle / \tau \right)} Lpt=logcCexp(ϕ(q),ϕ(c)⟩/τ)exp(ϕ(q),ϕ(c+)⟩/τ)

逐项解释如下:

符号 含义
q q q 查询(图+文+指令)
c + c⁺ c+ 正确匹配的目标(正样本)
𝒞 候选集(包括所有可能的目标,含负样本)
ϕ ( q ) ϕ(q) ϕ(q) 查询的嵌入向量
ϕ ( c + ) ϕ(c⁺) ϕ(c+) 正确目标的嵌入向量
ϕ ( c ′ ) ϕ(c′) ϕ(c) 其他候选(负样本)的嵌入向量
〈 ⋅ , ⋅ 〉 〈·,·〉 ⋅,⋅ 余弦相似度(点积后归一化)
τ τ τ 温度系数(温度越低,模型越“自信”)

这其实是一个 InfoNCE 风格的对比损失:

分子是正确目标与查询的相似度(希望最大)

分母是对所有候选目标与查询的相似度求softmax(归一化)

目标是:让正样本更接近,负样本更远离

最终,通过这个损失训练编码器,使得它能够:

准确捕捉“查询”表达的真实意图;

并在向量空间中拉近语义相关的查询和目标

Stage 0 用对比学习方法训练图文编码器,让模型具备理解“查询+指令”和“目标”的语义对应关系,为之后生成离散 ID 的任务打下良好基础。

训练完成后,图像编码器和文本编码器的参数就会 被冻结(frozen),不再更新,用于后续量化与生成阶段。

4.3 模态解耦的语义量化

在这里插入图片描述

🎯 目标:如何将不同模态的目标(图、文、图文对)统一编码为结构化的离散 ID,作为生成式检索的目标序列。

✅ 一、这部分的核心目标

在 Stage 1 中,模型要做一件事:

把每个目标(图、文、图文对)表示成一串结构化的离散 ID,作为之后生成任务的“目标输出”。

但这个 ID 不只是随机的数字序列,它有明确结构:

Token位置 表示内容
第一个 Token 表示 模态(如图像 = 0,文本 = 1,图文对 = 2)
后续 Token 表示 语义内容,逐层精细地描述该目标的含义

这就是 “模态解耦语义量化(Modality-Decoupled Semantic Quantization)”。

✅ 二、图中结构逐块解释(Stage 1)

🔹 输入部分:

左边是查询 q:

图像部分 ψ i m g ( q i ) ψ_{img}(q_i) ψimg(qi)

文本部分 + 指令 ψ t e x t ( q t , q i n s t ) ψ_{text}(q_t, q_{inst}) ψtext(qt,qinst)

两者通过 Fuse 模块(可以是加和、MLP、注意力等)融合成一个联合表示 z q z_q zq

右边是目标 c:

图像部分 ψ i m g ( c i ) ψ_{img}(c_i) ψimg(ci)

文本部分 ψ t e x t ( c t ) ψ_{text}(c_t) ψtext(ct)

同样通过 Fuse 得到 z c z_c zc

🔹 中间模块:Residual Quantization(残差量化)

✨ 概念简介:

残差量化是一种层级式编码方式:

第一个编码器负责学习“粗粒度”的信息(如:模态类型);

后续编码器逐步编码更细节的语义(如:内容、关系、风格);

每一层量化残差(residual)——即前面没表达完的信息。

👉 在 GENIUS 中的作用:

z q z_q zq z c z_c zc 分别量化为离散 ID: z ^ q ẑ_q z^q z ^ c ẑ_c z^c

输出结构如图:[0, 2, 1, 4, 7] 表示模态=0,语义tokens=[2,1,4,7]

🔹 损失函数部分:

L c l L_{cl} Lcl:对比损失(Contrastive Loss)

保证同一语义下的 z q z_q zq z c z_c zc 距离更近(查询和目标匹配);

类似于 Stage 0 的方式,只不过此处是用于量化学习。

L m s e L_{mse} Lmse:重构误差(Mean Squared Error)

保证量化后的 ẑ 与原始连续表示 z 尽量接近;

避免量化过程“破坏”语义信息。

在 Stage 1,GENIUS 通过残差量化机制将多模态目标表示成“模态 + 语义”的离散 ID 序列,为后续生成式检索提供统一的表示目标。

4.3.1 图例分析

在这里插入图片描述

这张图(Figure 3)是论文中关于 模态解耦语义量化(Modality-Decoupled Semantic Quantization) 的核心可视化示例,它展示了 GENIUS 如何将不同模态的数据(图像、文本、图文对)编码为结构化的离散 ID 序列,并且每一位 token 的意义是有逻辑分层的。

✅ 一、每个编码的结构是怎样的?

图中每个数据项(无论是图像还是文本)都被编码成一个长度为 5 的 token 序列:

[ t 1 , t 2 , t 3 , t 4 , t 5 ] [t_1, t_2, t_3, t_4, t_5] [t1,t2,t3,t4,t5]

这些 token 各自承担不同的信息角色:

位置 含义
t₁ 模态码:0=图像,1=文本,2=图文对(image-text pair)
t₂ 主体语义:跨模态共享的核心语义(如物体类别)
t₃ 次级语义:属性、动作等可被提取出的概念(如颜色、数量)
t₄ / t₅ 更细粒度的信息或其他补充语义

✅ 二、上半部分:图文同义 ID 示例

最上排红色框中展示的是“同一个图文内容”的多种编码方式:

左1️⃣:图像 + 文本分开表示

左边是图片 qᵢ

右边是其对应描述 qₜ: A yellow train parked…

它们被编码成:

图像 → [0, 127, 33, 48, 143]

文本 → [1, 127, 33, 48, 146]

图文对 → [2, 127, 33, 48, 174]

重点:第二位、第三位、第四位完全一致,说明这部分是图文共享的语义层!

127:代表“yellow train”

33:代表“parked at station”

48:表示“platform”场景

这种一致性说明了 GENIUS 的离散 ID 是跨模态对齐的:同一语义在图和文中会被编码成相同的 token。

✅ 三、中间部分:模态一致但内容不同的语义聚类

这一部分展示了:具有相似语义的内容,在编码上会聚集到同一个主 token 上(t₂)

🍞 食物聚类示例(token 203)

图像:食物图(面包、三明治、热狗)

文本:包含 “sandwich” 的句子

编码(图/文)前两位为 [0/1, 203, *, *, *]

这说明 token 203 编码了 “食物 / 三明治 / 餐盘” 相关的共享概念。


🎿 滑雪聚类示例(token 70)

图像:滑雪者、雪地运动

文本:描述中出现 “skis”、“mountain” 等词

编码中第二位为 70

说明这个 token 捕捉到了“滑雪”语义,且对图文一致有效。


🐶 狗的聚类示例(token 115)

图像:狗的特写

文本:“a brown and white dog”、“the fur on this dog…”

都以 [0/1, 115, *, *, *] 编码

说明 GENIUS 成功将“狗”抽象为共享语义 token。


✅ 四、底部部分:更细粒度的属性聚类(t₃)

这里展示了更细的语义粒度,比如颜色、数量、形容词修饰词。

👥 “two” 的语义聚类(token 247)

图像:

两只大象

两个小孩

两只长颈鹿

文本中强调“两只”、“two”

编码中第三位为 247(模糊掉其他位)

✅ 说明:GENIUS 能从图像中提取“数量”的语义,并与文本中“two”对齐!


🔴 “red” 的语义聚类(token 101)

图像中有红色双层巴士、红帽子、红摩托;

文本中描述中都有 “red”;

第三位编码为 101

这说明第3位 t₃ 担负了“物体属性/外观”相关语义的编码任务。

这张图展示了 GENIUS 的离散 ID 是结构化、有语义层级的,不仅区分模态(t₁),还能将跨模态的共享语义(t₂)和关键属性(t₃)统一表达,从而构建可解释、可生成、可索引的检索表示空间。

4.3.2 融合模块

这里其实就是图中的“Fuse”框框,

🎯 目标:构建统一的跨模态表示,作为量化器的输入。

✅ 背景:为什么需要 Fusion Module?

GENIUS 要将查询和目标表示成统一的离散 ID,而这些目标可能是:

纯图像(image)

纯文本(text)

图文对(image-text pair)

所以,必须设计一种机制,将图像和文本编码后的表示融合成一个统一的向量表示,这就是 Fusion Module 的职责。

✅ 核心目标:

构建一个轻量、可学习的融合函数,将图像特征向量 x 和文本特征向量 y 合并成一个统一的表示,用于后续量化编码。

✅ 融合函数的数学定义:

h ( x , y ) = λ ⋅ x + ( 1 − λ ) ⋅ y + MLP ( [ x ; y ] ) h(x, y) = \lambda \cdot x + (1 - \lambda) \cdot y + \text{MLP}([x; y]) h(x,y)=λx+(1λ)y+MLP([x;y])

逐项解释:

  • x x x:图像的特征向量(来自 ψ i m a g e ψ_{image} ψimage
  • y y y:文本或指令的特征向量(来自 ψ t e x t ψ_{text} ψtext
  • [ x ; y ] [x; y] [x;y]:把 x 和 y 在维度上拼接成一个向量(concat)
  • M L P ( [ x ; y ] ) MLP([x; y]) MLP([x;y]):对拼接后的向量使用多层感知机(Multi-Layer Perceptron)处理,提取非线性交互信息
  • λ λ λ:一个可学习的平衡参数,控制 x 和 y 的占比
  • 整个表达是**“加权线性融合 + 非线性交互项”**

✅ 类比理解:它就像是在问:“这条信息是更偏向图像,还是更偏向文本?”,然后再用 MLP 提取它们的联合特征。

✅ λ 是怎么来的?

文中提到:

λ is dynamically determined via another MLP with a sigmoid activation over the concatenated image-text features.

也就是说, λ λ λ 不是固定的,而是通过另一个 MLP 来预测的:

输入: [ x ; y ] [x; y] [x;y]

输出:一个介于 [0, 1] 之间的标量 λ(使用 sigmoid 激活)

用来自动判断当前应该偏重图像,还是文本,或者平均融合

✅ 结果嵌入的计算方式:

根据这套机制:

查询的最终嵌入表示是:

z q = h ( ψ image ( q i ) , ψ text ( q t , q inst ) ) \mathbf{z_q} = h(\psi_{\text{image}}(q_i), \psi_{\text{text}}(q_t, q_{\text{inst}})) zq=h(ψimage(qi),ψtext(qt,qinst))

目标的嵌入表示是:

z c = h ( ψ image ( c i ) , ψ text ( c t ) ) \mathbf{z_c} = h(\psi_{\text{image}}(c_i), \psi_{\text{text}}(c_t)) zc=h(ψimage(ci),ψtext(ct))

这个 z q z_q zq z c z_c zc 就是后面送入残差量化(Residual Quantization)的输入。

✅ Fusion 模块的意义:

作用 描述
融合图文特征 ψ i m a g e ψ_{image} ψimage ψ t e x t ψ_{text} ψtext 得到的向量统一成一个跨模态表示
动态权重控制 自动决定图 vs 文的占比,适应不同模态组合
增加表达力 MLP 提取非线性交互,提升语义建模能力
为后续量化做准备 输出结构化向量,作为 Residual Quantization 的输入

Fusion Module 是 GENIUS 中连接感知层与离散化层的桥梁,它通过加权融合和非线性 MLP,实现了模态统一和语义丰富的表达,是支持多模态生成检索的基础模块之一。

4.3.3 指令对比学习

在 GENIUS 的框架中,模型最终需要将输入的查询内容(可以是图像、文本或两者组合)映射到一个统一的、结构化的离散 ID 序列。这个 ID 的每一位都具有意义:第一位标识模态,其余则编码语义内容。因此,在执行量化前,我们必须先建立一个具有良好结构的嵌入空间,让模型“知道”如何将不同类型的内容以统一方式表达出来。

为此,GENIUS 引入了一个非常关键的设计:在量化之前,通过对比学习构建模态解耦+语义聚合的嵌入空间,并使用了“查询指令”来指导这种组织结构。

具体来说,在构建这个嵌入空间时,每一个查询不仅包含查询内容(如图片或文本),还会带有一个说明性指令(如“找与这张图相关的标题”或“找和这段描述相关的图像”)。这段指令是关键,它告诉模型用户希望检索哪种模态的数据。也就是说,它明确了输出的“类型”与“目标语义”,从而在训练阶段起到了类似“检索意图监督”的作用。

在这个基础上,模型通过对比学习的方式,训练一个融合后的嵌入表示 z q z_q zq(来自图像+文本+指令),并与目标数据 z c z_c zc 进行对齐。我们希望模型学习到:如果查询和目标语义一致,模态也一致,那么它们在嵌入空间中的表示就应该非常接近;而如果查询和目标在语义或模态上存在差异,那么它们就应该被拉开距离。

为了实现这一点,GENIUS 构造了一个对比学习损失函数:

L cl = − log ⁡ exp ⁡ ( ⟨ z q , z c + ⟩ / τ ) ∑ c ′ ∈ C exp ⁡ ( ⟨ z q , z c ′ ⟩ / τ ) \mathcal{L}{\text{cl}} = -\log \frac{\exp(\langle \mathbf{z_q}, \mathbf{z_{c^+}} \rangle / \tau)}{\sum_{c{\prime} \in \mathcal{C}} \exp(\langle \mathbf{z_q}, \mathbf{z_{c{\prime}}} \rangle / \tau)} Lcl=logcCexp(⟨zq,zc/τ)exp(⟨zq,zc+/τ)

这个公式可以理解为:

  • 分子部分是“正确目标”与当前查询之间的相似度(用内积或余弦相似度表示),我们希望这个值越大越好;
  • 分母则是查询与所有候选目标之间的相似度总和(包括正确与错误的目标);
  • 所以这个损失的含义就是:最大化正样本的匹配程度,同时最小化负样本的匹配程度

通过这个目标的训练,模型将自然地学会在嵌入空间中形成两种结构性:

  1. 模态结构(Modality Structure):由于相同模态的样本在训练集中数量较多,模型倾向于自动形成“模态簇”(image cluster、text cluster等);

  2. 语义结构(Semantic Alignment):而在每个模态簇内部,模型进一步把语义一致的内容聚到一起(例如同一图片描述和相似的图片);

最终,模型建立起了一个有“模态分层、语义聚合”的嵌入空间,为下一步的离散化(Residual Quantization)提供了理想的基础。量化器可以更容易地将这些结构化表示编码为“模态+语义”的离散 token 序列,从而大幅提升后续检索的可控性和生成效果。


简言之,这一部分的对比学习模块的作用是:

通过指令引导模型区分“要找什么模态”,通过对比学习拉近“想找的是什么语义”,为量化器构建一个结构清晰、模态解耦、语义聚类的嵌入空间。

这个机制也体现了 GENIUS 的一个核心思路:生成式检索不仅仅是“生成目标”,而是构建目标生成的“先验空间”

4.3.4 残差量化

Residual Quantization(残差量化),是将连续的向量编码逐步压缩成结构化离散 ID 的过程,也是整篇文章最核心的表征构造环节之一。

✅ 什么是 Residual Quantization?它的核心思想是什么?

Residual Quantization(简称 RQ)是一种逐层近似向量表示的编码方法,它的目标是:

将一个连续的向量 z(例如多模态融合后的表示)逐层压缩成离散的 token 序列,并且每层都编码某一方面的语义信息。

我们可以把它想象成“按信息层次逐步提取语义”的过程:

第一层:提取最重要、粗粒度的信息(比如“这个是图还是文本”);

第二层及以后:逐步捕捉剩余的、更细粒度的语义差异(比如“这是哪种图”、“内容是什么”)。

这个过程特别适合多模态检索任务,因为它能:

  • 显式地区分“模态”(image / text / image-text pair);
  • 同时高效压缩语义信息,生成统一的离散 ID 序列,供 decoder 使用。

✅ 数学定义与公式解释

整个 RQ 编码过程就是将一个输入嵌入向量 z z z 转换为一组离散 token:
T : = RQ ( z ) = ( t 1 , t 2 , … , t M ) T := \text{RQ}(z) = (t_1, t_2, …, t_M) T:=RQ(z)=(t1,t2,,tM)

其中:

M 是量化的层数(也叫“码本级数”);

每个 t i t_i ti 是第$ i$ 层选择的 token,表示在该层中选中的离散表示。

整个过程是“递归式的”:

第一步:初始化残差向量

r 0 = z r_0 = z r0=z

你可以理解为“我们一开始就是原始的向量”。


第二步:在第 i 层寻找最相近的码本向量

对于第 i 层,我们有一个离散的向量集合(码本):

E i = { e i k ∈ R d ∣ k = 1 , … , K i } E_i = \{e^k_i \in \mathbb{R}^d \mid k = 1, …, K_i\} Ei={eikRdk=1,,Ki}

这里的每个 $e^k_i $就像一个候选的“离散基向量”。

我们在这些中寻找距离当前残差 r i − 1 r_{i-1} ri1 最近的那个向量:
t i = arg ⁡ min ⁡ k ∈ K i ∥ r i − 1 − e i k ∥ 2 t_i = \arg\min_{k \in K_i} \| r_{i-1} - e^k_i \|^2 ti=argkKiminri1eik2

也就是说,第 i 层的 token t i t_i ti 就是“最能解释这一层信息的那个 token”。


第三步:更新残差

选出之后,我们从当前残差中减去这个向量:
r i = r i − 1 − e i t i r_i = r_{i-1} - e^{t_i}_i ri=ri1eiti

这个 r i r_i ri 就是下一层要处理的“剩余信息”。


最终:把每一层得到的向量累加,近似原始向量

整个原始嵌入向量 z 被逼近为:

z ^ = ∑ i = 1 M e i t i \hat{z} = \sum_{i=1}^M e^{t_i}_i z^=i=1Meiti

也就是说,这组离散 token t 1 , . . . , t M t_1, ..., t_M t1,...,tM,是$ z $的一种离散近似表示。


✅ 在 GENIUS 中的作用与设计巧思

GENIUS 对残差量化做了一些特别的设计,使它更适合生成式多模态检索任务:

1. 第一层编码模态信息(modality token)

第一层的码本 E₁ 只有 3 个 token:

图像 → 0

文本 → 1

图文对 → 2

这样生成出来的离散 ID 第一位就告诉你目标是什么类型的数据。

2. 后续层逐步编码语义信息

每一层都处理“上一层没表达完”的信息(残差);

越往后,语义越细致,从 coarse 到 fine;

每一层都有独立的码本(token 集合)。

这种逐层递进的设计让离散表示具有两种结构性:

维度 结构
纵向 每一位代表不同的语义层级
横向 每一位 token 来源于不同的独立码本

✅ 好处总结:

  1. 模态解耦显式建模:第一位 token 单独表示目标模态,解决跨模态任务模糊的问题;

  2. 语义分层逐步编码:后续 token 逐层捕捉语义细节,适合生成式建模;

  3. 训练过程稳定、结构可控:每层处理的信息明确、独立;

  4. 检索目标可以用离散 token 表达:decoder 在生成时目标清晰,不再需要大规模检索库。

残差量化是 GENIUS 将连续表示压缩为结构化离散ID的关键,它通过层层残差分解,实现了“模态在首位、语义逐层”的清晰表达,为后续生成式检索提供了统一、精确、可控的目标序列。

4.3.5 训练目标

GENIUS 框架中量化器(quantizer)和模态融合模块的 训练目标部分。它通过设计多个损失函数,联合优化了离散ID的结构性、语义表达力和可恢复性。

✅ 为什么要设计多个损失函数?

我们前面已经知道,GENIUS 会将查询与目标表示成连续向量( z q z_q zq z c z_c zc),然后用残差量化将它们编码成离散ID序列( T q T_q Tq T c T_c Tc)。但要让这些ID序列既准确表达语义,又结构合理,还能稳定训练,就必须引入多个损失函数来“约束”和“引导”。

GENIUS 总共使用了三个损失项,每个都发挥不同作用:

🔷 第一项:残差量化损失(Residual Quantization Loss)
L rq = ∑ i = 1 M ∥ r i − 1 − sg ( e i t i ) ∥ 2 \mathcal{L}{\text{rq}} = \sum_{i=1}^M \left\| r_{i-1} - \text{sg}(e^{t_i}_i) \right\|^2 Lrq=i=1M ri1sg(eiti) 2

✨ 用途:

保证每一步选出来的离散向量( e i t i e^{t_i}_i eiti)能够真实地逼近当前的残差信息;

也就是说,选的 token 不仅要有“标识符”的作用,还要能“代表”该层的残差信息。

🧠 stop-gradient 操作(sg)是什么?

sg(·) 的作用是“停止梯度传播”;

它让我们在训练时不直接对码本向量进行梯度更新,而是用指数滑动平均(EMA)来更新这些向量;

这是为了让量化过程更稳定,防止噪声更新扰乱整个码本结构。

🔷 第二项:量化空间的语义相似性(MSE Loss)

L mse = ∥ z ^ q − z ^ c ∥ 2 \mathcal{L}_{\text{mse}} = \| \hat{z}_q - \hat{z}_c \|^2 Lmse=z^qz^c2

z ^ q \hat{z}_q z^q z ^ c \hat{z}_c z^c 是查询和目标的量化后表示(所有选中的 e t i e^{t_i} eti 向量相加);

这个损失的目标是让语义相近的查询和目标,在离散化之后的表示空间中仍然靠近;

它可以理解为在量化后的空间中施加一个“语义对齐”的约束。


🔷 第三项:对比学习损失(前文已定义)

L cl = − log ⁡ exp ⁡ ( ⟨ z q , z c + ⟩ / τ ) ∑ c ′ ∈ C exp ⁡ ( ⟨ z q , z c ′ ⟩ / τ ) \mathcal{L}{\text{cl}} = -\log \frac{\exp(\langle z_q, z_c^+ \rangle / \tau)}{\sum{c{\prime} \in \mathcal{C}} \exp(\langle z_q, z_{c{\prime}} \rangle / \tau)} Lcl=logcCexp(⟨zq,zc/τ)exp(⟨zq,zc+/τ)

前面我们已经分析过这个损失,它在量化之前,约束连续空间中的语义对齐;

配合 MSE loss,是一种“量化前”和“量化后”双空间的一致性训练机制。

🧮 最终联合损失函数
L combined = L cl + β L rq + γ L mse \mathcal{L}{\text{combined}} = \mathcal{L}{\text{cl}} + \beta \mathcal{L}{\text{rq}} + \gamma \mathcal{L}{\text{mse}} Lcombined=Lcl+βLrq+γLmse

其中 β β β 和 $γ $是两个超参数,用于调节不同损失项的相对重要性。

这个组合目标的设计非常有层次感:

  • L c l L_{cl} Lcl 保证模态+语义空间的可分性(尤其是 instruction 引导的);
  • L r q L_{rq} Lrq 保证量化每层都能正确提取残差信息;
  • L m s e L_{mse} Lmse 保证量化结果能保持原始语义结构。

🔎 与传统方法有何不同?

传统的量化方法(例如 PQ / VQ-VAE 等)通常主要关注“如何重建原始向量”,也就是像素级别的“还原”。而 GENIUS 更注重的是:

保留语义结构

构造具有“解释性”的离散编码(第一个 token 是模态,后面逐层表达语义);

更关注检索能力,而不是纯粹的向量恢复。

这一部分其实是 GENIUS 框架“离散表示学习”策略的精髓,它体现了三点关键原则:

原则 损失对应 功能
结构清晰 L r q L_rq Lrq 残差信息分层逼近,保证表示结构分明
语义对齐 L c l + L m s e L_{cl} + L_mse Lcl+Lmse 连续空间和离散空间都具有语义聚类能力
稳定训练 s g + E M A sg + EMA sg+EMA 避免梯度破坏码本,提升收敛稳定性

通过这三个损失项的协同作用,GENIUS 得以学习出一套高质量、可控性强、结构解释性好的离散 ID 表达方式,为下游的生成式检索打下坚实的表示基础。

4.4 用于检索的自回归解码器

4.4.1 解码器训练

GENIUS 框架的第三阶段 —— Stage 2:Autoregressive Decoder for Retrieval(自回归解码器用于检索) 的训练部分。它的核心任务是:给定一个查询,逐步生成目标的离散ID序列,这实际上是将“信息检索”转化为一个“条件生成问题”。

✅ 解码器的目标是什么?

在前面的阶段中,查询已经被编码成了一个向量 z q z_q zq,目标数据也被编码成了一个离散的 token 序列 T c = ( t 1 , t 2 , . . . , t M ) T_c = (t_1, t_2, ..., t_M) Tc=(t1,t2,...,tM),其中每一位都承载模态或语义信息。

现在,模型要学习的是一个函数:

如何根据查询 z q z_q zq,自回归地一步步生成对应的目标 ID T c T_c Tc


🧠 模型架构:使用 T5-style 自回归解码器

作者采用了类似于 T5 的解码器架构,即:

  • 一个 transformer decoder(自回归结构),每次预测下一个 token;
  • 当前 token 的生成依赖于:
  • 查询信息(Query embedding);
  • 已生成的 token 序列(prefix)。

但 transformer decoder 本身不能直接处理一个向量 z q z_q zq,所以引入一个额外模块来转化它。


🔁 查询前缀嵌入:Prefix Conditioning 机制

为了让解码器“知道”查询的语义,作者设计了如下处理方式:
P ( z q ) = Reshape ( MLP ( z q ) ) ∈ R N × d ′ \mathbf{P}(z_q) = \text{Reshape}(\text{MLP}(z_q)) \in \mathbb{R}^{N \times d{\prime}} P(zq)=Reshape(MLP(zq))RN×d

解释如下:

  • 输入:查询向量 z q z_q zq(由图像+文本+指令编码而来);
  • 处理方式:
  • 首先使用一个多层感知机(MLP)对 z q z_q zq 进行非线性映射;
  • 然后 reshape 成一个长度为 N N N、维度为 d ′ d' d 的向量序列;
  • 这个序列就是 decoder 的“查询前缀”(prefix embeddings);
  • 作用:让解码器通过 cross-attention 感知查询语义。

这一步是连接“检索语义空间”与“生成器”的桥梁。

🎯 解码器的训练目标:Cross-Entropy 损失

生成式模型最常见的训练方法是最大化目标序列的似然,即最小化负对数概率:
L GR ( P ( z q ) , T c ) = − ∑ k = 1 M log ⁡ p ( t k c ∣ P ( z q ) , t < k c ) \mathcal{L}{\text{GR}}(\mathbf{P}(z_q), T_c) = - \sum_{k=1}^{M} \log p(t_k^c \mid \mathbf{P}(z_q), t_{<k}^c) LGR(P(zq),Tc)=k=1Mlogp(tkcP(zq),t<kc)

含义解释:

  • 每一步 k 的目标是生成 ID 序列中的第 k 个 token t k c t_k^c tkc
  • 条件是:查询前缀 P ( z q ) P(z_q) P(zq) 和当前已生成的 prefix token t < k c t_{<k}^c t<kc
  • 总损失就是整个序列 token 的 log-likelihood 求和(标准自回归训练方式)。

通过这个损失训练,模型将学会在给定查询的情况下完整地生成目标的离散表示序列


⚠️ 一个潜在挑战:离散ID的表达能力是有限的

相比连续的嵌入向量(如传统的 CLIP embedding),离散 token 序列的容量是有限的。例如:

每一位 token 只能从一个有限集合中选(比如 256 种);

长度也是固定的(比如 5 个 token);

所以总的表示空间是离散且有限的。

因此,在面对表达复杂语义或训练样本较少时,模型可能难以泛化到未见过的 query-target 配对


🔄 文本领域的参考:Doc2Query 类比

文中提到一个对比:

在文本检索中,人们常用 Doc2Query 这类方法生成多个“伪查询”来补充训练样本;

但多模态检索中(尤其涉及图像),我们很难用类似策略去扩展训练数据;

所以 GENIUS 后续才引入了 Query Augmentation 来缓解这个问题(即插值生成增强query)


✅ 小结:这一阶段训练流程的核心逻辑

步骤 内容 目的
① 查询编码 图文信息 → z q z_q zq 表达用户意图
② 前缀构造 M L P ( z q ) MLP(z_q) MLP(zq) P ( z q ) P(z_q) P(zq) 让 decoder 感知 query
③ 自回归训练 decoder 逐步生成 ID 预测目标 T c T_c Tc
④ 损失函数 cross-entropy over token sequence 强化 ID 精准生成能力

GENIUS 利用自回归解码器将检索问题转化为“离散 ID 序列生成”任务,结合 prefix 注入查询语义,实现了高效、统一的生成式检索训练机制。

4.4.2 基于插值的查询增强

GENIUS 中为了解决模型泛化能力不足的问题而引入的一个技巧:Query Augmentation via Interpolation(插值式查询增强)。它是自回归解码器训练流程中的增强策略,核心目的是:在保持语义不变的前提下,制造出更多变化的查询表达,从而让模型学会更通用的生成方式

GENIUS 的这个增强方法非常特别,因为它是作用在 embedding 层面,而不是在原始输入(图像或文字)上做增强。

✅ 背后的问题:泛化能力受限

在前一节中我们看到,GENIUS 训练的是一个自回归生成器,它需要根据查询表示 z q z_q zq 来生成离散 ID 序列 T c T_c Tc

但是存在一个现实问题:

由于每个查询 z q z_q zq 对应的目标 T c T_c Tc 是唯一的,而且训练集中不同形式的表达可能很少,模型容易过拟合于某种固定的表达方式,缺乏泛化能力。

特别是在数据规模有限或样本分布不均时,模型很可能记住了具体的 query→ID 映射,而不是学会“抽象语义到ID”的生成逻辑。


💡 解决方案:插值式查询增强

为了解决这个问题,GENIUS 提出了一种非常简洁而有效的思路:

通过在 z q z_q zq(查询表示)和 z c z_c zc(目标表示)之间做插值,生成一些“变体查询”,这些查询虽然和原始 query 不一样,但语义上是对目标仍然成立的,因此可作为新的训练样本。


🧮 插值公式解释

生成增强查询表示 z q ′ z'_q zq 的公式如下:

z ′ q = μ ⋅ z q + ( 1 − μ ) ⋅ z c z{\prime}_q = \mu \cdot z_q + (1 - \mu) \cdot z_c zq=μzq+(1μ)zc

含义:

z q z_q zq:原始的查询向量(图 + 文 + 指令编码);

z c z_c zc:目标的向量表示(例如图片或文本编码);

μ μ μ:在区间 [0,1] 上采样的随机数,用于控制插值比例;

μ μ μ 来自 Beta 分布 Beta(α, α)(这是一个常用于采样混合权重的分布);

μ μ μ ≈ 1 → 接近原始 query;

μ μ μ ≈ 0.5 → 平均融合 query 和 target;

μ μ μ ≈ 0 → 近似于目标向量。

最终$ z’_q $是一个与目标语义接近,但在表达方式上与原始查询略有差异的“伪查询”。


🧠 模型如何利用这些增强的查询?

对于这些增强查询 z q ′ z'_q zq,模型使用的训练方式完全相同:

将其转化为 prefix embedding P ( z q ′ ) P(z'_q) P(zq)

用相同的交叉熵损失函数来训练生成器:

L GR ( P ( z ′ q ) , T c ) \mathcal{L}_{\text{GR}}(\mathbf{P}(z{\prime}_q), T_c) LGR(P(zq),Tc)

这样模型就被迫学会:无论输入查询如何变化,只要其语义对目标成立,都必须生成相同的目标 ID。


🎯 这一策略带来了哪些好处?

效果 说明
增强数据多样性 对同一个目标生成多个变种查询,相当于进行“语义保持的数据增强”
提高泛化能力 不再依赖固定的查询表达,提升对不同 query 表达方式的适应性
降低过拟合 模型不能仅靠记忆原始 query 来生成,而要学会语义建模
灵活性强 方法通用、无需额外标注、计算代价低,可用于多模态任务

🧠 总结一句话:

Query Interpolation 是一种无需额外标注、仅基于已有数据,通过语义一致性插值生成查询增强样本的方法,极大提升了模型对 query 表达多样性的鲁棒性和泛化能力,是 GENIUS 能够统一适配多模态检索任务的重要支撑手段。

4.5 推理阶段

GENIUS 框架在**推理阶段(Inference)**的两个关键策略:

  1. Constrained Beam Search(受限束搜索) —— 如何有效、合法地生成离散 ID;

  2. Embedding-based Re-ranking(基于嵌入的重排序) —— 如何提高检索准确性。

这两个步骤的目标是:在保持高效率的同时,最大化检索的准确性。


4.5.1 在生成ID时避免非法序列

在训练阶段,模型已经学会了:给定查询 z q z_q zq,如何生成对应目标的离散 ID 序列 T c T_c Tc

但在推理时(也就是实际检索时),我们需要模型:

根据一个给定的查询,生成一组高概率的候选ID序列,然后从中选出最好的结果。

🔍 普通 beam search 怎么做?

​ • Beam search 是一种“保留多个最优路径”的搜索策略;

​ • 它会在每一步保留 top-k 的最可能 token 序列,最终得到 B 个完整候选 ID;

​ • 每条路径的得分是它每一位 token 的 log 概率之和。

但问题来了:

Beam search 可能生成一些“无效的ID序列”——即根本在数据库中不存在的编码。

这在 GENIUS 中尤其重要,因为离散ID的合法性是由训练数据中所有目标定义的,生成出数据库里不存在的ID毫无意义。


✅ 解决方案:Constrained Beam Search + Trie 结构

为了避免生成“非法 ID”,GENIUS 使用了一个经典技巧:

在 Beam Search 的基础上引入 Trie 前缀树结构,将搜索路径限制为训练集中真实存在过的 ID 前缀集合

📐 工作原理:

所有训练集中目标的离散 ID 被预先构建成一棵 Trie 树

只有在 Trie 中出现过的前缀,才允许继续展开;

这相当于给 decoder 加上了“只走合法路径”的约束。

⏱️ 时间复杂度:

搜索复杂度为 O(M),M 是 ID 的长度;

和传统 beam search 相比,几乎没有额外开销,但大大提高了生成效率与合法性。


4.5.2 基于嵌入的重排序

虽然 constrained beam search 可以高效产生多个合法 ID,但仍然存在一个问题:

由于 ID 是离散的,其表达能力有限,不如连续的 embedding 精细。

因此,作者进一步提出了一种重排序策略:

🧪 基本流程:

  1. 使用 constrained beam search 生成前 B 个候选 ID 序列;

  2. 将这些 ID 对应的目标数据取出来,编码成向量(embedding);

  3. 与查询的向量 z q z_q zq 进行余弦相似度比较

  4. 根据相似度重新排序这 B 个候选,挑选最匹配的作为最终结果。

✅ 好处:

只对少量候选做比较,几乎无计算负担;

弥补了离散ID表达不够细腻的问题;

实际检索效果可显著提升,尤其在多模态场景中。


🧠 总结一下:

阶段 技术 功能
ID 生成 Constrained Beam Search + Trie 高效生成合法ID序列,避免生成无效数据
精度提升 Embedding-based Re-ranking 用语义空间微调排序,提升最终检索质量

GENIUS 的推理阶段结合了“受限生成 + 语义排序”两种策略,确保生成出的离散 ID 既合法又语义精准,实现了生成式检索的效率与精度兼顾

5. 实验

5.1 数据集和评价指标

  1. 数据集来源:M-BEIR 多模态基准集

M-BEIR 是作者提出的一个综合性多模态检索评测套件,涵盖了多个真实场景下的任务。

包含的子任务非常多,覆盖了 图文匹配、图像检索、跨模态检索、VQA 等等,包括:

MS-COCO:图像与描述的相互检索;

Fashion200K、FashionIQ:时尚领域图文匹配;

VisualNews:新闻图像与文字内容配对;

NIGHTS:图像相似性判断;

OVEN、EDIS、CIRR:涉及组合查询或属性增强的复杂检索任务;

InfoSeek、WebQA:视觉问答(VQA)类任务。

▶️ 这些任务充分覆盖了多模态检索的多样性和挑战性,总数据量达 5.6 million candidates


  1. 评估指标:Recall@K(Top-K 召回率)

核心评估指标是 Recall@5 (R@5),即:目标在 top 5 检索结果中是否出现。

在 Fashion200K 和 FashionIQ 中,还额外报告了 Recall@10,因为这些任务目标更难,需要更宽的 top-K。

使用 Recall 是因为多模态检索并非分类任务,而是看是否能把“正确目标”排到前面。


5.2 模型实现细节

1. 网络结构(Network Architectures)

编码器:使用 CLIP ViT-L/14(预训练版本)作为图像和文本的联合编码器(跟 UniIR 一致);

解码器:采用 T5-small(一个轻量 Transformer decoder),隐藏维度为 d’ = 512,初始随机。

▶️ 编码器部分直接使用现成模型,而解码器是自定义训练的,保证了性能与效率的平衡。

2. 网络训练(Optimization)

优化器:AdamW;

学习率统一设置为 1e-4;

残差量化部分训练 20 个 epoch;

解码器训练 30 个 epoch,使用余弦调度;

批次大小:256;

所有模型在同一训练流程中联合训练。

3. 超参数设置(Hyperparameters)

对比学习温度 τ = 0.01;

损失项权重 β = γ = 100(用于联合损失中 Eq.8);

插值增强中的 Beta 分布参数 α = 2(见 Eq.11);

prefix embedding 长度 N = 30(Eq.9,T5 decoder 的输入)。

4. 残差量化配置(RQ)

每一层使用一个码本(codebook);

默认有 9 层(对应 ID 的长度为9);

每个码本大小为 4096,除了第1层(模态编码层),固定大小为 3(图、文、图文对);

所有码本用 k-means 聚类在训练初始阶段初始化。

▶️ 这种设计支持了“第1位为模态标识,其余为语义编码”的机制。

5. 推理方式(Inference)

复述自 4.4 节,作者在推理时采取了两种方式来提高效率与精度:

  1. Constrained Beam Search

使用 beam search 生成离散 ID;

用 Trie 限制只生成合法的 ID 序列;

默认 beam size = 50。

  1. Embedding-based Re-ranking

对生成的 top B 候选 ID,对其目标进行向量编码;

与查询向量计算余弦相似度,重排序;

弥补离散ID表达不足的问题,提升精度。

“GENIUS 在大规模多模态数据集 M-BEIR 上进行了系统实验,结合标准 Recall 指标、CLIP 编码器、T5 解码器、残差量化与精细推理策略,从效率与精度两个维度全面评估其通用检索能力。”

5.3 基线模型

GENIUS 实验中用来对比的两类主流检索范式:

1. 🧠 两种训练策略(Training strategies)

策略 描述
Single-task fine-tuning 每个任务单独训练一个模型,最适配任务但泛化弱
Unified instruction fine-tuning 所有任务共享一个模型,统一通过 instruction 引导,GENIUS 使用的是这种方式,更具泛化能力

2. 🔶 基线类型一:Embedding-based Retrieval

这些方法直接基于嵌入向量(embedding)进行最近邻搜索,是传统的主流方法。

代表方法:

CLIP-SF:CLIP + score-level fusion(输出阶段拼接视觉/文本特征)

BLIP-FF:BLIP + feature-level fusion(Transformer层内融合)

▶️ 这类方法在多数任务中表现很好,但速度和存储开销大。


3. 🔷 基线类型二:Generative Retrieval

这类方法不再做 embedding 比较,而是直接生成目标 ID(像 GENIUS 那样),代表方法有:

IRGen:原用于图像检索,替换成文本输入用于 text→image;

GRACE:跨模态生成式检索方法之一;

这些方法的特点是轻量、无需最近邻索引,但大多仅设计用于单一任务,不具备通用性

5.4 实验结果

GENIUS 被评估于三个不同场景中:

场景 说明
① Task-specific information retrieval 每个任务单独训练,单独评估(如表 1)
② Universal information retrieval 全任务统一检索、跨模态通用模型(如表 2)
③ Text-to-image generative retrieval 标准生成式 benchmark 评估(如 Flickr30K / MS-COCO)

📊 表格 1:Task-Specific Retrieval(任务特定检索)

在这里插入图片描述

✅ 1. GENIUS 明显优于已有生成式模型

GENIUS 在 COCO text-to-image 检索任务中,相比 GRACE 提升了 28.6 点的 Recall@5!

GRACE(R@5)= 39.5GENIUS = 68.1

GENIUSᴿ(re-ranking 后)= 78.0 → 非常接近 CLIP-SF(81.1)

▶️ 说明:在相同任务下训练,GENIUS 的生成式方法极大超越了之前所有生成式基线。


✅ 2. 与嵌入方法接近,甚至在某些任务中超越

段落中指出:

GENIUSᴿ 使用 re-ranking 后,在多个任务上超过了 BLIP-FF,并在某些任务接近甚至超过 CLIP。

从表 1 可以看到:

CIRR 数据集:

GENIUSᴿ = 39.5,BLIP-FF = 52.2(稍低)

FIQ 数据集:

GENIUSᴿ = 19.3,CLIP-SF = 24.4,BLIP-FF = 29.2

OVEN((q,q)→(c,t))任务中,GENIUSᴿ = 52.5 > CLIP-SF(44.6)

▶️ 说明:在一些结构化或组合类任务中,GENIUS 的通用性带来了更强适应性。


❗ 3. 在知识密集型任务中仍存在差距

段落指出:

GENIUS 在 WebQA / InfoSeek 等需要外部知识的任务中仍不如嵌入式方法。

我们在表中也看到:

WebQA(q_t→c_t):

CLIP-SF = 84.7,GENIUS = 32.5,GENIUSᴿ = 44.6

InfoSeek(q→c):

CLIP-SF = 27.9,GENIUSᴿ = 20.7

▶️ 原因在于离散 ID 的表示能力有限,难以捕捉复杂知识,这在未来仍需改进。

📊 表格 2:Universal Retrieval(通用跨任务检索)

在这里插入图片描述

全体任务统一模型,全量候选池(5.6M items)下检索目标

✅ 1. GENIUS 保持合理精度,且全面胜出其它生成式方法

表中最后一行:

CLIP-SF 平均 Recall@5 = 48.9

BLIP-FF 平均 Recall@5 = 45.5

GENIUSᴿ 平均 Recall@5 = 38.3

GRACE / IRGen 没在该设置中测试(无法泛化)

▶️ 说明:GENIUS 是目前唯一在通用检索场景中还能稳定表现的生成方法

✅ 2. 各任务表现稳定,接近嵌入模型

MSCOCO(q_i→c_t):CLIP 92.3 / GENIUSᴿ 90.6

WebQA(q_t→c_t):CLIP 84.7 / GENIUSᴿ 42.9

FashionIQ(组合查询):GENIUSᴿ = 19.2,略低于 BLIP-FF(28.5)

▶️ 虽然整体略低于 CLIP,但能跨任务统一处理,这是嵌入方法无法做到的。

5.5 消融实验

在这里插入图片描述

目的:验证 GENIUS 各个模块对最终检索效果的贡献

从表中可见,在三个代表性数据集(COCO、WebQA、CIRR)上评估了以下组件的重要性:

实验组件 功能 移除后效果下降情况(以 COCO 为例)
Modality-decoupling 用于第一位编码模态(0:图像,1:文本,2:图文对) Text-to-image 从 55.4 → 20.2,差异极大
Query Augmentation 用于增强查询表达,提升泛化 精度下降 7–9+ 点(如 CIRR: 20.5→11.7)
对比损失 Lcl 对齐 query 与 target 表达 全部结果近似为 0,说明完全崩溃
MSE损失 Lmse 精化 embedding,缩小量化误差 精度下降但不至于失效(如 CIRR: 20.5→21.6)

📌 结论:

模态分离结构 和 对比损失 是支撑 GENIUS 能够处理多模态检索的关键;

Query 插值增强有效提升了模型的鲁棒性;

MSE loss 帮助 embedding 更精细,但作用次于 Lcl。

5.6 效率分析

在这里插入图片描述

目的:GENIUS 在推理阶段是否具备可扩展性

图中横轴是数据集规模(K),纵轴是每秒可处理的 query 数量(Queries per second),三条线分别表示:

CLIP:嵌入方法,需要最近邻搜索 → 随规模扩大急剧下降;

GRACE:旧版生成方法(Flamingo-3B),慢;

GENIUS:我们的方法,T5-small 解码器 + CLIP 编码器,几乎不受数据集大小影响

📌 结论:

GENIUS 的效率稳定性极强;

相比 GRACE 快了 4 倍以上;

相比 CLIP,在大规模数据集上表现远优。

5.7 Codebook 配置分析

在这里插入图片描述

目的:量化结构(码本尺寸、层数)对性能的影响

表中横轴是任务 + 模态类型;

纵轴是不同的码本配置(K × M):

K = 每层 code 数(如 4096);

M = codebook 层数(默认是 9)。

📈 结论观察:

调整 效果趋势
减少层数 M(9 → 7 → 5) 表达能力下降,性能普遍降低(COCO: 83.4 → 81.5)
减小每层码本大小 K 轻微下降,尤其在 CIRR 或 WebQA(从 47.4 → 33.5)
过小配置(256×5) 表达力严重受限(WebQA: 47.4 → 22.8)
更大层数 / 更大码本 略有提升(如 CIRR 21.0 → 24.5),但会引发分布过散、聚类不集中的问题