models/vlm · 视觉多模态 (VLM)
VLM 继承自 LMForCausalLM,复用 LM 主干,只在 forward 里把视觉特征投影后拼到文本 embedding 序列对应位置。
结构
VLM(LMForCausalLM)
├─ model: LM # 复用主干
├─ vision_encoder: SiglipVisionEncoder
└─ vision_proj: MMVisionProjector # 图像特征 → LLM hidden
视觉注入方式(面试重点)
- 文本序列里用特殊 token(如
<|image_pad|>×image_token_len)占位。 - 图像经
vision_encoder(SigLIP) 得到 patch 特征 →vision_proj映射到hidden_size与目标 token 数。 forward把投影后的图像特征替换掉占位 token 位置的 embedding,再走标准LM主干。- 因此 LLM 看到的「图像」就是一段连续的视觉 token,与文本 token 一视同仁。
关键字段(VLMConfig)
| 字段 | 含义 |
|---|---|
image_special_token |
图像占位符,如 `< |
image_ids |
占位 token 的 id(如 [12]) |
image_hidden_size |
视觉编码器输出维度 |
image_token_len |
单张图压缩成的视觉 token 数 |
要点(面试)
- 为什么投影 + 占位而不是 concat 新模态? 复用现成 LLM 的词嵌入位置,训练稳定,且位置编码天然连续。
- 冻结策略:训练时常冻结
vision_encoder,只训练vision_proj与 LLM 部分(freeze_llm参数控制),避免灾难性遗忘。 - 视觉 token 数与图像分辨率/分块数解耦,由
vision_proj重采样到固定image_token_len。