什么是多模态
你拍一张冰箱内部的照片发给 AI,问"今晚能做什么菜",它会告诉你"番茄和鸡蛋够了,可以做番茄炒蛋,但你没有葱"。这件事在 2022 年之前是不可能的——那时候的模型要么只会读字,要么只会认图,两者互不相通。"多模态"这个词说白了就是:一个模型同时能吃好几种不同形式的信息。这一节先把"模态"这个概念钉死,再讲清楚一件真正关键的事:文字、图片、声音这三样在物理上毫无共同点的东西,凭什么能被同一台机器一起处理。答案只有一句话,但这句话撑起了整个第 9 章。
你现在手里拿着一个苹果。请注意,你正在同时用五套完全不同的感官系统处理这一个东西:
眼睛告诉你它是红的、圆的、表皮有反光;手告诉你它凉、硬、有点沉;鼻子闻到一点果香;嘴咬一口是脆的、甜的;如果旁边有人说"这苹果不错",你的耳朵还收到了"苹果"这两个音节。
这五路信息的物理形式天差地别——一路是光的波长,一路是皮肤上的压力,一路是空气里的化学分子,一路是舌头上的化学受体,一路是空气的振动。可它们在你脑子里汇成了同一个东西:苹果。你从来不会觉得"看见的苹果"和"听到的苹果"是两个不相干的概念,你甚至能只凭闻到的味道就说出"这是苹果"。
更神的是迁移:你小时候第一次学"苹果"这个词,是妈妈举着一个真苹果告诉你的。之后你看到超市货架上颜色不同、形状略扁的另一个苹果,你照样认得出来。你甚至能看懂简笔画里的苹果、能听懂"苹果手机"里那个苹果是个比喻。
先把"模态"这个词彻底说清
模态(Modality,读作"模达乐提")在中文里是个很吓人的词,因为它既不像"图片"那么具体,也不像"数据"那么熟悉。但它的定义简单到有点无聊:模态就是"信息以什么形式存在"。
换成大白话:同一件事,可以用不同的"载体"表达出来,每一种载体就是一种模态。比如"外面在下雨"这件事,可以有五种模态:
同一个事实,五种模态
文字模态: "外面在下雨" ← 一串字符
图像模态: 一张窗户上有雨滴的照片 ← 一堆像素的亮度数值
音频模态: 雨打屋檐的沙沙声 ← 一串声压采样值
视频模态: 一段雨落下来的画面 ← 一堆图片按时间排队
结构化模态:{"weather": "rain", ← 键值对
"mm_per_hour": 4.2}
它们表达的是同一个事实,但在计算机里的存储形式
完全不一样——形状不一样、数值范围不一样、长度不一样。
所以"多模态 AI"这个词的准确含义是:一个系统能够接收、理解、或者生成不止一种形式的信息。注意这里有三个动词,它们对应三种不同难度的能力,后面会拆开讲。
顺便澄清一个特别常见的用词错误。"多模态"和"多模型"完全是两回事。多模型是"我用三个模型分别干三件事,然后把结果拼起来";多模态是"一个模型本身就能同时理解好几种输入"。打个比方:前者是餐厅里三个厨师各炒一个菜然后端上同一桌,后者是一个厨师一个人做出一整桌配得上的菜。前者只是拼盘,后者才叫融合。两者的区别在实际效果上非常明显——真正融合的模型能回答"图里那个人穿的衣服和文字描述的颜色一致吗",拼盘系统做不到,因为它的图像模块和文字模块之间没有对话渠道。
四大主流模态各自长什么样
要理解"为什么融合很难",你得先亲眼看看这四种东西在计算机里到底是什么形状。这一段有几个具体数字,请务必看一眼——多模态领域所有的工程难题,根子都在这几个数字上。
| 模态 | 在计算机里的真实形状 | 一个"典型样本"的数据量 | 是离散还是连续 |
|---|---|---|---|
| 文字 | 一串整数编号(token id) | 1000 字的文章 ≈ 600 个 token | 离散(编号只能是整数) |
| 图像 | 三维数组:高 × 宽 × 3 个颜色通道 | 1024×1024 彩照 = 314 万个数值 | 连续(每个亮度是 0~255) |
| 音频 | 一维长数组:每秒若干个采样点 | CD 音质 1 秒 = 44100 个采样点 | 连续 |
| 视频 | 四维数组:帧数 × 高 × 宽 × 3 | 1 分钟 30 帧 1080p ≈ 112 亿个数值 | 连续 + 有时间顺序 |
把最后那个数字换算成可感知的量:一分钟的 1080p 视频原始像素数据是 112 亿个数值。如果每个数值用一个字节存,那是 11 个 GB——一分钟的视频,原始数据比整个中文维基百科的纯文本还大好几倍。这就是为什么视频必须先压缩再处理,也是为什么"多模态"里视频永远是最难的那一块。
再看"离散 vs 连续"这一栏,这个区别比数据量更本质。文字是离散的——第 100 号 token 和第 101 号 token 之间不存在"第 100.5 号",它们的编号只是标签,编号相邻不代表意思相近("苹果"可能是 5000 号,"香蕉"可能是 87000 号)。图像和音频是连续的——亮度从 120 变成 121,画面几乎没变化;采样值稍微抖一下,声音听起来一样。
这个差别导致了一个很实际的后果:文字可以"查表"(编号 → 向量),图像和音频不能查表(数值有无穷多种可能,表列不完),只能用一个神经网络"算"出来。相当于:文字是从通讯录里查号码,一查就到;图像是拿一堆原料现场加工,必须过一遍机器。
为什么纯文字模型必然不够用
你可能会问:GPT 光靠读文字就已经很厉害了,为什么非要看图?这里有三个层次的理由,从最实用的往最深刻的排。
第一层,纯粹的实用性。现实世界里的信息大半不是纯文字的。你手机相册里几千张照片、微信里的语音消息、电脑里那些扫描版 PDF、报错时的截图、超市货架上的价签、体检报告上的图表——这些东西你没法先手打成文字再问 AI,那还不如自己看。多模态能力直接决定了 AI 能不能用在真实场景里。
第二层,有些信息用文字表达不出来。试着用文字精确描述一张脸,让另一个人根据你的描述在一百张照片里找出那张——你会发现这几乎做不到。图像里的信息密度远超语言,"一图胜千言"不是修辞,是事实。同样,一段音乐的旋律、一个人说话时的语气(同一句"你真行"可以是赞叹也可以是嘲讽)、一段视频里动作的连贯性,这些都是文字系统天生丢失的信息。
第三层,也是最深的一层:符号接地问题。这个词的英文是 Symbol Grounding Problem(符号接地问题,"接地"就是接上地面、和真实世界连上)。它问的是:一个只读过文字的系统,真的"懂"它说的词吗?
假设有一个人,从出生起就被关在房间里,唯一的信息来源是一本超厚的中文词典——里面只有汉字互相解释,没有一张图。他查"红",词典说"像血或朱砂的颜色";他再查"血",词典说"人和动物体内的红色液体"。他在两个词之间无限循环,永远碰不到"红"这个感觉本身。他可以把关于红色的诗背得滚瓜烂熟、可以正确使用"红"这个字造句,但他从没见过红。
这就是纯文本 LLM 的处境。它对"红"的全部知识,就是"红"这个 token 在其他 token 中间的统计位置。这套知识足以让它写出漂亮的句子,但当你给它一张图问"这是不是红的",它没有任何依据。多模态的哲学意义就在这里:给语言符号接上感官经验,让"红"这个词第一次和真实的波长挂上钩。
想象一个巨大的快递分拣中心。每天进来的包裹五花八门:有装衣服的软袋、有装冰箱的大纸箱、有装液体的桶、有装鲜花的异形盒。形状、重量、材质全不一样,传送带怎么可能统一处理?
分拣中心的解法很朴素:在入口处给每个包裹贴一张统一格式的条码。不管你原来是软袋还是大纸箱,贴上条码之后,对整个分拣系统而言你就只是"一串数字"了。传送带、扫码枪、分拣机器人全都只认那串数字——它们从头到尾不需要知道箱子里装的是衣服还是冰箱。
更妙的是,这套条码是有含义的编排:前几位是省份,接着是城市,再接着是区。于是"条码上数字接近"就等价于"目的地地理位置接近"。系统只要按数字排序,就自动把去同一个城市的包裹归到了一起——它压根不用理解地理。
多模态 AI 干的就是这件事。入口处每种模态各有一台"贴条码机"(编码器):图片进图像编码器出来一串数字,文字进文本编码器出来一串数字,声音进音频编码器出来一串数字。贴完之后,所有模态的差异全部消失,下游只剩一件事:处理一串数字。
而"条码编排得有含义"这一点,对应的就是本章最核心的要求:语义相近的东西,数字必须也相近。一张猫的照片和"一只猫"这四个字,贴出来的条码必须挨得很近;和"一台推土机"贴出来的条码必须离得很远。这件事怎么做到,就是 §9.2 和 §9.3 的全部内容。
核心答案:所有模态都往同一个空间里塞
现在可以正面回答开篇那个问题了。文字、图片、声音凭什么能一起处理?因为它们在进入模型主体之前,都被各自的编码器转换成了同样格式的向量。
向量这个词我们在 §9.2 会详细讲,这里先给一句最粗糙的解释:向量说白了就是一串固定长度的小数,比如 512 个小数、或者 1536 个小数排成一排。你可以把它想成一个"超长的身份证号",只不过每一位不是 0~9 的整数,而是一个可以有小数点的数。
多模态模型的通用骨架(几乎所有模型都是这个结构)
┌─────────┐
│ 文字 │──→ 文本编码器 ──┐
└─────────┘ │
┌─────────┐ │ ┌────────────────┐
│ 图片 │──→ 图像编码器 ──┼──→ │ 共享向量空间 │
└─────────┘ │ │ (都是 512 或 │
┌─────────┐ │ │ 1536 个小数) │
│ 声音 │──→ 音频编码器 ──┤ └────────────────┘
└─────────┘ │ │
┌─────────┐ │ ↓
│ 视频 │──→ 视频编码器 ──┘ 下游任意任务:
└─────────┘ · 算相似度 → 跨模态检索
· 送进 LLM → 图文对话
各模态"贴条码" · 算距离 → 聚类去重
专用编码器各不相同 · 分类头 → 打标签
关键:编码器出口的向量长度必须一样,否则拼不起来。
这个"共享向量空间"有个正式名字:共享嵌入空间(Shared Embedding Space),也叫联合嵌入空间。换成大白话:就是让不同来源的东西住进同一个小区,用同一套门牌号系统。
为什么这一招这么有用?因为一旦所有东西都在同一个空间里了,"跨模态"这件听起来很玄的事,就退化成了小学生都会的"比大小"。用文字搜图片:把文字编成向量,把图库里每张图也编成向量,然后看谁的向量离文字向量最近。就这样。没有任何额外机制。
但请注意一个非常容易被跳过的前提:光"长度一样"是不够的,还必须"对齐"。你可以随便训两个编码器,让它们都输出 512 维向量,但如果它们是各自独立训练的,那猫的照片和"猫"这个字的向量之间没有任何关系——就像两个人各自发明了一套 512 位密码,长度一样,含义完全不通。让两套编码器的输出真正"对上号",需要专门的训练过程,这就是 §9.3 讲的 CLIP 干的事。
三种能力:理解、生成、和真正的融合
"多模态"是个被滥用的营销词。同一个标签下,实际能力差距巨大。这里按难度分成三档,你以后看产品宣传时就知道对方在说哪一档。
| 档次 | 能力描述 | 典型代表 | 你能做什么 |
|---|---|---|---|
| 一档 · 多模态理解 | 输入可以是图 + 文,输出只有文字 | LLaVA、BLIP-2、各家的"上传图片提问" | 拍照问作业、截图问报错、给图写说明 |
| 二档 · 多模态生成 | 输入文字,输出图 / 音 / 视频 | 文生图、文生视频、语音合成 | 画插图、配音、生成短片 |
| 三档 · 任意到任意 | 输入输出都可以是任意模态组合 | 实时语音对话、边看边说的助手 | 打断式对话、指着屏幕问"这个按钮干什么" |
为什么三档比一档难那么多?因为方向不同。第一档只需要"把别的模态翻译成文字世界的东西"——文字是终点,而文字模型已经很成熟了,所以只要在前面接一个翻译官就行,这也是为什么 2023 年一年之内涌现出几十个视觉语言模型。第二档要"从文字造出别的模态",需要一个能生成连续数值的解码器(第 5 章讲的扩散模型就是干这个的)。第三档最难,因为它要求同一个模型在同一次前向里既读得懂又造得出,而且还得实时——延迟一旦超过几百毫秒,对话的自然感就崩了。
把"实时"这个要求换算成可感知的量:人正常对话中,一方说完到另一方开口的间隔大约是 200 毫秒——比你眨一次眼(约 100 毫秒)的两倍还短。要在 200 毫秒内完成"听清、理解、想好、说出"这一整套,中间任何一个环节走弯路都来不及。所以真正的实时语音对话模型不能走"语音转文字 → LLM → 文字转语音"这条老路(三段串起来动辄两三秒),必须让声音直接进出同一个模型。这是 §9.5 的主题。
两条历史路线:先分家,后合并
多模态不是 2023 年才有的想法,它的历史几乎和 AI 一样长。但有意思的是,这个领域走过一个明显的"分久必合"的过程,值得完整讲一遍——因为理解了它为什么分家,你才明白今天的合并有多不容易。
分家阶段(1980 年代到 2017 年前后)。计算机视觉和自然语言处理是两个几乎不来往的学科。它们开不同的会(视觉的人去 CVPR、语言的人去 ACL)、用不同的数据集、发明不同的模型结构,甚至连"什么算好结果"的标准都不一样。视觉那边的主力工具是卷积神经网络(CNN,第 5 章讲过——说白了就是一个个小窗口在图上滑动找花纹),语言那边的主力是循环神经网络(RNN,一个字一个字往后传话)。两套工具的形状完全不同,没法互换零件。
转折点(2017 年,Transformer 出世)。第 7 章讲过的 Transformer 本来是为翻译设计的,但它有一个谁都没预料到的性质:它不在乎输入到底是什么。它只要求输入是"一串东西",然后让这串东西互相看一眼算注意力。一句话是一串词,那一张图能不能也切成一串小方块?这个念头直接催生了 2020 年的 ViT(Vision Transformer),把图片切成 16×16 的小方块当"词"来读——效果居然不输 CNN。
合并阶段(2021 年之后)。一旦视觉和语言用的是同一套骨架,融合的技术障碍就消失了。2021 年 CLIP 把图文对齐做通;2023 年 BLIP-2 和 LLaVA 演示了怎么把视觉编码器直接接到 LLM 上;之后各家旗舰模型全部标配多模态。这场合并的根本原因不是有人特别聪明,而是"两边终于用上了同一种积木"。
| 年份 | 关键事件 | 意义 |
|---|---|---|
| 2013 年 1 月 | word2vec(arXiv 1301.3781) | 证明"用一串数字表示词义"可行——一切嵌入的起点 |
| 2017 年 | Transformer | 提供了一个不挑输入类型的通用骨架 |
| 2018 年 7 月 | CPC 论文提出 InfoNCE(arXiv 1807.03748) | 对比学习的损失函数定型,是 CLIP 与 SimCLR 的共同祖先 |
| 2020 年 2 月 | SimCLR(arXiv 2002.05709) | 对比学习在纯视觉上打平监督学习,证明这条路走得通 |
| 2021 年 1 月 / 2 月 | CLIP(官方博客 1 月 5 日,arXiv 2103.00020 于 2 月 26 日) | 图文正式住进同一个空间,零样本分类成为现实 |
| 2023 年 1 月 | BLIP-2(arXiv 2301.12597) | 冻结的视觉编码器 + 冻结的 LLM,中间只训一个轻量连接器 |
| 2023 年 4 月 | LLaVA(arXiv 2304.08485) | 用纯语言版 GPT-4 造多模态指令数据,把视觉指令微调带火 |
注意 CLIP 那一行的日期写法。OpenAI 的官方博客是 2021 年 1 月 5 日发布的,arXiv 论文是同年 2 月 26 日才挂上去的——博客比论文早了一个半月。很多科普文章会把这两个日期搞混,写成"CLIP 发布于 2021 年 3 月"或"论文早于博客"。在写技术时间线时,"发布"和"论文上传"是两个不同的事件,最好分开标。
三种融合策略:早、中、晚
知道了"都变成向量"这个大方向,接下来的问题是:在哪一步把不同模态的向量掺到一起?答案有三种,教科书上叫早期融合、中期融合、晚期融合。这个分类很实用,因为它直接决定了系统能干什么、不能干什么。
| 策略 | 在哪一步掺 | 生活类比 | 优点 / 缺点 |
|---|---|---|---|
| 晚期融合 Late Fusion | 各模态各自算到最后,只把结论合并 | 三个医生各自看片、各自出诊断,最后投票 | 简单、模块可替换;但模态之间无法互相参考细节 |
| 中期融合 Intermediate Fusion | 各模态编码成向量后,在向量层面交互 | 三个医生各写一份摘要,然后坐在一起讨论摘要 | 当今主流;保留了各模态的专用编码器,又能真正交互 |
| 早期融合 Early Fusion | 在最原始的数据层面就拼在一起 | 把三张片子叠在一张灯箱上一起看 | 理论上信息损失最小;但数据形状差异大,工程上很难 |
今天绝大多数模型走的是中期融合。CLIP 是一种极简的中期融合——两个编码器各出一个向量,然后只做一次点积。LLaVA 和 BLIP-2 那类视觉语言模型也是中期融合——图像编码器出一串向量,经过一个连接器变成 LLM 认得的形式,然后和文字 token 拼在一起送进 LLM。
为什么早期融合这么难?还是回到那张形状表。文字是一串整数、图片是三百万个小数,你要在"原始数据层面拼起来",等于要求把一句话和一张照片首尾相连成一个数组——这个数组既有整数又有小数、既有长度 600 的部分又有长度 314 万的部分,模型压根不知道该怎么处理。相当于要把一份菜谱和一堆生菜直接搅在一起下锅——两样东西不在同一个抽象层次上。
多模态解锁了哪些具体本领
抽象讲完了,来看清单。下面每一条你大概都用过,但可能没意识到它们背后是同一套机制。
- 图文检索(双向)用一句话搜出图库里最匹配的图,或者反过来用一张图搜出最贴切的描述。手机相册里搜"海边"能搜到照片,就是这个——你的相册压根没被人工打标签。
- 零样本分类不训练就能识别新类别。给模型一张图和十个候选类名,它选出最像的那个。好处是加一个新类别只要多写一行字,不用重新收集样本、重新训练。
- 视觉问答(VQA)Visual Question Answering,"看图回答问题"。给一张图问"桌上有几个杯子""这个人在笑吗"。这需要真正的融合,晚期融合做不到。
- 图像描述生成(Captioning)给一张图自动写一句说明文字。这是无障碍场景的关键能力——视障用户靠它"读"图。
- OCR 与文档理解读扫描件、发票、表格、手写笔记。注意这比纯 OCR 难:不只要认出字,还要理解版面(哪个是表头、哪个是页脚)。
- 跨模态生成文生图、文生视频、文生音乐、图生视频。所有这些的共同前提都是"文字和目标模态已经对齐过"。
- 内容审核与去重判断一张图是否和某条违规描述相符,或者在千万张图里找出重复的。这是向量相似度最朴素的商业应用。
- 具身智能的感知层机器人要"看着做事",必须把摄像头画面和"把杯子放到桌上"这句指令对齐。多模态是机器人能听懂人话的前提。
把这个清单和纯文本模型的能力清单对照一下你会发现,多模态不是给 LLM 加了一个功能,而是把它能接触的世界扩大了一个数量级。
多模态模型笨在哪:三类真实短板
科普文章总爱吹能力,很少讲短板。但短板往往更能说明机制。这里给三条有确凿出处的。
短板一:训练数据里没有的,它就是不会。CLIP 在 MNIST 手写数字(一个 1998 年就有的最基础的数据集,就是手写的 0~9)上,零样本准确率只有 88%,而人类是 99.75%。这个反差很刺眼——一个能认出上千种物体、能理解复杂场景的模型,认手写数字居然不如小学生。原因很朴素:它的四亿张训练图是从互联网抓的自然照片,里面几乎没有"白底黑字的手写数字"这种东西。这件事说明所谓"通用视觉能力"是有边界的,边界就是训练数据的分布。
短板二:细粒度识别不行。CLIP 论文报告了一个名人识别实验:在 100 个候选人里选,top-1 准确率 59.2%;候选扩大到 1000 人,掉到 43.3%。候选数量翻十倍,准确率掉了十六个百分点。这是所有"靠相似度检索"的方法的通病——候选一多,向量空间里就挤,稍微一偏就选错。
短板三:它不理解"没有"和"数量"。这条不像前两条有确凿的论文数字支撑,但是多模态领域公认的通行观察:基于图文对训练的模型对否定("一只没有戴帽子的猫")和精确计数("恰好三个苹果")都很弱。原因也好理解:网上的图片说明文字很少写"这张图里没有大象",所以模型从没学过"没有"该对应什么视觉特征。相当于一个人只从菜市场的吆喝里学中文,他会听懂"新鲜的西红柿",但没人会吆喝"这里没有榴莲",所以他学不会"没有"。
常见误解一次澄清
| 常听到的说法 | 实际情况 |
|---|---|
| "多模态就是把几个模型拼起来" | 那叫多模型拼盘。真正的多模态是在同一个向量空间里融合,能回答跨模态的问题 |
| "模型看图是一个像素一个像素扫" | 不是。它先把图切成小方块(patch),再像读句子一样读这串方块(§9.4 详述) |
| "零样本就是模型自己无师自通了" | 不是。它只是在候选类名的向量里挑最近的那个——本质是检索,前提是这些概念在四亿图文对里出现过 |
| "能看图就说明它真的理解了" | 不一定。它在 MNIST 手写数字上零样本只有 88%,比人类 99.75% 差远了。能力边界就是数据分布边界 |
| "多模态是 2023 年才有的新方向" | 不是。图文联合的研究可追到十几年前,2021 年 CLIP 才是转折点,2023 年只是产品化爆发 |
| "CLIP 那篇论文用了 InfoNCE" | 严格说:CLIP 原文并没有用"InfoNCE"这个词,它写的是"对称交叉熵损失"。InfoNCE 这个名字出自 2018 年的 CPC 论文(§9.3 会讲清这条谱系) |
| "视频就是很多张图,处理起来差不多" | 差得远。一分钟 1080p 30 帧的原始像素是 112 亿个数值,而且时间顺序不能丢——所有视频模型都得先抽帧压缩 |
动手感受一下:向量长什么样
光说"变成一串数字"太抽象。下面这段代码不需要任何 AI 库,只用 numpy,就能让你亲眼看见"图片和文字变成同样形状的数组"这件事:
# 安装: pip install numpy
import numpy as np
# ---- 模拟:三种模态各自的原始数据形状 ----
text_ids = np.array([9906, 1917, 0]) # 3 个 token 编号(整数)
image_raw = np.random.randint(0, 256, (224, 224, 3)) # 一张 224x224 彩图
audio_raw = np.random.randn(16000) # 1 秒 16kHz 音频
print("文字原始形状:", text_ids.shape, text_ids.dtype)
print("图片原始形状:", image_raw.shape, "共", image_raw.size, "个数值")
print("音频原始形状:", audio_raw.shape, "共", audio_raw.size, "个采样点")
# 三个形状完全不一样,没法拼在一起。这就是多模态的核心难题。
# ---- 模拟:各配一个"编码器",统一压成 512 维向量 ----
D = 512 # 共享空间的维度,三个编码器必须一致
def fake_encoder(x, out_dim=D, seed=0):
"""假编码器:真实编码器是训练出来的神经网络,
这里只演示"输入形状随便、输出形状固定"这个性质。"""
rng = np.random.default_rng(seed)
flat = np.asarray(x, dtype=np.float64).ravel()
W = rng.standard_normal((len(flat), out_dim)) / np.sqrt(len(flat))
v = flat @ W
return v / np.linalg.norm(v) # 归一化成单位长度
v_text = fake_encoder(text_ids, seed=1)
v_image = fake_encoder(image_raw / 255.0, seed=2)
v_audio = fake_encoder(audio_raw, seed=3)
for name, v in [("文字", v_text), ("图片", v_image), ("音频", v_audio)]:
print(f"{name}向量:形状 {v.shape},长度 {np.linalg.norm(v):.4f},"
f"前 4 个数 {np.round(v[:4], 3)}")
# ---- 现在它们形状一样了,可以放进同一个矩阵一起算 ----
bank = np.stack([v_text, v_image, v_audio]) # (3, 512)
print("三种模态叠成一个矩阵:", bank.shape)
print("两两相似度矩阵:\n", np.round(bank @ bank.T, 3))
跑完你会看到关键的一幕:三种形状完全不同的原始数据,出口全是 (512,)。最后那个相似度矩阵对角线上全是 1(自己和自己完全一样),其他位置接近 0。
但请特别注意:这里的编码器是随机的假货,所以非对角线上那些数字毫无意义。真实模型和这段代码唯一的区别,就是那些随机矩阵 W 是从海量数据里训练出来的,训练目标就是让"猫的图"和"猫这个字"的相似度尽量高。形状统一是工程问题,一行代码解决;语义对齐才是真问题,需要四亿组数据和几百张显卡——这就是 §9.3 的主题。
写给要动手的人:入门路径建议
- 先玩 Embedding,别急着碰大模型调一次 embedding 接口拿到向量、算一次余弦相似度,你就完成了一个语义搜索的最小闭环。这件事一个下午能做完,收益却极大(§9.2)。
- 要做图文检索,直接用现成 CLIP 权重开源库
open_clip提供了各种规模的预训练权重,不用自己训。四亿组数据的训练成本你复现不起(§9.3 会给具体的显卡天数)。 - 分清"理解"和"生成"两条技术栈要做"看图回答",找视觉语言模型(LLaVA / BLIP-2 那一路);要做"文字画图",找扩散模型(第 5 章)。两者的论文、库、评测都不通用,别混着找资料。
- 评估要拿自己的数据跑公开榜单分数和你的实际场景经常差很远。尤其小心"训练数据分布外"的情况——MNIST 那个 88% 就是活教材。
- 图片是很贵的输入一张高分辨率图折算成 token 后可能相当于上千字。做成本预估时不能只按文字算,务必先跑一遍真实图片看用量。
模态就是"信息以什么形式存在":文字、图片、声音、视频各是一种。人天生是多模态的——你看见、听见、摸到的苹果在脑子里是同一个概念;而纯文本模型像一个只有词典没有窗户的人,他能把"红"用得很漂亮,却从没见过红。这就是符号接地问题。
四种模态在计算机里的形状天差地别:文字是一串离散整数,一张 1024×1024 的照片是 314 万个连续数值,一分钟 1080p 视频是 112 亿个数值。它们能被一起处理的唯一原因是:每种模态各配一个编码器,先统统翻译成同样长度的向量,之后下游只面对向量。那个向量落脚的地方叫共享嵌入空间。
但"长度一样"只是形状统一,不等于语义对齐——两套各自独立训练的编码器就像两套互不相通的密码。真正让"猫的照片"和"猫这个字"靠在一起,需要专门的对齐训练。融合的位置分早、中、晚三种,今天主流是中期融合:各模态先编码,再在向量层面交互。
也别把多模态神化。CLIP 在最简单的 MNIST 手写数字上零样本只有 88%(人类 99.75%),名人识别候选从 100 扩到 1000 时准确率从 59.2% 掉到 43.3%。能力边界就是训练数据的分布边界。
下一节我们钻进那个"共享空间"里面,看清 Embedding 到底是什么——它是本章的地基,也是整章里唯一一个你今天下午就能动手用上的东西。