直觉:让"猫的图片"和"猫这个词"住进同一个空间

人类看到一只猫的照片、听到"喵"、读到"cat",脑子里激活的是同一个概念。多模态模型想做的事类似:把图像、文本、音频这些异构信号映射到一个共享的语义空间里,让"语义相近"的东西在向量空间里也相近——哪怕它们来自完全不同的模态。

一旦做到这一点,很多任务就统一了:图文检索是"在共享空间里找最近邻",看图说话是"图像向量 → 文本生成",文生图是反过来。所以多模态的核心问题就两个:跨模态对齐(怎么把不同模态拉到同一空间)和统一表示(用什么架构承载这个空间)。

机制一:对比学习与跨模态对齐

最有影响力的对齐范式是对比学习(CLIP 式)。思路极简:准备海量"图像-文本"配对,用一个图像编码器 fIf_I 和一个文本编码器 fTf_T 分别编码,然后训练它们,让配对的图文向量靠近、不配对的远离

给一个 batch 有 NN 个图文对,算出图像向量 {vi}\{v_i\} 和文本向量 {tj}\{t_j\},构造 N×NN \times N 的相似度矩阵 Sij=vitjτS_{ij} = \frac{v_i \cdot t_j}{\tau}τ\tau 是温度系数)。对角线是正样本,其余是负样本。损失是对称的 InfoNCE:

L=12Ni[logeSiijeSij+logeSiijeSji]\mathcal{L} = -\frac{1}{2N}\sum_{i}\left[\log\frac{e^{S_{ii}}}{\sum_j e^{S_{ij}}} + \log\frac{e^{S_{ii}}}{\sum_j e^{S_{ji}}}\right]

前一项是"给定图像,在 N 个文本里选对的那个",后一项反过来。直觉上这是一个 NN 路分类问题,正确答案在对角线上。

1
2
3
4
5
6
7
# 一个 batch 的对比损失(伪代码)
img_emb = l2_normalize(image_encoder(images)) # [N, d]
txt_emb = l2_normalize(text_encoder(texts)) # [N, d]
logits = img_emb @ txt_emb.T / temperature # [N, N]
labels = arange(N) # 对角线
loss = 0.5 * (cross_entropy(logits, labels) +
cross_entropy(logits.T, labels))

几个关键工程点:

  • L2 归一化让相似度退化为余弦相似度,避免向量模长干扰。
  • 大 batch 至关重要。负样本数量 = batch size,batch 越大,对比信号越强、表示越有判别力。这也是为什么这类模型训练偏好大显存/多卡——loss 本身要求 batch 内全互相比较。
  • 温度 τ\tau 控制分布尖锐度。τ\tau 太大梯度太平、学不动;太小则对噪声敏感。它通常作为可学习参数。

对齐之后得到的是一个**双塔(dual-encoder)**结构:两个模态各编各的,最后在共享空间比对。它的最大优点是检索高效——文本向量可以离线算好建索引,查询时只编码一次图像做最近邻搜索。

机制二:从"对齐"到"统一生成"

双塔擅长检索,但不能"看图写文章"——它只比较,不生成。要做生成式多模态(看图问答、图文对话),需要让模态真正融合进一个生成模型。主流做法是把视觉接到一个 LLM 上:

  1. 视觉编码器(通常就是对比学习预训练好的图像塔)把图像变成一组 patch 特征,比如 [P,dv][P, d_v]PP 个图块,每个 dvd_v 维)。
  2. 一个投影/连接模块(projector,可以是简单的 MLP,也可以是带可学习 query 的注意力模块)把视觉特征映射成若干个"视觉 token",维度对齐到 LLM 的词嵌入维度 dtextd_{\text{text}}
  3. 这些视觉 token 和文本 token 拼成一个序列,一起喂给 LLM 的 Transformer:
1
2
3
[<img_1> <img_2> ... <img_P>]  [描述  这张  图片]
└──────视觉 token──────┘ └────文本 token────┘
都进同一个自注意力序列,LLM 当成普通 token 处理

于是图像就被"翻译"成了 LLM 能理解的伪词。自注意力让文本 token 能 attend 到视觉 token,模型就能基于图像内容生成回答。这就是统一表示的精髓:不同模态最终都被表达为同一个 Transformer 序列里的 token

训练上常见两阶段:先冻结视觉塔和 LLM、只训 projector(让视觉特征学会"说 LLM 的语言"),再做指令微调放开部分参数。这样既省算力,又避免破坏 LLM 已有的语言能力。

工程权衡与踩坑

视觉 token 的数量是显存与精度的核心权衡。一张高分辨率图可能产生几百上千个 patch,每个都是一个 token。Transformer 自注意力是序列长度的 O(L2)O(L^2),视觉 token 一多,上下文和算力都暴涨。所以要么降采样(信息损失),要么用 query 压缩(如用 32/64 个可学习 query 把上千 patch 压成几十个 token)。给图越多、越清晰,回答越准,但也越慢越贵——这是部署时必须调的旋钮。

模态鸿沟(modality gap)是个真实现象。即便经过对比对齐,图像向量和文本向量在共享空间里往往各自聚成一团,中间有一条间隙,并非完美混合。这意味着跨模态相似度的绝对值不能直接当概率解读,做阈值判断时要按模态分别校准。

常见误区

  • 以为"多模态 = 把图片 OCR 成文字再喂 LLM"。OCR 只能拿到文字,丢掉了布局、颜色、空间关系、非文字图像信息;真正的视觉 token 保留了像素级语义。
  • 以为对齐后任意两模态都能互换。对齐质量高度依赖训练数据的配对覆盖——训练里没见过的概念组合(如冷门专业图表),对齐会很弱。
  • 忽视数据噪声。互联网图文对噪声很大(alt 文本经常和图无关),对比学习对错配对相对鲁棒但并非免疫,数据清洗的收益常常大于模型调参。

小结

多模态的两条主线:对齐靠对比学习把异构模态拉进共享空间,用对称 InfoNCE 损失把"配对图文"在向量空间里拉近、非配对推远,产出适合检索的双塔;统一表示则把视觉特征投影成"伪 token"接进 LLM 序列,让自注意力在一个 Transformer 里同时处理图像与文本,从而具备生成能力。落地时最该盯住的,是视觉 token 数量带来的 O(L2)O(L^2) 算力代价、模态鸿沟导致的相似度不可直接比较,以及训练数据配对覆盖决定的对齐边界。