⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

7.1 视觉-语言对齐

核心问题: 如何让模型理解图像和文本的关系?

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明


问题

图像和文本是两种不同的模态,如何在同一个模型中处理?

挑战:

  • 图像是像素矩阵
  • 文本是离散的单词
  • 需要找到共同的表示空间

核心组件速览

在深入之前,先理解多模态 LLM 的三个关键组件及其角色。这里的重点是组件职责,不是固定模型列表:

组件输入输出角色代表模型
ViT图像图像特征向量视觉编码器LLaVA、Qwen2.5-VL
CLIP图像+文本联合嵌入空间图文对齐(桥梁)零样本分类、检索
LLM文本+视觉特征文本响应语言理解与生成多模态助手

关键区别:

  • ViT:单向(图像→特征),用于特征提取
  • CLIP:双向(图像+文本→对齐),用于对齐
  • LLM:多模态理解,用于推理和生成

多模态架构的演进

早期方法:特征拼接

思想: 分别提取图像和文本特征,然后拼接。

图像 → CNN → 特征1
文本 → RNN → 特征2

    拼接 → 分类器

问题:

  • 特征空间不对齐
  • 跨模态信息利用不足

对比学习方法:CLIP

思想: 用对比学习对齐图像和文本特征。

损失函数:

L=logexp(sim(I,T)/τ)jexp(sim(I,Tj)/τ)

其中 τ 是温度参数。

优势:

  • 特征空间对齐
  • 零样本学习能力强

融合方法:LLaVA

思想: 用投影层连接视觉编码器和LLM。

图像 → ViT → 投影层 → LLM → 输出

              文本

关键组件:

  • 视觉编码器:提取图像特征
  • 投影层:对齐特征空间
  • LLM:理解和生成文本

视觉编码器详解

步骤1:提取图像特征

用CNN或Vision Transformer(ViT)提取图像特征。

图像(3×H×W)

ViT或CNN

图像特征(N×D)

Vision Transformer(ViT)

基本思想: 把图像分成小块(patches),用Transformer处理。

图像

分成16×16的patches

线性投影

Transformer

图像特征

ViT Patches可视化

图7.1a:Vision Transformer 图像分块可视化——原始图像分割成 16×16 的 patches,每个 patch 线性展开后加位置编码送入 Transformer。

代码文件: code/ch07_multimodal_llm/vit_patches.py
运行方式: python code/ch07_multimodal_llm/vit_patches.py

ViT的详细步骤

  1. 分块:把图像分成 N×N 的patches

    • 图像大小:H×W×3
    • Patch大小:P×P
    • Patch数量:(H/P)×(W/P)
  2. 线性投影:把每个patch投影到向量

    • 输入:P×P×3 的patch
    • 输出:D 维向量
  3. 位置编码:添加位置信息

    • 类似NLP中的位置编码
    • 让模型知道patch的位置
  4. Transformer:处理patch序列

    • 自注意力:学习patch之间的关系
    • 前馈网络:非线性变换

ViT的优势

  • 可扩展性:可以扩展到不同分辨率的图像,但会受到 visual token 数和位置编码设计的限制
  • 全局建模:自注意力可以直接建模 patch 之间的长距离关系
  • 统一架构:与NLP中的Transformer一致

计算复杂度

自注意力复杂度: O(N2),其中 N 是patch数量。

对于大图像:

  • 图像大小:2048×2048
  • Patch大小:16×16
  • Patch数量:128×128=16384
  • 复杂度:O(163842)2.6×108

优化方法:

  • 分层ViT:多尺度处理
  • 局部注意力:只关注附近的patch
  • 稀疏注意力:减少计算量

文本编码器

用标准的Transformer编码文本。

文本

Tokenization

Embedding

Transformer

文本特征

对比学习的原理深度

对比学习的几何直观

核心思想: 在高维特征空间中,相似的样本应该聚集在一起,不相似的样本应该分散开来。

几何解释:

特征空间(高维)

相似对(应该接近):
  图像1 ●

         ╲ 小距离

           ● 文本1

不相似对(应该远离):
  图像1 ●

         ╲ 大距离

           ● 文本2(不匹配)

为什么这样有效:

  • 相似对接近 → 模型学会识别匹配的图像-文本对
  • 不相似对远离 → 模型学会区分不匹配的对
  • 自动形成对齐的特征空间 → 不需要显式的对齐标签

与其他方法的对比:

方法原理优点缺点
MSE损失最小化预测误差简单不能处理多模态
对比学习相似对接近,不相似对远离自动对齐,零样本能力强需要大批大小
三元损失相似对比不相似对更接近直观需要手工选择负样本

为什么对比学习能对齐特征?

关键机制: 通过最大化相似对的相似度、最小化不相似对的相似度,自动学习对齐。

数学直观:

给定一个图像-文本对 (I,T)

  • 目标:sim(I,T) 应该大(相似对接近)
  • 约束:sim(I,Tj) 应该小,其中 Tj 是不匹配的文本

为什么这能创建共同的表示空间:

  1. 相似对的拉力: 模型被迫让匹配的图像和文本特征接近
  2. 不相似对的推力: 模型被迫让不匹配的对分散
  3. 自动对齐: 这两个力共同作用,自动创建对齐的特征空间

与显式对齐的区别:

  • 显式对齐:需要手工标注对应关系
  • 对比学习:从数据中自动学习对应关系

对齐质量与下游任务的关系

对齐质量的度量:

  1. 相似度分布: 相似对的相似度应该高,不相似对应该低

    好的对齐:
    相似对相似度:0.8-0.95
    不相似对相似度:0.1-0.3
    
    差的对齐:
    相似对相似度:0.5-0.6
    不相似对相似度:0.4-0.5
  2. 检索准确率: 给定图像,能否正确检索对应的文本

    • 好的对齐:Top-1准确率 > 90%
    • 差的对齐:Top-1准确率 < 50%

对齐与零样本学习的关系:

零样本分类的原理:

1. 给定图像和类别文本描述
2. 计算图像与每个类别的相似度
3. 选择相似度最高的类别

这只有在特征空间对齐时才能工作!

对齐与下游任务的关系:

任务对齐的重要性原因
零样本分类🔴 极高主要依赖相似度排序
图像检索🔴 极高需要准确的相似度排序
VQA🟠 中等需要理解图像内容
图像描述🟠 中等需要理解图像内容

常见失败模式:

  • 图像文字太小或模糊,视觉编码器无法提取细节
  • 图文描述存在歧义,对比学习可能学到粗粒度相关而不是精确对应
  • 空间关系、计数和细粒度属性比普通图文检索更难
  • 下游任务要求的证据粒度高于预训练对齐数据提供的粒度

ViT vs CNN:为什么Transformer常用于图文对齐?

CNN的特点: 局部卷积从小感受野开始,依靠多层堆叠、池化或大卷积核逐步扩大感受野。它可以建模整体语义,但全局关系通常不是第一层就直接可见。

ViT的优势: 自注意力机制让每个 patch 可以直接关注其他 patch,更容易形成全局图像表示;这与文本描述通常表达全局语义的方式更接近,因此常用于图文对齐模型。

CNN vs ViT 感受野对比

图7.1c:CNN 局部感受野(每次只看 3×3 区域)vs ViT 全局自注意力(每个 patch 关注所有其他 patch)的直观对比。

代码文件: code/ch07_multimodal_llm/architecture_diagrams.py运行方式: python code/ch07_multimodal_llm/architecture_diagrams.py

为什么全局感受野对对齐更重要:

  1. 语义理解: 图像的语义通常需要全局信息

    • 例如:"一个人在公园里"需要看到人、公园、背景的关系
  2. 特征一致性: 全局特征更稳定,更容易与文本对齐

    • CNN的局部特征容易受到位置变化影响
    • ViT的全局特征对位置变化更鲁棒
  3. 跨模态对齐: 文本是全局的,图像特征也应该是全局的

    • 文本"一个人在公园里"是全局概念
    • 应该与全局图像特征对齐,而不是局部特征

温度参数的深层原理

温度参数与softmax分布的关系:

softmax(z_i / τ) = exp(z_i / τ) / Σ exp(z_j / τ)

τ的作用:控制分布的"尖锐度"

不同τ值的效果:

温度参数效果

图7.1d:三种温度参数下的 softmax 概率分布——τ=0.07 分布较尖,τ=0.5 适中,τ=10.0 分布极平(学习信号弱)。

代码文件: code/ch07_multimodal_llm/architecture_diagrams.py运行方式: python code/ch07_multimodal_llm/architecture_diagrams.py

为什么过小的τ可能导致训练不稳定或过度自信:

  1. 梯度爆炸: 小τ导致softmax分布尖锐,梯度很大

    ∂L/∂z_i ∝ 1/τ  (τ越小,梯度越大)
  2. 学习不稳定: 大梯度导致参数更新不稳定

    w_new = w_old - α * (∂L/∂w)
    
    如果∂L/∂w很大,w_new可能跳过最优点
  3. 过度自信: 模型可能过度拟合训练数据中的相似对

    • 对训练数据中的相似对非常自信
    • 对新数据的泛化能力差

为什么大τ导致学习效率低:

  1. 梯度消失: 大τ导致softmax分布平缓,梯度很小

    ∂L/∂z_i ∝ 1/τ  (τ越大,梯度越小)
  2. 学习缓慢: 小梯度导致参数更新缓慢

    w_new = w_old - α * (∂L/∂w)
    
    如果∂L/∂w很小,w_new变化不大
  3. 信号弱: 模型无法区分相似对和不相似对

    • 所有对的相似度都接近
    • 模型无法学到有意义的对齐

如何选择τ:

  • 经验值: τ = 0.07 是CLIP中的标准值
  • 原理: 平衡梯度大小和学习稳定性
  • 调整:
    • 如果过拟合,增大τ
    • 如果学习太慢,减小τ
    • 通常在0.01-0.1之间

对齐:对比学习的数学基础

对齐的目标

让图像特征和文本特征在同一个空间中。

对比学习的目标

最大化相似的样本对之间的相似度,最小化不相似的样本对之间的相似度。

损失函数

NT-Xent(Normalized Temperature-scaled Cross Entropy):

Li,j=logexp(sim(zi,zj)/τ)k=12N1[ki]exp(sim(zi,zk)/τ)

其中:

  • zi,zj:特征向量
  • sim:相似度函数(通常是余弦相似度)
  • τ:温度参数(控制分布的尖锐度)

温度参数的作用

τ 太小: 分布过于尖锐,容易过拟合

τ 太大: 分布过于平缓,学习效率低

典型值: τ=0.07

批大小的影响

大批大小:

  • 优点:更多的负样本,更稳定的梯度
  • 缺点:需要更多显存

小批大小:

  • 优点:显存占用少
  • 缺点:负样本少,学习效率低

对比学习的方法

用对比学习(Contrastive Learning):

  • 相关的图像-文本对应该接近
  • 不相关的图像-文本对应该远离

代码实验

CLIP相似度矩阵

图7.1b:CLIP 图像-文本相似度矩阵——对角线最亮表示对比学习对齐效果好,相似对相似度高,不相似对相似度低。

代码文件: code/ch07_multimodal_llm/clip_similarity.py
运行方式: python code/ch07_multimodal_llm/clip_similarity.py


本节小结

视觉-语言对齐经历了从特征拼接到对比学习再到融合方法的演进。核心思想是:

  1. 用ViT提取图像特征
  2. 用Transformer提取文本特征
  3. 用对比学习对齐两个特征空间

下一节: 7.2 Qwen2.5-VL:高分辨率多模态LLM案例

扩展阅读: 对比学习与投影层深度细节(InfoNCE 推导、温度参数原理、投影层设计)

本教程采用 CC BY-NC-SA 4.0 许可协议