Back to all posts

大模型是怎么"看懂"图片的?——多模态视觉理解全解析

/18 min read/AIAI 对话总结生成
LLMAI多模态Vision

当你把一张自拍、一张表格截图、或者一段代码报错的截图丢给 ChatGPT、Claude 或 Gemini 时,它几乎都能给你一个合理的回答。但你有没有想过——它到底是怎么"看懂"这些图片的?

人看图片是一种直觉——瞬间就能感知到"这是一个人在微笑"、"这是一张 Excel 表格"、"这段代码报了空指针异常"。但对模型来说,图片进来的时候只是一堆像素值(RGB 数字矩阵),它需要经过一整套流程,才能把这些数字转化成它能理解的"语义信息"。

这篇文章会带你从底层原理出发,彻底搞懂多模态大模型的"视觉能力"是怎么来的。

1. 图片在模型眼中长什么样?

在聊模型如何理解图片之前,我们得先搞清楚一件事:图片在计算机中是怎么表示的。

一张彩色图片本质上是一个三维数组 [高度 × 宽度 × 3],其中 3 代表 RGB 三个颜色通道。一张 1024×1024 的图片就有 1024 × 1024 × 3 ≈ 314 万个数字

如果直接把这些数字扔给 Transformer 处理,每个像素当作一个 token,那一张普通照片就是几百万个 token——这个计算量是完全不可接受的。

所以第一个核心问题就是:怎么把图片信息"压缩"成模型能处理的规模?

2. Vision Transformer(ViT):把图片变成"文字"

Vision Transformer 切片机制示意图:图片被切分成 Patches,经过线性投影后送入 Transformer

这是多模态大模型最核心的技术之一——Vision Transformer(ViT)

ViT 的核心思想非常优雅:既然 Transformer 擅长处理序列数据(文字),那就把图片也变成序列。

2.1 第一步:切片(Patch Embedding)

ViT 不会逐像素处理图片,而是把图片切成一个个固定大小的小方块,叫做 patch

以一张 224×224 的图片为例,如果 patch 大小设为 16×16:

  • 图片被切成 (224 ÷ 16) × (224 ÷ 16) = 14 × 14 = 196 个 patch
  • 每个 patch 包含 16 × 16 × 3 = 768 个像素值
  • 通过一个线性投影层,把这 768 个数字压缩成一个固定维度的向量(比如 768 维)

这样,一张图片就变成了 196 个向量,就像一段话有 196 个词一样。

为什么是 16×16? 这是经验和性能的平衡:

  • 太大(比如 32×32):patch 数量少,处理快,但丢失细节
  • 太小(比如 4×4):patch 数量多,细节保留好,但计算量爆炸
  • 16×16 是目前比较主流的选择,在效果和效率之间取得了良好平衡

2.2 第二步:位置编码(Positional Encoding)

切片之后有一个问题——模型不知道每个 patch 原来在图片的哪个位置

如果只是把 196 个向量丢给 Transformer,它会把这些 patch 当成一个无序的"词袋",完全丧失空间信息。一只猫的耳朵在上面、爪子在下面,这种空间关系对理解图片至关重要。

解决方法就是加上位置编码:给每个 patch 向量加上一个表示其位置的向量。这样模型就知道"第 1 个 patch 在左上角,第 196 个 patch 在右下角"。

常见的位置编码方式有:

  • 可学习的位置编码:直接让模型在训练中学会每个位置应该对应什么向量
  • 2D 正弦位置编码:用数学公式编码行列信息,泛化能力更好
  • RoPE(旋转位置编码):近年来越来越流行,支持动态分辨率

2.3 第三步:Transformer 自注意力

位置编码加完后,这 196 个向量就被送进 Transformer 的多层自注意力(Self-Attention)模块。

自注意力的核心作用是:让每个 patch 都能"看到"其他所有 patch 的信息

  • 一个 patch 包含猫的耳朵,另一个 patch 包含猫的眼睛——通过自注意力,模型能把这些局部信息关联起来,形成"这是一只猫"的完整理解
  • 一个 patch 包含代码的行号,另一个 patch 包含报错信息——模型能把它们关联起来,理解"第 42 行报了空指针异常"

经过多层 Transformer 的处理,每个 patch 向量已经不再是一个局部的像素块信息了,而是融合了全局上下文的高级语义特征。

2.4 不同分辨率的图片怎么办?

实际使用中,用户上传的图片大小各异。常见的处理策略有:

  • 直接 resize:把所有图片统一缩放到固定尺寸(如 224×224),简单粗暴但可能丢失细节
  • 动态分辨率:根据原图比例,切出不同数量的 patch。比如一张 448×224 的横图会切出 28×14 = 392 个 patch
  • 多尺度切片:先在低分辨率下切片获得全局信息,再在高分辨率下切片获取局部细节,两路信息合并——这是目前高端模型常用的方案

3. 视觉与语言的"桥梁":怎么让模型同时理解图片和文字?

多模态大模型架构图:视觉编码器与语言模型通过桥梁层连接

ViT 让模型能"看"图片了,但这只完成了一半——模型还需要把视觉信息和语言信息放进同一个"思考空间"

这就好比一个人同时懂中文和英文,但如果脑子里两套语言系统完全独立、互不相通,那他就无法做"看图说话"这样的跨模态任务。

3.1 方案一:投影层对齐(LLaVA 方案)

最直接的方案:用一个线性投影层(或 MLP),把视觉编码器输出的向量映射到语言模型的 embedding 空间。

text
图片 → ViT 编码 → 视觉向量 [196个] → 投影层 → 语言空间向量 [196个]

文字 → Tokenizer → 文本 Token [N个] ──────────────→ 拼接 → LLM 处理

简单来说就是把视觉 token 和文本 token 拼在一起,一起送给语言模型处理。语言模型不需要关心输入是来自图片还是文字,它只看到一串向量。

LLaVA 系列模型就是用这个方案,效果出奇地好,证明了"简单有效"。

3.2 方案二:Q-Former 查询机制(BLIP-2 方案)

如果图片分辨率很高,直接拼接可能产生太多视觉 token(比如数百甚至上千个),会大幅增加语言模型的计算负担。

BLIP-2 提出了一个巧妙的方案:用一组可学习的 query token(通常只有 32 个),去"询问"视觉特征中最重要的信息。

text
图片 → ViT 编码 → 视觉向量 [196个]

32 个 Query Token → Q-Former 交叉注意力 → 32 个压缩后的视觉向量

                                          投影 → 送入 LLM

这就像你看一张复杂的图片,不会记住每一个像素,而是提取出"关键信息"——有什么物体、什么颜色、在哪个位置。Q-Former 就是做这件事的。

3.3 方案三:CLIP 对比学习预对齐

还有一种更底层的方案:在预训练阶段就让视觉和语言住进同一个空间。

CLIP(Contrastive Language-Image Pre-training) 的做法是:

  1. 收集海量的(图片, 文本描述)配对数据——比如"一只橘猫趴在键盘上"配上对应的照片
  2. 同时训练一个图片编码器和一个文本编码器
  3. 训练目标:让匹配的(图片, 文本)对在向量空间中靠近,不匹配的远离

训练完成后,图片和文字天然就在同一个语义空间里了。"猫的照片"和"猫"这个词的向量会非常接近。

很多多模态大模型会用 CLIP 预训练好的视觉编码器作为起点,再进行微调。

4. 不同类型的图片,模型是怎么理解的?

不同图片类型的处理方式对比:自拍、表格截图、代码报错截图

理解了底层原理后,我们来看看具体场景。当你发送不同类型的图片时,模型内部的"思考过程"有什么不同?

4.1 用户自拍 / 自然场景照片

这是视觉模型最"基础"的能力场景。

模型的处理流程:

  1. 物体检测与分类:识别出画面中的主要元素——人脸、身体、背景物体
  2. 属性识别:性别、年龄范围、表情(微笑/严肃)、穿着、姿势
  3. 场景理解:通过背景元素推断场景——室内/室外、咖啡厅/公园/办公室
  4. 空间关系:谁在前面、谁在后面、物体之间的相对位置

这种能力主要来源于训练数据中海量的图文对——互联网上有无数的照片及其描述文字,模型在预训练阶段已经学会了把视觉模式映射到语义概念。

4.2 表格截图

表格识别是多模态模型非常擅长但也非常考验能力的场景。

模型需要同时完成多项任务:

  1. 文字识别(OCR 能力):识别出表格中每个单元格的文字内容
  2. 结构理解:识别出行、列、表头、合并单元格等结构信息
  3. 空间关系映射:理解"销售额 100 万"是属于"2024年Q1"这一列、"华东区"这一行的

这里有一个关键点:现代多模态大模型的 OCR 能力通常是"内置"的,而非依赖外部 OCR 模块

在 ViT 切片过程中,如果 patch 足够小(比如 14×14 像素),每个 patch 恰好能覆盖一两个字符。模型在大量包含文字的图片上训练后,自然学会了从像素模式中"认"出文字。这就是为什么你把一张手写笔记的照片丢给模型,它也能读出来。

4.3 代码报错截图

代码截图的理解融合了多种能力:

  1. OCR:先"读"出截图中的代码文本和错误信息
  2. 代码理解:凭借语言模型在海量代码上训练获得的编程知识,理解代码逻辑
  3. 错误诊断:结合报错信息和代码上下文,推断问题原因

比如你发一张 NullPointerException 的截图,模型会:

  • 先读出错误类型、堆栈跟踪、涉及的代码行
  • 理解代码逻辑,找到可能产生空值的地方
  • 给出修复建议

这里视觉能力和语言能力是紧密配合的——视觉负责"读",语言负责"理解"和"推理"。

4.4 图表 / 数据可视化

当你发送一张柱状图、折线图或饼图时,模型的理解过程是:

  1. 图表类型识别:判断是柱状图、折线图、饼图还是其他类型
  2. 元素提取:识别坐标轴标签、图例、数据点、标题
  3. 数值估算:根据视觉比例估算各数据点的大致数值
  4. 趋势分析:综合所有信息,得出"销售额呈上升趋势"这样的结论

5. 训练数据:这些能力从哪来?

多模态模型的视觉能力不是凭空而来的,它来自于精心构造的多阶段训练

5.1 预训练阶段

  • 数据规模:数亿到数十亿组(图片, 文本)配对数据
  • 数据来源:互联网上的图片及其 alt 文本、图片描述网站、学术数据集等
  • 训练目标:学会图片和文字之间的对应关系

典型的预训练数据集如 LAION-5B,包含 50 亿个图文对。

5.2 指令微调阶段

预训练让模型学会了"看",但还不会"按要求回答"。指令微调阶段会用高质量的多模态问答数据来训练:

  • "这张图片里有什么?" → 详细的图片描述
  • "这个表格第二行第三列的值是多少?" → 精确的数值回答
  • "这段代码报错的原因是什么?" → 技术分析和修复建议

5.3 RLHF / 偏好对齐

最后通过人类反馈强化学习(RLHF),让模型的回答更符合人类的期望——更准确、更有帮助、更安全。

6. 当前的局限与未来方向

多模态模型虽然已经很强大,但仍有一些明显的局限:

  • 幻觉问题:模型可能"看到"图片里并不存在的东西,或者误读文字
  • 细粒度理解:对于非常小的文字、密集的表格、复杂的图表,识别准确率仍有提升空间
  • 空间推理:对物体的精确位置、大小比例的判断还不够准确
  • 视频理解:从静态图片到动态视频的理解,仍是活跃的研究方向

未来的发展趋势包括:

  • 更高分辨率的支持:让模型看到更多细节
  • 原生多模态架构:不再是"视觉编码器 + 语言模型"的拼接,而是从头设计的统一架构
  • 实时视觉理解:支持视频流的实时处理和理解

总结

回到最初的问题——大模型是怎么看懂图片的?

核心流程可以概括为:

  1. 切片(ViT):把图片切成小方块,每个小方块变成一个向量
  2. 编码(Transformer):让每个小方块都能感知全局信息,形成高级语义特征
  3. 对齐(桥梁层):把视觉特征映射到语言模型能理解的空间
  4. 理解(LLM):语言模型综合视觉信息和文字信息,进行推理和生成

不管是自拍、表格、代码截图还是数据图表,走的都是这一套流程——区别只在于模型在不同类型的图片上积累了不同的"经验"(训练数据)

本质上,多模态大模型做的事情就是:把"看"的过程翻译成"读"的过程,然后用它最擅长的语言理解能力来处理。