Skip to content

视觉、多模态与生成应用 ​

本页整理 Transformer 在视觉与多模态中的结构、扩散模型的少步采样,以及文档向量化和切分的工程边界。

一、Vision Transformer(ViT) ​

Vision Transformer(ViT)的基本做法是把图像切成固定大小的 patch,把每个 patch 映射成一个 token,再交给 Transformer Encoder 建模。它把视觉输入转换成了与 NLP 类似的序列表示,但标准 ViT 不要求使用 CNN backbone。

1.1 Patch Embedding:图像变成 token 序列 ​

设输入图像大小为 H×W×C,patch 的边长为 P,且 H,W 可以被 P 整除,则 patch 数量为:

Npatch=HP×WP

每个 patch 的原始维度为:

P2C

将 patch 展平为向量 xpi∈RP2C,再通过线性投影得到 dmodel 维的 patch token:

zi=xpiE+b,E∈RP2C×dmodel

因此 patch embedding 后的序列形状通常是:

Z∈RNpatch×dmodel

若使用分类 token([CLS]),则会在序列前拼接一个额外 token,输入 Transformer 的长度变为 1+Npatch。

ViT 的 patch 数量与形状示例

对于 224×224×3 的图像,若 P=16:

Npatch=22416×22416=14×14=196

每个 patch 的原始维度为:

16×16×3=768

因此可以把 196 个 768 维 patch 向量投影成 196 个 dmodel 维 token;若加上分类 token,序列长度就是 197。

当图像高或宽不能被 patch 大小整除时,需要由具体实现选择 padding、裁剪或调整输入尺寸,不能直接套用整除情况下的数量公式。

1.2 Transformer 建模与位置信息 ​

Patch token 进入 Transformer Encoder 后,通过 Self-Attention 在不同图像区域之间建立联系。与 CNN 逐层扩大局部感受野的归纳偏置不同,ViT 的注意力可以在较早阶段直接建模远距离 patch 之间的关系,例如物体的不同部位或前景与背景之间的联系。

Transformer 本身不提供 patch 的二维空间顺序,因此 ViT 还需要加入位置信息:

Z0=[CLS;z1;…;zNpatch]+Epos

位置表示可以采用可学习的绝对位置 embedding,也可以使用经过二维布局处理的插值位置表、相对位置机制或 RoPE 等变体;“必须使用某一种 3D 位置编码”不是标准 ViT 的普遍要求。

模型基本输入单元主要归纳偏置跨区域关系
CNN像素网格局部连接与平移等变性通过堆叠卷积逐步扩大感受野
ViT图像 patch token依赖 patch 序列和位置表示Self-Attention 可直接建立全局关系

标准 ViT 的典型数据流是:

图像→Patch Embedding→Position Embedding→Transformer Encoder→分类或其他视觉任务头

混合 CNN-Transformer 架构可以先用 CNN 提取特征再送入 Transformer,但这属于架构变体,不是标准 ViT 的必要步骤。

ViT 速记

图像切 patch,patch 映射成 token,再加入位置信息交给 Transformer;标准 ViT 不依赖 CNN backbone,也不限定某一种位置编码。

二、BLIP-2 与 Q-Former ​

BLIP-2 的目标是把冻结的视觉编码器与冻结的大语言模型连接起来。中间的 Q-Former(Querying Transformer)不是新的视觉编码器,而是一个轻量的视觉信息提取与压缩模块:

图像→冻结的视觉编码器→视觉特征→Q-Former→少量视觉 token→冻结的 LLM

2.1 可学习 Query 与跨模态注意力 ​

设视觉编码器输出 M 个视觉特征:

Xvision∈RM×dvision

Q-Former 维护 m 个可学习的 Query token,通常有 m≪M:

Q0∈Rm×dq

Query 之间可以通过 Self-Attention 交换信息,同时通过 Cross-Attention 查询视觉特征:

Q=Q0WQ,K=XvisionWK,V=XvisionWVZ=softmax(QKTdk)V

这里的角色与一般 Cross-Attention 一致:Query 表示当前需要提取的信息,视觉特征提供 Key 和 Value。经过若干层交互后,输出仍然只有 m 个 Query 表示,因此可以把大量视觉特征压缩为固定数量的视觉 token。

这个压缩不是简单的平均池化。不同 Query 可以学习关注物体、文字、布局或其他与任务相关的视觉证据;但 Query 如果完全不与视觉特征进行 Cross-Attention,就无法从图像内容中获得信息。

2.2 冻结骨干与训练阶段 ​

BLIP-2 的关键取舍是尽量复用已有的预训练能力:

组件在 BLIP-2 主体方案中的作用
视觉编码器提供视觉特征,通常冻结
Q-Former学习 Query、Self-Attention 和视觉 Cross-Attention,负责抽取与压缩
线性投影将 Query 输出映射到 LLM 的词向量或隐藏空间
LLM接收视觉 token 和文本上下文,主体通常冻结

Q-Former 的预训练可以包含图文对比学习(ITC)、图文匹配(ITM)和图像条件文本生成(ITG)等目标。不同目标需要不同的信息流约束,例如是否允许 Query 与文本 token 互相注意,不能把所有阶段简单概括成“Query 和文本始终无条件混合”。

在连接 LLM 时,Q-Former 输出经线性投影后可以作为视觉前缀或软提示输入语言模型。这样既避免端到端更新庞大的视觉编码器和 LLM,又让中间模块学习视觉表示与语言空间之间的对齐。

Q-Former 的形状示例

假设视觉编码器输出 M=576 个视觉 token,而 Q-Former 使用 m=32 个 Query。它需要从 576 个视觉位置中读取信息,但最终只向 LLM 提供 32 个视觉表示:

576×dvision→32×dq→32×dLLM

这里的 32 只是示意性的 Query 数量;实际数量由具体模型配置决定。它体现的是“固定数量 Query 压缩可变数量视觉特征”的结构,而不是某个必须采用的常数。

Q-Former 速记

冻结视觉编码器和 LLM,使用少量可学习 Query 通过 Self-Attention 协作、通过 Cross-Attention 读取视觉特征,再把压缩后的视觉 token 对齐到语言模型空间。

三、扩散模型的少步采样 ​

扩散模型通常从噪声出发,经过多次反向去噪得到样本。若采样需要数百甚至上千次神经网络函数评估,推理延迟会很高。因此“少步采样”方法的共同目标是减少反向过程中的步数或函数评估次数,但不同方法改变的对象并不相同。

3.1 渐进式蒸馏与一致性模型 ​

Progressive Distillation(渐进式蒸馏)使用原本需要很多步的教师采样器,训练学生模型模仿更少步的去噪结果。每轮蒸馏可以把步数大致减半,再反复进行:

N→N2→N4→⋯

它需要额外训练或蒸馏,但可以把多步扩散模型压缩成少步采样模型。

Consistency Models(一致性模型)学习同一条扩散轨迹上不同噪声程度的状态之间的一致映射,使这些状态可以直接映射到相同的干净样本或轨迹终点。因此它从设计上支持一步或少步生成,也可以通过多步采样在速度与质量之间折中。它既可以从预训练扩散模型蒸馏得到,也可以独立训练。

3.2 DPM-Solver、DDIM inversion 与 CFG ​

DPM-Solver 把扩散反向过程视为相应的 ODE,并针对扩散模型的结构使用高阶数值求解器。它主要优化采样阶段的数值积分效率,通常不需要增加模型参数或重新训练基础模型;其核心不是改变网络,而是让较大的时间步仍能保持较好的求解精度。

DDIM inversion 的任务不同:它将已有图像反推到扩散轨迹中的噪声或潜变量,常用于图像编辑和重建。DDIM sampler 本身可以采用较少采样步,但不能把“DDIM inversion”直接等同于少步采样加速。

Classifier-Free Guidance(CFG)主要增强条件一致性,而不是减少采样步数。其常见形式为:

ϵcfg=ϵuncond+s(ϵcond−ϵuncond)

其中 s 是 guidance scale。传统实现往往需要条件和无条件两次模型预测,因此 CFG 甚至可能增加每一步的计算量;它改善的是 prompt adherence 等条件控制效果。

方法主要改变是否直接减少采样步数
Progressive Distillation训练学生模型模仿更少步的教师采样是,需要额外蒸馏
Consistency Models学习跨噪声状态的一致映射支持一步或少步,需要训练或蒸馏
DPM-Solver使用扩散专用高阶 ODE 求解器是,通常无需重新训练基础模型
DDIM inversion将已有图像反演到噪声/潜变量不是主要目标
CFG放大条件与无条件预测的差异不是,主要增强条件控制

扩散模型少步采样速记

蒸馏和一致性模型通过训练改变少步生成能力;DPM-Solver 通过更高阶的采样求解器减少函数评估;CFG 负责条件控制,DDIM inversion 负责图像反演。

四、文档 Embedding 与切分 ​

如果每篇文档最终只保存一个 d 维的 float32 Embedding,那么每篇文档的向量存储量是:

d×4 bytes

设文档数量为 Ndoc,理想情况下只计算向量本身的存储量:

S=Ndoc×d×4 bytes

若有 G 张 GPU、每张可用 M GiB,则不考虑索引元数据、分片复制和系统预留时,维度上限满足:

Ndocd×4≤GM230

实际 ANN 索引还可能需要图结构、页表、ID、对齐空间或副本,因此这个结果只是“裸向量理论上限”,部署时应预留额外空间。

4.1 文档切分与语义边界 ​

在 RAG 或文档向量检索中,Chunking 的目标不是把文本机械地切成完全相同的长度,而是在长度可控的前提下尽量保持语义单元完整。chunk 太大可能超过编码器上下文限制并降低检索粒度,chunk 太小又可能丢失定义、条件和结论之间的联系。

切分方式主要特点常见优点与代价
固定长度每达到指定 token 数或字符数就切分实现简单、长度可控,但可能从句子或段落中间截断
滑动窗口加 overlap相邻 chunk 共享一段内容可以缓解边界信息断裂,但会增加重复编码、存储和检索结果冗余
句子或段落切分以句子、段落等自然边界为优先语义通常更完整,但每个 chunk 的 token 数不必完全相同,超长句子仍需二次处理
Recursive Split按较大的分隔符切分,超长时逐级使用更细的分隔符优先保留段落和句子结构,必要时才退化到词或字符

滑动窗口的 overlap 主要用于缓解边界截断,而不是保证每个 chunk 都包含完整主题。若重要信息刚好跨越两个块,重叠区域可以让两个相邻块都保留一部分上下文,提高至少一个块被准确召回的机会。overlap 越大,边界保护通常越强,但重复内容、向量数量和检索后去重压力也会增加。

句子级或段落级切分追求的是语义边界,而不是严格等长。不同句子长度不同,因此生成的 chunk 可以有不同 token 数;实际系统通常再设置最大长度,对超长句子、表格、代码块或列表采用递归拆分、特殊规则或保留结构的处理方式。

Recursive Split 通常按以下粒度逐级退化:

段落→换行或句子→词或空白→字符

它先尝试使用较粗的分隔符,只有当某个片段仍超过最大长度时,才继续降低切分粒度。这样既能控制 token 长度,又比单纯固定长度切分更不容易破坏完整语义。

滑动窗口与 Recursive Split 示例

假设目标 chunk 长度为 512 token,overlap 为 64 token,则相邻窗口会共享边界附近的 64 个 token:

text
Chunk 1:………………前一段内容………………[边界上下文]
Chunk 2:                         [边界上下文]………………后一段内容

Recursive Split 则可以先按段落切分;若某段超过长度限制,再按换行或句子切分;仍然过长时,再按词、空白或字符处理。最终长度可能不同,但优先保留更大的语义单元。

对于知识库检索,chunk 通常还应保留文档 ID、标题层级、页码或段落路径等元数据。这样检索命中后不仅能返回局部文本,也能追溯来源并在必要时扩展相邻上下文。切分策略最终应通过召回率、答案完整性、重复率和端到端问答效果评估,而不能只看 chunk 是否等长。

文档切分速记

Chunking 追求“长度可控且语义完整”;overlap 缓解边界断裂,句子/段落切分不要求等长,Recursive Split 则是从大语义单元开始、超长时逐级细分。

4.2 平均 token 数影响什么? ​

如果文档编码器先生成每个 token 的隐藏状态,再通过 mean pooling、attention pooling 或 [CLS] 表示压缩成一个文档向量:

Ltoken×dhidden→1×d

那么平均 token 数主要影响:

  • 编码阶段的计算量;
  • Transformer 中间激活的临时显存;
  • 批处理吞吐量。

它不直接影响 ANN 中最终每篇文档一个 d 维向量的常驻存储量。只有在要求保存每个 token 的 Embedding 时,才需要把 token 数乘入存储公式。

文档 Embedding 显存上限示例

假设有 2×108 篇文档、8 张 GPU、每张可用 75 GiB,且每篇只保存一个 float32 向量,则:

d≤8×75×2302×108×4≈805.3

所以只按整数维度计算,理想上限为:

dmax=805

若 d=1024,裸向量需要:

2×108×1024×4≈762.9 GiB

已经超过 8×75=600 GiB 的可用总显存;这还没有计入 ANN 索引和运行时开销。

如果保存每篇文档的 256 个 token 向量而不是一个 pooled 向量,存储量会变为:

2×108×256×d×4

相对于一篇一个向量的方案扩大约 256 倍。

文档 Embedding 存储速记

一篇文档最终一个 d 维 float32 向量时,存储量是文档数 ×d×4;平均 token 数影响编码计算和临时激活,只有保存逐 token 向量时才直接进入常驻存储公式。

使用 Markdown 与 VitePress 构建