第三章:主流模型架构解析

第三章:主流模型架构解析

在前两章中,我们从宏观层面了解了多模态学习的概念和核心技术原理。从本章开始,我们将深入分析几个代表性的多模态大模型,理解它们的架构设计、训练方法和能力特点。

这些模型的出现标志着多模态AI发展的重要里程碑:CLIP证明了图文可以统一理解,GPT-4V展示了视觉理解的新高度,Gemini则开创了原生多模态的新范式。通过学习这些模型的架构和原理,你将对多模态大模型的技术演进有更深入的理解。

3.1 CLIP:连接视觉与语言的里程碑

为什么需要CLIP?

在CLIP出现之前,计算机视觉(CV)和自然语言处理(NLP)是两个相对独立的研究领域。图像分类模型只能识别它在训练时见过的类别,文本模型只能处理文字信息。两者之间缺乏一座能够相互理解、相互翻译的"桥梁"。

注释:用"语言障碍"来类比。想象一个有翻译困难的世界:

  • 只会说中文的人看不懂英文文章
  • 只会说英文的人听不懂中文播报
  • 两种语言之间没有对照字典,也没有自动翻译系统

这就是CLIP出现之前CV和NLP的关系——图像模型和文本模型各自为政,无法相互理解。CLIP的诞生就是为了打破这种障碍,建立视觉和语言之间的对应关系。

传统视觉模型的局限

假设你训练了一个能识别1000种动物的图像分类模型。这个模型很强大,但有两个致命的局限:

注释:第一个局限是类别封闭。如果测试时出现训练数据中没有的动物(比如"穿山甲"),模型就会完全无法识别,只能从它已知的1000个类别中选一个最接近的,答案是错误的。

注释:第二个局限是语义单一。模型只能输出"这是猫"这样的类别标签,无法理解更丰富的语义。比如给模型看一张"一只橘猫坐在窗台上看着雨"的图片,模型只能告诉你"猫",而无法理解"猫在窗台上看雨"这个更丰富的场景。

CLIP的突破

CLIP(Contrastive Language-Image Pre-training)的核心思想是:与其让模型预测固定的类别标签,不如让模型学习图像和文本描述之间的对应关系。

注释:这个思想转变的意义非常重大。想象你要教一个孩子认识动物:

  • 传统方法:你给他看很多标记了"猫"、"狗"标签的照片,让他记住每种动物长什么样
  • CLIP方法:你给他看很多配有文字描述的照片,让他理解"什么样的画面对应什么样的文字描述"

第二种方法的优势是:孩子学会的是"图文对应"这种通用的能力,而不仅仅是记住几个特定的类别。当遇到他没见过的动物时,只要给他一个文字描述,他就能识别出对应的动物。

CLIP的架构设计

CLIP的架构设计简洁而优雅,它由两个主要组件组成:视觉编码器文本编码器

双编码器架构详细图

┌─────────────────────────────────────────────────────────────────────────────┐
│                         CLIP双编码器架构详解                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                          图像输入层                                    │  │
│  │                    🖼️ 输入图像 (224×224×3)                            │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                   │                                          │
│                                   ▼                                          │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                    视觉编码器 (Vision Encoder)                         │  │
│  │                                                                       │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  图像分块 (Patch Partition)                                      │ │  │
│  │  │  224×224×3 → 16×16×3 patches (14×14=196个)                       │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  线性投影 (Linear Projection)                                    │ │  │
│  │  │  Patch Embedding + Position Embedding                            │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  Vision Transformer (ViT)                                        │ │  │
│  │  │  12层Transformer Encoder                                         │ │  │
│  │  │  [CLS] token输出作為图像全局特征                                  │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                   │                                          │
│                                   ▼                                          │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                      视觉特征向量                                      │  │
│  │                I_emb ∈ ℝ^(batch_size × d)                            │  │
│  │                (d = 512 或 768)                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ══════════════════════════════════════════════════════════════════════════  │
│                                                                              │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                          文本输入层                                    │  │
│  │              📝 输入文本 "a photo of a cat"                           │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                   │                                          │
│                                   ▼                                          │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                    文本编码器 (Text Encoder)                           │  │
│  │                                                                       │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  分词 (Tokenization)                                             │ │  │
│  │  │  "a photo of a cat" → [a, photo, of, a, cat, <EOS>]            │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  词嵌入 (Word Embedding)                                         │ │  │
│  │  │  Token → Vector (d=512)                                         │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  Transformer Encoder (12层)                                      │ │  │
│  │  │  [CLS] token输出作為文本全局特征                                  │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                   │                                          │
│                                   ▼                                          │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                      文本特征向量                                      │  │
│  │                T_emb ∈ ℝ^(batch_size × d)                            │  │
│  │                (d = 512 或 768)                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
│  ══════════════════════════════════════════════════════════════════════════  │
│                                                                              │
│                                   │                                          │
│                    ┌──────────────┴──────────────┐                           │
│                    ▼                              ▼                          │
│  ┌────────────────────────────┐  ┌────────────────────────────┐             │
│  │   视觉投影层 (Projection)  │  │   文本投影层 (Projection)   │             │
│  │   W_v ∈ ℝ^(d × d)          │  │   W_t ∈ ℝ^(d × d)          │             │
│  └─────────────┬──────────────┘  └─────────────┬──────────────┘             │
│                │                                 │                            │
│                ▼                                 ▼                            │
│  ┌────────────────────────────┐  ┌────────────────────────────┐             │
│  │   视觉嵌入向量             │  │   文本嵌入向量              │             │
│  │   I_final ∈ ℝ^(d)         │  │   T_final ∈ ℝ^(d)          │             │
│  └─────────────┬──────────────┘  └─────────────┬──────────────┘             │
│                │                                 │                            │
│                └──────────────┬──────────────┘                           │
│                               ▼                                             │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                      统一特征空间                                       │  │
│  │                                                                       │  │
│  │              I_final · T_final = 余弦相似度                            │  │
│  │                                                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                               │                                              │
│                               ▼                                              │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                      对比学习目标                                      │  │
│  │                                                                       │  │
│  │              正样本:匹配的图文对 → 高相似度                           │  │
│  │              负样本:不匹配的图文对 → 低相似度                         │  │
│  │                                                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

视觉编码器

CLIP使用Vision Transformer(ViT)ResNet作为视觉编码器。ViT是目前更常用的选择,因为它与Transformer架构更契合。

注释:视觉编码器的工作流程:

  1. 图像分块:把输入图像切成固定大小的patch(如16×16像素)
  2. 线性投影:把每个patch展平并通过线性层转换为向量
  3. 加入位置编码:添加每个patch的位置信息
  4. Transformer处理:输入Transformer编码器进行特征提取
  5. 输出:通常是[CLS]标记对应的输出,或者所有patch输出的平均值

文本编码器

CLIP使用Transformer编码器作为文本编码器,与GPT等语言模型使用的是同一种架构(只是只用了编码器部分)。

注释:文本编码器的工作流程:

  1. 分词:把输入文本切成子词(subword)单元
  2. 嵌入:把每个子词转换为向量表示
  3. 位置编码:添加位置信息
  4. Transformer处理:输入Transformer编码器进行特征提取
  5. 输出:通常使用[CLS]标记对应的输出作为整个文本的特征

投影到统一空间

为了让图像和文本能够在同一个空间中进行比较,CLIP在两个编码器的输出之后各加了一个线性投影层,把视觉特征和文本特征都投影到同一个维度的空间(如512维或768维)。

注释:投影操作是简单的线性变换:y = Wx + b,其中W是投影矩阵,b是偏置向量。训练过程中,投影矩阵的参数也会被优化,让投影后的向量更适合进行对比学习。

CLIP PyTorch实现

import torch
import torch.nn as nn
import torch.nn.functional as F
from transformers import ViTModel, BertModel
from collections import OrderedDict


class CLIPVisionEncoder(nn.Module):
    """CLIP视觉编码器"""

    def __init__(self, model_name="google/vit-base-patch16-224", embed_dim=512):
        super().__init__()
        self.vit = ViTModel.from_pretrained(model_name)
        self.projection = nn.Linear(self.vit.config.hidden_size, embed_dim)

    def forward(self, images):
        """
        参数:
            images: [batch_size, 3, 224, 224]

        返回:
            image_features: [batch_size, embed_dim]
        """
        # 获取ViT输出
        outputs = self.vit(images)
        # 使用[CLS]token的输出
        image_embeds = outputs.last_hidden_state[:, 0, :]
        # 投影到统一空间
        image_features = self.projection(image_embeds)
        # L2归一化
        image_features = F.normalize(image_features, dim=-1)

        return image_features


class CLIPTextEncoder(nn.Module):
    """CLIP文本编码器"""

    def __init__(self, model_name="bert-base-uncased", embed_dim=512):
        super().__init__()
        self.bert = BertModel.from_pretrained(model_name)
        self.projection = nn.Linear(self.bert.config.hidden_size, embed_dim)

    def forward(self, input_ids, attention_mask=None):
        """
        参数:
            input_ids: [batch_size, seq_len]
            attention_mask: [batch_size, seq_len]

        返回:
            text_features: [batch_size, embed_dim]
        """
        # 获取BERT输出
        outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        # 使用[CLS]token的输出
        text_embeds = outputs.last_hidden_state[:, 0, :]
        # 投影到统一空间
        text_features = self.projection(text_embeds)
        # L2归一化
        text_features = F.normalize(text_features, dim=-1)

        return text_features


class CLIPModel(nn.Module):
    """完整的CLIP模型"""

    def __init__(self, embed_dim=512, temperature=0.07):
        super().__init__()
        self.vision_encoder = CLIPVisionEncoder(embed_dim=embed_dim)
        self.text_encoder = CLIPTextEncoder(embed_dim=embed_dim)
        self.temperature = nn.Parameter(torch.tensor(torch.log(1 / temperature)))

    def forward(self, images, input_ids, attention_mask=None):
        """
        前向传播

        参数:
            images: [batch_size, 3, 224, 224]
            input_ids: [batch_size, seq_len]
            attention_mask: [batch_size, seq_len]

        返回:
            image_features: [batch_size, embed_dim]
            text_features: [batch_size, embed_dim]
            logits: [batch_size, batch_size]
        """
        # 获取图像和文本特征
        image_features = self.vision_encoder(images)
        text_features = self.text_encoder(input_ids, attention_mask)

        # 计算相似度矩阵
        logits = torch.matmul(image_features, text_features.t()) * self.temperature.exp()

        return image_features, text_features, logits

    def compute_loss(self, image_features, text_features, logits):
        """
        计算对比学习损失

        参数:
            image_features: [batch_size, embed_dim]
            text_features: [batch_size, embed_dim]
            logits: [batch_size, batch_size]

        返回:
            loss: 对比学习损失
        """
        # 创建标签(对角线为正样本)
        labels = torch.arange(image_features.size(0), device=image_features.device)

        # 计算交叉熵损失
        loss = F.cross_entropy(logits, labels)

        # 计算准确率
        predictions = logits.argmax(dim=1)
        accuracy = (predictions == labels).float().mean()

        return loss, accuracy.item()


# 使用示例
if __name__ == "__main__":
    # 创建模型
    clip = CLIPModel(embed_dim=512)

    # 模拟数据
    batch_size = 4
    images = torch.randn(batch_size, 3, 224, 224)
    input_ids = torch.randint(0, 1000, (batch_size, 32))
    attention_mask = torch.ones(batch_size, 32)

    # 前向传播
    image_features, text_features, logits = clip(images, input_ids, attention_mask)

    print(f"图像特征形状: {image_features.shape}")
    print(f"文本特征形状: {text_features.shape}")
    print(f"相似度矩阵形状: {logits.shape}")

    # 计算损失
    loss, accuracy = clip.compute_loss(image_features, text_features, logits)
    print(f"对比学习损失: {loss.item():.4f}")
    print(f"图文匹配准确率: {accuracy:.2%}")
    print("CLIP模型测试通过!")

代码详解

  • CLIPVisionEncoder类:基于ViT的视觉编码器,包含投影层和L2归一化
  • CLIPTextEncoder类:基于BERT的文本编码器,包含投影层和L2归一化
  • CLIPModel类:完整的CLIP模型,整合视觉和文本编码器
  • temperature参数:可学习的温度参数,用于控制相似度分布的锐利程度

CLIP的训练方法

CLIP的训练方法是大规模对比预训练,这是它能够学会图文对应能力的关键。

训练数据

CLIP的训练数据是从互联网上收集的4亿个图文对(image-text pairs)。这些数据来自各种来源:

  • 搜索引擎的结果(用户搜索词和对应的图片)
  • 社交媒体的图片配文
  • 电商平台的商品图片和描述
  • 图片版权网站的标题和描述
  • 各种带有文字说明的图片

注释:这4亿个图文对的特点是:

  • 规模巨大:4亿个样本,远超大多数视觉数据集
  • 来源多样:涵盖各种主题、风格、质量
  • 自然配对:文字描述是自然产生的,不是人工标注的固定类别标签
  • 噪声存在:由于是从互联网收集,配对质量参差不齐(有些图片和文字可能不太相关)

CLIP训练流程图

┌─────────────────────────────────────────────────────────────────────────────┐
│                         CLIP大规模对比预训练流程                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        数据准备阶段                                    │  │
│  │                                                                       │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐                   │  │
│  │  │  4亿图文对   │  │  数据清洗    │  │  Batch划分  │                   │  │
│  │  │  原始数据    │──▶│  质量过滤   │──▶│  N个样本/批 │                   │  │
│  │  └─────────────┘  └─────────────┘  └─────────────┘                   │  │
│  │                                                                       │  │
│  └───────────────────────────────────────────────────────────────────────┘  │
│                                   │                                          │
│                                   ▼                                          │
│  ┌───────────────────────────────────────────────────────────────────────┐  │
│  │                        训练循环 (Epochs)                               │  │
│  │                                                                       │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  步骤1: 加载Batch (N个图文对)                                     │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  步骤2: 编码图文对                                                │ │  │
│  │  │                                                               │ │  │
│  │  │  图像 → ViT编码 → 视觉特征 I_i (i=1...N)                        │ │  │
│  │  │  文本 → BERT编码 → 文本特征 T_j (j=1...N)                        │ │  │
│  │  │                                                               │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  步骤3: 投影到统一空间 + 归一化                                   │ │  │
│  │  │                                                               │ │  │
│  │  │  I'_i = normalize(W_v * I_i)                                   │ │  │
│  │  │  T'_j = normalize(W_t * T_j)                                   │ │  │
│  │  │                                                               │ │  │
│  │  └─────────────────────────────────────────────────────────────────┘ │  │
│  │                                   │                                     │  │
│  │                                   ▼                                     │  │
│  │  ┌─────────────────────────────────────────────────────────────────┐ │  │
│  │  │  步骤4: 计算相似度矩阵                                           │ │  │
│  │  │                                                               │ │  │
│  │  │  S = I'_i · T'_j^T  (N×N矩阵)                                   │ │  │
│  │  │                                                               │ │  │
│  │  │         T'_1    T'_2    T

### CLIP的能力与应用

CLIP经过大规模对比预训练后,获得了几个非常重要的能力:

**Zero-shot图像分类**:

这是CLIP最令人惊叹的能力。CLIP不需要任何特定类别的训练样本,就能够进行图像分类。

**注释**:传统图像分类 vs CLIP的Zero-shot分类:

**传统方法**:
- 训练数据:标记了类别的图像(如ImageNet的1000类)
- 测试时:从固定的1000个类别中选一个
- 局限:只能识别训练过的类别

**CLIP Zero-shot方法**:
- 训练数据:4亿个图文对(没有特定类别标签)
- 测试时:生成候选类别的文字描述,计算相似度
- 优势:可以识别任何能描述出来的类别

**Zero-shot分类示例**:

假设要对一张图片进行分类,类别是"猫"、"狗"、"汽车"。

**注释**:CLIP的做法是:
1. 把类别名称转换为文本描述,如"a photo of a cat"、"a photo of a dog"、"a photo of a car"
2. 用文本编码器得到三个文本嵌入向量
3. 用视觉编码器得到图像的嵌入向量
4. 计算图像向量与三个文本向量的相似度
5. 选择相似度最高的类别作为答案

**CLIP的能力边界**:

需要注意的是,CLIP虽然强大,但也有它的局限性:

**注释**:CLIP的局限性包括:
1. **复杂场景表现有限**:对于需要复杂推理的场景,CLIP的表现可能不佳
2. **细粒度识别困难**:区分相似类别(如不同品种的狗)可能有困难
3. **文字识别能力有限**:虽然能理解图像中的文字,但不是它的强项
4. **分布偏移敏感**:对于与训练数据分布差异较大的图像,效果可能下降

### CLIP的深远影响

CLIP的发布对多模态AI领域产生了深远的影响:

**注释**:CLIP的影响可以从几个方面来看:

1. **证明了图文统一学习的可行性**:大规模对比学习确实能让模型学会图文对应
2. **开启了多模态预训练的新范式**:之后的多模态模型(如ALIGN、BLIP等)都借鉴了CLIP的思想
3. **推动了AIGC的发展**:CLIP的图文对齐能力是Stable Diffusion等文生图模型的关键组件
4. **启发了视频、音频等其他模态的学习**:类似的方法被扩展到视频-文本、音频-文本等任务

**本节小结**:

CLIP的核心贡献是:
- **双编码器架构**:视觉编码器 + 文本编码器,分别处理图像和文本
- **大规模对比学习**:用4亿个图文对进行对比预训练
- **统一特征空间**:让图像和文本能够在同一个空间中比较
- **Zero-shot能力**:无需特定类别训练样本即可进行图像分类

**思考题**:CLIP为什么需要那么大的训练数据规模?如果只用100万个图文对训练,结果会有什么不同?

---

## 3.2 GPT-4V:视觉理解的新高度

### 从GPT-4到GPT-4V

GPT-4是OpenAI在2023年发布的大语言模型,它在语言理解、生成、推理等方面达到了前所未有的高度。GPT-4V(GPT-4 with Vision)是GPT-4的视觉增强版本,增加了理解图像内容的能力。

**注释**:GPT-4V不是另起炉灶的新模型,而是在GPT-4的基础上"嫁接"了视觉理解能力。这种方法的优势是可以复用GPT-4强大的语言理解和生成能力,缺点是视觉和语言的融合可能不够自然。

**GPT-4和GPT-4V的能力对比**:

| 能力维度 | GPT-4 | GPT-4V |
|---------|-------|--------|
| 文本理解 | ★★★★★ | ★★★★★ |
| 文本生成 | ★★★★★ | ★★★★★ |
| 图像理解 | ★☆☆☆☆ | ★★★★★ |
| 图像生成 | ★☆☆☆☆ | ★☆☆☆☆ |
| 视觉推理 | 不支持 | ★★★★☆ |
| 多模态对话 | 不支持 | ★★★★★ |

**GPT-4V的架构设计**

关于GPT-4V的具体架构,OpenAI没有公开详细的论文或技术报告。我们只能根据公开信息推测其架构设计。

**推测的架构**:

基于已知信息和多模态模型的常见设计,GPT-4V很可能采用**"视觉编码器 + 语言模型"**的拼接式架构:

图像输入 文本输入 │ │ ▼ ▼ ┌────────────────┐ ┌────────────────┐ │ 视觉编码器 │ │ 词嵌入层 │ │ (可能是ViT变体) │ │ (Token Embed) │ └───────┬────────┘ └───────┬────────┘ │ │ ▼ │ 视觉特征 │ │ │ ▼ │ ┌────────────────┐ │ │ 投影/适配层 │ │ │ (Project/Adapt)│ │ └───────┬────────┘ │ │ │ └───────────┬────────────┘ │ ▼ ┌────────────────────┐ │ GPT-4 语言模型 │ │ (Transformer解码器) │ └──────────┬─────────┘ │ ▼ 文本输出


**注释**:这个架构的各个组件:

1. **视觉编码器**:负责"看懂"图像,可能使用ViT或类似架构
2. **投影/适配层**:把视觉特征转换为语言模型可以理解的格式
3. **GPT-4语言模型**:负责理解和生成文本,这是整个系统的"大脑"

**视觉编码器的设计选择**:

视觉编码器有几种可能的设计选择:

**选项一:独立ViT编码器**
- 使用一个独立的ViT处理图像
- 把图像patch的编码序列"插入"到文本token序列中
- 优点:ViT是成熟的技术,效果有保障
- 缺点:视觉和语言的交互较晚才开始

**选项二:视觉Transformer与语言模型联合训练**
- 使用一个端到端的架构,视觉和语言部分联合优化
- 类似于Flamingo、Kosmos-1等模型的设计
- 优点:视觉和语言可以更深度融合
- 缺点:训练复杂度更高

**选项三:CLIP-style预训练 + 语言模型微调**
- 先用CLIP-style方法预训练视觉编码器
- 然后与语言模型连接并进行端到端微调
- 优点:可以利用大规模图文数据
- 缺点:需要多阶段训练

**注释**:根据GPT-4V展现出的能力(特别是复杂的视觉推理能力),推测它可能采用了较为深度的视觉-语言融合设计,可能使用了交叉注意力机制让语言模型能够直接"关注"图像的不同区域。

### GPT-4V的核心能力

GPT-4V展现了多方面的视觉理解能力:

**图像描述与理解**:

GPT-4V能够详细描述图片中的内容,包括场景、物体、人物、动作等。

**注释**:示例对话:
- 用户:(发送一张城市天际线的照片)
- GPT-4V:这张照片展示了[城市名]的城市景观。前景是[某建筑],背景是[其他地标]。天气看起来是[晴天/阴天],时间是[白天/傍晚]。照片的构图...

**视觉问答(VQA)**:

GPT-4V能够回答关于图片的各种问题,从简单的事实识别到复杂的推理。

**注释**:问题类型包括:
- **事实性问题**:图中有几个人?他们在做什么?
- **比较性问题**:这张图和那张图有什么不同?
- **推理问题**:根据图中的线索,发生了什么事?
- **开放性问题**:你对这张图片有什么看法?

**文本识别(OCR)**:

GPT-4V能够识别图片中的文字,包括印刷体和手写体。

**注释**:应用场景:
- 识别商品包装上的文字
- 转录手写笔记
- 读取路牌、指示牌
- 识别公式、图表中的文字

**图表与文档理解**:

GPT-4V能够理解数据图表、流程图、UI界面等结构化视觉信息。

**注释**:具体能力包括:
- 解读柱状图、折线图的趋势
- 理解流程图的逻辑
- 分析UI界面的布局和功能
- 从文档图片中提取关键信息

**多图像比较**:

GPT-4V能够同时处理多张图片,进行比较和分析。

**注释**:应用示例:
- 比较两张图片的异同
- 分析图片序列的时间变化
- 从多张图片中综合信息回答问题

**视觉推理**:

GPT-4V能够进行需要推理的视觉任务,如理解漫画、识别图像中的逻辑关系等。

**注释**:这是GPT-4V相比早期视觉模型的一个重大进步。早期模型通常只能做简单的识别任务,而GPT-4V能够理解图像的深层含义、隐喻、幽默等。

**GPT-4V的能力示例**:

示例1:理解讽刺漫画 输入:一张讽刺职场加班文化的漫画 GPT-4V能理解漫画的讽刺意图,解释其中的幽默点

示例2:识别UI可用性问题 输入:一张App界面的截图 GPT-4V能识别界面中的可用性问题,如按钮太小、文字难以阅读等

示例3:解答数学几何题 输入:一张几何证明题的配图 GPT-4V能理解图形,分析题目要求,给出解题步骤


### GPT-4V的提示工程

使用GPT-4V时,提示工程(Prompt Engineering)的技巧非常重要。以下是一些最佳实践:

**注释**:提示工程是在GPT-4V时代更加重要的技能。同样的图片,不同的提问方式可能导致截然不同的回答质量。

**技巧一:明确问题类型**

**不太好的提问**:这张图里有什么?
**更好的提问**:请详细描述这张图片中的场景,包括主要物体、人物动作、环境氛围等。

**注释**:越具体、越明确的问题,越容易得到高质量的回答。

**技巧二:提供上下文**

**不太好的提问**:这个图表显示了什么?
**更好的提问**:这是一张关于公司季度销售额的柱状图,请分析销售额的变化趋势,并推测可能的原因。

**注释**:提供上下文信息可以帮助模型更好地理解任务需求。

**技巧三:分步骤提问**

对于复杂问题,可以先问简单的问题,再逐步深入。

**注释**:示例:
1. 先问:图片中主要有哪些物体?
2. 再问:这些物体之间是什么关系?
3. 最后问:基于图片内容,你能推断出发生了什么故事?

**技巧四:指定输出格式**

如果需要特定格式的输出,可以在提示中明确说明。

**注释**:示例:
- "请用JSON格式输出图片中识别的物体列表"
- "请用表格形式对比这两张图片的异同"
- "请用100字以内概括这张图片的主要内容"

### GPT-4V的局限性

尽管GPT-4V展现了强大的能力,但它也有明显的局限性:

**注释**:了解局限性对于正确使用GPT-4V非常重要:

1. **空间推理能力有限**
   - 难以准确判断物体之间的精确空间关系
   - 对于需要精确测量的任务表现不佳

2. **小物体识别困难**
   - 当图像中有很多细节时,可能忽略小物体
   - 对于密集场景,识别可能不完整

3. **幻觉问题**
   - 可能生成与图像内容不符的描述
   - 对于不确定的内容,可能"编造"答案

4. **不擅长数字计算**
   - 从图像中提取数据进行精确计算可能有困难
   - 复杂的数学问题容易出错

5. **依赖提示质量**
   - 回答质量很大程度上取决于提问方式
   - 不当的提示可能导致误导性回答

**本节小结**:

GPT-4V的核心特点是:
- **拼接式架构**:在GPT-4基础上增加视觉编码器
- **多能力融合**:集成了图像描述、视觉问答、OCR、图表理解等多种能力
- **视觉推理**:相比早期模型,具有更强的视觉推理能力
- **提示依赖性**:回答质量很大程度上取决于提示的设计

**思考题**:如果让你设计一个比GPT-4V更强的视觉语言模型,你会做出哪些改进?

---

## 3.3 Gemini:原生多模态架构

### 什么是"原生多模态"?

在介绍GPT-4V时,我们提到它采用的是"拼接式"架构——先有语言模型,再"嫁接"视觉能力。而Gemini采用的是"原生多模态"(Native Multimodal)架构,从设计之初就考虑了多模态输入。

**注释**:用**"语言学习"**来类比两种架构的区别:

**拼接式(如GPT-4V)**:
- 一个人先学会了流利的中文(语言模型)
- 后来又学习了看图能力(视觉模块)
- 他能用两种能力,但本质上仍然是两套系统
- 需要通过"翻译"(接口)才能交流

**原生多模态(如Gemini)**:
- 一个人从小同时学习中文和看图(两种能力一起学)
- 他的大脑自然地建立了图文关联
- 理解和表达都更加自然、协调

**原生多模态的优势**:

原生多模态设计有几个关键优势:

**注释**:优势一:更自然的跨模态推理
- 模型不需要在不同模态之间"翻译"
- 可以直接在多模态输入上进行推理
- 类似于人类的认知方式

**注释**:优势二:更流畅的多模态生成
- 能够同时输出文本和图像内容
- 文本和图像的生成更加协调一致
- 不存在"语言生成一部分,再转图像"的问题

**注释**:优势三:更强的上下文理解
- 能够综合多种模态的信息进行深度理解
- 不存在信息在模态间传递时的损失
- 上下文理解更加完整

### Gemini的架构设计

Gemini是Google DeepMind在2023年底发布的系列模型,包括Gemini Ultra、Pro、Nano三个版本。Gemini Ultra是最强大的版本,在多项基准测试中超越了GPT-4。

**架构特点**:

Gemini的架构设计有几个关键特点:

**多模态Transformer**:
- 使用统一的Transformer架构处理多种模态
- 不同模态的输入被"token化"成统一的序列格式
- 在同一个模型中进行端到端的处理

**模态特定的编码器**:
- 文本使用标准的子词分词器
- 图像被"视觉分词器"(Visual Tokenizer)转换为token序列
- 音频被转换为梅尔频谱图或类似表示,再进行分词

**长上下文处理**:
- 支持很长的上下文窗口(如100万tokens)
- 能够处理长文档、长对话、多图等复杂场景

**Gemini架构简化图**:

多模态输入 │ ├──→ 文本 ──→ 分词器 ──→ 文本Token序列 ├──→ 图像 ──→ 视觉分词器 → 图像Token序列 └──→ 音频 ──→ 音频编码器 ─→ 音频Token序列 │ └──→ 统一输入到Gemini模型 │ ▼ ┌────────────────────┐ │ 多模态Transformer │ │ (统一处理所有Token) │ └─────────┬──────────┘ │ ▼ ┌────────────────────┐ │ 多模态输出生成 │ │ (文本/图像可选) │ └────────────────────┘


**Gemini 1.5 Pro的突破**:

Gemini 1.5 Pro引入了一个革命性的特性:**支持高达100万tokens的上下文窗口**。

**注释**:100万tokens是什么概念?
- 大约等于100万英文单词,或50万中文汉字
- 可以同时处理:
  - 1小时的视频内容
  - 完整的代码库
  - 多本长篇小说的文本
  - 数十张高分辨率图片

**这个能力的意义**:

**注释**:超长上下文的意义:
1. **完整理解长文档**:能够一次读完一本完整的小说或技术文档
2. **跨文档分析**:能够比较分析多个相关文档
3. **视频理解**:能够处理长达1小时的视频,提取关键信息
4. **代码库理解**:能够一次性理解整个项目的代码结构

### Gemini的核心能力

Gemini在多个方面展现了强大的能力:

**原生多模态理解**:

Gemini能够无缝地在不同模态之间"切换",理解它们之间的关系。

**注释**:示例能力:
- 看一张食谱图片,然后按照步骤做菜
- 看一段音乐视频,然后分析其中的音乐元素
- 同时理解图表和配套的文字说明

**高质量文本生成**:

作为基于Transformer的大语言模型,Gemini继承了强大的文本生成能力。

**注释**:文本生成能力包括:
- 长篇文章写作
- 代码编写和调试
- 创意写作
- 复杂问题的分析

**原生图像生成**:

与GPT-4V不同,Gemini能够**原生生成图像**,而不是只能处理图像。

**注释**:原生图像生成的意义:
- 生成与文本描述高度匹配的图像
- 能够在生成过程中"参考"已有的图像
- 文本和图像的生成更加协调一致

**视频理解**:

Gemini能够理解视频内容,包括动作、场景、时间变化等。

**注释**:视频理解能力:
- 识别视频中的动作和事件
- 理解视频的时间线
- 从视频中提取关键帧和信息
- 回答关于视频内容的问题

**代码能力**:

Gemini在代码理解和生成方面也有出色的表现。

**注释**:代码能力包括:
- 多语言代码生成
- 代码理解和解释
- 代码调试和优化
- 多个文件之间的代码关系分析

### Gemini的技术创新

Gemini的技术创新体现在几个方面:

**注释**:技术创新一:大规模多模态预训练
- 在预训练阶段同时接触文本、图像、视频、音频
- 使用混合模态的数据集进行训练
- 让模型从一开始就建立跨模态的关联

**注释**:技术创新二:高效的架构设计
- 使用改进的Transformer架构
- 优化的注意力机制,处理长序列
- 高效的推理和部署

**注释**:技术创新三:复杂的训练流程
- 多阶段训练,包括预训练、微调、对齐等
- 使用人类反馈进行强化学习(RLHF)
- 严格的安全过滤和评估

### 三种模型的对比

让我们对比一下CLIP、GPT-4V和Gemini这三种代表性模型:

| 对比维度 | CLIP | GPT-4V | Gemini |
|---------|------|--------|--------|
| 发布机构 | OpenAI | OpenAI | Google DeepMind |
| 发布时间 | 2021 | 2023 | 2023 |
| 架构类型 | 双编码器 | 拼接式 | 原生多模态 |
| 训练方式 | 对比学习 | 指令微调 | 多模态预训练 |
| 核心能力 | 图文匹配 | 视觉问答 | 原生多模态理解 |
| Zero-shot能力 | ★★★★★ | ★★★☆☆ | ★★★★☆ |
| 图像生成 | ✗ | ✗ | ✓ |
| 视频理解 | ✗ | 有限 | ★★★☆☆ |
| 上下文长度 | N/A | 约8K-128K | 最高100万 |
| 开放程度 | 开源 | 闭源 | 闭源 |

**注释**:从对比中可以看出三种模型的设计哲学:
- **CLIP**:专注于图文对齐,采用简洁的双编码器架构,是很多后续模型的基础
- **GPT-4V**:在强大的语言模型基础上增加视觉能力,强调视觉问答和推理
- **Gemini**:从架构层面原生支持多模态,追求更自然的跨模态理解和生成

**本节小结**:

Gemini的核心特点是:
- **原生多模态架构**:从设计之初就支持多模态输入,而非后期拼接
- **统一Transformer**:使用同一个模型处理文本、图像、视频、音频
- **超长上下文**:支持高达100万tokens的上下文窗口
- **原生图像生成**:能够直接生成图像,而非只能处理图像

**思考题**:你认为"原生多模态"和"拼接式多模态"哪个是未来的发展方向?为什么?

---

## 3.4 本章小结与练习

### 核心概念回顾

让我们用简洁的关键词回顾本章学到的核心概念:

**CLIP**:
- 双编码器架构:视觉编码器 + 文本编码器
- 大规模对比学习:4亿个图文对进行预训练
- 统一特征空间:让图文能够在同一空间中比较
- Zero-shot能力:无需特定类别训练样本即可分类

**GPT-4V**:
- 拼接式架构:GPT-4 + 视觉编码器
- 多能力融合:图像描述、视觉问答、OCR、图表理解
- 视觉推理:相比早期模型,具有更强的推理能力
- 提示依赖性:回答质量很大程度上取决于提示设计

**Gemini**:
- 原生多模态:从设计之初就支持多模态
- 统一Transformer:同一个模型处理多种模态
- 超长上下文:支持高达100万tokens
- 原生图像生成:能够直接生成图像

### 知识关系图

主流模型架构 │ ├── CLIP:图文统一 │ │ │ ├── 双编码器架构 │ ├── 对比学习预训练 │ ├── 统一特征空间 │ └── Zero-shot分类 │ ├── GPT-4V:视觉增强 │ │ │ ├── 拼接式架构 │ ├── 多能力融合 │ ├── 视觉推理 │ └── 提示工程 │ └── Gemini:原生多模态 │ ├── 原生多模态设计 ├── 统一Transformer ├── 超长上下文 └── 原生图像生成


### 实践任务

**任务一:CLIP Zero-shot实验**

使用CLIP模型(或其开源实现如openai/clip)完成以下实验:

1. 准备3-5张不同类别的图片(如猫、狗、汽车、房子)
2. 设计3组不同的类别标签(每组5-10个类别)
3. 使用CLIP进行Zero-shot分类,记录准确率
4. 分析:哪些类别容易识别?哪些类别容易混淆?

**任务二:GPT-4V提示工程实验**

使用GPT-4V(或类似的视觉语言模型)完成以下实验:

1. 选择一张复杂的图片(如有多个物体的场景图)
2. 设计3种不同详细程度的提示
3. 比较不同提示得到的回答质量
4. 总结:什么样的提示能获得更好的回答?

**任务三:模型能力对比表**

查阅相关资料,补充完善以下对比表:

| 能力维度 | GPT-4V | Gemini Ultra | Claude 3 Opus |
|---------|--------|--------------|---------------|
| 图像理解 | | | |
| 视觉推理 | | | |
| 代码能力 | | | |
| 长上下文 | | | |
| 图像生成 | | | |

### 思考题参考答案提示

**3.1节思考题**:CLIP为什么需要那么大的训练数据规模?如果只用100万个图文对训练,结果会有什么不同?

**参考思路**:
- CLIP需要学习足够广泛的图文对应关系,覆盖各种物体、场景、概念
- 4亿规模才能保证覆盖长尾类别和少见场景
- 如果只用100万,可能导致:
  - Zero-shot能力大幅下降
  - 对少见类别识别能力差
  - 特征空间不够均匀

**3.2节思考题**:如果让你设计一个比GPT-4V更强的视觉语言模型,你会做出哪些改进?

**参考方向**:
- 更深度的视觉-语言融合(如原生多模态架构)
- 更强的视觉推理能力(增加推理模块)
- 更好的小物体识别(改进视觉编码器)
- 更长的图像序列处理能力

**3.3节思考题**:你认为"原生多模态"和"拼接式多模态"哪个是未来的发展方向?

**参考思路**:
- 原生多模态是更优雅、更一致的设计
- 但拼接式可以更快地复用现有成果
- 未来可能是两者融合:既有原生设计,又有模块化扩展

### 预告:下一章

在第三章中,我们详细分析了三个代表性的多模态模型:CLIP、GPT-4V和Gemini。这些模型代表了多模态AI发展的不同阶段和设计理念。

**第四章预告:视觉-语言模型详解**

- 视觉-语言模型的核心任务
- BLIP系列:引导语言-图像预训练
- LLaVA:大型语言和视觉助手
- 视觉-语言模型的应用场景

下一章我们将深入讲解视觉-语言模型(Vision-Language Models)的核心技术,包括几个代表性模型的设计和训练方法。

---

**本章作者**:智柴网(zhichai.net)
**发布日期**:2026年1月
**版权声明**:© 2026 智柴网 版权所有
← 返回目录