
摘要
- 核心问题:语言模型天生只懂"文字"。但人类世界的信息 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 杀手"?
参考资料
- Radford et al. (2021) --- Learning Transferable Visual Models From Natural Language Supervision(CLIP)
- Dosovitskiy et al. (2020) --- An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale(ViT)
- Radford et al. (2022) --- Robust Speech Recognition via Large-Scale Weak Supervision(Whisper)
- Alayrac et al. (2022) --- Flamingo: a Visual Language Model for Few-Shot Learning
- Liu et al. (2023) --- Visual Instruction Tuning(LLaVA)
- OpenAI (2023) --- GPT-4V(ision) System Card
- Gemini Team (2023) --- Gemini: A Family of Highly Capable Multimodal Models
延伸讨论
思考题:
- 如果让你设计一个"能看屏操作电脑"的多模态 Agent,你会选早期融合还是原生多模态?为什么?
- CLIP 的"对齐"是基于互联网图文对学到的,这可能带来什么偏见?
实践作业:
- 用 CLIP 为自己相册里的 100 张图做"零样本分类"(定义 10 个类别,输出每张图的类别概率)。
- 用 LLaVA 或 Qwen-VL 分析一张你手头的图表/截图,看它能否正确读出趋势和数字。