【LLM技术全景】多模态大模型:当语言模型学会“看“和“听“

摘要

  • 核心问题:语言模型天生只懂"文字"。但人类世界的信息 80% 以上来自视觉与听觉------大模型如何突破"纯文本"的边界,真正理解图像、语音甚至视频?
  • 主要贡献:系统拆解多模态的核心难点(模态鸿沟)统一表示基石(CLIP / ViT / Whisper)三大架构范式(编码对齐 / 早期融合 / 统一模型),并给出可运行的实战代码。
  • 阅读收获:① 理解"模态鸿沟"为什么比想象中难;② 读懂 CLIP 如何用对比学习把图文拉进同一空间;③ 弄清 Flamingo、LLaVA、GPT-4V 三种多模态路线差异;④ 能亲手用 Hugging Face 跑通一次图文检索与视觉问答。

一、引言:从"读文字"到"看世界"

回顾本系列前 17 篇,我们一直在和文本 Token打交道:Tokenization、Embedding、Self-Attention、预训练、对齐......所有机制都建立在"一串离散文本符号"之上。

但人类的智能不是这样的。

复制代码
人类接收信息的通道(粗略估计):
  视觉   ≈ 60-70%    ← 看
  听觉   ≈ 20-25%    ← 听
  语言   ≈ 7-10%     ← 读/说
  触觉/其他 ≈ 3-5%   ← 摸

一个只会"读文字"的模型,本质上是被关在一个由人类转述过的、高度压缩的二手世界里。它没见过猫,只知道"猫"这个词的上下文;它没听过雷声,只知道"雷声"常和"下雨"共现。这种"纸上谈兵"的局限,正是纯文本 LLM 产生幻觉(见第17篇)、缺乏真正世界理解的根源之一。

多模态大模型(Multimodal LLM, MLLM) 的目标,就是打破这道墙:让同一个模型既能处理文字,也能"看"图像、"听"语音、"理解"视频,并在这些模态之间自由推理、对齐、生成。

本文即从技术原理层面,拆解多模态大模型是如何把"看"和"听"塞进语言模型的。


二、核心难点:模态鸿沟(Modality Gap)

把不同模态塞进一个模型,远不止"把图片也喂进去"那么简单。真正的障碍叫做模态鸿沟 ------不同模态的数据在数据结构、统计分布、语义粒度上完全不同。

维度 文本(Text) 图像(Image) 音频(Audio)
基本单元 离散 Token(词/字) 连续像素网格(H×W×3) 连续波形 / 频谱图
结构 一维序列,强时序 二维网格,空间局部相关 一维时序 + 频域结构
语义粒度 天然语义化(词即概念) 原始信号,需抽象 原始信号,需抽象
训练信号 自回归(预测下一个词) 像素重建 / 分类 识别 / 生成
长度动态范围 几十到几千 Token 固定分辨率(如 224×224) 可变时长

最关键的一点:文本 Token 从一开始就是"语义化"的 (一个"猫"字已经代表了猫这个概念),而图像和音频是原始信号------一堆像素值、一段波形,本身不携带任何语义标签。

这就引出多模态的第一性原理问题:

复制代码
如何把"非语义的原始信号"和"语义化的文本符号"
映射到同一个可以互相计算的表示空间?

解决这个问题有两条主干路线,理解它们就理解了整个多模态领域:

复制代码
路线 A:表示对齐(Representation Alignment)
  先分别训练强大的视觉/音频编码器,再用对比学习把它们和文本
  拉进同一个语义空间(代表:CLIP)。之后文本侧 LLM 就能"借用"
  这个对齐后的特征。

路线 B:统一建模(Unified Modeling)
  直接让一个 Transformer 同时吃文本、图像、音频 Token,
  端到端学出跨模态理解(代表:GPT-4V、原生多模态模型)。

下面我们逐一拆解这两类路线的基石技术。


三、基石一:CLIP ------ 把图文拉进同一空间

2021 年 OpenAI 的 CLIP(Contrastive Language-Image Pre-training) 是多模态史上的分水岭。它回答了一个看似简单却极难的问题:"这张图和这句话,说的是同一件事吗?"

3.1 核心思想:对比学习

CLIP 的训练极其优雅------不需要任何人工标注的"图像-类别"标签,只用了互联网上4 亿对(图片,文本描述)

复制代码
训练目标(伪代码):
  对一批 N 个 (图像, 文本) 对:
    1. 图像编码器(ViT/ResNet)得到 N 个图像特征 I_1..I_N
    2. 文本编码器(Transformer)得到 N 个文本特征 T_1..T_N
    3. 计算 N×N 相似度矩阵:S[i][j] = cosine(I_i, T_j)
    4. 对角线(i==j,真正配对)应为高分:
       损失 = 对比损失(对角线为正确配对,其余为"负样本")

直观理解:CLIP 让"配对正确的图文"在向量空间里互相靠近 ,让"不配对的图文"互相远离。训练完成后,图像和文本就共享同一个语义空间了。

python 复制代码
import torch
import torch.nn.functional as F
from transformers import CLIPProcessor, CLIPModel

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

# 零样本图文匹配:给定一张图和若干候选文本
image = ...  # PIL Image
candidates = ["一只猫在睡觉", "一辆红色跑车", "海滩上的日落", "一个人在弹钢琴"]

inputs = processor(text=candidates, images=image,
                   return_tensors="pt", padding=True)
outputs = model(**inputs)

# logits_per_image: [1, 4],每个候选文本的匹配分数
probs = outputs.logits_per_image.softmax(dim=1)
print(probs)  # 例如: [0.91, 0.02, 0.03, 0.04] → 模型判定"一只猫在睡觉"

为什么 CLIP 重要? 它首次证明:用海量"图文对"做对比学习,可以零样本(zero-shot)迁移到任意视觉分类任务------不需要针对每个新类别重新训练。这为后续所有视觉语言模型(Flamingo、LLaVA、GPT-4V)提供了现成的、对齐好的视觉特征

3.2 CLIP 的两种编码器

CLIP 实际上由两个独立编码器组成:

复制代码
┌─────────────┐         ┌─────────────┐
│ 图像编码器   │         │ 文本编码器   │
│ (Vision     │         │ (Text       │
│  Encoder)   │         │  Encoder)   │
│             │         │             │
│ ViT 或      │  → 同维  │ Transformer │
│ ResNet      │   向量   │ (因果/双向) │
└─────────────┘         └─────────────┘
       ↓                      ↓
  图像特征向量 ──对比学习──→ 文本特征向量
   (同一语义空间)
  • 图像侧:OpenAI 原版用 ViT-L/14(Vision Transformer,下文详解)和 ResNet-50 两种。
  • 文本侧:一个标准的 Transformer 文本编码器。

两者输出都用投影头映射到同一维度(如 512 维),再在投影后的空间里算相似度。


四、基石二:ViT ------ 把图像变成"Token 序列"

要让图像能被 Transformer(语言模型的主干)处理,必须先把图像转成序列形式的 Token ------这正是 ViT(Vision Transformer, 2020, Google) 做的事。

4.1 分块(Patch)即 Token

ViT 的核心洞察极其朴素:把图像切成一堆小方块,每个方块就当成一个"视觉词"(visual token)。

复制代码
原始图像 (224×224×3)
   ↓ 切成 16×16 的 patch
   共 (224/16)×(224/16) = 14×14 = 196 个 patch
   ↓ 每个 patch 展平为向量
   196 个视觉 Token,每个维度 = 16×16×3 = 768
   ↓ 线性投影 + 加位置编码
   196 个 embedding,送入标准 Transformer Encoder
   ↓ 取 [CLS] Token 的输出做分类
python 复制代码
from transformers import ViTImageProcessor, ViTModel
from PIL import Image

processor = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTModel.from_pretrained("google/vit-base-patch16-224")

image = Image.open("cat.jpg")
inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)

# last_hidden_state: [1, 197, 768]
#   - 197 = 196 个 patch token + 1 个 [CLS] token
#   - 768 是每个视觉 token 的表示维度
# 这 196 个 token 就可以像文本 token 一样被后续模块处理
patch_tokens = outputs.last_hidden_state[:, 1:, :]  # [1, 196, 768]

意义:ViT 把"图像处理"和"文本处理"统一到了同一套 Transformer 机制上。一旦图像变成 Token 序列,理论上语言模型就能用 Self-Attention 来处理它------这是后续一切多模态融合的前提。


五、基石三:Whisper ------ 让模型"听懂"语音

文本和图像之外,语音是第三大模态。OpenAI 的 Whisper(2022) 用海量弱标注的多语种语音数据,训练出一个强大的通用语音识别(ASR)模型。

5.1 语音如何变成模型可吃的输入

语音原始是一维波形 (采样点序列),但主流做法(包括 Whisper)先把它转成二维频谱图(Mel-spectrogram),再当作"图像"用卷积+Transformer 处理:

复制代码
原始音频波形 (16kHz, 30秒 ≈ 480000 个采样点)
   ↓ Mel 滤波器组变换
二维频谱图 (如 80 × 3000,80个梅尔频带 × 3000帧)
   ↓ 当作"特殊图像"卷积分块
   音频 Token 序列
   ↓ Whisper Encoder-Decoder
   文本转录(同时可指定语言、翻译任务)
python 复制代码
import whisper

model = whisper.load_model("base")
result = model.transcribe("meeting.wav")
print(result["text"])          # 转录文本
print(result["language"])      # 检测到的语言
# Whisper 还能直接做语音翻译:
# result = model.transcribe("jp_audio.wav", task="translate")
# → 输出英文翻译(日→英)

多模态视角下的 Whisper:它本质上是一个"语音→文本"的** translator**。在多模态系统里,Whisper 常作为"前端"------先把语音转成文本,再交给文本 LLM 处理。更前沿的做法是把音频频谱直接作为另一种模态 Token 喂入统一模型(如 GPT-4o 的语音通道),但这需要大量端到端语音数据。


六、三大架构范式

有了"对齐表示"(CLIP)、"视觉 Token 化"(ViT)、"音频前端"(Whisper)这三块基石,接下来是如何把它们组合进语言模型。业界走过三条逐步演进的路线。

范式一:编码对齐式(Encoder-Alignment)

代表:CLIP、BLIP、ALIGN

复制代码
图像 ──[视觉编码器]──→ 视觉特征 ──[对齐训练]──→ 与文本同空间
文本 ──[文本编码器]──→ 文本特征 ──[对齐训练]──→ 与图像同空间
                                              ↓
                                  用于:图文检索 / 零样本分类 / 作为下游特征

特点:只做表示对齐,不引入生成/推理 。CLIP 训练好后,本身不能直接"看图回答问题",它只是一个强大的"图文相似度计算器"。但它是后续所有生成式多模态模型的特征供应商

范式二:早期融合式(Early Fusion / Vision-Language Adapter)

代表:Flamingo(DeepMind, 2022)、LLaVA(2023)

这是把视觉接入 LLM 最主流、最"便宜"的工程范式:冻结预训练 LLM,只训练一个"视觉适配器"把图像特征映射到 LLM 的词嵌入空间。

复制代码
图像 ──[ViT/CLIP编码器]──→ 视觉特征
                            ↓
                       [适配器 Adapter]
                       (如线性层/Multi-Layer Perceptron/
                        Q-Former 等,把视觉特征投到 LLM 维度)
                            ↓
视觉 Token  ──────────────→ 拼接进 LLM 的输入序列
                                ↓
                          预训练 LLM(如 LLaMA,冻结)
                                ↓
                         输出文本回答

Flamingo 的创新:在 LLM 的每一层 Transformer 之间插入"交叉注意力层"(GATED XATTN),让文本 token 能去"查询"视觉特征。这样视觉信息能贯穿整个网络,而不只是停留在输入层。

LLaVA 的开源贡献:用一个简单的线性投影层把 CLIP 视觉特征映射到 LLaMA 的词嵌入空间,配合 GPT-4 生成的视觉指令数据做微调,以极低成本复现了接近商业模型的多模态对话能力,直接引爆了开源多模态生态。

python 复制代码
# LLaVA 风格的视觉适配器(极简版示意)
import torch.nn as nn

class LLaVAConnector(nn.Module):
    def __init__(self, vision_dim=1024, llm_dim=4096):
        super().__init__()
        # 把 CLIP 的 1024 维视觉特征投影到 LLaMA 的 4096 维词嵌入空间
        self.proj = nn.Linear(vision_dim, llm_dim)

    def forward(self, image_features):
        # image_features: [batch, num_patches, 1024]
        visual_tokens = self.proj(image_features)  # [batch, num_patches, 4096]
        return visual_tokens  # 直接作为"视觉词"拼到 LLM 输入序列里

# 使用:LLM 输入 = [系统提示][视觉Token们][文本问题]

范式三:统一原生多模态(Unified / Native Multimodal)

代表:GPT-4V(2023)、GPT-4o(2024)、Gemini 系列

前两种范式本质上是"给文本 LLM 外接一个视觉插件 "。而原生多模态从训练第一天起,就让模型同时见到文本、图像、音频、视频,端到端地学会跨模态推理。

复制代码
                    ┌─────────────────────────────┐
                    │   统一 Transformer / MoE     │
  文本 Token ───────→│                             │
  图像 Patch ───────→│   所有模态共享同一套参数     │──→ 任意模态输出
  音频帧   ───────→│   (同一表示空间,端到端)   │
  视频帧   ───────→│                             │
                    └─────────────────────────────┘

优势

  • 模态间交互更充分(不是"插件式"而是"原生融合");
  • 支持任意模态组合输入输出(如 GPT-4o 可实时语音对话、看图说话、看图听声);
  • 涌现出"跨模态常识推理"能力(如看懂一张梗图、理解图表中的因果关系)。

代价:需要从头用海量多模态数据训练,工程成本极高,目前主要是大厂闭源模型的主场。

三种范式对比

维度 编码对齐(CLIP) 早期融合(LLaVA) 原生多模态(GPT-4V)
训练成本 中(海量图文对) 低(冻结 LLM,只训适配器) 极高(端到端多模态)
模态交互深度 仅对齐,无推理 浅(输入层拼接) 深(逐层原生融合)
可解释性 高(相似度可查)
开源友好度 高(主流开源路线) 低(闭源为主)
典型能力 检索/分类 视觉问答/对话 全模态推理/生成
代表模型 CLIP/BLIP Flamingo/LLaVA/Qwen-VL GPT-4V/4o/Gemini

七、实战:亲手跑通多模态

7.1 用 CLIP 做零样本图文检索

python 复制代码
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
import torch

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

# 图库
image_paths = ["cat.jpg", "car.jpg", "beach.jpg", "piano.jpg"]
images = [Image.open(p) for p in image_paths]

# 文本查询
query = ["猫", "车", "海滩", "钢琴"]

inputs = processor(text=query, images=images,
                   return_tensors="pt", padding=True, truncation=True)
outputs = model(**inputs)

# 计算每个查询对每张图的相似度
logits = outputs.logits_per_text  # [4, 4]
probs = logits.softmax(dim=1)

for i, q in enumerate(query):
    best = probs[i].argmax().item()
    print(f"查询'{q}'最匹配图:{image_paths[best]} (置信度 {probs[i][best]:.2f})")

7.2 用 LLaVA 做视觉问答

python 复制代码
from transformers import LlavaForConditionalGeneration, AutoProcessor
from PIL import Image
import torch

model_id = "llava-hf/llava-1.5-7b-hf"
model = LlavaForConditionalGeneration.from_pretrained(
    model_id, torch_dtype=torch.float16, device_map="auto")
processor = AutoProcessor.from_pretrained(model_id)

image = Image.open("chart.png")
prompt = "USER: <image>\n这张图表说明了什么趋势?\nASSISTANT:"

inputs = processor(images=image, text=prompt, return_tensors="pt").to("cuda")

with torch.no_grad():
    out = model.generate(**inputs, max_new_tokens=200)
print(processor.decode(out[0], skip_special_tokens=True))

7.3 用 Whisper 做语音转写

python 复制代码
import whisper
model = whisper.load_model("small")
result = model.transcribe("interview.mp3")
print(result["text"])

八、常见误区纠正

复制代码
误区1:"多模态就是把图片也当输入喂给 LLM。"
正解:图像必须经过编码器(ViT/CLIP)转为与文本对齐的特征,
     且需要解决表示空间、模态对齐、训练目标三大问题。

误区2:"有了 CLIP,模型就能看图回答了。"
正解:CLIP 只提供"图文相似度",本身不会生成回答。
     还需融合模块 + LLM 才能形成多模态问答能力。

误区3:"原生多模态一定全面优于外接插件式。"
正解:原生式能力强但成本极高;早期融合(LLaVA)以 1% 的成本
     复现了 80% 的能力,是开源界的主流务实选择。

误区4:"视觉和语言在模型里是'平等'的。"
正解:多数 MLLM 仍以文本为"主模态"(推理、输出都是文本),
     视觉/音频是条件输入。真正的全模态对等仍是前沿开放问题。

九、总结与展望

核心要点

复制代码
1. 模态鸿沟:文本天然语义化,图像/音频是原始信号,
   多模态的本质是"把不同模态对齐到同一可计算空间"。

2. 三块基石:
   ✓ CLIP(图文对比,提供对齐好的视觉特征)
   ✓ ViT(把图像切成 patch 变成 Token 序列)
   ✓ Whisper(把语音转成文本/频谱 Token)

3. 三条路线:
   ✓ 编码对齐(CLIP,只对齐不生成)
   ✓ 早期融合(LLaVA/Flamingo,冻结 LLM + 训练适配器)
   ✓ 原生多模态(GPT-4V/4o,端到端全模态)

4. 工程现实:开源界靠"LLaVA 范式 + 强视觉编码器"以低成本追平闭源;
   闭源界靠原生多模态追求能力上限。

技术演进方向

复制代码
2021: CLIP ------ 图文对比学习,奠定对齐基石
2022: Flamingo ------ 冻结 LLM + 交叉注意力,早期融合开山作
2023: LLaVA ------ 线性投影 + 指令数据,引爆开源多模态
2023: GPT-4V ------ 商业闭源多模态标杆
2024: GPT-4o / Gemini 1.5 ------ 原生全模态 + 实时语音/视频
2025: 视频多模态、GUI Agent(看屏操作)、具身多模态(VLA)
2026: 多模态推理增强、跨模态思维链、端侧多模态

趋势:从"能看图" → "能理解图里的因果/讽刺/图表"
     → "能看屏操作" → "能看能听能说能动的统一智能体"

下期预告:《状态空间模型与 Mamba:Transformer 的挑战者》------ 在算力墙和长序列压力下,线性复杂度的 SSM 如何挑战注意力机制,Mamba 又凭什么被称为"Transformer 杀手"?


参考资料

  1. Radford et al. (2021) --- Learning Transferable Visual Models From Natural Language Supervision(CLIP)
  2. Dosovitskiy et al. (2020) --- An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale(ViT)
  3. Radford et al. (2022) --- Robust Speech Recognition via Large-Scale Weak Supervision(Whisper)
  4. Alayrac et al. (2022) --- Flamingo: a Visual Language Model for Few-Shot Learning
  5. Liu et al. (2023) --- Visual Instruction Tuning(LLaVA)
  6. OpenAI (2023) --- GPT-4V(ision) System Card
  7. Gemini Team (2023) --- Gemini: A Family of Highly Capable Multimodal Models

延伸讨论

思考题

  1. 如果让你设计一个"能看屏操作电脑"的多模态 Agent,你会选早期融合还是原生多模态?为什么?
  2. CLIP 的"对齐"是基于互联网图文对学到的,这可能带来什么偏见?

实践作业

  • 用 CLIP 为自己相册里的 100 张图做"零样本分类"(定义 10 个类别,输出每张图的类别概率)。
  • 用 LLaVA 或 Qwen-VL 分析一张你手头的图表/截图,看它能否正确读出趋势和数字。
相关推荐
湘美书院--湘美谈教育1 小时前
湘美谈教育互联网逻辑:AI时代的社会学猜想
大数据·人工智能·深度学习·机器学习·生活
东方佑1 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
KKKlucifer2 小时前
多源异构通信数据统一识别:运营商分类分级平台关键技术与落地成
人工智能·分类·数据挖掘
jinggongszh2 小时前
从长鑫科技的十年突围,看中国制造的“硬核”与“底座”
人工智能·科技·制造
程序员cxuan2 小时前
A 社官方:我们删掉了 80% 的 skills
人工智能·后端·程序员
工业胶囊2 小时前
“AI+制造”1.0基础认知篇:通用AI与工业AI的核心差异与应用逻辑
人工智能·制造·数字化转型·工业ai
问商十三载2 小时前
AI 引擎生成式优化两种思路怎么选?2026 对比分析附选型方法
人工智能·算法
Chuck New2 小时前
疫情回国耽误澳洲学业,被学校开除还有挽回余地吗
人工智能
用户298698530142 小时前
在 PC 上将 HTML 转换为 PDF 的3种有效方法
人工智能·c#·html