Multi-modal

介绍多模态大规模语言模型的基本概念及其应用

综述

ViT

基本思想

  • ViT 模型首次将 NLP 领域的 Transformer 成功迁移到图像分类,证明大规模数据下 Transformer 可超越 CNN

  • ViT 模型的核心逻辑是将 2D 图像切分为固定大小的 Patch(视觉 Token),展平后通过线性投影映射为嵌入向量,补充位置信息后输入 Transformer Encoder,最终用 [CLS] 输出做任务预测

  • 模型架构

ViT

  • ViT 的模型结构和 Bert 非常像,都是 Encoder-only 模型

  • 在输入处理上,包含对图片的 Patch 过程、Position Embedding 过程

  • 送入 Encoder 后,拿出 CLS 对应位置的向量,经过一个简单的 Softmax 多分类模型,去预测原始图片中的物品类别

从 Patch 到 Token

  • 假设原始图片尺寸大小为:224*224*3 (H * W * C)

  • 现在将这个图片切分为小 Patch,每个 Patch 的大小为 16,则每个 Patch 图片大小为 16*16*3,因此一共有 224∗22416∗16=196\frac {224*224}{16*16} = 196 个 Patch

  • 每个 patch 对应着一个 token,将每个 patch 展平,则得到输入矩阵 X,其大小为 (196, 768),也就是每个 token 是 768 维

  • 那么如何将每个小方块展平为一个一维向量?最简单的方法是拼接几个 channel,但是在这种方法下,同一个 pixel 本来是三个 channel 的值共同表达的,现在变成竖直的向量之后,这三个值的距离反而离得更远了

  • 因此,ViT 采用 CNN 进行特征提取,采用 768 个 16*16*3 尺寸的卷积核,stride=16,padding=0,这样就能得到 14*14*768 大小的特征图

  • 这里用到了二维卷积的输出尺寸通用公式

    Output_Size=⌊Input_Size−Kernel_Size+2×PaddingStride⌋+1Output\_Size = \left\lfloor \frac {Input\_Size - Kernel\_Size + 2 \times Padding}{Stride} \right\rfloor + 1
  • 每个卷积核 = 16×16×3,刚好覆盖一个完整的小 Patch(16×16×3);stride=16,卷积窗口不重叠,刚好从左到右、从上到下,逐个切 Patch;每个卷积核对一个 Patch 做一次点积,把 16×16×3 = 768 个数值,压缩成 1 个数值;768 个卷积核,每个 Patch 输出 768 维向量

  • 为什么 ViT 要先分 Patch 再转 Token?

    • 降低 Transformer 计算复杂度
      • Transformer 自注意力的计算复杂度为 O(N2)O (N^2),NN 为序列长度,如果直接以像素为 token,序列长度会极大,计算量难以承受
      • 通过划分 Patch 可以显著减小 NN,在精度与计算成本间取得平衡
      • Patch 尺寸 PP 越小,NN 越大,计算量越高,因此需要选择合适的 PP 控制计算开销
    • 利用图像天然的空间冗余性
      • 图像相邻像素高度相关、信息冗余度高,无需以单个像素作为基本计算单元
      • 用 Patch 作为基本单元既能保留局部结构信息,又能去除大量冗余,这也是 MAE、MoCo 等像素级预测与自监督算法能够有效工作的重要前提

嵌入层

  • Token Embedding

    • 将经过 Patch 处理后的 (196, 768) 的输入向量,经过 Embedding 层得到 (196, 768) 的嵌入

      XTE=X∗E=(196,768)∗(768∗768)=(196,768)X_{TE} = X * E = (196, 768) * (768 * 768) = (196, 768)
    • 输入 XX 本身已经是 (196,768)(196, 768),为什么还要再经过一层 embedding 映射?

    • 关键不在于维度是否变化,而在于表征含义与可学习性:

      • 原始 XX 是通过卷积 / 展平得到的固定预处理特征,与模型主体无关
      • token embedding 矩阵 EE 是可学习参数,会在训练中随梯度更新,能让向量更适配 Transformer 内部的语义空间
    • 更进一步,EE 的形状也可以设为 (768,x)(768, x),即第二维不一定要等于 768

    • 通过这层线性映射,可以自由设定最终送入 Transformer 的特征维度,灵活控制模型规模

  • Position Embedding

    • 记位置向量为 EposE_{pos},则它是一个形状为(196,768)的矩阵,表示 196 个维度为 768 的向量,每个向量表示对应 token 的位置信息
    • 无位置编码
      • 完全不加入任何位置信息,把所有 patch 当作无序集合输入,模型无法感知空间结构,性能通常会显著下降
    • 1-D 绝对位置编码
      • ViT 最终采用的方案,可学习 1-D 位置编码(与 BERT 一致)
      • 直接为第 1、2、…、196 个 token 分配独立可学习向量,区别于原始 Transformer 的三角函数固定编码
    • 2-D 绝对位置编码
      • 针对图像 2D 空间结构设计,认为 patch 不仅有全局序号,还存在行、列二维位置
      • 将位置编码拆分为水平方向 + 垂直方向分别学习,最终拼接或相加得到完整位置向量
    • 相对位置编码(RPE)
      • 在计算 Attention 时,将相对位置信息作为偏置(bias)加入注意力分数,为不同相对距离学习不同权重 wiw_i
      • 可通过 clip 截断控制距离范围,减少参数量:超出 k 步的相对位置共用同一套编码
  • 模型的完整数学表达

    z0=[xclass;xp1E;xp2E;… ;xpNE]+Epos,E∈R(P2⋅C)×D,Epos∈R(N+1)×Dzℓ′=MSA(LN(zℓ−1))+zℓ−1,ℓ=1…Lzℓ=MLP(LN(zℓ′))+zℓ′,ℓ=1…Ly=LN(zL0)\begin {align*} \mathbf {z}_0 &= \left [\mathbf {x}_{\text{class}}; \mathbf {x}_p^1 \mathbf {E}; \mathbf {x}_p^2 \mathbf {E}; \dots; \mathbf {x}_p^N \mathbf {E} \right] + \mathbf {E}_{\text{pos}}, \quad \mathbf {E} \in \mathbb {R}^{(P^2 \cdot C) \times D}, \mathbf {E}_{\text{pos}} \in \mathbb {R}^{(N+1) \times D} \\ \mathbf {z}'_\ell &= \text{MSA}\left (\text{LN}(\mathbf {z}_{\ell-1}) \right) + \mathbf {z}_{\ell-1}, \quad \ell = 1 \dots L \\ \mathbf {z}_\ell &= \text{MLP}\left (\text{LN}(\mathbf {z}'_\ell) \right) + \mathbf {z}'_\ell, \quad \ell = 1 \dots L \\ \mathbf {y} &= \text{LN}(\mathbf {z}_L^0) \end {align*}
  • 输入预处理与嵌入层

    • ViT 的输入构建阶段,完成「分 Patch → 线性投影 → 加分类头 → 加位置编码」的全流程
    • 例如:输入 224×224×3224 \times 224 \times 3 图像,P=16P=16,则 N=224×22416×16=196N = \frac {224 \times 224}{16 \times 16} = 196,D=768D=768,最终 z0\mathbf {z}_0 形状为 (197,768)(197, 768)(196 个 Patch + 1 个cls token)
    符号含义细节说明
    xpi\mathbf {x}_p^i第 ii 个图像 Patch原始图像尺寸 H×W×CH \times W \times C,切分为 N=H⋅WP2N = \frac {H \cdot W}{P^2} 个 P×P×CP \times P \times C 的 Patch,展平后为 P2⋅CP^2 \cdot C 维向量(例:P=16,C=3P=16,C=3 时为 768768 维)
    E\mathbf {E}Token Embedding 矩阵可学习参数,形状 (P2⋅C)×D(P^2 \cdot C) \times D,作用是将 Patch 从像素空间线性投影到 DD 维模型隐空间(例:D=768D=768,即 BERT-base 维度)
    xclass\mathbf {x}_{\text{class}}分类头(cls token)额外添加的可学习向量,形状 1×D1 \times D,类比 BERT 的 cls token,最终用它的输出做分类
    Epos\mathbf {E}_{\text{pos}}1-D 可学习位置编码形状 (N+1)×D(N+1) \times D,为每个 Patch token + cls token 注入空间位置信息,ViT 默认采用可学习式 1-D 绝对位置编码
    z0\mathbf {z}_0ViT 的最终输入形状 (N+1)×D(N+1) \times D,由「cls token + 所有 Patch 的投影向量」拼接后,加上位置编码得到
  • 多头自注意力(MSA)层 + 残差连接

    符号含义细节说明
    LN(⋅)\text{LN}(\cdot)Layer Normalization(层归一化)对输入做归一化,稳定训练,ViT 采用 Pre-LN 结构(先归一化再进注意力 / MLP,区别于原始 Transformer 的 Post-LN)
    MSA(⋅)\text{MSA}(\cdot)Multi-Head Self-Attention(多头自注意力)将 DD 维特征拆分为 hh 个独立头(例:h=12h=12,每头 6464 维),并行计算注意力后拼接,捕捉不同子空间的依赖关系
    zℓ−1\mathbf {z}_{\ell-1}上一层的输出第 ℓ−1\ell-1 层 Encoder 的输出,作为当前层的输入
    ++残差连接(Residual Connection)将 MSA 的输出与输入直接相加,缓解深层网络的梯度消失问题
    zℓ′\mathbf {z}'_\ellMSA 子层的输出形状与输入一致 (N+1)×D(N+1) \times D,进入下一个 MLP 子层
    LLEncoder 层数ViT-B/16 为 12 层,ViT-L/16 为 24 层
  • 多层感知机(MLP)层 + 残差连接

    符号含义细节说明
    MLP(⋅)\text{MLP}(\cdot)多层感知机结构为「线性层 → GELU 激活 → Dropout → 线性层」,中间层维度通常为 4D4D(例:D=768D=768 时中间层为 30723072 维),用于特征的非线性变换
    LN(⋅)\text{LN}(\cdot)层归一化同样采用 Pre-LN 结构,先归一化再进 MLP
    zℓ′\mathbf {z}'_\ell上一个 MSA 子层的输出作为 MLP 子层的输入
    ++残差连接将 MLP 的输出与输入相加,进一步稳定梯度
    zℓ\mathbf {z}_\ell第 ℓ\ell 层 Encoder 的最终输出形状 (N+1)×D(N+1) \times D,作为下一层 Encoder 的输入(ℓ<L\ell < L 时),或最终层输出(ℓ=L\ell = L 时)
  • 分类输出层:ViT 的最终预测阶段,用cls token 完成分类任务

    符号含义细节说明
    zL0\mathbf {z}_L^0第 LL 层 Encoder 输出中,cls token 对应的向量取 zL\mathbf {z}_L 的第 0 个元素(形状 1×D1 \times D),聚合了全局图像特征
    LN(⋅)\text{LN}(\cdot)层归一化对cls token 做最终归一化
    y\mathbf {y}模型最终输出后续接一个线性分类层(公式中省略),将 DD 维特征映射为类别数维度,得到分类概率
  • 分类头是「LN(zL0)⋅Wcls+bcls\text{LN}(\mathbf {z}_L^0) \cdot \mathbf {W}_{\text{cls}} + \mathbf {b}_{\text{cls}}」,Wcls\mathbf {W}_{\text{cls}} 为分类权重矩阵

微调

  • 预训练完成的 ViT 是一个强大的特征提取器,其输出的特征可用于各类下游任务,例如更丰富的分类任务、目标检测等

  • 在执行这些任务时,会向预训练模型输入新数据,同时尽可能保留模型主体架构不变(例如冻结 ViT 整体参数,仅在输出层后新增模型,训练时仅更新新模型参数)

  • 这种既复用已有模型的特征提取能力,又让模型适配新任务的操作,称为微调(fine-tune)

  • 在微调时,输入图像的尺寸往往与预训练阶段不一致:

    • 预训练阶段:通常使用 224×224×3 大小的图像
    • 微调阶段:为提升效果,一般采用更高分辨率的图像,例如 1024×1024×3
  • 若保持 Patch 尺寸 P=16P=16 不变:

    • 预训练阶段的 Patch 数量:224×224162=196\frac {224 \times 224}{16^2} = 196
    • 微调阶段的 Patch 数量:1024×1024162=4096\frac {1024 \times 1024}{16^2} = 4096​
  • Transformer 主体架构理论上可处理任意长度的输入序列,但可学习(learnable)位置编码与输入序列长度强绑定(一个位置对应一条独立的位置编码),无法直接适配变长输入

  • 针对新增 Patch 的位置编码初始化问题:

    • 若统一赋值为 0 向量,再在微调中训练,虽可实现,但会增加计算量,且浪费预训练阶段学到的位置信息
    • 更优方案:充分利用已有位置编码的先验信息,对预训练阶段的位置编码做 2D 插值处理,完成新位置编码的初始化,再在微调中进行适配性更新
  • 2D 插值的过程

    • 插值分为 3 个核心步骤:

      • Reshape 还原 2D 结构

      • 将预训练阶段的 1D 位置编码(形状 (spretrain,D)(s_{\text{pretrain}}, D),DD 为隐维度),还原为 2D 特征图:

        (196,768)→(14,14,768)(196, 768) \rightarrow (14, 14, 768)
      • 对应公式中的 spretrain×spretrain\sqrt {s_{\text{pretrain}}} \times \sqrt {s_{\text{pretrain}}} 空间结构

      • 2D 插值扩展尺寸

      • 对 2D 特征图执行双三次插值(bicubic),将空间尺寸从 spretrain\sqrt {s_{\text{pretrain}}} 扩展到 sfinetune\sqrt {s_{\text{finetune}}}:

        (14,14,768)→(64,64,768)(14, 14, 768) \rightarrow (64, 64, 768)
      • 插值过程中保持特征维度 DD 不变,仅对空间维度做缩放

      • Reshape 还原 1D 序列

      • 将插值后的 2D 特征图重新展平为 1D 位置编码,适配微调阶段的长序列输入:

        (64,64,768)→(4096,768)(64, 64, 768) \rightarrow (4096, 768)
    • 代码实现

      new_pos_embedding_img = nn.functional.interpolate(
          pos_embedding_img,
          size=new_seq_length_1d,
          mode=interpolation_mode,
          align_corners=True
      )
    • 参数说明

      参数含义ViT 实践细节
      pos_embedding_img输入的预训练位置编码(已 reshape 为 2D 格式)形状为 (batch, hidden_dim, h_pretrain, w_pretrain),PyTorch 插值默认以最后两维为空间维度
      size目标空间尺寸对应微调阶段的 sfinetune\sqrt {s_{\text{finetune}}},如 64×64
      mode插值方法ViT 论文默认采用 bicubic(双三次插值),相比线性插值能更好保留局部细节
      align_corners=True角点对齐固定原矩阵的四个角点位置不变,仅对中间区域做插值,保证空间位置的一致性(如图中白色圆圈为原始点,蓝色点为插值后点)
    • cls token 位置编码:分类头 cls token 的位置编码不参与插值,直接保留预训练值,仅对图像 Patch 对应的位置编码做 2D 插值

    • 插值方法选择:除 bicubic 外,也可根据任务选择 bilinear(双线性)、nearest(最近邻)等,bicubic 在图像任务中通常效果最优

    • 微调阶段更新:插值后的位置编码会作为初始化参数,在微调过程中继续参与梯度更新,适配新分辨率的空间分布

与 CNN 的对比

  • 实际实验结果表明,ViT 在准确率上早期不如卷积网络,这主要是由于卷积神经网络的归纳偏置(inductive biases)

  • 归纳偏置可以简单理解为一种先验假设或领域先验知识,有了这些先验,才能判断哪种模型更适合某类任务。不同任务的归纳偏置内容不同,对图像任务而言,核心有两点:

    • 空间局部性(locality):假设图像中相邻区域的特征高度相关,比如太阳和天空常常一起出现,邻近像素语义相似
    • 平移等变性(translation equivariance):满足 f(g(x))=g(f(x))f (g (x)) = g (f (x)),其中 ff 为卷积,gg​ 为平移;物体在图中移动后,卷积核仍能以相同方式提取特征;无论物体出现在哪里,只要局部模式一致,卷积输出就一致
  • 在这两种先验下,CNN 成为图像任务的主流方案,卷积核天然保持空间局部性与平移等变性,能在训练中最大程度学习并保留图像结构信息

  • 反观 ViT,它在这两种先验的保持上不如 CNN:

    • 同一物体被切分成不同 patch 后,在序列中距离变远,即使 Attention 能学习关联,空间局部性的保持也弱于直接用卷积框选局部区域
    • 在平移等变性上,ViT 依赖学习得到的位置编码,同一个 patch 移动位置后对应的编码不同,输出也会变化,因此架构本身没有天然维护平移等变性
  • 但这并不代表 ViT 没有优势,Transformer 系列有一个标志性特点:大力出奇迹

  • 只要数据量足够大,模型就能充分学习 patch 之间的关联,从而弥补归纳偏置的不足

CLIP

基本思想

  • 所谓多模态,就是指来自不同领域的输入数据,比如文字、图片、语音、视频等,在传统方法中,各个领域都有相对独立的经典处理算法:

    • 处理文本:RNN、LSTM、Transformer 等
    • 处理图像:各类卷积神经网络等
  • 不同模态的建模方式相对独立,但现实场景中常常需要跨模态联合建模,例如:

    • 输入一张图片,输出对应的描述文字(图像 caption)
    • 输入一段文字,生成符合描述的图片(文生图)
  • 实现这类任务的核心难点在于:不同模态数据的特征分布、信息结构差异巨大

  • 因此,多模态模型的总体目标就是训练一个统一模型,既能对齐不同模态的特征空间,又能让不同模态的特征之间学到语义相关性

  • ViT 的缺陷

    • 在使用 ViT 做传统图像分类时,训练过程是有监督、带标签的
    • 每张训练数据以 <image, label> 形式输入,最终通过 MLP Head 输出的向量完成图片类别预测
    • 这种设计存在两个明显缺点:
      • 缺点 1:遇到训练集中从未见过的新类别时,模型无法正确预测。例如训练数据只有动物,测试时输入汽车图片,模型会完全失效
      • 缺点 2:当输入数据出现分布偏移(distribution shift)时,模型性能会大幅下降。比如训练用普通动物照片,测试用毕加索风格的动物画作,就属于典型的分布偏移
    • 传统解决思路是微调,但多模态模型希望做到一步到位,即不做任何微调,直接实现零样本(zero-shot)图像分类
  • CLIP(Contrastive Language-Image Pre-training)是 OpenAI 提出的双塔结构多模态模型,核心是通过对比学习实现图像 - 文本的跨模态语义对齐,从而支持零样本(zero-shot)图像分类

  • 模型结构

CLIP

  • CLIP 由两个独立的编码器组成,分别处理图像和文本两种模态:

    • 图像编码器(Image Encoder):可以用 ResNet 或 ViT(论文中两种都做了实验,ViT 效果更优),负责将输入图像编码为固定维度的图像特征向量 IiI_i
    • 文本编码器(Text Encoder):采用 Transformer 结构(类似 BERT),负责将输入文本编码为固定维度的文本特征向量 TjT_j
  • 两个编码器输出的特征维度完全一致,确保可以在同一个语义空间中计算相似度

  • 阶段一:对比预训练(Contrastive Pre-training)

    • CLIP 最核心的训练阶段,目标是让匹配的图像 - 文本对特征相似度高,不匹配的对相似度低

    • 训练数据:用海量(4 亿对)弱对齐的 <图像, 文本描述> 数据对,无需人工标注分类标签

    • 计算流程

      • 输入一个 batch 包含 NN 对 <图像, 文本>,分别通过两个编码器,得到 NN 个图像特征 {I1,I2,...,IN}\{I_1, I_2, ..., I_N\} 和 NN 个文本特征 {T1,T2,...,TN}\{T_1, T_2, ..., T_N\}
      • 计算所有图像 - 文本对的余弦相似度,得到一个 N×NN \times N 的相似度矩阵:
        • 对角线元素(Ii⋅TiI_i \cdot T_i):正样本对(图像和对应文本匹配)
        • 非对角线元素(Ii⋅Tj,i≠jI_i \cdot T_j, i \neq j):负样本对(图像和其他文本不匹配)
      • 损失函数:对称交叉熵损失,同时优化两个方向:
        • 图像到文本的分类:让每个图像特征正确匹配到对应的文本特征
        • 文本到图像的分类:让每个文本特征正确匹配到对应的图像特征
    • 通过这个训练,CLIP 会学到一个统一的跨模态语义空间:语义相似的图像和文本,在这个空间里的特征会被拉得很近

  • 阶段二:零样本分类的推理流程

    • 预训练完成后,CLIP 无需任何微调,就能直接完成零样本图像分类,分为两步:

    • 用标签文本生成分类器

      • 针对目标数据集的类别标签(如 plane, car, dog, bird),用 prompt 模板(论文中用 A photo of a {object}.)将标签转化为自然语言描述
      • 将这些描述文本输入文本编码器,得到每个类别对应的文本特征向量 {T1,T2,...,TN}\{T_1, T_2, ..., T_N\},这些特征就构成了零样本分类器
    • 零样本预测

      • 输入一张待分类的测试图像,通过图像编码器得到图像特征 I1I_1
      • 计算 I1I_1 与所有类别文本特征的余弦相似度,相似度最高的类别,就是模型预测的结果
      • 例:输入狗的图片,I1I_1​ 与 A photo of a dog. 的文本特征相似度最高,模型就输出 dog 类别
  • Prompt 工程:CLIP 的零样本效果高度依赖 prompt 设计,好的 prompt 能显著提升分类准确率,这也是后续多模态模型的核心优化方向

  • 编码器选择:CLIP 图像编码器支持 ResNet 和 ViT,其中 ViT 版本(如 ViT-L/14)在大模型规模下效果远优于 ResNet,也是后续多模态模型的主流选择

数据集

  • CLIP 的训练数据为 <图像,文本> 配对(pair),在一个训练 batch 中,包含若干张图像,每张图像都对应一条文本描述(prompt),例如:小狗的图像,对应 prompt <dog> 或 A photo of a dog
  • CLIP 作者通过实验发现,prompt 的设计会显著影响模型的最终性能,典型案例如下:
    • 通用图像分类:将 prompt 从单词 <dog> 改为完整句子 A photo of a dog,模型在 ImageNet 分类任务上的准确率直接提升 1.3%
    • OCR 识别任务:将待识别的文字、数字用引号包裹,能大幅提升识别效果
    • 卫星图像分类:将 prompt 替换为 A satellite photo of a house,更贴合数据场景,分类效果显著优化
    • 多语义歧义场景:针对 crane 这类多义词(可表示 “仙鹤” 或 “起重机”),通过 prompt 补充语义约束,如 A photo of a crane, a type of pet,可有效消除歧义,提升分类准确性
  • CLIP 没有使用前人构建的图像 - 文本数据集,原因在于:
    • 现有数据集质量参差不齐
    • 数据规模远不足以支撑大模型训练
  • 因此,CLIP 团队构建了一个包含 4 亿对 <图像,文本> 的大规模数据集,制作流程如下:
    • 从 Wikipedia 中提取出现次数 ≥ 100 的词,构建查询词列表(query list)
    • 为列表中的每个查询词,匹配约 2 万条 <图像,文本> 配对,最终形成 4 亿级的大规模训练数据集

预训练

  • CLIP 模型由两大核心模块组成:Text Encoder 和 Image Encoder,它们分别是文本与图像的特征提取器

  • Text Encoder

    • CLIP 的 Text Encoder 直接借鉴了 OpenAI 在 2019 年提出的 GPT2 模型架构,采用 Transformer 解码器结构作为核心,专门处理自然语言文本的特征提取
    • 在文本预处理阶段,模型会对输入的每一条文本提示词(prompt)进行标准化处理:在文本序列的起始位置添加特殊符号[SOS](Start of Sequence,序列开始),在末尾位置添加[EOS](End of Sequence,序列结束),以此标识文本的完整范围,帮助编码器明确文本边界
    • 文本序列经 GPT2 架构的多层 Transformer 编码后,CLIP 选取最后一层 Transformer 输出中 [EOS] 位置对应的特征向量,作为该条文本的最终全局特征表示,记为 TiT_i,每一条独立的 prompt 都会对应唯一的文本特征向量 TiT_i
  • Image Encoder

    • CLIP 的 Image Encoder 并未直接沿用单一架构,而是在研究阶段做了大量对比实验
    • 先后测试了 5 种不同深度的 ResNet 架构和 3 种不同规格的 ViT 架构,最终选定性能最优的 ViT-L/14@336px 作为正式的图像编码器
    • 该编码器的核心参数定义为:ViT 的模型规模为 Large(大容量版本),图像分块大小 patch_size=14,即把输入图像划分为 14×14 的像素块进行 Transformer 编码
    • 同时,在 CLIP 完成全部预训练流程后,研究团队额外使用 336×336 高分辨率图像对该图像编码器进行了 1 个 epoch 的微调(fine-tune),通过提升输入图像的细节信息,进一步激发模型的跨模态理解能力,让图像特征表达更精准
    • 与文本编码器的输出逻辑一致,每张输入图像经过 ViT 编码后,都会生成一个对应的全局特征向量,记为 IiI_i,虽然原论文中未明确标注 IiI_i​ 的具体提取层位置,但从 Transformer 视觉模型的通用设计逻辑推断,该特征向量大概率取自 ViT 的[CLS]分类标记位(与文本编码器取 [EOS] 向量的设计思路同源,均取模态序列的全局聚合特征)
  • 批次数据与基础特征输出

    • 假设模型训练时一个批次(batch)中包含 N 组一一对应的 <图像,文本> 配对数据,即第 1 张图像对应第 1 条文本、第 2 张图像对应第 2 条文本…… 第 N 张图像对应第 N 条文本
    • 这 N 组数据分别通过 Image Encoder 和 Text Encoder 后,会输出两组基础特征序列:
      • 文本基础特征序列:[T1,T2,...,TN][T_1, T_2, ..., T_N],维度为 [N,dt][N, d_t](dtd_t 为文本编码器输出特征维度)
      • 图像基础特征序列:[I1,I2,...,IN][I_1, I_2, ..., I_N],维度为 [N,di][N, d_i](did_i​为图像编码器输出特征维度)
  • 多模态 Embedding 特征投影

    • 由于文本、图像的基础特征分属不同模态空间,无法直接计算相似度,因此 CLIP 引入了可学习的多模态投影层,将两种特征映射到统一的跨模态特征空间中:

      • 为文本特征设置可学习投影矩阵 WtW_t(维度 [dt,de][d_t, d_e],ded_e 为统一的跨模态特征维度)
      • 为图像特征设置可学习投影矩阵 WiW_i(维度 [di,de][d_i, d_e])
    • 文本、图像基础特征分别与对应投影矩阵做矩阵乘法后,再进行 L2 归一化处理,得到最终的跨模态对齐特征:

      • 文本跨模态特征:Te=l2normalize(Tf⋅Wt)T_e = l2_normalize (T_f \cdot W_t),维度 [N,de][N, d_e]
      • 图像跨模态特征:Ie=l2normalize(If⋅Wi)I_e = l2_normalize (I_f \cdot W_i),维度 [N,de][N, d_e]
    • 这一步的核心作用是消除不同模态特征的维度差异与数值量级差异,让文本、图像特征处于同一度量空间,保证相似度计算的合理性

  • 跨模态相似度计算

    • 完成特征投影后,通过向量点积计算图像特征与文本特征之间的余弦相似度,构建 N×N 的相似度矩阵(logits 矩阵):

      logits=(Ie⋅TeT)×etlogits = (I_e \cdot T_e^T) \times e^t
    • Ie⋅TeTI_e \cdot T_e^T 为图像特征与文本特征的点积,直接反映两两之间的余弦相似度,生成维度为 [N,N][N, N] 的基础相似度矩阵

    • tt​ 为模型可学习的温度参数,通过指数缩放调整相似度数值分布,避免相似度值过于集中或分散,提升训练稳定性

  • 损失函数

    • CLIP 的损失函数采用双向对称交叉熵设计,同时从 “图像检索文本” 和 “文本检索图像” 两个方向优化模型,具体分为两步计算后取平均:

    • 按行计算图像→文本检索损失(loss_i)

      • 以每一行为单位做 softmax 归一化,再计算交叉熵损失,真值为每行的对角线位置
      • 该损失的物理意义:对于每一张输入图像,强制模型在当前批次的所有文本中,匹配出与其唯一对应的正确文本,最大化图像检索对应文本的准确率
    • 按列计算文本→图像检索损失(loss_t)

      • 以每一列为单位做 softmax 归一化,再计算交叉熵损失,真值为每列的对角线位置
      • 该损失的物理意义:对于每一段输入文本,强制模型在当前批次的所有图像中,匹配出与其唯一对应的正确图像,最大化文本检索对应图像的准确率
    • 将两个方向的损失相加后取平均值,得到最终训练损失:

      loss=lossi+losst2loss = \frac {loss_i + loss_t}{2}

缺陷

  • 零样本性能并非顶尖,规模化提升成本极高
    • CLIP 零样本在 ImageNet 达 76.2%,与有监督 ResNet50 相当,但远低于 MAE 等 SOTA 模型的 80%+ 精度
    • 虽随模型增大性能会提升,但训练成本高昂,小幅精度提升需付出巨大代价
  • 缺乏逻辑推理能力,难以处理抽象任务
    • 无法完成物体计数、复杂纹理分类等需逻辑推理的抽象任务,在 DTD 纹理分类、CLEVRCountS 计数数据集上表现显著弱于 ResNet
  • 对分布严重偏移的测试集泛化失效
    • 零样本鲁棒性存在局限,当测试数据与训练集分布差异极大时效果不佳,如简单的 MNIST 手写数字识别仅 88% 准确率,远低于常规模型水平
  • 文本标签为闭集,不支持开放式预测
    • 零样本推理只能从预设的固定标签集合中选择匹配结果,无法自主生成全新的文本标签,自动化与开放泛化能力不足
  • 不具备生成能力,仅为判别式多模态模型
    • 受计算与架构设计限制,CLIP 只能实现图像 - 文本匹配判别,无法完成文本生成图像、图像生成文本等生成式任务,该缺陷后续被 DALL・E 2、Stable Diffusion 等模型弥补

BLIP

  • BLIP (Bootstrapping Language-Image Pretraining) 是 salesforce 在 2022 年提出的多模态框架

VLM

主流 VLM 架构

这篇文档有帮助吗?

On this page

页面信息