1. 什么是 Modality-Pre-Fusion?
在 sVLM,也就是小型视觉语言模型中,modality-pre-fusion / 模态预融合可以理解为:
在视觉信息进入小型 LLM 主干之前,先把图像特征、文本提示、检测/OCR/结构信息等进行一次轻量级跨模态融合,使小模型接收到的是"已经压缩、对齐、任务相关"的多模态 token,而不是原始、冗长、未筛选的视觉 token。
它和普通 LLaVA 式结构的区别在于:
普通结构多是 Vision Encoder → Projector → LLM ;
而模态预融合会在 Projector 之前或 Projector 内部 增加一层"图文交互 / 语义筛选 / token 压缩"。
典型位置如下:
text
普通 sVLM:
Image → Vision Encoder → Projector → Small LLM → Answer
Modality-Pre-Fusion sVLM:
Image → Vision Encoder
│
Text Prompt → Text Embed / Query
│
▼
Pre-Fusion Module
图文对齐 / token筛选 / ROI聚合 / 语义压缩
│
▼
Projector / Adapter
│
▼
Small LLM → Answer
LLaVA 这类模型主要通过 projection layer 把视觉特征映射到语言模型 embedding 空间,并采用特征对齐和视觉指令微调两阶段训练;MobileVLM 则面向移动端,使用视觉编码器、轻量 projector 和小型 LLM 组成端侧 VLM;TinyLLaVA 也强调 vision encoder、connector 和 small-scale LLM 的模块化组合。([GitHub][1])
2. 在 sVLM 中为什么需要预融合?
sVLM 的核心问题是:
text
模型小 → 推理能力弱
显存小 → 不能保留太多视觉 token
上下文短 → 图像 token 会挤占文本上下文
projector 弱 → 图像与语言空间对齐不足
边缘端算力有限 → 不能堆很深的 cross-attention
所以,模态预融合的目标不是"让模型更复杂",而是:
在进入小型 LLM 前,提前完成视觉 token 的筛选、压缩、语义对齐和任务相关增强,降低小 LLM 的理解负担。
这和 BLIP-2 的思路有相似性:BLIP-2 用轻量 Q-Former 在冻结视觉编码器和冻结 LLM 之间桥接模态差距,并把视觉信息压缩成对语言模型更有用的表示。([arXiv][2])
3. sVLM 中的具体应用方式
3.1 Prompt-aware Visual Token Selection
这是最常见、最适合 sVLM 的预融合方式。
传统方式:
text
图像 → ViT patch tokens → 全部送入 LLM
预融合方式:
text
图像 patch tokens + 文本 prompt
│
▼
根据问题筛选相关视觉 token
│
▼
只送入和问题相关的视觉区域
例如:
text
Prompt: "第二层左侧有几瓶可乐?"
模型不需要关注整张图,而应该优先关注:
text
第二层
左侧区域
瓶装商品
可乐包装
数量特征
结构示意:
text
V = VisionEncoder(image) # N 个视觉 token
Q = TextEncoder(prompt) # 文本 query
A = softmax(Q @ V.T) # prompt 对视觉 token 的注意力
V_select = topk(A, V) # 选出最相关 token
V_fused = Fuse(V_select, Q) # 图文预融合
优势:
- 减少视觉 token 数量;
- 提升问题相关性;
- 降低小 LLM 的上下文压力;
- 对视觉问答、商品识别、OCR 问答、区域计数非常有用。
3.2 Q-Former / Query-Based Pre-Fusion
这是 BLIP-2 风格的做法。
核心思想:
text
固定数量的 learnable query
│
▼
从图像特征中抽取最有用的信息
│
▼
输出少量 multimodal query tokens
│
▼
送入 LLM
结构:
text
Image → Frozen Vision Encoder → Visual Tokens
│
Learnable Queries ────────────────┘
│
▼
Q-Former / Cross-Attention
│
▼
K 个融合视觉 token
│
▼
Small LLM
BLIP-2 的 Q-Former 被设计成视觉编码器和 LLM 之间的信息瓶颈,用于抽取对语言生成最有用的视觉表示。([Proceedings of Machine Learning Research][3])
对 sVLM 来说,这种方法非常有价值,因为它可以把几百到上千个 patch token 压缩成几十个 query token。
适合:
- 小模型 VQA;
- 图像描述;
- 图像分类解释;
- OCR 场景理解;
- 工业质检;
- 商品柜/货架图像理解。
3.3 ROI-Aware Pre-Fusion
对于你的自动售货柜 / SKU / YOLO / SAM / OCR 场景,最实用的是 ROI-aware pre-fusion。
流程:
text
Image
│
├── YOLO / SAM → bbox / mask / shelf ROI
├── OCR → text region
├── M2结构对齐 → shelf_id / layer_id / perspective
│
▼
ROI Feature Pooling
│
▼
ROI token + class prompt + OCR token + position token
│
▼
Pre-Fusion Module
│
▼
sVLM
例如每个商品区域可以构造成:
json
{
"roi_id": 17,
"bbox": [x1, y1, x2, y2],
"shelf_id": 2,
"position": "left",
"det_class": "bottle",
"ocr_text": "Coca Cola",
"visual_embedding": "...",
"prompt": "判断该区域商品是否为可乐"
}
然后送入预融合模块:
text
ROI视觉特征 + OCR文字 + 位置编码 + 类别prompt
│
▼
fused ROI token
│
▼
Small LLM
这比整图直接问 sVLM 更稳定,因为它把低层视觉任务交给 YOLO / SAM / OCR,把 sVLM 主要用于语义确认和异常判断。
3.4 Spatial-Structure Pre-Fusion
在货架、柜体、机器人场景中,空间结构很重要。
例如:
text
第几层
左中右位置
上下遮挡
商品排列关系
同类商品连续区域
柜体透视变形
可以把 M2 几何结构结果编码成 spatial tokens:
text
shelf_token_1
shelf_token_2
left_region_token
right_region_token
mask_region_token
bbox_position_token
然后与视觉 token 预融合:
text
Visual ROI Token + Spatial Token + Text Prompt
│
▼
Structure-aware Fusion
│
▼
Small LLM
对自动售货柜场景,这类预融合非常重要,因为问题往往不是"图里有什么",而是:
text
第二层左侧缺了什么?
某一排是否少放?
该 SKU 是否摆错位置?
目标商品是否被遮挡?
是否需要补货?
3.5 OCR-Enhanced Pre-Fusion
sVLM 小模型通常 OCR 能力弱。可以在预融合阶段加入 OCR token:
text
Image → OCR Engine → text boxes + recognized text
Image → Vision Encoder → visual tokens
Prompt → text query
│
▼
OCR-aware Pre-Fusion
│
▼
Small LLM
示例:
text
ROI视觉特征: 红色瓶装饮料
OCR文本: Coca Cola / 可口可乐
Prompt: 判断该商品SKU
预融合后,小模型不需要完全依赖视觉图案,可以结合 OCR 结果判断 SKU。
适合:
- 商品包装识别;
- 票据理解;
- 屏幕 HUD OCR;
- 工业铭牌;
- 药盒/食品标签识别。
3.6 Multi-Scale Pre-Fusion
sVLM 很容易漏掉小目标,所以可以做多尺度预融合:
text
Global Image Token
Local ROI Token
Crop Token
OCR Token
Mask Token
Position Token
融合方式:
text
global_token + roi_tokens + crop_tokens + prompt_token
│
▼
Multi-scale Fusion Adapter
│
▼
Small LLM
这样可以兼顾:
text
整图上下文
局部细节
目标位置
文字信息
mask形状
对 SKU、货架、自动售货柜、机器人操作场景都很实用。
4. 典型实现结构
4.1 最轻量实现:Concat + MLP
text
visual_token + text_token + position_token
│
▼
MLP
│
▼
fused multimodal token
伪代码:
python
v = vision_encoder(image) # [B, Nv, Dv]
t = text_encoder(prompt) # [B, Nt, Dt]
p = position_encoder(bbox) # [B, Nr, Dp]
v_proj = visual_proj(v)
t_proj = text_proj(t)
p_proj = pos_proj(p)
fused = torch.cat([v_proj, t_proj, p_proj], dim=1)
fused = fusion_mlp(fused)
out = small_llm(inputs_embeds=fused)
优点:
- 简单;
- 速度快;
- 适合端侧;
- 容易导出 ONNX / TensorRT / MNN。
缺点:
- 跨模态交互能力弱;
- 对复杂空间关系不够强。
4.2 Cross-Attention Pre-Fusion
text
Text Query attends to Visual Tokens
公式:
text
Q = Wq * text_prompt
K = Wk * visual_tokens
V = Wv * visual_tokens
F = Attention(Q, K, V)
伪代码:
python
class PreFusionAdapter(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.cross_attn = nn.MultiheadAttention(
embed_dim=dim,
num_heads=num_heads,
batch_first=True
)
self.norm = nn.LayerNorm(dim)
self.mlp = nn.Sequential(
nn.Linear(dim, dim * 4),
nn.GELU(),
nn.Linear(dim * 4, dim)
)
def forward(self, text_tokens, visual_tokens):
fused, attn = self.cross_attn(
query=text_tokens,
key=visual_tokens,
value=visual_tokens
)
fused = self.norm(text_tokens + fused)
fused = self.norm(fused + self.mlp(fused))
return fused, attn
优点:
- prompt-aware;
- 适合 VQA;
- 能根据问题动态选择视觉区域;
- 比全量 early fusion 更省 token。
缺点:
- 比 MLP 慢;
- 多层 cross-attention 会增加部署成本。
4.3 Learnable Query Pre-Fusion
类似 Q-Former / Perceiver Resampler:
python
class QueryPreFusion(nn.Module):
def __init__(self, num_queries, dim, num_heads):
super().__init__()
self.queries = nn.Parameter(torch.randn(1, num_queries, dim))
self.cross_attn = nn.MultiheadAttention(dim, num_heads, batch_first=True)
self.norm = nn.LayerNorm(dim)
def forward(self, visual_tokens, batch_size):
q = self.queries.expand(batch_size, -1, -1)
fused, attn = self.cross_attn(q, visual_tokens, visual_tokens)
fused = self.norm(q + fused)
return fused
优点:
- 把大量视觉 token 压缩成固定数量 token;
- 对小 LLM 友好;
- 适合端侧;
- 可控制上下文长度。
Flamingo 使用 Perceiver Resampler 把可变尺寸视觉特征变成较少的视觉 token,并通过 gated cross-attention 把视觉信息注入语言模型。([arXiv][4])
5. 与其他融合方式的主要区别
5.1 Pre-Fusion vs Early Fusion
| 对比项 | Modality-Pre-Fusion | Early Fusion |
|---|---|---|
| 融合位置 | 进入 LLM 前的 adapter / projector 阶段 | 模型最早层直接混合图文 token |
| 计算量 | 较低,可控 | 通常较高 |
| 适合 sVLM | 很适合 | 要谨慎,token 多时成本高 |
| 优势 | 压缩、筛选、对齐后再送入小 LLM | 图文交互充分 |
| 缺点 | 表达能力取决于 adapter | 小模型容易算不动 |
MoMa 这类 early-fusion 模型会在预训练中处理任意顺序的图文混合 token,并使用 modality-aware MoE 区分不同模态 token;这类方法交互充分,但通常比 sVLM 常用的轻量 adapter 方案更重。([arXiv][5])
5.2 Pre-Fusion vs Projector-Only
| 对比项 | Projector-Only | Modality-Pre-Fusion |
|---|---|---|
| 典型结构 | Vision Encoder → Linear/MLP → LLM | Vision/Text/ROI/OCR → Fusion Adapter → LLM |
| 是否感知问题 | 通常不感知 | 可以 prompt-aware |
| 是否压缩视觉 token | 有时压缩,有时不压缩 | 通常会压缩 |
| 是否融合 OCR/ROI/结构 | 一般不融合 | 很适合融合 |
| 对小模型友好度 | 中等 | 更高 |
| 适合场景 | 通用图像问答 | 工业、端侧、结构化视觉任务 |
LLaVA 经典结构主要是把 CLIP 视觉特征通过投影层映射到语言模型 embedding 空间;这很简单有效,但对小模型来说,projector-only 往往不足以处理复杂 ROI、OCR、空间结构和 prompt-aware token 选择。([GitHub][1])
5.3 Pre-Fusion vs Cross-Attention Inside LLM
| 对比项 | Pre-Fusion | LLM 内部 Cross-Attention |
|---|---|---|
| 融合位置 | LLM 前 | LLM 多层内部 |
| 计算成本 | 较低 | 较高 |
| 改 LLM 结构 | 通常不需要 | 通常需要 |
| 端侧部署 | 更容易 | 更复杂 |
| 表达能力 | 中等 | 更强 |
| 适合 | sVLM / edge VLM | 大模型 / few-shot VLM |
Flamingo 是典型的"在语言模型内部通过 gated cross-attention 注入视觉信息"的路线,能力强,但工程复杂度和推理成本通常高于轻量预融合。([OpenReview][6])
5.4 Pre-Fusion vs Late Fusion / Post-Fusion
| 对比项 | Pre-Fusion | Late/Post-Fusion |
|---|---|---|
| 融合时机 | LLM 推理前 | 各模型输出后 |
| 是否有 token 级交互 | 有 | 通常没有 |
| 例子 | 图文 token 先融合再回答 | YOLO 输出 + OCR 输出 + LLM 文本总结 |
| 优势 | 语义理解更强 | 工程简单、可解释 |
| 缺点 | 需要训练 adapter | 跨模态推理弱 |
Late fusion 更像:
text
YOLO检测结果 → 文本化
OCR结果 → 文本化
库存表 → 文本化
LLM → 规则判断
Pre-fusion 则是:
text
视觉ROI token + OCR token + prompt token + 空间token
│
▼
融合成 multimodal embedding
│
▼
sVLM 推理
如果目标只是业务规则判断,late fusion 足够;如果目标是让 sVLM 真正理解图像区域、文字、空间关系,pre-fusion 更强。
8. 核心优势总结
| 优势 | 说明 |
|---|---|
| 降低 token 数量 | 先压缩视觉 token,减少 LLM 上下文压力 |
| 提升视觉 grounding | 小模型更容易知道应该看哪里 |
| 支持 prompt-aware 理解 | 根据问题动态选择视觉区域 |
| 易融合检测/OCR/结构信息 | 特别适合工业视觉和货柜场景 |
| 适合边缘端部署 | 比 LLM 内部多层 cross-attention 更轻 |
| 降低幻觉 | 因为输入给 sVLM 的是经过 ROI/OCR/结构约束的视觉证据 |
| 提升细粒度识别 | 对 SKU、包装、文字、局部区域更有效 |
| 便于蒸馏 | 可以蒸馏 teacher 的 fused token、attention map、ROI 选择结果 |
9. 总结
在 sVLM 中,modality-pre-fusion 的本质不是简单地把图像和文本拼起来,而是:
在小型 LLM 推理前,用轻量模块把视觉、文本、OCR、检测框、mask、空间位置、业务结构信息提前融合成更紧凑、更相关、更容易被小模型理解的 multimodal tokens。
Projector-only 是"把图像翻译成 LLM 能读的 token";modality-pre-fusion 是"先根据任务把视觉、文本和结构证据融合好,再交给小 LLM 推理"。
参考链接:
1\]: https://github.com/haotian-liu/llava?utm_source=chatgpt.com "haotian-liu/LLaVA: \[NeurIPS'23 Oral\] Visual Instruction ..." \[2\]: https://arxiv.org/abs/2301.12597?utm_source=chatgpt.com "BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models" \[3\]: https://proceedings.mlr.press/v202/li23q/li23q.pdf?utm_source=chatgpt.com "BLIP-2: Bootstrapping Language-Image Pre-training with ..." \[4\]: https://arxiv.org/abs/2204.14198?utm_source=chatgpt.com "Flamingo: a Visual Language Model for Few-Shot Learning" \[5\]: https://arxiv.org/html/2407.21770v2?utm_source=chatgpt.com "MoMa: Efficient Early-Fusion Pre-training with Mixture ..." \[6\]: https://openreview.net/forum?id=EbMuimAbPbs\&utm_source=chatgpt.com "Flamingo: a Visual Language Model for Few-Shot Learning"