omni / docs /models /vlm.md
chenbhao's picture
Add modular development docs under docs/ for learning and interviews
c6b1b88
|
Raw
History Blame Contribute Delete
1.61 kB

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