0Prologue · Why this book
你学会了乘法,却没人告诉你在乘什么
为什么会算矩阵的人,依然看不懂 AI?
回想一下大学的线性代数考试。
你能在草稿纸上把两个 3×3 的矩阵乘出来:左边取一行,右边取一列,对应相乘再相加,一格一格填满。步骤熟练,结果正确,分数不低。
可如果监考老师在你交卷时多问一句:“你刚才算出来的这个矩阵,代表什么?”——大多数人会愣住。
这不怪你。我们学的是“怎么算”,很少有人讲“为什么要这样算”“算出来是什么东西”。这就像背熟了一本菜谱的每一个步骤,却从来没尝过这道菜。
0.1一个被放大的空白
在考场上,这个空白无关紧要。可今天,它被放大了。
新闻里说,某个大模型有“数千亿参数”;某块 GPU“每秒能做一千万亿次运算”;训练一个前沿模型“要用十万块 GPU、耗资数亿美元”。向量数据库、Transformer、Token、注意力机制……这些词每天都在你眼前经过。
如果顺着这些词一路往下挖,会发现它们最后都落在同一个地方:矩阵乘法。
于是,当年那个空白变成了今天的迷雾:你知道 AI 很重要,也知道它“本质上是矩阵运算”,但这句话对你来说是一句正确的废话——因为你不知道矩阵乘法本身意味着什么。
在往下读之前,试着用一句话回答:矩阵是什么?
把你的答案记在手边,不必追求正确。常见的答案是“一张由数字排成的表格”。这个答案不算错,但它只描述了矩阵长什么样,没说它做什么。读完第 1 章,再回来对照你写下的这句话。
0.2从最朴素的事实出发
要驱散这团迷雾,我们不从定义开始,而从最朴素的事实开始。这就是第一性原理:先找到那个不能再拆的最小事实,再一步步往上搭。
那么,AI 到底在做什么?我们用一连串问题把它逼出来。
AI 做的事情,最朴素地说是什么?
看一张照片,说出里面是猫还是狗;读一句话,接出下一句话;听一段录音,写出文字。
把照片、句子交给计算机之前,它们必须先变成什么?
数。照片是一大堆像素的亮度值,句子会被切成小块,每一块换成一个编号。
那 AI 给出的答案呢?“是猫”“下一个字是‘好’”,在计算机里又是什么?
也是数。比如“猫的可能性 0.97,狗 0.03”;或者词表里每个字各有一个分数,分数最高的那个就是下一个字。
所以,把所有花哨的外衣脱掉,AI 做的是什么?
输入一串数,输出另一串数。
那“学习”又是什么?
找到一个合适的“规则”,让它把输入的那串数,变成我们想要的那串数。
这就是全书的地基:
人工智能 = 从数据里学一个函数:一串数进,一串数出
“函数”这个词听上去很数学,其实它就是一台机器:喂进去一样东西,吐出来另一样东西。自动售货机是函数:投币加按钮,出来一罐饮料。
而本书要讲的矩阵,正是“把一串数变成另一串数”的机器里最简单、最好组合、最适合大规模计算的那一种。它简单到可以写在一张纸上;一层层叠起来,再在层与层之间加上一点点“折痕”,就能写诗、能编程。这不是巧合,后面八章会一步步说明为什么。
0.3本书怎样展开:一个黄金圈
全书按“为什么 → 怎么做 → 是什么”的顺序展开,也就是黄金圈:先理解为什么偏偏是矩阵,再看它怎样变成智能、怎样被算得飞快,最后落到具体的数字:一块 GPU 有多快,训练一个大模型要多少算力和数据。
图 0-1全书的黄金圈。越往里越根本:不先弄清“为什么是矩阵”,后面的 GPU 指标和算力数字就只是一堆没有意义的大数。
更重要的是,章与章之间不是并列的知识点,而是一条问题链:每一章回答一个问题,而这个问题恰好是上一章的结论引出来的。
| 章 | 要回答的问题 |
|---|---|
| 第 1 章 | 矩阵到底是什么? |
| 第 2 章 | 矩阵乘法代表什么?为什么最常见的运算是乘法? |
| 第 3 章 | 为什么科学研究、图像处理都离不开矩阵? |
| 第 4 章 | 机器学习和矩阵是什么关系? |
| 第 5 章 | Token、Transformer、向量数据库,为什么都是矩阵运算? |
| 第 6 章 | 矩阵运算为什么可以并行?GPU 为什么适合? |
| 第 7 章 | GPU 的性能用什么衡量? |
| 第 8 章 | 训练 GPT-5、GPT-6 这样的模型,需要多大算力、多少数据? |
如果某一章让你觉得突兀,回头看看它的第一段:那里写着它接住的是上一章的哪个问题。
0.4读完之后,你能做到什么
先把承诺说清楚。读完这本书,你将能够:
- 用一句话说清矩阵是什么,并且这句话能解释为什么它的乘法要“行乘列”;
- 解释为什么 AI 几乎全是矩阵乘法,从图片滤镜一路讲到大语言模型的每一个环节;
- 看懂一张 GPU 规格表,知道哪个数字是天花板、哪个数字是营销口径、哪个数字才决定你的模型跑多快;
- 在餐巾纸上估算训练一个大模型需要多少次运算、多少块 GPU、多少天、多少度电。
第四条听上去最难,其实它只需要一个乘法公式和几个你到第 8 章时已经熟悉的数字。
0.5怎样读这本书
这本书用了三个小工具,提前介绍一下,读的时候会轻松些。
第一,“停一下”
你会不时遇到标着“停一下”的问题框。请真的停下来,想十几秒,再展开答案。自己先想过的结论,比读到的结论牢靠得多。
第二,类比和它的边界
复杂的东西,我们会用面包店、调色盘、厨房、装配线来类比。但每个类比都有失效的地方,所以你还会看到“它是 / 它不是”的对照框,把概念的边界画清楚,免得类比把你带偏。
第三,三句反复出现的话
全书的核心可以浓缩成三句话。它们会在不同章节、从不同角度反复出现。第一次读到时你未必认同,读到第三次时,希望你已经能自己推出来:
- 矩阵是一个动作。
- 乘法就是加权混合。
- 每一格互不等待,所以能并行;真正的瓶颈常常不是算,而是搬。
这本书是
- 一张地图:从“一串数”走到“训练一个大模型”
- 建立直觉,并配上可核对的真实数字
- 只需要中学数学和一点点大学线代的记忆
这本书不是
- 线性代数教材:没有定理证明,不做习题
- 编程教程:不教你写 CUDA 或训练代码
- 对某个厂商或模型的背书:未公开的数据会明说“未公开”
本章带走
AI 做的事,是把一串数变成另一串数;矩阵,是完成这件事最简单、最能大规模复制的那台机器。
- 会算矩阵乘法却不懂 AI,是因为只学了“怎么算”,没学“在做什么”。
- 照片、句子、答案,进了计算机都是数。
- 全书是一条问题链:为什么是矩阵 → 它怎样变成智能 → 具体有多大。
于是,下一个问题如果 AI 的核心是“把一串数变成另一串数”,而矩阵是做这件事的机器,那么矩阵到底是什么?它和那张“数字排成的表格”是什么关系?
1Chapter 1 · What is a matrix
矩阵是什么:从一张表到一个动作
矩阵到底是什么?
上一章留下的问题:如果 AI 的核心是“把一串数变成另一串数”,而矩阵是做这件事的机器,那么矩阵到底是什么?它和那张“数字排成的表格”是什么关系?
教科书上的定义是这样的:由 m × n 个数排成的矩形阵列,叫作矩阵。
这句话完全正确,也几乎完全没用。它就像把汽车定义成“四个轮子加一个铁壳”——你看得出它长什么样,却看不出它能把你从家里带到公司。
本章要换一个角度:不问矩阵长什么样,而问矩阵做什么。为此,我们要先退一步,看清楚矩阵加工的原料是什么。
1.1先问向量:一串数能表示什么
上一章说,照片、句子、答案进了计算机都是“一串数”。这串数有个正式名字,叫向量。先别急着回忆“有大小有方向的量”这种物理课定义,我们从例子开始。
屏幕上的一个橙色像素,计算机怎么记住它?
记三个数:红多少、绿多少、蓝多少。比如 (240, 138, 36)。
人事系统里的一个员工呢?
身高、体重、年龄、工龄……也是一串数,比如 (175, 68, 35)。
地图上的一个点呢?
往东多少、往北多少,两个数,比如 (3, 2)。
这三件事毫不相干,它们在计算机里的共同点是什么?
都是一串有顺序的数。顺序不能乱:(240, 138, 36) 是橙色,把顺序倒过来 (36, 138, 240) 就成了蓝色。
图 1-1颜色、人、位置,性质完全不同,进了计算机却是同一种东西:向量。向量里的每个数都有固定的含义,所以顺序不能乱。
所以,向量最朴素的定义是:用一串有顺序的数,描述一个东西。数的个数叫作维度。颜色是 3 维,平面上的点是 2 维。到第 5 章你会看到,大语言模型里的一个词,是一个几千维的向量。
两维的向量可以画成一根从原点出发的箭头:往东 3 格、往北 2 格。三维的也能想象成空间里的箭头。几千维的画不出来,但没关系,计算机不需要“看见”它,只需要按同样的规则去算。
向量像一个地址。“3 号楼 2 单元 501”也是一串有顺序的数,换个顺序就是另一户人家。维度越多,地址越精细,能区分的东西也越多。
向量是
- 任何能用一串有顺序的数描述的东西
- 可以想象成“从原点出发的箭头”或“空间里的一个点”
向量不一定是
- 物理课里的力或速度(那只是它的一个例子)
- 你能画出来的东西(几千维的向量画不出来,但照样能算)
原料清楚了。接下来的问题就是:矩阵拿这些向量做什么?
1.2矩阵的三张脸
同一个矩阵,在不同场合会被读成三种完全不同的东西。多数人的困惑,来自只认识了其中一张脸。
图 1-2矩阵的三张脸。左边是它的“存法”,右边是它的一种“用法”,中间才是它最本质的身份:一台把向量变成向量的机器。
| 面孔 | 怎么读 | 例子 | 本书在哪里用到 |
|---|---|---|---|
| 表格 | 一堆排好的数,存起来 | 一张 1920×1080 的彩色照片 ≈ 622 万个数 | 第 3 章(图像) |
| 动作 | 一台机器:向量进,向量出 | 旋转、拉伸、神经网络的一层 | 全书主线 |
| 关系 | 第 i 行第 j 列 = i 和 j 有多相关 | 社交网络、网页链接、注意力权重 | 第 3、5 章 |
第一张脸最直观,所以大家最先记住它:数字照片存在电脑里,确实就是一张(或三张叠在一起的)巨大数字表格。但这只是矩阵的存法,不是它的意义。
一本小说,放在书架上是“一摞印了字的纸”,读进脑子里是“一个故事”。“一摞纸”这个描述没错,但如果你只知道这一点,就永远理解不了为什么有人会为一本书流泪。矩阵的“表格”和“动作”,就是“一摞纸”和“一个故事”的关系。
1.3动作:一个 2×2 矩阵能对平面做什么
现在把注意力放到第二张脸上。我们从最小的情况出发:一台机器,输入一个平面上的点 (x, y),输出另一个点 (x′, y′)。
这台机器的规则可以千奇百怪。但如果要求它最简单——只准做乘法和加法,不准平方、不准开根号、不准查表——那么每个输出只能是输入的“加权和”:
x′ = a·x + b·y y′ = c·x + d·y每个输出,都是输入按某种权重加起来
整台机器由四个数 a、b、c、d 决定。把它们按位置排成一个方块:
| a | b |
| c | d |
这就是一个矩阵。请注意刚才发生了什么:那张“数字表格”,本来就是这台机器的说明书。第一张脸和第二张脸在这里接上了:表格里的每个数,是机器的一个旋钮。
可是,看着 a、b、c、d 四个数,你能想象出这台机器对平面做了什么吗?很难。我们需要一个更好的看法。
先挑两个最简单的输入试试。把 î = (1, 0),也就是“往东一格”,送进机器,出来的是什么?
代进去:x′ = a·1 + b·0 = a,y′ = c·1 + d·0 = c。出来的是 (a, c)。
这正好是矩阵的哪一部分?
第一列。
那 ĵ = (0, 1),“往北一格”呢?
出来的是 (b, d),第二列。
再试一个普通的点 v = (1, 2)。它可以怎样用 î 和 ĵ 拼出来?
往东 1 格、往北 2 格:v = 1·î + 2·ĵ。
既然机器只做“加权和”,那 v 会被送到哪里?
送到 1 份“î 的新位置”加上 2 份“ĵ 的新位置”。也就是说,只要知道两列,就知道任何点的去向。
这是本章最重要的一个发现,值得单独写出来:
矩阵的第一列,是 î 的新家;第二列,是 ĵ 的新家
平面上任何一个点,都是“若干个 î 加若干个 ĵ”。所以两根基向量搬到哪里,整张平面就被带到哪里。我们用一个具体的矩阵看一眼:
| 2 | −1 |
| 1 | 1 |
图 1-3左:标准方格,v = 1·î + 2·ĵ。右:乘以 M 之后,î 被搬到 (2, 1)(第一列),ĵ 被搬到 (−1, 1)(第二列)。v 不需要单独计算,它跟着两根箭头走:1·(2, 1) + 2·(−1, 1) = (0, 3)。
现在再看教科书上“矩阵乘向量”的算法——第一行点乘向量得第一个数,第二行点乘向量得第二个数——你会发现它和“按列拼接”算出来的结果一模一样:
第一行:2×1 + (−1)×2 = 0 第二行:1×1 + 1×2 = 3按行算和按列拼,是同一件事的两种读法(第 2 章会细讲)
区别在于:按行算,你得到一个数字;按列看,你看到一个动作。这就是那个缺失的“意义”。
想象一张印着方格的橡皮膜,原点用图钉钉死。你用两根手指分别捏住“往东一格”和“往北一格”的两个格点,把它们拖到新位置。整张橡皮膜都会跟着变形,而且格线始终是直的、平行的。矩阵,就是记录“两根手指拖到了哪里”的那张便签。
矩阵 [[0, −1], [1, 0]](第一列 (0, 1),第二列 (−1, 0))对平面做了什么?
看两列:î 从“东”被搬到“北”,ĵ 从“北”被搬到“西”。两根箭头都逆时针转了 90°,整张平面也就逆时针转了 90°。不用算任何一个点,只看两列就读出了动作。(网页版读者可以在封面的方格实验室里点“旋转”按钮验证。)
1.4什么样的动作算“线性”
刚才我们给机器加了一条限制:只准做加权和。这条限制有一个名字,叫线性。它在几何上表现为三条规矩:
- 原点不动。输入 (0, 0),加权和还是 (0, 0)。
- 直线还是直线。格线可以被拉斜、拉长,但不会被弄弯。
- 平行等距的格线,依然平行等距。方格可以变成平行四边形,但所有格子变得一样。
满足这三条的动作,都能用一个矩阵写出来;不满足的,任何矩阵都做不到。
图 1-4五种矩阵能做的动作,和一种做不到的。每个矩阵下方,朱橙的第一列就是 î 的去向,钴蓝的第二列就是 ĵ 的去向。“压扁”把整张平面压到一条线上;“哈哈镜”把直线弄弯了,它不是线性的。
线性变换(矩阵能做)
- 拉伸、压缩、旋转、剪切、镜像
- 把高维压到低维(投影),或把低维放进高维
- 以上任意几种连着做
不是线性变换(矩阵做不到)
- 哈哈镜:把直线弄弯
- 平移:把原点挪走(需要额外的“加一个常数”)
- “小于 0 就变成 0”这种带拐点的规则
你可能已经起了疑心:真实世界到处是曲线,只会“拉直线”的矩阵能有多大用处?这个问题会在后面得到两次回答。第 3 章会告诉你,任何光滑的曲线,放大到足够近看都是直的;第 4 章会告诉你,在矩阵之间加一道小小的“折痕”,就能拼出任意复杂的形状。
一个顺手的收获:面积放大了几倍
既然所有格子都变得一样,那就可以问:每个小方格的面积被放大了几倍?答案藏在四个数里:
面积倍数 = |a·d − b·c|a·d − b·c 叫作行列式;负号表示平面被翻了个面
对图 1-3 里的 M,2×1 − (−1)×1 = 3,每个方格都变成了原来的 3 倍大。网页版封面实验室里实时显示的“面积 ×”,就是这个数。
最要紧的是它等于 0 的时候,比如图 1-4 里的“压扁”。整张平面被压成一条线,面积归零。这意味着许多不同的点被压到了同一个位置,信息丢了,而且再也找不回来。
行列式为 0 的矩阵,就像给一个立体的物体拍影子。从一个人的影子,你猜不出他是胖是瘦、面朝哪边。影子不是错的,只是丢掉了一个维度的信息。第 3 章讲图像压缩(低秩近似)时,你会再次看到这种“有意识地丢信息”。
1.5更高维:画不出来,但道理一样
平面上的一切,都能原样搬到更高的维度:
- 一个 3×3 矩阵,是对三维空间的动作。它有三列,分别记录三根基向量(东、北、上)的新家。
- 一个 4096×4096 的矩阵,是对 4096 维空间的动作。你画不出来,但它照样是“4096 根基向量各自搬去哪里”,每个输出照样是输入的加权和。
矩阵也不一定是方的。一个 3 行 2 列的矩阵,吃进 2 个数、吐出 3 个数,它把平面“放进”三维空间;一个 2 行 3 列的矩阵反过来,把三维空间压成平面,就像相机把立体世界拍成照片。
m 行 n 列的矩阵 = 一台“吃进 n 个数、吐出 m 个数”的机器列数 = 输入的维度;行数 = 输出的维度
这一条对 AI 很重要。神经网络的每一层,本质上就是一台这样的机器:比如吃进 4096 个数,吐出 14336 个数,或者反过来。维度的升降,就是信息被展开、被压缩的过程。
一张 1920×1080 的照片存成矩阵,它的“动作”是什么?
多数时候,它没有动作——它只是一张被存起来的数字表格(第一张脸)。“把照片看成矩阵”和“把矩阵看成动作”是两回事。照片是被加工的原料;拿来加工照片的滤镜、旋转、压缩,才是动作。分清原料和机器,是读懂后面所有章节的前提。
1.6第三张脸:关系
最后简单认识一下第三张脸。假设有 3 个人:甲、乙、丙。做一张 3×3 的表格,第 i 行第 j 列写“i 和 j 是不是朋友”,是就写 1,不是就写 0。这张表也是一个矩阵,它记录的是关系。
关系矩阵无处不在:社交网络里谁关注了谁,互联网上哪个网页链接到哪个网页,城市之间两两的距离。第 3 章你会看到,Google 早年正是把整个网络的链接写成一个巨大的关系矩阵,才算出了网页的排名。
到了第 5 章,这张脸会以一个更重要的身份回来:大语言模型读一句话时,会为句子里的每两个词打一个“相关度”分数,排成一张 n×n 的关系表。那就是著名的注意力。
本章带走
矩阵是一个动作:它把向量变成向量;它的每一列,记录一根基向量被搬去了哪里。
- 向量 = 用一串有顺序的数描述一个东西;数的个数是维度。
- 矩阵有三张脸:表格(存法)、动作(本质)、关系(一种用法)。
- “线性”意味着原点不动、直线不弯、格子一样;矩阵能做的只有线性动作。
- 行列式是面积倍数;它为 0 时信息被压扁丢失,无法还原。
- m×n 的矩阵,是一台吃进 n 个数、吐出 m 个数的机器。
于是,下一个问题如果一个矩阵是一个动作,那两个矩阵相乘又是什么?是两个动作连着做吗?那种“一行乘一列、对应相乘再相加”的算法,究竟在算什么?为什么在所有矩阵运算里,偏偏是乘法最常见?
2Chapter 2 · What multiplication means
乘法到底在乘什么
矩阵乘法代表什么?为什么最常见的运算是乘法?
上一章留下的问题:如果一个矩阵是一个动作,那两个矩阵相乘又是什么?“一行乘一列、对应相乘再相加”究竟在算什么?为什么偏偏是乘法最常见?
上一章我们从几何出发,看到矩阵是一个动作。这一章换一个完全生活化的起点:一家面包店的账本。你会发现,同一个“行乘列”,在面包店里、在推荐系统里、在几何里,讲的是同一件事。
本章的结论先放在这里,读完再回头看:
乘法就是加权混合
2.1从一家面包店开始
你开了一家小面包店,卖三样东西:面包、蛋糕、饼干。每样东西用到三种原料:面粉、黄油、鸡蛋。配方是这样的:
| 面粉(kg) | 黄油(kg) | 鸡蛋(个) | |
|---|---|---|---|
| 面包 | 0.5 | 0.05 | 1 |
| 蛋糕 | 0.3 | 0.2 | 4 |
| 饼干 | 0.2 | 0.1 | 1 |
今天的原料价格是:面粉 6 元/kg,黄油 80 元/kg,鸡蛋 1.5 元/个。问:每样点心的原料成本是多少?
一个蛋糕的成本怎么算?
面粉 0.3 kg × 6 元,加黄油 0.2 kg × 80 元,加鸡蛋 4 个 × 1.5 元:1.8 + 16 + 6 = 23.8 元。
你用了配方表里的哪些数?
蛋糕那一行,和价格那一列。对应位置相乘,再全部加起来。
面包和饼干呢?
同样的算法,换成各自那一行:面包 8.5 元,饼干 10.7 元。
那你刚才做的,是不是就是“矩阵乘以向量”?
……是的。配方表是矩阵,价格是向量,结果是每样点心的成本。
图 2-1面包店的矩阵乘法。朱橙的一行(蛋糕的配方)和钴蓝的一列(原料单价)对应相乘再相加,得到朱橙底色的那一格。
“一行乘一列”在这里的意义一目了然:用一组数当权重,把另一组数加起来。蛋糕的配方,就是给三种原料价格分配的权重:黄油的权重 0.2 看着小,但黄油贵,它贡献了 16 元,是成本的大头。
这种“按权重加起来”的计算叫作加权求和,它有一个专门的名字:点积。矩阵乘以向量,就是一口气做很多次点积:每一行和向量做一次,得到一个结果。
黄油涨价到 100 元/kg,三样点心的成本怎么变?需要重新算哪些格子?
配方矩阵不变,只换价格向量:面包 +1 元,蛋糕 +4 元,饼干 +2 元。每样点心的涨幅等于它的黄油用量乘以 20 元,黄油用得越多的点心受影响越大。
这里有一个很重要的角色分工:矩阵是固定的“配方”,向量是不断变化的“输入”。神经网络也是这样分工的:训练好的权重矩阵固定不变,每次输入的数据不同。
2.2点积:一种打分方式
点积不只能算钱。换一个场景,它还能衡量两样东西有多“对味”。
假设我们只用两个数描述口味:甜的程度、辣的程度。你是 (1, 3):不太爱甜,很爱辣。三道菜分别是:火锅 (0.5, 3.5),提拉米苏蛋糕 (3.5, 0.2),白粥 (0.5, 0.3)。你会更喜欢哪道菜?
用点积打分:你的每个口味维度乘以菜在这个维度上的程度,再加起来。
图 2-2点积是一种打分。火锅的箭头和你的箭头几乎同向,得分最高;蛋糕方向偏得远,得分低;白粥方向不算差,但箭头太短(味道太淡),得分也低。
图上能看出点积的几何意义:两根箭头方向越一致、长度越长,点积越大;方向垂直时点积为 0,表示“毫不相干”;方向相反时点积为负,表示“正好相反”。
这个看起来很朴素的打分方式,是整个 AI 世界最常用的“相似度尺子”:
- 视频网站给你推荐节目:你的兴趣向量和节目的特征向量做点积,分高的排前面;
- 搜索引擎和向量数据库找相关文档:问题向量和文档向量做点积(第 5 章);
- 大语言模型的“注意力”:每个词和其他所有词做点积,看谁跟自己最相关(第 5 章)。
点积是
- 加权求和:一组数给另一组数当权重
- 一种打分:方向越一致,分越高
点积不是
- “对应位置相乘”本身(那只是第一步,还要全部加起来)
- 一个完美的“相似”定义:长度也会影响分数,所以实际常先把向量长度统一(余弦相似度)
2.3矩阵乘向量的两种读法
现在回到上一章的几何。同一个“矩阵乘向量”,其实可以从两个方向去读,而这两种读法对应着两种直觉。
用一个 3 行 2 列的矩阵 A 乘以向量 x = (3, 2):
| 2 | 1 |
| 1 | 3 |
| 0 | 1 |
| 3 |
| 2 |
| 8 |
| 9 |
| 2 |
读法一:按行读——打分
每一行和 x 做一次点积,得到一个输出:2×3 + 1×2 = 8,1×3 + 3×2 = 9,0×3 + 1×2 = 2。就像三位评委,各自拿着自己的评分标准(一行),给同一个选手(x)打分。面包店算成本,用的就是这种读法。
读法二:按列读——调配
把 x 里的数当作“用量”:取 3 份第一列,加 2 份第二列。3×(2, 1, 0) + 2×(1, 3, 1) = (6, 3, 0) + (2, 6, 2) = (8, 9, 2)。结果完全一样。上一章“î 去哪、ĵ 去哪”用的就是这种读法。
图 2-3矩阵乘向量的两种读法。左边按行,每个输出是一次点积;右边按列,输出是各列按输入的数量调配出来的“混合物”:朱橙是第一列的贡献,钴蓝是第二列的贡献。
按列读,就像调鸡尾酒。矩阵的每一列是一种基酒,自带固定的风味配比;输入向量是酒单上写的“几份这个、几份那个”;输出就是调出来的那杯酒。同样几瓶基酒,换一张酒单,就调出一杯新酒。
两种读法各有用处:想知道“某个输出是怎么来的”,按行读;想知道“整个动作把空间变成什么样”,按列读。它们算出的数永远一样,因为每一格都是同样的乘法与加法,只是加的顺序不同。
无论哪种读法,核心都是同一件事:把一组东西按权重混合起来。本章开头的口号,在这里第一次有了完整的含义。
2.4矩阵乘矩阵:两个动作连着做
现在可以回答“两个矩阵相乘是什么”了。我们不背规则,而是问一个问题,让规则自己冒出来。
假设先对平面做动作 B,再做动作 A。整体效果还是线性的吗?
是。两次都不弯曲直线,连着做也不会弯。所以整体效果也能写成一个矩阵,我们叫它 C。
要写出 C,按上一章的方法,需要知道什么?
两根基向量最终去了哪里。那就是 C 的两列。
î 先经过 B,去了哪里?
B 的第一列。
然后这根箭头再经过 A 呢?
就是“A 乘以 B 的第一列”:用 A 的每一行,去和 B 的第一列做点积。
所以 C 第 i 行第 j 列的那个数,是怎么算的?
A 的第 i 行,点乘 B 的第 j 列。——这不就是“行乘列”吗。
这就是“行乘列”的来历。它不是数学家随手定的规矩,而是为了让“两个动作连着做”能写成一个矩阵,被逼出来的唯一答案。
矩阵 × 矩阵 = 两个动作连着做
这也解释了一个曾让很多人困惑的性质:矩阵乘法不能随便交换顺序,AB 一般不等于 BA。因为动作的顺序本来就重要。
图 2-4同一面小旗,“先旋转再剪切”和“先剪切再旋转”得到两种不同的结果。注意写法:S·R 表示先做 R 再做 S,因为向量写在最右边,离它最近的矩阵最先作用。
先穿袜子再穿鞋,和先穿鞋再穿袜子,用的是同样两个动作,结果完全不同。矩阵乘法的“不交换”,就是动作顺序的记录。
一个神经网络有 3 层,每层是一个矩阵 W₁、W₂、W₃。输入 x 依次经过三层,这个过程该怎么写?
W₃·W₂·W₁·x,从右往左读:先经过第一层,最后经过第三层。
这里埋着一个问题:既然三个矩阵连乘还是一个矩阵,那三层和一层有什么区别?这个问题要到第 4 章才回答,答案会告诉你神经网络为什么需要“折痕”。
再看一个完整的例子,体会“每一格 = 一行 · 一列”:
| 2 | 1 |
| 1 | 3 |
| 0 | 1 |
| 3 | 1 |
| 2 | 0 |
| 8 | 2 |
| 9 | 1 |
| 2 | 0 |
例如右上角的 2 = 第一行 (2, 1) · 第二列 (1, 0) = 2×1 + 1×0。网页版在下方提供了一个可以点选格子的演示,会高亮对应的行和列。
2.5为什么最常见的是乘法
矩阵有加法、有减法、有转置、有求逆,为什么在 AI 和科学计算里,出场最多的偏偏是乘法?
先看加法做了什么。两个矩阵相加,是对应位置的数各自相加:第 1 行第 1 列只和第 1 行第 1 列相遇。加法里,每个数只和它的“同位置邻居”打交道。
再看乘法。输出的每一个数,都是一整行和一整列的加权混合:每个输入都有机会影响每个输出。
如果要设计一台机器,让“输入的任何一部分”都能影响“输出的任何一部分”,最简单的做法是什么?
给每一对(输入,输出)接一根线,线上标一个权重,每个输出把所有连进来的线加起来。
这张“接线图”写下来是什么?
一个矩阵。第 i 行第 j 列,就是“第 j 个输入接到第 i 个输出的那根线有多粗”。
而让信号沿着这些线流过去,就是……
矩阵乘法。
这就是乘法无处不在的根本原因:乘法是“接线”。凡是需要让信息彼此混合、相互影响的地方,就需要乘法。加法只能把两份信息叠在一起,乘法才能把信息重新组合。第 4 章你会看到,神经网络的“一层”,就是这样一张接线图。
加法像把两杯水倒进一个桶里:水多了,但每一滴还是原来那一滴。乘法像一个调音台:每路输入的声音,按不同的音量推子送到每一个输出声道,每个声道里都混着所有乐器的声音。
乘法常见还有一个更“物质”的原因:它贵。把两个 n×n 的矩阵相加,只需要 n² 次加法;相乘,则每一格要做 n 次乘法和 n 次加法,总计约 2n³ 次运算。
| n | 相加(n²) | 相乘(约 2n³) | 乘法是加法的 |
|---|---|---|---|
| 1,000 | 100 万 | 20 亿 | 2,000 倍 |
| 4,096 | 约 1,678 万 | 约 1,374 亿 | 8,192 倍 |
| 16,384 | 约 2.7 亿 | 约 8.8 万亿 | 32,768 倍 |
4096、16384 是大语言模型里常见的矩阵边长。乘法与加法的运算量之比恰好是 2n,矩阵越大,差距越悬殊。
所以,“AI 的算力都花在矩阵乘法上”这句话,背后是简单的算术:其他运算(加法、激活函数、归一化)的运算量只和 n² 成正比,而矩阵乘法和 n³ 成正比。n 一大,乘法就压倒一切。这也是为什么 GPU 厂商拼命优化的,就是矩阵乘法这一件事(第 6、7 章)。
“矩阵乘法”是
- 行乘列:一次又一次的点积
- 两个动作的连续执行
- 一张接线图:每个输入影响每个输出
“矩阵乘法”不是
- 对应位置相乘(那叫逐元素乘法,一种更简单的运算)
- 可以随便交换顺序的普通乘法
本章带走
乘法就是加权混合:一行乘一列是一次加权求和;矩阵乘矩阵是两个动作连着做。
- 点积 = 加权求和 = 打分:方向越一致,分越高。它是推荐、搜索、注意力共用的尺子。
- 矩阵乘向量有两种读法:按行是“打分”,按列是“调配”,结果相同。
- “行乘列”是让“连着做两个动作”成立的唯一规则,所以顺序不能随便交换。
- 乘法最常见,因为它是“接线”,让每个输入影响每个输出;它也最贵,运算量随 n³ 增长。
于是,下一个问题面包店、口味、几何,都能写成“加权混合”。可这是巧合吗?为什么物理、经济、图像处理、网页搜索……这么多看起来毫不相干的问题,都能写成矩阵乘法?
3Chapter 3 · Why the world runs on matrices
为什么世界离不开矩阵
为什么现代科学、图像处理都离不开矩阵?
上一章留下的问题:面包店、口味、几何,都能写成“加权混合”。这是巧合吗?为什么物理、经济、图像、搜索……这么多毫不相干的问题,都能写成矩阵乘法?
先给出答案,再逐条论证:不是巧合。矩阵之所以无处不在,有三个层层递进的原因。
- 很多现象本来就是线性的:原因叠加,效果也叠加。
- 不是线性的现象,放大看也是线性的:光滑的世界,局部都是直的。
- 一旦写成矩阵,就能交给机器:矩阵是问题和计算机之间的通用接口。
第一条解释“为什么能写”,第二条解释“为什么到处都能写”,第三条解释“为什么大家都愿意这么写”。
3.1叠加:可以拆开算的世界
两个人一起推一辆车,一个人向前推 30 牛,另一个人也向前推 20 牛。车受到的推力是多少?
50 牛。两个力直接加起来。
如果第一个人推的力气翻倍呢?
他那一份的效果也翻倍。
音箱同时放一段人声和一段钢琴,空气里的振动是什么?
人声的振动加上钢琴的振动。所以降噪耳机能把噪声“减掉”,而不伤到音乐。
这些现象有什么共同点?
几个原因同时作用的效果,等于各自效果之和;原因放大几倍,效果也放大几倍。
这个性质叫叠加原理,它就是第 1 章那个“线性”的物理版本。第 1 章说,矩阵能做的动作只有线性动作;这里反过来:凡是满足叠加原理的系统,都可以用矩阵来描述。
叠加原理珍贵在哪里?它让复杂的问题可以拆开。一段复杂的声音,拆成许多简单的纯音分别处理,再加回去;一座桥上的许多辆车,每辆车引起的形变分别算,再叠加。人类处理复杂问题的基本策略是“分而治之”,而线性系统是唯一一种保证能分、分了还能合回去的系统。
线性系统像一份按人头 AA 的账单:每个人点了什么、各付多少,可以分开算,最后加起来一分不差。非线性系统像“满 300 减 50”:谁先下单、怎么凑单都会影响总价,没法简单拆开算。
3.2光滑的世界,局部是直的
可是,真实世界大多不是线性的。弹簧拉得太长会变形,病毒传播越来越快,天气更是出了名的复杂。第 1 章留下的那个疑问又冒出来了:只会“拉直线”的矩阵,凭什么描述一个弯弯曲曲的世界?
答案藏在一个你每天都在经历的事实里:地球是圆的,但你脚下是平的。
站在操场上,你完全感觉不到地面的弧度,因为你只看到了很小的一块。任何一条光滑的曲线也是这样:放得足够大,它就和一条直线分不出来。
图 3-1同一条曲线,在蓝点附近逐级放大。放大 10 倍时,曲线和虚线(切线)还略有分离;放大 100 倍,已经分不开;放大 1000 倍,曲线就是一条直线。蓝框表示下一级放大的范围。
那条在局部“代替”曲线的直线,就是中学学过的切线,它的斜率就是导数。这是微积分最核心的思想:在一点附近,用线性近似非线性。
一条曲线只有一个输入、一个输出,它的局部近似是一个数(斜率)。那一个有很多输入、很多输出的复杂系统呢?比如一架飞机,输入是几十个舵面角度,输出是几十个姿态参数。它在某个状态附近的“局部近似”,就是一张表:每个输入变一点点,每个输出各变多少。这张表是一个矩阵,有个专门的名字,叫雅可比矩阵。
于是,科学计算有了一个通用套路:
- 在当前状态附近,把复杂系统近似成一个矩阵;
- 用矩阵算出下一小步;
- 走到新状态,重新近似,再走一步。
天气预报、飞行控制、桥梁受力、芯片散热的仿真,背后都在反复做这件事:把大问题切成很多小块,每一小块在局部当作线性处理,最后变成一个巨大的矩阵方程,交给计算机去解。
“局部线性”是
- 在一个足够小的范围内,用直线代替曲线
- 一步一步走,每一步重新近似
“局部线性”不是
- 认为整个世界是线性的
- 一劳永逸:走远了,近似就会失效,必须重新算
第 4 章会讲神经网络的训练:每次只把参数调一小步。结合“局部线性”,你能猜到为什么只能走一小步吗?
因为训练时,我们只知道“当前位置附近”的坡度,这正是局部的线性近似。步子迈得太大,就走出了近似有效的范围,可能越走越糟。这就是训练里“学习率”不能太大的直觉来源。
3.3图片处理:四种加权混合
现在来看你最熟悉的例子:图片。一张照片存进电脑,是一张(彩色的话是三张叠在一起的)数字表格,这是矩阵的第一张脸。而对照片做的几乎所有处理,都是矩阵的第二张脸:动作。
第一种:彩色变黑白
把一个彩色像素 (R, G, B) 变成一个灰度值,常用的公式(来自电视标准 ITU-R BT.601)是:
Y = 0.299·R + 0.587·G + 0.114·B一个 1 行 3 列的矩阵:吃进 3 个数,吐出 1 个数
这是一次点积,和面包店算成本一模一样。绿色的权重最大,因为人眼对绿光最敏感。
第二种:调色滤镜
手机里的“怀旧”“冷色调”滤镜,很多就是一个 3×3 的矩阵:新的红 = 原来的红、绿、蓝按某种比例混合,新的绿和新的蓝也一样。第 2 章的“调鸡尾酒”,在这里是字面意思:把三种颜色重新调配。
第三种:旋转与缩放
把照片旋转 30°、放大 2 倍,是对每个像素的坐标做一次 2×2 矩阵变换——正是第 1 章图 1-4 里的动作。
第四种:模糊、锐化、找边缘
这一种最有意思。它不再只看一个像素,而是看一个像素和它的邻居。用一个 3×3 的小权重表(叫卷积核)对准图片上的一个窗口,九个像素和九个权重对应相乘再相加,得到一个新像素;然后窗口滑到下一个位置,再算一次。
图 3-2用卷积核找边缘。卷积核左列是 −1、右列是 +1,意思是“右边的亮度减去左边的亮度”。在一片平坦的区域,左右相等,结果是 0;在明暗交界处,差值很大。图像的边缘就这样被计算出来了。
换一组权重,同一个过程就变成了别的效果:九个权重都是 1/9,结果是周围九个像素的平均值,图片变模糊;中间权重大、四周为负,差异被放大,图片变锐利。
| 操作 | 矩阵形状 | 每个输出是谁的加权和 |
|---|---|---|
| 彩色变黑白 | 1×3 | 同一个像素的红、绿、蓝 |
| 调色滤镜 | 3×3 | 同一个像素的红、绿、蓝 |
| 旋转、缩放 | 2×2 | 一个点的横、纵坐标 |
| 模糊、锐化、找边缘 | 3×3 卷积核(可改写为大矩阵) | 一个像素和它周围的邻居 |
你可能会问:卷积是“滑动窗口”,看起来不像矩阵乘法啊?其实可以把它改写成矩阵乘法:把每个 3×3 窗口的 9 个数摊平成一行,所有窗口叠成一个大矩阵,再乘以摊平成 9 个数的卷积核,一次就算出所有输出。这个技巧有个名字叫 im2col。它看起来多占了内存,却让卷积可以直接调用高度优化的矩阵乘法,反而更快。
这件事本身就是一个信号:人们宁可多花内存,也要把问题改写成矩阵乘法。为什么?3.5 节会回答。
3.4秩:一张图里有多少“独立的花样”
矩阵还有一个性质,初学线代时常被一带而过,在 AI 时代却变得很重要:秩。
先看一个最简单的矩阵:用一列数 (1, 2, 3) 乘以一行数 (1, 1, 2),得到一个 3×3 的表:第一行 (1, 1, 2),第二行 (2, 2, 4),第三行 (3, 3, 6)。九个数,但每一行都只是同一行的倍数,真正的信息只有“一列加一行”共 6 个数。这种“一列乘一行”拼出来的矩阵,秩是 1。
任何一个矩阵,都可以拆成若干个“秩 1 的花样”叠加起来,而且可以按重要程度排好序。这个拆法叫奇异值分解(SVD)。只保留最重要的前几个花样,就能用很少的数字,近似还原一个大矩阵。
图 3-3用 SVD 压缩一张 20×20 的笑脸。只保留 1 个花样时,只剩横竖条纹的格子布;保留 4 个,笑脸已经认得出来;保留 6 个,和原图相差无几,却只需要存大约 240 个数,而原图是 400 个。
秩的含义可以一句话说清:一个矩阵的秩,是它里面真正独立的“花样”有几种。一个 4096×4096 的矩阵有 1600 多万个数,但如果它的秩只有 16,那它真正携带的信息,只相当于 16 列加 16 行。
一家奶茶店的菜单上有 100 种饮品,但仔细一看,不过是 5 种茶底、4 种小料、3 种甜度的组合。菜单很长,“秩”很低。你只要记住这 12 个基本选项,就能写出整张菜单。
这个概念在大模型时代格外有用。微调一个大模型时,一种流行的方法叫 LoRA:不去改动原来那个 4096×4096 的大矩阵,而是在旁边加一个秩只有 16 的“修正项”,也就是一个 4096×16 的瘦矩阵乘以一个 16×4096 的瘦矩阵。需要训练的数从 1600 多万个降到约 13 万个,不到百分之一。它能奏效,背后的假设正是:针对一项具体任务的调整,真正独立的花样并不多。
一张 1920×1080 的风景照片,天空占了上半部分。你觉得它的“有效秩”高还是低?哪一部分最“费”花样?
大片天空的每一行都很相似,只需要很少的花样就能描述,所以整体的有效秩比 1080 低得多。最“费”花样的是细节丰富的部分:树叶、人群、文字。图像压缩的思路大体如此:平坦的地方少存,细节多的地方多存。
3.5更远的地方:矩阵是一种通用接口
把视线从图片移开,矩阵在许多领域都扮演着同样的角色:
- 经济学:经济学家列昂惕夫把整个国民经济写成一张投入产出表:生产 1 元钢铁需要多少煤、多少电、多少运输。每个行业既是买家又是卖家,要满足最终需求,各行业该生产多少?这变成一个矩阵方程。他因此获得了 1973 年的诺贝尔经济学奖。
- 网页搜索:Google 早期的 PageRank,把整个互联网写成一个巨大的“关系”矩阵:网页 j 链接到网页 i,就把 j 的一部分重要性分给 i。一个网页的重要性,是链接到它的网页的重要性的加权和。反复用这个矩阵去乘重要性向量,直到数值稳定下来,就得到了排名。第 1 章的第三张脸(关系),在这里变成了第二张脸(动作)。
- 推荐系统:用户 × 商品的评分表是一个巨大而稀疏的矩阵。假设它的秩很低(人的口味只有少数几种“花样”),就能补全那些空格,猜出你可能喜欢什么。
- 物理学:在量子力学里,一个粒子的状态是一个向量,测量和演化都是矩阵。
这些领域的研究者,本来各说各的语言。写成矩阵之后,他们得到了什么共同的东西?
同一套数学工具:求解方程、分解、求秩……在一个领域发展出来的方法,另一个领域可以直接拿来用。
还有呢?他们还得到了什么?
同一套计算机程序。
这第二点可能比第一点更重要。早在 1979 年,科学计算界就发布了一套标准的线性代数子程序接口,叫 BLAS;80 年代末,它又增加了专门处理“矩阵乘矩阵”的第三级接口(1990 年正式发表),其中最核心的一个函数叫 GEMM(通用矩阵乘法)。此后几十年,每一代处理器的厂商,都会花大力气为自己的芯片写一版极致优化的 GEMM。
这意味着:任何问题,只要能改写成矩阵乘法,就能立刻享受到几十年积累下来的算法优化和硬件加速。这就是 3.3 节里人们宁可多花内存、也要把卷积改写成矩阵乘法的原因。
矩阵是问题与机器之间的通用接口
标准集装箱。货物千奇百怪,有电视、有香蕉、有汽车零件,可一旦装进标准集装箱,全世界的港口、吊车、货轮、卡车都能搬运它。矩阵就是计算世界的集装箱:问题千奇百怪,一旦装进“矩阵乘法”这个标准箱,所有为它优化的软件和硬件都能为你服务。
到这里,第 2 章结尾的问题有了完整的回答:很多现象天然满足叠加原理;不满足的,在局部也可以线性近似;而一旦写成矩阵,就接上了人类几十年打磨的计算基础设施。三个理由互相加强,让矩阵成了科学和工程的“普通话”。
反思一下你自己的工作:有哪些问题,本质上是“加权混合”?
可能比你想的多:综合评分(各项指标按权重相加)、成本分摊(按比例分给各部门)、网络流量规划(每条链路的负载是各条业务流的加权和)、风险评估(各风险因子按权重叠加)。每当你用 Excel 做“SUMPRODUCT”,你就在做点积;当你对整张表这样做,你就在做矩阵乘法。
本章带走
矩阵无处不在,因为世界可以叠加、光滑的变化局部是线性的,而矩阵乘法是连接问题与机器的通用接口。
- 叠加原理让复杂系统可以拆开算、再合回去。
- 光滑的系统在一点附近可以用矩阵近似(导数、雅可比矩阵),科学计算靠一步步局部近似前进。
- 图片的灰度、调色、旋转、模糊、找边缘,都是加权混合。
- 秩 = 独立花样的数量;低秩近似能用很少的数还原大矩阵,这是压缩与 LoRA 的基础。
- 写成矩阵乘法,就能直接用上几十年优化过的 GEMM 与硬件。
于是,下一个问题找边缘的卷积核、调色的矩阵、灰度的权重,都是人根据经验精心设计的。可是,识别一只猫、理解一句话,需要什么样的权重?没人设计得出来。那么,能不能让机器自己从数据里把这些权重“找”出来?
4Chapter 4 · How machines learn
机器怎样学习:矩阵加一道折痕
机器学习和矩阵是什么关系?
上一章留下的问题:找边缘的卷积核、调色的矩阵,都是人精心设计的。可识别一只猫、理解一句话,需要什么样的权重?没人设计得出来。能不能让机器自己从数据里把权重“找”出来?
先想想人是怎么设计那个找边缘的卷积核的:我们知道“边缘就是左右亮度差很大的地方”,于是写下“右减左”的权重。设计的前提,是我们能用语言说清楚规则。
可“猫”的规则是什么?尖耳朵?有些猫耳朵是折的。有胡须?老虎也有。你一眼就能认出猫,却说不清自己是怎么认出来的。说不清的规则,就写不成权重。
机器学习的思路是反过来的:先定好机器的形状,再让数据来决定里面的数。形状是什么?就是我们前三章一直在讲的东西:矩阵。
4.1一个神经元,一层矩阵
神经网络里最小的零件叫神经元。别被名字吓到,它做的事情你已经很熟悉了:
- 把几个输入按权重加起来(一次点积,和面包店算成本一样);
- 结果经过一道“门槛”:小于 0 就输出 0,大于 0 就原样输出。
第二步那道门槛,最常用的一种叫 ReLU。它简单得近乎可笑,却是本章的主角之一,4.2 节会解释为什么缺了它不行。
一个神经元只能打一种分。把很多个神经元并排放在一起,让它们看同一组输入、各打各的分,就组成了一层。每个神经元有自己的一组权重,把这些权重一行一行摞起来,就是一个矩阵。
图 4-1左:一个神经元,三个输入按权重 0.8、−0.5、0.3 加起来,再经过 ReLU。右:四个神经元组成一层,它们的权重摞成一个 4 行 3 列的矩阵 W。朱橙高亮的第 2 行,正是第 2 个神经元的那组权重。
于是,一层神经网络的全部计算可以写成一行:
y = ReLU(W · x)先做一次矩阵乘法(加权混合),再对每个数单独过一道门槛
第 2 章说“乘法是接线”,这里就是字面意思:矩阵的第 i 行第 j 列,是第 j 个输入连到第 i 个神经元的那根线的粗细。
一个神经元像一场选秀的评审团。每位评委(输入)给出一个印象分,但评委的话语权不同(权重),有的评委甚至投反对票(负权重)。加权汇总之后,如果总分没过线,选手直接淘汰(输出 0);过了线,分数照实报上去。一层,就是很多个评审团同时评估同一位选手,各自关注不同的方面。
4.2为什么需要一道“折痕”
第 2 章的“停一下”留了一个问题:三个矩阵连乘,结果还是一个矩阵,那三层和一层有什么区别?现在来回答它。
如果把 ReLU 去掉,一个网络只是 100 个矩阵一层层叠起来,它会比一个矩阵更聪明吗?
不会。100 个矩阵连乘,W₁₀₀…W₂·W₁,乘出来还是一个矩阵。叠 100 层,等于只有 1 层。
从几何上看,这意味着什么?
线性动作连着做,还是线性动作。格线永远是直的,再怎么叠也弯不了。
可是“猫”和“不是猫”之间的分界线,会是一条直线吗?
不太可能。它一定弯弯曲曲、奇形怪状。
那需要往矩阵之间加一点什么?
加一个“不是线性”的东西,哪怕只有一点点。
ReLU 就是那一点点。它把负数变成 0、正数保持不变,在 0 那里有一个拐角。单看一个 ReLU,毫不起眼;但把它夹在矩阵之间,每一层都能在空间里“折”一下。
图 4-2一维的例子。橙点在中间、蓝点在两边,任何一刀都切不开。沿 0 把数轴对折(取绝对值,恰好可以写成两个 ReLU 之和),橙点都挤到 0 附近,蓝点都在远处,一刀就切开了。
一张纸,你可以拉它、转它、斜着推它,它永远是一张平的纸。这就是矩阵能做的一切。但只要允许折一下,纸就能变成纸飞机、纸鹤、纸盒子。神经网络就是一台折纸机:矩阵负责摆放和拉伸,ReLU 负责折痕。层数越多,折痕越多,能折出的形状越复杂。
数学上有一个定理(万能逼近定理)说:只要神经元足够多,“矩阵加折痕”这种结构可以在有限的输入范围内,任意精确地逼近任何连续的输入输出关系。换句话说,形状本身不是限制,难的是找到那些合适的数。
神经网络 = 矩阵乘法 × 折痕 × 反复调整
折痕(激活函数)是
- 让网络“能弯”的唯一来源;ReLU 是最简单的一种,还有 GELU、SiLU 等更平滑的版本
- 逐个数字单独处理,计算量很小
折痕不是
- 算力的大头:大头始终是它两边的矩阵乘法
- 可有可无的装饰:去掉它,再深的网络也只等于一个矩阵
4.3学习,就是调矩阵里的数
机器的形状定下来了:一层矩阵、一道折痕、再一层矩阵、再一道折痕……一开始,矩阵里的数都是随机填的,这台机器什么都不会,看到猫的照片,可能说“是猫的可能性 30%”。怎么让它变好?
第一步:量一量错了多少
我们手里有标好答案的照片:这张是猫(100%)。机器说 30%,差了一截。把“差多少”写成一个数,叫损失。损失越小,机器越准。学习的目标,就是找到一组矩阵里的数,让所有训练照片上的总损失尽可能小。
第二步:往损失变小的方向挪一点
矩阵里有成千上万个数,每个数稍微变一点,损失都会跟着变一点。如果知道“每个数往哪边挪,损失会下降”,就可以把所有数一起往那个方向挪一小步。这个“往哪边挪”的方向,叫梯度;整个过程叫梯度下降。
图 4-3梯度下降的直觉。等高线表示损失的高低,谷底是最好的那组参数。每一步只看脚下最陡的下坡方向,迈一小步。真实的“地形”有上千亿个维度,但道理和这张二维图一样。
大雾里下山。你看不见山谷在哪,只能感觉脚下的地面往哪边倾斜。于是往最陡的下坡方向迈一小步,站稳,再感觉一次,再迈一步。步子太大会冲过头,甚至跨到对面的山坡上去;步子太小,天黑了还没走到。这个“步子大小”,就是训练里的学习率。
第 3 章说过“光滑的世界,局部是直的”。梯度正是损失在当前位置的局部线性近似。它只在附近有效,所以只能一小步一小步地走,每走一步都要重新量一次坡度。
第三步:把“错”沿原路分摊回去
问题来了:一个网络有很多层,最后的损失是所有层共同造成的。每一层的每个数,各自该负多少责任?
办法叫反向传播:从输出端的误差出发,沿着计算的原路一层层往回推,把“责任”分摊到每一层。有意思的是,往回推的每一步,用的还是矩阵乘法:前向时乘以 W,反向时乘以 W 的转置(把行和列对调)。
前向计算一次,要做多少运算?
每个参数大约参与一次乘法和一次加法。一个有 N 个参数的模型,处理一个输入单位大约要 2N 次运算。
反向传播呢?
既要算“误差往前一层怎么传”,又要算“每个权重该改多少”,两件事各是一次矩阵乘法,所以大约是前向的两倍:4N。
那训练时,每处理一个输入单位的总账是多少?
2N + 4N = 6N。
请记住这个 6N。对大语言模型来说,“输入单位”是 Token(可以先理解为“词块”,第 5 章细讲)。训练数据有 D 个 Token,整个训练的运算量就是大约 6·N·D。第 8 章估算一个大模型要多少算力,全靠这个公式。
一次看一批,而不是一张
实际训练时,机器不是一张一张地看照片,而是一次看一批(比如几百张)。一批照片的向量并排摆在一起,本身就是一个矩阵。于是“矩阵乘向量”变成了“矩阵乘矩阵”。这看似只是换了个写法,却让计算效率大幅提高,原因在第 6 章揭晓。
训练就是“调参数让损失变小”。如果训练数据全是白猫,这台机器会学到什么?
它可能学到“白色的、毛茸茸的 = 猫”,看到黑猫反而犹豫,看到白色的狗却很自信。机器只会让训练数据上的损失变小,它学到的是数据里的规律,包括数据里的偏差。这就是为什么大模型的数据量和数据质量同样重要。
4.4“参数”到底是什么
现在可以回答一个常见的疑问了:新闻里说 GPT-3 有“1750 亿参数”,参数是什么?
参数,就是网络里所有矩阵中所有可调的数的总个数(外加少量别的可调数字)。1750 亿个参数,就是 1750 亿个旋钮。训练,就是把这 1750 亿个旋钮一点点拧到合适的位置。
这些数要存起来。常用的 BF16 格式(一种 16 位的数字格式),每个数占 2 个字节;更省空间的 FP8 格式,每个数只占 1 个字节。这些格式的来龙去脉,第 7 章细讲。
| 模型 | 参数量 | BF16(每个 2 字节) | FP8(每个 1 字节) |
|---|---|---|---|
| Llama 3.1 70B | 700 亿 | 约 140 GB | 约 70 GB |
| GPT-3 | 1750 亿 | 约 350 GB | 约 175 GB |
| Llama 3.1 405B | 4050 亿 | 约 810 GB | 约 405 GB |
训练时还要额外存梯度和优化器的中间状态,总显存需求通常是权重本身的好几倍。这也是一块 GPU 装不下、必须多卡协作的原因之一(第 6 章)。
350 GB 是什么概念?以 NVIDIA H100 为例,一块卡的显存是 80 GB(更新一代的产品在 180 到 288 GB 之间)。光是把 GPT-3 的权重放进 H100,就需要好几块卡。第 7 章讲 GPU 的“显存容量”指标时,这些数字会再次出现。
想象一台有 1750 亿个推子的调音台。刚出厂时推子的位置乱七八糟,放出来全是噪音。训练,就是一边播放海量的“标准曲目”,一边根据跑调的程度,把每个推子往正确的方向推一点点。推了几十万乃至上百万次以后,这台调音台就能自己“演奏”了。而 GPU 的任务,就是让每一次“试听—调整”尽可能快。
4.5机器学到的,是什么
最后画一道围栏。“学习”这个词很容易让人误会。
模型学到的是
- 一组矩阵里的数,它们共同决定了“什么样的输入,给出什么样的输出”
- 分散在上亿个权重里的模式:没有哪一个数单独代表“猫耳朵”
- 训练数据中的规律,包括其中的偏差
模型学到的不是
- 一张写好的规则清单(“如果有尖耳朵且有胡须,则……”)
- 一个存着原始照片或原句的数据库
- 必然正确的知识:它只是让训练损失变小的那组数
这里值得停下来想一想。人类花了几千年总结规则、写成教科书;神经网络却不写规则,只是把海量的例子“压”进一组数里。它做对的时候,我们往往说不清它为什么对;做错的时候,也很难指出是哪个数错了。这既是它强大的地方,也是它让人不安的地方。
你认人时,是在套用规则,还是在做某种“加权求和”?
多数时候,你说不出规则,只是“觉得像”:脸型、声音、走路的姿态、出现的场合,各自贡献一点,加起来过了某个门槛,你就认出来了。这和一个神经元很相似。当然,人脑远比神经网络复杂,但这个类比能帮你理解:说不清规则,不等于没有规律。机器学习,就是把“说不清的规律”交给矩阵去存。
本章带走
神经网络 = 矩阵乘法 × 折痕 × 反复调整:矩阵负责加权混合,折痕负责弯曲,梯度下降负责把数调对。
- 一个神经元是一次点积加一道门槛;一层神经元的权重摞起来就是一个矩阵。
- 没有折痕,多少层都等于一层;ReLU 这样的非线性是“能弯”的唯一来源。
- 学习 = 量损失、算梯度、迈一小步;反向传播也是矩阵乘法。
- 训练每个输入单位约 6N 次运算(前向 2N,反向 4N)。
- 参数就是矩阵里可调的数;1750 亿参数在 BF16 下约 350 GB。
于是,下一个问题照片天然是一张数字表格,可以直接喂给矩阵。可是语言呢?“我爱你”三个字,要怎么变成一串数?ChatGPT 这样的大语言模型,从读进一句话到吐出下一个字,中间经过了哪些矩阵?
5Chapter 5 · Language as matrices
大语言模型:一句话如何变成一连串矩阵乘法
Token、Transformer、向量数据库,为什么都是矩阵运算?
上一章留下的问题:照片天然是一张数字表格,可以直接喂给矩阵。可是语言呢?“我爱你”要怎么变成一串数?大语言模型从读进一句话到吐出下一个字,中间经过了哪些矩阵?
先把大语言模型做的事情说到最朴素:给它一段文字,它预测下一个词是什么。仅此而已。你看到的长篇回答,是它一个词一个词接出来的:预测一个,接到末尾,再预测下一个。
所以本章只需要回答一个问题:预测下一个词这件事,是怎样一步步变成矩阵乘法的?我们沿着一句话在模型里走过的路线,分五站来看:切词、查表、互相打量、各自加工、给出答案。最后再看看,搜索和向量数据库又是怎么搭上这条路线的。
5.1第一站:把文字切成 Token
计算机不认识字,只认识数。第一步,要把文字切成一块一块,每一块换成一个编号。这些小块叫 Token,可以理解为“词块”。
为什么不直接按“字”切?一个汉字一个编号,不是很简单吗?
可以,但太碎了。“矩阵”两个字几乎总是一起出现,拆开处理是浪费。
那为什么不按“词”切?把每个完整的词都编上号。
词太多了,而且新词层出不穷。遇到词表里没有的新词就没法处理。
所以折中的办法是?
常见的组合整块编号,少见的拆成更小的块。实在不认识的,退回到单个字甚至单个字节。这样词表不会太大,又什么都能表示。
现代大模型的词表通常有 10 万到 20 万个 Token。大致的换算:英文里 1 个 Token 约等于 0.75 个单词;中文里 1 个 Token 大约对应 1 到 1.5 个汉字(因分词器而异)。模型按 Token 计费、按 Token 计算长度,说的就是这些小块。
图 5-1从文字到向量。“矩阵是一个动作”被切成 4 个 Token,每个换成一个编号(图中编号为示意);再拿编号到嵌入矩阵里取出对应的那一行,就得到了这个词的向量。
5.2第二站:查表,得到一个向量
编号本身没有意义。48213 和 48214 挨着,并不代表两个词意思相近。我们需要的是第 1 章说的那种“地址”:意思相近的词,地址也相近。
办法很直接:准备一张大表,词表里的每个 Token 占一行,每行是几千个数(Llama 3.1 405B 是 16384 个,70B 是 8192 个)。拿到编号,就去取对应的那一行。这张表叫嵌入矩阵,取出来的那一行,就是这个词的嵌入向量。
“查表取一行”,和矩阵乘法有什么关系?
把编号写成一个很长的向量:只有第 48213 位是 1,其余全是 0(这叫 one-hot 向量)。用它去乘嵌入矩阵,按第 2 章的“按列读”,结果正是“1 份第 48213 行,其余各 0 份”,也就是取出了那一行。所以查表是一种特殊的矩阵乘法,只不过实际计算时直接去取,不必真的做乘法。
嵌入矩阵里的数一开始是随机的。训练过程中,它们和网络的其他参数一起被反复调整。调整的结果是:经常出现在相似上下文里的词,向量会被推到相近的位置。
图 5-2词向量空间的示意。意思相近的词聚成一簇。更有意思的是,关系变成了方向:从“男人”到“女人”的箭头,和从“国王”到“王后”的箭头近似平行。真实的空间有几千维,这里只是二维的示意。
这就是第 2 章那把“相似度尺子”派上用场的地方:两个词向量的点积越大,意思越接近。经典的例子是“国王 − 男人 + 女人 ≈ 王后”:意思变成了方向,关系变成了可以加减的箭头。这个现象最早是在 word2vec 这类早期词向量中被观察到的;大模型内部的向量更复杂,但“相近的意思、相近的方向”这一原则不变。
词向量是
- 一个词在高维空间里的“地址”,由训练得出
- 意思越接近,方向越接近,点积越大
词向量不是
- 一本字典:没有哪一维固定代表“性别”或“大小”,含义分散在很多维度里
- 一成不变:同一个词进入模型后,会在后面的层里根据上下文被不断改写
5.3第三站:注意力,词与词互相打量
现在每个词都有了自己的向量。但问题来了:一个词的意思,常常取决于它周围的词。
看这句话:“小明把苹果给了小红,因为她饿了。”这里的“她”指谁?你一眼就知道是小红,因为“饿了”和“给了苹果”连在一起才说得通。可是“她”这个词的嵌入向量,是从表里查出来的固定一行,它根本不知道自己在这句话里指的是谁。
要让“她”的向量知道自己指小红,它需要做什么?
去看看句子里其他的词,找出和自己最相关的那个。
怎么衡量“相关”?
用点积打分。第 2 章说过,点积就是相似度打分。
找到相关的词之后呢?
把它们的信息按相关程度混合进来。越相关的,混进来的越多。
“打分”,然后“按权重混合”,这是第几次出现了?
第 2 章的点积和“按列读”,又回来了。
这就是注意力机制,Transformer 的核心。它的具体做法是,让每个词的向量分别乘以三个不同的矩阵,得到三个新向量:
- Q(查询):我在找什么样的词?
- K(键):我身上贴着什么标签,能被谁找到?
- V(值):如果有人找到我,我能提供什么内容?
然后分三步:
- 打分:每个词的 Q 和所有词的 K 做点积。n 个词两两打分,得到一张 n×n 的分数表。把所有 Q 排成矩阵、所有 K 排成矩阵,这一步就是一次矩阵乘法:Q·Kᵀ。(实际还会除以一个与向量维度有关的缩放系数,防止分数过大。)
- 归一:用一个叫 softmax 的函数,把每一行分数变成加起来等于 1 的权重。
- 混合:用这些权重,把所有词的 V 加权混合起来。这又是一次矩阵乘法:权重表 × V。
注意力 = softmax(Q·Kᵀ) · V打分(矩阵乘法)→ 归一(softmax)→ 混合(矩阵乘法)
图 5-3一句话的注意力权重(示意数值)。每一行是一个词在“看”其他词的权重,颜色越深权重越大。灰色的格子表示不许看:生成文字时,一个词只能看它自己和前面的词。“她”这一行最深的格子落在“小红”上。
还记得第 1 章矩阵的第三张脸吗?“第 i 行第 j 列 = i 和 j 的关系”。注意力的那张 n×n 权重表,就是一个关系矩阵。不同的是,它不是事先写好的,而是模型读每句话时现场算出来的。
鸡尾酒会。满屋子的人同时在说话(每个词都有 V),你却能在嘈杂中听清有人叫你的名字。因为你心里有个“我在找什么”(Q),每个人的声音都带着某种特征(K),你的注意力自动把音量分配给最匹配的那几个声音,再把他们的话混在一起理解。每个词都在同时做这件事。
注意力有一个重要的代价:n 个词两两打分,要算 n² 个分数。句子长度翻一倍,这一步的计算量翻两番。这就是为什么“长上下文”一直是昂贵的功能。一段 10 万 Token 的文档,光一张分数表就有 100 亿个格子,而每一层的每个注意力“头”都要算一张(实际实现会分块计算,不会一次存下整张表)。
模型怎么知道“小明”在“苹果”前面?注意力的打分里,好像没有位置信息。
问得好。单纯的点积确实不在乎顺序:把句子打乱,每对词的分数不变。所以模型需要额外注入位置信息。现代模型常用的一种办法(叫 RoPE)是:根据词的位置,把 Q 和 K 向量旋转一个角度,位置越远转得越多。旋转,正是第 1 章里一个 2×2 矩阵就能完成的动作。
5.4第四站:前馈网络,每个词各自加工
注意力让词与词交换了信息。接下来,每个词要各自“消化”一下收到的信息。这一步叫前馈网络(FFN),它就是第 4 章那个最标准的结构:
y = W₂ · 折痕(W₁ · x)先把向量展开到更高维(通常是原来的 3 到 4 倍),过一道折痕,再压回原来的维度
先升维再降维,就像把一件事“展开想一想,再收拢成结论”。展开的那个高维空间里,每一维都可以对应某种模式。研究者普遍认为,模型记住的大量事实性知识,就存在前馈网络的这些矩阵里。它们也是参数的大头:在一个典型的 Transformer 里,前馈网络约占三分之二甚至更多的参数。(现代模型常用一种叫 SwiGLU 的变体,用三个矩阵代替两个,但“展开、折痕、收拢”的结构不变。)
开会讨论。注意力是会上的发言环节:每个人听取别人的意见,决定重点听谁的。前馈网络是会后每个人回到自己的工位,结合自己的专业知识,把听到的内容消化成自己的新判断。一层 Transformer,就是“开一次会,再各自消化一次”。
一层注意力加一层前馈网络,组成一个 Transformer 层。大模型把这样的层叠很多次:Llama 3.1 70B 有 80 层,405B 有 126 层。每经过一层,每个词的向量都被改写一次,吸收更多上下文,含义越来越具体。为了让这么深的网络训练得动,每一层的输出还会加回它的输入(叫“残差连接”),相当于每层只负责“补充修改”,而不是“推倒重来”。
5.5第五站:给出下一个词
经过所有层之后,取出最后一个词的向量。它已经吸收了整段话的信息。现在要把它变成“下一个词是什么”的答案。
办法还是矩阵乘法:用这个向量去乘一个“词表矩阵”,词表里的每个 Token 对应一列。结果是一个很长的向量,每个候选 Token 一个分数。这其实是拿当前的向量,和词表里每个词做了一次点积,看谁最“对味”。
分数再经过 softmax 变成概率,比如“动作”0.41、“过程”0.12……从中选出一个,接到文字末尾。然后,整个流程再来一遍。
图 5-4一次生成的完整流水线。每个框的核心都是矩阵乘法:查嵌入矩阵、注意力里的 Q·Kᵀ 和 ×V、前馈网络里的几次矩阵乘法、最后乘以词表矩阵。右列是每一步的主要矩阵形状。每生成一个词,这条流水线就完整地跑一遍。
从 Token 到回答,每一步都是查表、打分、混合
5.6算一笔账:说一个字要算多少次
第 4 章算过,一个有 N 个参数的模型,处理一个输入单位的前向计算约 2N 次运算。对大语言模型,这个单位就是 Token:每生成一个 Token,约 2N 次运算。
| 模型 | 参与计算的参数 | 每个 Token 约 |
|---|---|---|
| Llama 3.1 70B | 700 亿 | 1400 亿次 |
| GPT-3 | 1750 亿 | 3500 亿次 |
| Llama 3.1 405B | 4050 亿 | 8100 亿次 |
| DeepSeek-V3(MoE) | 总 6710 亿,每次只激活 370 亿 | 约 740 亿次 |
最后一行值得解释。DeepSeek-V3 用了一种叫混合专家(MoE)的结构:前馈网络不是一个,而是很多个“专家”,每个 Token 只被路由给其中少数几个。于是模型总共有 6710 亿参数(知识容量大),但每个 Token 只动用其中 370 亿(计算量小)。
一家大医院有上百个专科医生,但你看病时只会被分诊到其中两三位。医院的总知识量很大,每位病人花费的问诊时间却不多。MoE 就是给神经网络配了一个分诊台。
即便如此,每说一个字,也要做几百亿到上千亿次乘法和加法。一个上千字的回答,就是上百万亿次运算。这个量级引出了下一章的问题。不过在那之前,先看一个和大模型关系密切的邻居。
5.7向量数据库:用点积找资料
大模型的知识停留在训练结束的那一刻,也不知道你们公司内部的文档。常见的补救办法叫 RAG(检索增强生成):先从资料库里找出和问题相关的几段文字,塞进提示词里,再让模型回答。
怎么“找出相关的”?用的正是本章第二站的思路:
- 用一个嵌入模型,把每篇文档(或每一段)变成一个向量,存起来。这就是向量数据库。
- 用户提问时,把问题也变成一个向量。
- 问题向量和所有文档向量做点积,分数最高的几篇就是最相关的。
把所有文档向量排成一个矩阵,第 3 步就是一次“矩阵乘向量”。
图 5-5向量检索。问题向量和每篇文档的向量做点积,按得分排序,取前几名交给大模型参考。所有文档一起算,就是“文档矩阵 × 问题向量”。
文档少的时候,挨个算点积就行。文档多到上亿篇时,挨个算太慢,就要用 HNSW 这类“近似最近邻”索引:先把向量组织成一张多层的邻居网络,查询时顺着网络快速跳到相关区域,只和一小部分文档做比较。它用一点点精度的损失,换来了成百上千倍的速度。
向量检索擅长
- 找“意思相近”的内容,即使用词完全不同
- 从海量资料里快速筛出候选
向量检索不保证
- 找到的就是正确答案:相似 ≠ 正确,“意思相关”也可能是反面观点
- 精确匹配:查型号、编号、专有名词时,传统的关键词搜索往往更可靠
回头看本章的五站和向量数据库,你能找出一个不是“矩阵乘法 + 少量简单运算”的步骤吗?
很难。切词是查规则表;查嵌入是取矩阵的一行;注意力是两次矩阵乘法夹一个 softmax;前馈网络是两次矩阵乘法夹一道折痕;输出是一次矩阵乘法加 softmax;向量检索是矩阵乘向量。softmax、折痕、归一化这些“少量简单运算”很关键,但它们的计算量和矩阵乘法相比微不足道。这就是为什么说大模型“最终都演变成矩阵运算”。
本章带走
大语言模型每说一个词,都在重复同一套动作:查表、打分、混合。每个动作都是矩阵乘法。
- Token 是词块;嵌入是查表取矩阵的一行;意思相近的词,向量方向相近。
- 注意力 = softmax(Q·Kᵀ)·V:用点积打分,再按权重混合;代价随句子长度的平方增长。
- 前馈网络 = 矩阵、折痕、矩阵,存放大量知识,占参数的大头。
- 生成一个 Token 约需 2N 次运算;MoE 让每个 Token 只动用一部分参数。
- 向量数据库 = 用点积找相似内容,本质是矩阵乘向量。
于是,下一个问题每说一个字,要做几百亿到上千亿次乘加。可是 ChatGPT 回答问题,字是一串一串往外冒的,几乎不用等。这么大的计算量,是怎么在一眨眼间完成的?矩阵乘法有什么特别的性质,让它能被算得这么快?
6Chapter 6 · Why it parallelizes
为什么能并行:一万个小学生胜过一位数学家
矩阵运算为什么可以并行?GPU 为什么适合?
上一章留下的问题:每说一个字,要做几百亿到上千亿次乘加。可是 ChatGPT 的回答几乎不用等。这么大的计算量,是怎么在一眨眼间完成的?矩阵乘法有什么特别的性质,让它能被算得这么快?
假设你要在一小时内批改一万份小学数学试卷。你有两个选择:请一位数学教授,或者请一万个五年级的小学生,每人改一份。
教授当然更聪明,改一份可能只要十秒,但一万份要改一天多。一万个小学生每人改一份,哪怕慢一点、要一分钟,一分钟后也全部改完了。
这个选择成立,有一个前提:这一万份试卷可以分开改,谁也不用等谁。如果第二份试卷的答案要依赖第一份的批改结果,那一万个小学生也只能排队,还不如教授快。
本章要说明的是:矩阵乘法恰好是“一万份可以分开改的试卷”;而 GPU,恰好是那“一万个小学生”。
6.1每一格互不等待
两个矩阵相乘,C = A × B。要算出 C 第 3 行第 4 列的那一格,需要哪些数?
A 的第 3 行,和 B 的第 4 列。第 2 章说过,一格就是一行和一列的点积。
需要先知道 C 的其他格子吗?比如第 3 行第 3 列?
不需要。每一格只用到 A 和 B 里原有的数,和 C 里别的格子毫无关系。
那如果有一万个计算单元,可以怎么分工?
把 C 的格子分下去,每个单元负责一块,大家同时开工,互不打扰。
图 6-1左:C 里深色的 2×2 小块,只需要 A 的两行(浅朱)和 B 的两列(浅蓝)。其他小块同理,可以同时计算。右:斐波那契数列的每一项都要等前一项算完,再多的人也只能排队。
这就是矩阵乘法能够并行的根本原因。用计算机的话说,它是一种数据并行的任务:同样的操作(点积),作用在大量互不相关的数据(不同的行列组合)上。
而且,这种“不等待”在神经网络里无处不在:
- 一层里的几千个神经元,各打各的分,互不等待;
- 一批里的几百个样本,各算各的,互不等待;
- 训练时,一段文本里的几千个 Token,可以同时算完所有层(注意力的遮罩保证了每个词只看前面,但计算可以一起做)。
可以并行的
- 一个矩阵乘法内部的所有格子
- 同一层里的所有神经元、同一批里的所有样本
- 训练时一段文本里的所有位置
不能并行的
- 层与层之间:第 2 层要等第 1 层算完
- 生成回答时词与词之间:下一个词要等上一个词选出来
- 训练的一步与下一步:参数更新完才能进行下一步
最后一栏很重要。你看到 ChatGPT 的回答是一个词一个词“冒”出来的,正是因为生成过程在词与词之间是串行的。每一个词内部那上千亿次乘加,才是被并行“瞬间”完成的部分。
6.2CPU 和 GPU:两种不同的聪明
现在来看硬件。电脑里的 CPU 和 GPU,是两种不同设计思路的产物。
图 6-2CPU 用大量芯片面积做复杂的控制和大缓存,让少数几个核心各自很聪明;GPU 把面积几乎全部给了计算单元,核心简单,但数量极多。
CPU 像几位博士。每个核心都很强:能处理复杂的分支判断(“如果……就……否则……”),能预测接下来要执行什么,配有大容量的缓存。它的设计目标是延迟:让每一件事尽快做完。操作系统、网页浏览器、数据库,这类充满判断和依赖的任务,是 CPU 的主场。
GPU 像上万个小学生。每个核心都很简单,不擅长复杂判断,但数量极多。以 NVIDIA H100 为例,它有 132 个“流式多处理器”(可以理解为 132 个班级),合计 16,896 个 CUDA 核心。它的设计目标是吞吐:单位时间里做完尽可能多的事。
GPU 最初是为画游戏画面设计的:屏幕上几百万个像素,每个像素的颜色计算方式相同、互不依赖。这和矩阵乘法“每一格互不等待”的性质如出一辙。于是,当深度学习需要海量矩阵乘法时,GPU 成了现成的最佳选择。
CPU 像一辆跑车,GPU 像一列火车。送一个急件,跑车快得多;运一万吨煤,火车完胜。问“哪个更快”,要先问“你要运什么”。
6.3Tensor Core:一次盖一个印章
后来,GPU 厂商发现,AI 的计算实在太集中在矩阵乘法上了,干脆为它造了专用的电路:Tensor Core(张量核心)。H100 有 528 个。
普通核心一次做一个乘法加一个加法。Tensor Core 一次直接完成一个小矩阵块的乘加:最早一代是把两个 4×4 的小块相乘再加到结果上,后来的型号块越来越大,一条指令就是成百上千次运算。
普通核心像用笔一个字一个字地写;Tensor Core 像盖印章,一下就是一整块。要写一万遍同样的格式,印章的速度优势是压倒性的。
大矩阵怎么交给这些“印章”?办法叫分块:把 C 切成许多小块,每个班级(流式多处理器)领一块。班级把需要的那几行、几列从显存搬到身边的高速小仓库里,然后用 Tensor Core 一块一块地盖章,盖完再写回去。第 2 章说过矩阵乘法是 2n³ 次运算,这些运算最终几乎都由 Tensor Core 完成。
一块 H100 的 Tensor Core,按 BF16 格式、稠密计算,理论峰值是每秒 989 万亿次运算(989 TFLOPS)。这个数字第 7 章会细讲,这里先记住它的量级。
6.4内存墙:真正的瓶颈常常是“搬”
每秒 989 万亿次运算,听上去足以瞬间完成一切。可是第 5 章说,一个 700 亿参数的模型每个词只要 1400 亿次运算。按峰值算(先不管模型装不装得下一块卡),H100 一秒能生成好几千个词。实际上单用户使用时,一秒只有几十个词。差距在哪里?
要做乘法,数字得先在哪里?
在计算单元旁边。可模型的参数平时存在显存里,要先搬过来。
生成一个词,要用到多少参数?
全部。每个参数都要参与一次乘法。所以整个模型的权重,每生成一个词都要从显存里完整地读一遍。
每搬来一个参数,做几次运算?
一次乘法、一次加法,两次,然后就扔掉了,等下一个词再搬一遍。
搬得快还是算得快?
……这得看数据。
数据是这样的:H100 的显存带宽是每秒 3.35 TB,算力是每秒 989 万亿次。两者一除:
989 × 10¹² ÷ 3.35 × 10¹² ≈ 295每从显存搬来 1 个字节,要做约 295 次运算,才能让计算单元不闲着
这个“每字节做多少次运算”,叫算术强度。逐字生成时,每个参数占 2 个字节(BF16),只做 2 次运算,算术强度约为 1。离 295 差了近 300 倍。于是计算单元绝大多数时间都在等数据,算力利用率不到 1%。
一个手速极快的厨师,一分钟能切一百盘菜。但厨房只有一个传菜员,一分钟只能从冷库搬来一盘原料。厨师再快,一分钟也只能出一盘菜。这时候换一个更快的厨师毫无用处,要么多雇传菜员(提高带宽),要么让每次搬来的原料多做几道菜(提高算术强度)。
怎样提高算术强度?最直接的办法:批处理。同时为 32 个用户生成下一个词,搬来的每个参数就可以用 32 次,算术强度升到约 32,实际算力一下子提高 30 多倍。这就是云服务商总是把很多用户的请求打包一起算的原因。
而训练时的大矩阵乘法,情况完全不同。两个 n×n 的矩阵相乘,运算是 2n³ 次,数据只有约 3n² 个数(BF16 下约 6n² 字节),算术强度约为 n/3。n = 4096 时约 1365,远远超过 295,算力可以被吃满。
图 6-3H100 的“屋顶线”。斜线部分是带宽屋顶:算术强度低时,能达到的算力受搬运速度限制;水平部分是算力屋顶。逐字生成(1 个用户)卡在左下角,大批量生成好得多,大矩阵乘法才能顶到峰值。
这个图解释了硬件发展的很多选择。GPU 为什么要用昂贵的 HBM(高带宽内存,把内存芯片堆叠起来,紧挨着 GPU 封装)?因为带宽是生成速度的命门。为什么新一代 GPU 的带宽增长总是备受关注?因为算力涨得比带宽快:据 Epoch AI(一家专门追踪 AI 算力、硬件与模型规模趋势的研究机构)统计,GPU 显存带宽每年只增长约 28%,慢于算力的增长;如果算上 FP8、FP4 这类低精度格式带来的算力跃升,差距更大。这道越来越高的“内存墙”,是整个行业的共同难题。
每一格互不等待,所以能并行;
真正的瓶颈常常不是算,而是搬
生成长回答时,模型会把前面每个词的 K、V 向量存起来复用(叫 KV 缓存),避免重算。这对“搬”有什么影响?
它省下了大量重复计算,却增加了要搬的数据:每生成一个新词,除了读一遍模型权重,还要读一遍前面所有词的 KV 缓存。上下文越长,缓存越大,搬得越多。所以长对话不只“算得多”,还“搬得多”。这也是为什么显存容量和带宽,对推理服务同样关键。
6.5一张卡不够:让网络成为计算机的一部分
最后一个问题。第 4 章算过,GPT-3 的权重就要约 350 GB,训练时加上梯度和优化器状态还要多好几倍,而一块 H100 只有 80 GB 显存。更何况,训练一个前沿模型的运算量,一块卡要算上几千年(第 8 章会算)。所以必须多卡协作。
怎么把工作分给几千、几万块卡?有四种基本方式:
图 6-4四种并行方式。数据并行:每张卡一份模型、各算一份数据;张量并行:把一个大矩阵切开分给多张卡;流水线并行:不同的层放在不同的卡上;专家并行:MoE 的专家分布在不同的卡上。实际训练往往几种一起用。
- 数据并行:每张卡都有完整的模型,各自处理不同的数据。算完一步后,大家把各自的梯度求个平均,再同步更新。这个“求平均”的通信操作叫 All-Reduce。
- 张量并行:一个矩阵太大,按行或列切成几块,分给几张卡各算一部分。这正是 6.1 节“每一格互不等待”的直接应用,只是这次分工的对象从核心变成了整张卡。代价是每一层都要交换结果,通信非常频繁。
- 流水线并行:第 1 到 32 层放在第一组卡上,第 33 到 64 层放在第二组……数据像装配线上的零件一样依次流过。
- 专家并行:MoE 模型的几百个专家分布在不同的卡上,每个 Token 被发送到它需要的专家所在的那张卡。
这四种方式有一个共同点:卡与卡之间要不停地交换数据。张量并行每一层都要交换,数据并行每一步都要 All-Reduce,专家并行要把 Token 在卡之间来回发送。计算被切得越碎,通信就越频繁。
于是,GPU 之间的连接变得和 GPU 本身一样重要:
- 卡与卡之间(同一台服务器内):NVIDIA 的 NVLink,H100 每张卡约 900 GB/s,比普通的 PCIe 快好几倍。张量并行这种高频通信,通常只在 NVLink 连着的卡之间进行。
- 机器与机器之间:InfiniBand,或者支持 RDMA(让一台机器直接读写另一台机器的内存,绕开操作系统)的以太网(RoCE)。成千上万台服务器组成一张专门的高速网络,拓扑、拥塞控制、丢包处理的任何一点瑕疵,都会让几万块 GPU 一起停下来等待。
一万个小学生改试卷,如果每改完一题都要全体对一次答案,那么决定速度的,就不再是每个人改得多快,而是“对答案”这件事组织得多高效。大规模训练里,网络就是那个“对答案”的机制。
对网络工程师来说,这是一个值得停下来想一想的转变:在 AI 训练集群里,网络不再只是连接计算机的管道,它本身就是计算机的一部分。一次 All-Reduce 的时延,直接体现为训练时间;一条链路的拥塞,可能让整个集群的利用率下降。第 7 章的规格表里,你会看到“互联带宽”和“算力”被并列为同等重要的指标。
如果把 GPU 数量翻倍,训练时间会减半吗?
通常不会刚好减半。卡越多,每张卡分到的计算越少,而通信和同步的开销却不会同比例减少,甚至会增加;卡越多,出故障的概率也越高,需要保存进度、重启恢复。所以大规模训练追求的,是让“通信被计算掩盖”:趁着算这一层的时候,同时传上一层的数据。能做到多好,很大程度上取决于网络。
本章带走
每一格互不等待,所以能并行;真正的瓶颈常常不是算,而是搬。
- 矩阵乘法的每个输出格只依赖一行一列,天然适合拆给成千上万个核心同时算。
- CPU 追求单件事快(延迟),GPU 追求一次做完很多件(吞吐);Tensor Core 专为小块矩阵乘加而生。
- H100 每搬 1 字节要做约 295 次运算才能吃满算力;逐字生成只有约 1 次,所以慢在“搬”;批处理和大矩阵能提高算术强度。
- 多卡并行有四种方式,都离不开卡间通信;在训练集群里,网络是计算机的一部分。
于是,下一个问题我们已经见过好几个硬件数字:989 TFLOPS、3.35 TB/s、80 GB、900 GB/s。一张 GPU 规格表上还有 FP8、FP4、“稀疏”等各种说法。到底哪个数字才代表“快”?怎样读懂一张 GPU 规格表,不被营销口径带偏?
7Chapter 7 · Reading a GPU spec sheet
读懂一张 GPU 规格表
GPU 的性能用什么衡量?
上一章留下的问题:989 TFLOPS、3.35 TB/s、80 GB、900 GB/s,再加上 FP8、FP4、“稀疏”……到底哪个数字才代表“快”?怎样读懂一张 GPU 规格表,不被营销口径带偏?
打开任何一家 GPU 厂商的产品页,迎面而来的是一张密密麻麻的表:十几行指标,每一行后面跟着一个很大的数字,单位从 TFLOPS 到 PFLOPS,从 GB 到 TB/s。发布会上,新一代产品总是比上一代“快几倍”甚至“快几十倍”。
这些数字都是真的,但每一个都有它的口径。不懂口径,就像比较两辆车的“最高时速”,却不知道一个是在平路上测的,一个是在下坡时测的。
本章的目标很具体:读完之后,你拿到任何一张 GPU 规格表,都能问出五个正确的问题。
7.1先分清两个词:FLOP 和 FLOP/s
GPU 的“算力”用浮点运算来衡量。浮点运算就是带小数点的数字之间的一次加法或乘法,英文缩写是 FLOP。这里有一个极易混淆的地方:
- FLOP(或 FLOPs):运算的次数,是一个总量。比如“训练 GPT-3 用了 3.14×10²³ FLOP”。这种数大到读不出感觉,第 8 章会把它换算成“一块 GPU 要算多少年”。
- FLOP/s(常写成 FLOPS):每秒的运算次数,是一个速度。比如“H100 的算力是 989 TFLOPS”。
两者的关系和“公里”与“公里每小时”一样:总量 ÷ 速度 = 时间。第 8 章的估算,全靠这一个除法。
这些数字很大,所以要用前缀:
| 前缀 | 含义 | 中文 | 一个例子 |
|---|---|---|---|
| K(千) | 10³ | 千 | 一个人专心手算一整天,大约能做上千次乘法 |
| M(兆) | 10⁶ | 百万 | 一张 1920×1080 的彩色照片约 622 万个数 |
| G(吉) | 10⁹ | 十亿 | 70B 模型的“B”就是 10⁹:700 亿参数 |
| T(太) | 10¹² | 万亿 | H100 的 BF16 稠密算力:989 TFLOPS |
| P(拍) | 10¹⁵ | 千万亿 | 新一代 GPU 的低精度算力,已按 PFLOPS 计 |
| E(艾) | 10¹⁸ | 百亿亿 | 大型训练集群的总算力,按 EFLOPS 计 |
第 8 章会出现 10²⁵ 这样的数,它已经超出了常用前缀,直接用科学计数法。
7.2精度:一把尺子的长度和刻度
规格表上的算力,总是和一个数字格式绑在一起:FP32、BF16、FP8、FP4……同一块 GPU,格式不同,算力可以相差十几倍。先弄懂这些格式是什么。
计算机存储一个小数,用的是类似“科学计数法”的方式:一个符号(正或负),一个指数(10 的几次方,决定数的大小范围),一段尾数(有效数字,决定精细程度)。格式名里的数字,就是总共用几个比特(二进制位)。
图 7-1五种常见数字格式的位布局。灰色是符号位,钴蓝是指数位,朱橙是尾数位。位数越少,每个数占的空间越小,搬得越快、算得越快,但能表示的范围和精度也越有限。
指数位决定尺子有多长,尾数位决定尺子上的刻度有多密。FP32 是一把又长又密的尺子;BF16 保留了同样的长度,但刻度稀了很多;FP16 刻度比 BF16 密,但尺子短,太大或太小的数量不了;FP8、FP4 则是越来越短、越来越粗的尺子。
精度降低,计算结果不会出错吗?
单个数确实会有误差。但神经网络的计算,全是第 2 章说的“加权混合”:成千上万个数加在一起,个别数的小误差会被平均掉。
那为什么训练时偏爱 BF16,而不是刻度更密的 FP16?
训练时梯度可能非常小,也可能突然非常大。尺子不够长,小的数变成 0,大的数溢出成无穷大,训练就崩了。BF16 的尺子和 FP32 一样长,所以更稳。
FP8 和 FP4 呢?
主要用于推理(模型训好之后回答问题),也越来越多地用于训练的部分环节。它们需要额外的技巧,比如给一小组数配一个共同的缩放系数,来弥补尺子太短的问题。
低精度为什么快?两个原因。第一,每个数占的字节少了,同样的带宽能搬更多数,第 6 章的“搬”压力直接减轻。第二,Tensor Core 里做一次 8 位乘法的电路,比 16 位的小得多,同样的芯片面积可以塞进更多乘法器。所以在规格表上,精度每减半,算力大致翻一倍。
读表提醒比较两块 GPU 的算力时,必须在同一种精度下比较。用新卡的 FP4 算力去比旧卡的 FP16 算力,“快几倍”里有一大半来自格式变了,而不是芯片变强了。
7.3稀疏:规格表上最常见的“×2”
规格表上还有一个更隐蔽的口径:稀疏(sparse)与稠密(dense)。
NVIDIA 的 Tensor Core 支持一种叫“2:4 结构化稀疏”的模式:如果矩阵里每 4 个数中恰好有 2 个是 0,硬件可以跳过这些 0,速度翻倍。规格表上的算力,常常印的是这种稀疏模式下的数字,并在脚注里小字注明。
以 H100 为例:官方标称的 BF16 算力是 1979 TFLOPS,但那是稀疏口径;按普通的稠密矩阵计算,是 989 TFLOPS。本书用的一律是稠密口径。
问题在于,绝大多数模型在训练和推理时并不满足这种严格的“每 4 个里有 2 个 0”的结构。所以在估算真实性能时,应该先把稀疏数字除以 2。
标称算力是
- 在理想条件下,芯片每秒最多能做的运算次数
- 一个“天花板”,用来比较不同芯片的潜力
标称算力不是
- 你的模型实际能跑到的速度
- 可以跨精度、跨稀疏口径直接比较的数字
7.4五个指标,五个问题
现在可以系统地读规格表了。对 AI 来说,真正重要的指标只有五个,每个回答一个问题:
- 算力(FLOPS):它最多能算多快?——先看精度、再看稠密还是稀疏。
- 显存容量(GB):模型装不装得下?——第 4 章算过,70B 模型在 BF16 下光权重就要约 140 GB。
- 显存带宽(TB/s):数据能搬多快?——第 6 章说过,逐字生成时它才是决定速度的因素。
- 互联带宽(NVLink,GB/s 或 TB/s):多卡之间交流多快?——决定了张量并行等多卡协作的效率。
- 功耗(W):它要吃多少电、散多少热?——决定了一个机房能放多少张卡,也决定了电费。
| 指标 | H100 SXM(2022) | B200(2024–25) | Rubin(2026,官方初步规格) |
|---|---|---|---|
| BF16 算力(稠密) | 989 TFLOPS | ≈2.25 PFLOPS | 4 PFLOPS* |
| FP8 算力(稠密) | 1979 TFLOPS | ≈4.5 PFLOPS | 17.5 PFLOPS*(训练) |
| FP4 算力(稠密) | 不支持 | ≈9 PFLOPS | 35 PFLOPS*(NVFP4 训练) |
| 显存容量 | 80 GB HBM3 | 约 180 GB HBM3e | 288 GB HBM4 |
| 显存带宽 | 3.35 TB/s | 约 8 TB/s | 22 TB/s |
| NVLink 带宽 | 900 GB/s | 1.8 TB/s | 3.6 TB/s |
| 功耗 | 700 W | 官方未列单卡值† | — |
B200 的稠密算力由官方 8 卡 HGX 平台的稀疏数据折算(÷8 ÷2),显存与带宽由 DGX B200 整机数据 ÷8 得出。* Rubin 数字来自 NVIDIA HGX 页面,官方脚注注明为稠密口径、属初步信息且可能变更;发布会常引用的“NVFP4 推理 50 PFLOPS”是稀疏口径。† 官方页面只给出 DGX B200 整机最大功耗约 14.3 kW(8 卡加 CPU 等)。“—”表示此处不引用。各项出处见附录。
看这张表,可以读出几个趋势:
- 低精度算力涨得最快:新格式(FP8、FP4)本身就带来了成倍的数字增长。发布会上“快几十倍”的说法,多半来自这里。
- 同一精度下看,带宽追得并不慢:从 H100 到 Rubin,BF16 稠密算力增长约 4 倍(989 TFLOPS → 4 PFLOPS),带宽则增长约 6.6 倍(3.35 → 22 TB/s)。这一代厂商显然在全力补“内存墙”。但放到更长的时间里,据 Epoch AI 统计,显存带宽每年只增长约 28%,仍是被持续追赶的那一方。
- 显存容量持续增长,让单卡能装下更大的模型,减少多卡拆分的麻烦。
- 互联带宽每代翻倍,说明厂商把卡间通信看得和算力一样重要。
7.5两道例题:从规格到体验
例题一:一个人和大模型聊天,每秒能出几个字?
假设一个 700 亿参数的模型,用 FP8 格式(每个参数 1 字节),权重共 70 GB,一块 80 GB 的 H100 装得下(剩下的空间留给第 6 章说的 KV 缓存)。只有你一个人在用。
生成一个 Token,要从显存里搬多少数据?
第 6 章说过,每个 Token 都要把全部权重读一遍:70 GB。
H100 每秒能搬多少?
3.35 TB,也就是 3350 GB。
那每秒最多能生成几个 Token?
3350 ÷ 70 ≈ 48 个。
同样的计算:B200 带宽约 8 TB/s,上限约 114 个 Token/秒;按 Rubin 公布的 22 TB/s,上限约 314 个。注意,这里完全没用到算力数字。一个人用的时候,决定速度的是带宽。这是理论上限,实际还要读 KV 缓存、有各种开销,会更低一些。
如果同时服务很多人,情况就变了:搬一次权重可以为很多人各算一个 Token,总吞吐大幅上升,瓶颈逐渐移向算力。这就是第 6 章屋顶线的实际含义。
例题二:标称算力和实际算力差多少?
训练时的大矩阵乘法能吃满算力吗?看一个公开的真实数据:Meta 训练 Llama 3.1 405B 时,用了最多 16,384 块 H100,报告的模型算力利用率(MFU,实际用于模型计算的算力 ÷ 标称峰值)是 38% 到 43%。
也就是说,即便是世界上最有经验的团队、在最适合并行的训练任务上,也只用到了标称算力的四成左右。剩下的六成去哪了?等数据搬运、等卡间通信、注意力之类不那么高效的计算、故障恢复……
标称是天花板,不是日常
厂商宣布新一代 GPU“推理性能提升 30 倍”。你会问哪些问题?
至少这几个:比较的是什么精度?(新卡 FP4 对旧卡 FP8?)是稀疏还是稠密口径?是单卡还是整机柜(机柜里卡数、互联都变了)?测的是什么模型、多大批量、多长上下文?“性能”指的是吞吐(每秒总 Token 数)还是单用户速度?这些条件每一个都可能贡献好几倍。数字不一定是假的,但它回答的可能不是你关心的问题。
7.6一张可以随身带的清单
把本章浓缩成拿到任何一张 GPU 规格表时要问的五个问题:
| 问题 | 看哪个指标 | 要警惕什么 |
|---|---|---|
| ① 它最多算多快? | 算力(FLOPS) | 精度是否一致;是否为稀疏口径(÷2) |
| ② 我的模型装得下吗? | 显存容量 | 训练需要的显存是权重的好几倍 |
| ③ 生成回答有多快? | 显存带宽 | 单用户速度 ≈ 带宽 ÷ 模型字节数 |
| ④ 多卡协作顺不顺? | NVLink / 网络带宽 | 单卡数字再好看,多卡时可能卡在通信上 |
| ⑤ 实际能用到几成? | MFU(实测,不在规格表上) | 大规模训练常见 30%–50% |
读 GPU 规格表,像读一辆车的参数:最大马力(算力)不等于你每天通勤的速度;油箱大小(显存)决定能跑多远;道路是否拥堵(带宽、通信)往往才是决定你几点到家的因素。
本章带走
标称是天花板,不是日常:看算力先问精度和稀疏,看速度先看带宽,看规模先看互联,最后问实际利用率。
- FLOP 是次数,FLOP/s 是速度;总量 ÷ 速度 = 时间。
- 指数位决定量程,尾数位决定精度;精度减半,算力大致翻倍;训练偏爱 BF16。
- “稀疏”口径是稠密的 2 倍;H100 的 BF16 稠密算力是 989 TFLOPS。
- 单用户生成速度 ≈ 显存带宽 ÷ 模型大小:70B FP8 在 H100 上约 48 Token/秒(上限)。
- Llama 3.1 405B 训练的实际利用率约 38%–43%。
于是,下一个问题现在我们有了尺子:一块 H100 按 BF16 稠密每秒 989 万亿次,实际能用四成左右。那么,训练一个 GPT-5、GPT-6 这样的前沿大模型,到底需要多少次运算、多少数据、多少块 GPU、多少天、多少电?
8Chapter 8 · How much compute, how much data
训练一个大模型要多少算力和数据
训练 GPT-5、GPT-6 这样的模型需要多大算力、多少数据?
上一章留下的问题:我们有了尺子:一块 H100 按 BF16 稠密每秒 989 万亿次,实际能用四成左右。那么,训练一个前沿大模型,到底需要多少次运算、多少数据、多少块 GPU、多少天、多少电?
这是很多人最想知道、也最容易被夸大或误解的问题。本章会给出答案,但先说一句必须说在前面的话:
数据口径OpenAI、Anthropic、Google 都没有公开其旗舰模型的参数量、训练数据量和训练算力。“ChatGPT”是一个产品名,背后是 GPT-5 系列等模型,还会不断更新。本章关于闭源模型的所有数字,都来自外部研究机构(主要是 Epoch AI)的估算,或本书按公开方法做的推测,都会明确标注。有公开数据的模型,我们用公开数据。每一条的核查结果和出处,见书末附录。
好消息是,你并不需要内部数据,也能自己估出量级。方法只有一个公式,而这个公式你在第 4、5 章已经见过了。
8.1一个公式:C ≈ 6ND
第 5 章说,模型生成一个 Token,前向计算约需多少次运算?
2N,N 是参数量。每个参数做一次乘法、一次加法。
第 4 章说,训练时还要反向传播,那一步多少?
大约是前向的两倍,4N。所以训练时每个 Token 约 6N。
训练数据一共有 D 个 Token,每个 Token 都要走一遍前向和反向,总共多少?
6N × D。
C ≈ 6 · N · DC = 训练总运算量(FLOP);N = 参数量(MoE 模型用每个 Token 激活的参数);D = 训练 Token 数
这个公式忽略了注意力的额外开销等细节,但对大模型来说,误差通常在可接受范围内。它的好处是简单:知道参数量和数据量,就能算出训练总量。
先学会读这么大的数
用这个公式算出来的数,会大到失去意义。前沿模型的训练量在 10²⁶ 左右:1 后面跟 26 个零,读作“一百亿亿亿”次。人对“一亿”还有点感觉,对“亿亿亿”就只剩下“很大”两个字。
所以本章换一把尺子:不数“多少次”,而问一块 GPU 要算多久。第 7 章说过,一块 H100 按 BF16 稠密口径,实际每秒大约能做 4×10¹⁴ 次(989 TFLOPS × 40% 利用率)。用它当单位:
| 训练算力 | 一块 H100 要算 | 大致相当于 | 对应的模型 |
|---|---|---|---|
| 10²⁰ | 约 3 天 | 一个小长假 | 小型实验模型 |
| 10²³ | 约 8 年 | 一个孩子从出生到上小学二年级 | GPT-3(3×10²³,约 25 年) |
| 10²⁴ | 约 80 年 | 一个人的一生 | DeepSeek-V3(3.3×10²⁴,约 260 年) |
| 10²⁵ | 约 800 年 | 从南宋算到今天 | Llama 3.1 405B(3.8×10²⁵,约 3,000 年) |
| 10²⁶ | 约 8,000 年 | 从新石器时代算到今天 | 当前前沿(GPT-4.5、Grok 3 量级) |
| 10²⁷ | 约 8 万年 | 比现代人走出非洲(约 7 万–5 万年前)还要久 | 下一代旗舰(推测) |
从 10²³ 那一行起,每往下一行,指数加 1,时间乘以 10。计算:训练算力 ÷(989×10¹² × 40%)÷ 每年约 3,156 万秒。
只需要记住一个锚点:10²⁶ ≈ 一块顶级 GPU 不停地算 8,000 年。其余的数都可以从它推出来:多一个数量级,就乘以 10。
这把尺子也顺便解释了为什么训练要用十万块 GPU:8,000 年的活,分给 10 万块卡同时干,就是 8,000 × 365 ÷ 100,000 ≈ 29 天。第 6 章讲的“每一格互不等待”,在这里变成了把几千年压缩到一个月的能力。
10²⁶ ≈ 一块 GPU 算 8,000 年 ≈ 10 万块 GPU 算 一个月
8.2用公开数据验算
先拿三个公开了训练细节的模型来检验这个公式。
| GPT-3(2020) | Llama 3.1 405B(2024) | DeepSeek-V3(2024.12) | |
|---|---|---|---|
| 参数量 N | 1750 亿 | 4050 亿 | 总 6710 亿,每 Token 激活 370 亿 |
| 训练数据 D | 3000 亿 Token | 15.6 万亿 Token | 14.8 万亿 Token |
| 6ND 验算 | 3.15×10²³ | 3.79×10²⁵ | 3.3×10²⁴ |
| 官方公布 | 3.14×10²³ | 3.8×10²⁵ | —(给出 GPU·时) |
| 硬件 | — | 最多 16,384 块 H100 | 2,048 块 H800 |
| GPU·小时 | — | 约 3,084 万 | 约 278.8 万 |
| 换算:一块 H100 要算 | 约 25 年 | 约 3,000 年 | 约 260 年 |
来源:GPT-3 论文;Meta《The Llama 3 Herd of Models》及模型卡;DeepSeek-V3 技术报告。DeepSeek-V3 按每 GPU·时 2 美元折算,正式训练约 557.6 万美元,不含此前的研究与试验。
公式和公布值几乎完全吻合。再用第 7 章的尺子验算一下 Llama 3.1 的 GPU·小时:
3.8×10²⁵ ÷ (989×10¹² × 40%) ÷ 3600 ≈ 2,670 万 GPU·时公布值约 3,084 万:实际利用率 38%–43%,外加故障重启等开销
量级对上了。这说明,只要知道“算多少”(6ND)和“算多快”(卡数 × 峰值 × 利用率),就能估出“算多久”。
表里还有一个有意思的对比。DeepSeek-V3 的总参数比 Llama 3.1 405B 多,训练数据相近,但训练算力只有后者的十分之一左右。原因是它的 MoE 结构:每个 Token 只激活 370 亿参数(第 5 章),6ND 里的 N 小了十倍。此外,它在训练中大量使用了 FP8 这种更低的精度(第 7 章):这不会减少运算的次数,却让每次运算更便宜,于是需要的 GPU·时更少。这个例子说明,算法和工程上的改进,可以让同样的能力便宜得多。
Llama 3.1 405B 用了约 3,084 万 GPU·时。如果只有一块 H100,要算多少年?
3,084 万小时 ÷ 24 ÷ 365 ≈ 3,500 年。这比表 8-2 里按 40% 利用率换算的约 3,000 年多出约五百年,多出来的部分,正是真实训练中的故障重启、通信等待等开销。这就是为什么必须用上万块 GPU 并行(第 6 章),也是为什么卡间网络如此重要:16,384 块卡同时工作,才把 3,500 年压缩到几个月。
8.3闭源旗舰:我们能知道什么
现在回到你最关心的问题:GPT-5、GPT-6 这样的模型。我们能诚实地说出什么?
| 模型 | 训练算力(FLOP) | 一块 H100 要算 | 估算依据与可信度 |
|---|---|---|---|
| GPT-4(2023) | ≈2.1×10²⁵ | 约 1,700 年 | Epoch AI,依据硬件与训练时长推算,推测级 |
| GPT-4.5(2025) | 约 10²⁶ 量级 | 约 8,000 年 | Epoch AI 在同一页面给出 6.4×10²⁵ 与 2.1×10²⁶ 两个估计,推测级 |
| Grok 3(2025) | ≈4.6×10²⁶ | 约 3.7 万年 | Epoch AI,依据硬件规模,可信度较高 |
| GPT-5(2025) | 很可能少于 GPT-4.5 | 少于上一行 | Epoch AI 判断:资源转向后训练与推理能力 |
| 下一代旗舰(如 GPT-6) | 10²⁶ – 10²⁷ 以上 | 8,000 年 – 8 万年以上 | 本书推测,依据见下文 |
截至 2025 年 6 月,Epoch AI 已识别出 30 多个训练算力超过 10²⁵ FLOP 的模型。
GPT-5 那一行值得多说几句。按照过去的规律,OpenAI 每一代整数版本,训练算力大约增长 100 倍。但 Epoch AI 在 2025 年 9 月的分析认为,GPT-5 的训练算力很可能少于 GPT-4.5。原因是新出现的“推理模型”训练方法:在预训练之后,用强化学习大规模地“后训练”,教模型一步步思考。这种方法效果很好,同样的表现所需的预训练算力可以降到约十分之一。于是 OpenAI 把资源集中在一个较小的模型上做大量后训练,而不是继续放大预训练。
同一份分析也预计:当后训练的方法成熟、可以在更大规模上使用时,训练算力会回到增长的轨道上,GPT-6 的训练算力很可能超过 GPT-4.5。
那么,如果你问“训练 GPT-6 要多大算力”,最诚实的回答是一个量级区间,而不是一个假装精确的数字:
- 训练算力:10²⁶ 到 10²⁷ FLOP 以上,也就是一块 H100 要不停地算 8,000 年到 8 万年以上。依据:GPT-4.5 已在 10²⁶ 量级,Grok 3 约 4.6×10²⁶;从 GPT-4 的约 2×10²⁵ 按“每代约 100 倍”外推,是 2×10²⁷;前沿训练算力每年约增长 5 倍。
- 训练数据:数十万亿 Token。Meta 的官方模型卡显示,Llama 4 Scout 预训练约 40 万亿 Token、Maverick 约 22 万亿 Token(多模态数据);再加上大量合成数据和后训练数据。
- 硬件:十万块以上 H100 等效的 GPU,训练数月。已知最大的 AI 数据中心,计算能力约相当于 110 万块 H100。
- 成本:仅最终一次训练就在数亿美元量级。作为参照,Epoch AI 估计 Grok 4 的训练成本约 5 亿美元。
图 8-1训练算力的阶梯,横轴每一格是 10 倍;顶部的琥珀色刻度把它翻译成“一块 H100 要算多久”。实心圆是公开数据,空心圆是外部估算,右下的区间是对下一代旗舰的推测。从 GPT-3 到 Grok 3,五年间增长了一千多倍:从“一块卡算 25 年”到“一块卡算 3.7 万年”。
我们能可靠地说
- 前沿训练算力的量级:10²⁵ 已成常态,10²⁶ 已被突破
- 增长的趋势:约每年 5 倍
- 估算方法:6ND + 卡数 × 峰值 × 利用率
我们不能可靠地说
- 某个闭源模型的精确参数量或训练数据量
- “ChatGPT 5.6”这类具体版本的训练成本:版本号常常只是产品迭代,不一定对应一次全新的训练
8.4自己动手:餐巾纸估算
现在用本书的全部工具,自己估算一次。目标:训练算力 10²⁶ FLOP,大致是当前前沿水平,也就是那块“要算 8,000 年”的 GPU 的工作量。
| 步骤 | 计算 | 结果 |
|---|---|---|
| ① 每块卡实际多快 | H100 BF16 稠密 989 TFLOPS × 利用率 40% | 约 4×10¹⁴ 次/秒 |
| ② 需要多少 GPU·时 | 10²⁶ ÷ 4×10¹⁴ ÷ 3600 | 约 7,000 万 GPU·时 |
| ③ 用 10 万块卡要多久 | 7,000 万 ÷ 10 万 ÷ 24 | 约 29 天 |
| ④ 要多少电 | 7,000 万 GPU·时 × 每卡约 1.4 kW(含服务器、网络、制冷) | 约 1 亿度(98 GWh) |
| ⑤ 相当于多少户人家 | 1 亿度 ÷ 每户每年约 2,500 度 | 约 4 万户一年的用电 |
| ⑥ 要多少钱(租卡) | 7,000 万 GPU·时 × 每小时约 2 美元 | 约 1.4 亿美元 |
粗算,只计最终一次训练。每卡 1.4 kW、每小时 2 美元、每户每年约 2,500 度都是简化假设(依据见附录);真实项目还有大量试验、失败重跑、数据处理和后训练的开销。
如果目标是 10²⁷ FLOP 呢?运算量乘以 10。换成 B200(BF16 稠密约 2.25 PFLOPS),同样按 40% 利用率:约 3.1 亿 GPU·时,10 万块卡要四个多月,按每小时 2 美元计约 6 亿美元。换成一个 100 万块 H100 等效的超大集群,大约一个月。
这些数字到底有多大?换一种体感:
- 人力:假如地球上 80 亿人每人每秒做一次乘法或加法,不吃不睡,算完 10²⁶ 次需要约 4 亿年;算完 Llama 3.1 405B 的 3.8×10²⁵ 次,也要约 1.5 亿年。
- 阅读:15 万亿个 Token 约合 11 万亿个英文单词。一个人每分钟读 250 个词、每天读 8 小时,要读约 25 万年。
下面是几组参考结果(均按 H100、利用率 40%)。网页版还提供一个估算器,可以换成你感兴趣的参数试试。
| 情景 | 总运算量 | GPU 数 | 天数 |
|---|---|---|---|
| 4000 亿参数 × 15 万亿 Token(接近 Llama 3.1 405B) | 3.6×10²⁵ | 16,384 | 约 64 |
| 10²⁶ 级前沿模型 | 10²⁶ | 100,000 | 约 29 |
| 10²⁷ 级下一代(推测) | 10²⁷ | 1,000,000 | 约 29 |
6ND ÷(卡数 × 峰值 × 利用率)= 你自己的估算器
8.5不只是“最后那一次”
餐巾纸估算只算了最终一次预训练。真实的前沿模型开发,还有几块同样巨大的开销:
- 试验:在正式训练之前,要用小模型反复试验数据配比、网络结构、超参数。研发阶段消耗的算力,往往远大于最后一次训练。
- 后训练:指令微调、人类反馈强化学习、推理能力的强化学习。8.3 节说过,它正在成为算力的新重点。
- 推理:模型上线后,每天为海量用户生成回答。据 Epoch AI 估计,2024 年 OpenAI 的算力支出中约 30% 用于推理,其余主要用于研发和训练。随着用户增长,推理的比重还在上升。
数据墙
算力可以靠造更多的数据中心来增加,数据呢?
DeepMind 在 2022 年的 Chinchilla 研究发现,在固定算力下,训练效果最好的配比大约是每个参数配 20 个 Token。按这个配比,10²⁶ FLOP 对应约 9000 亿参数、18 万亿 Token;10²⁷ FLOP 对应约 2.9 万亿参数、58 万亿 Token。实际上,现代模型为了让推理更便宜,常常把较小的模型训练得远超这个配比,比如 Llama 3 的 80 亿参数版本用了 15 万亿 Token,相当于每个参数近 1,900 个 Token。
问题是,人类写下的高质量文本是有限的。Epoch AI 估计,可用的高质量公开人类文本约在 300 万亿 Token 的量级,可能在 2026 到 2032 年之间被用尽(这一估算有争议)。这就是所谓的“数据墙”。应对的方向包括:用模型生成的合成数据、让模型在强化学习中通过“做题”自己产生训练信号、加入图像视频等多模态数据。
另一条曲线:算法在变便宜
最后,别忘了一个经常被忽视的趋势:据 Epoch AI 统计,达到同样的效果,所需的算力每年大约降到三分之一。DeepSeek-V3 就是一个例子。这意味着:今天需要 10²⁶ FLOP 才能训练出来的能力,几年后可能只需要十分之一甚至百分之一。
所以前沿模型的算力在以每年约 5 倍的速度增长,而“同样的能力”在以每年约 3 倍的速度变便宜。两条曲线叠加,是这几年 AI 能力进展如此之快的根本原因。
既然算法每年都在变便宜,为什么各家公司还要建越来越大的数据中心?
因为变便宜的是“达到某个固定能力”,而竞争的是“下一个能力”。更高效的算法加上更多的算力,能到达更远的地方。此外,推理的需求随用户数增长,也需要大量算力。这很像历史上的蒸汽机:效率越高,用煤的地方反而越多(经济学里叫“杰文斯悖论”)。
本章带走
训练算力 ≈ 6ND;用卡数 × 峰值 × 利用率一除,就是时间。前沿模型已在 10²⁶ FLOP 量级,相当于一块 H100 算 8,000 年;下一代推测在 10²⁷ 左右,相当于 8 万年。
- 公开数据验证了公式:GPT-3 约 3×10²³,Llama 3.1 405B 约 3.8×10²⁵,DeepSeek-V3 约 3.3×10²⁴。
- 闭源旗舰的数字未公开;GPT-5 很可能少于 GPT-4.5,GPT-6 很可能更多(Epoch AI 判断)。
- 10²⁶ FLOP ≈ 一块 H100 算 8,000 年 ≈ 10 万块 H100 算约一个月,约 1 亿度电、约 1.4 亿美元租金(仅最后一次训练,粗算)。
- 数据在变成瓶颈;算法效率每年约提高 3 倍;试验、后训练、推理同样消耗大量算力。
于是,最后一个问题从“一串数”出发,我们一路走到了十万块 GPU 和上亿度电。回过头看,这条路上真正的基石是什么?矩阵运算能解释智能的全部吗?读完这本书,我们该带走什么、反思什么?
∞Epilogue · What the matrix teaches
回到起点:矩阵教会我们什么
读完之后,你该带走什么、反思什么?
上一章留下的问题:从“一串数”出发,我们一路走到了十万块 GPU 和上亿度电。回过头看,这条路上真正的基石是什么?矩阵运算能解释智能的全部吗?
序章里,我请你用一句话回答“矩阵是什么”,并把答案记在手边。现在可以拿出来对照了。
如果你当时写的是“一张由数字排成的表格”,这句话并没有错。但现在你知道了,那只是矩阵的“存法”。它更本质的身份是:一个动作,一台把一串数变成另一串数的机器。表格里的每个数,都是这台机器的一个旋钮。
∞.1兑现四个承诺
序章做过四个承诺。逐条检查一下。
承诺一:用一句话说清矩阵是什么
矩阵是一个动作:它的每一列记录一根基向量被搬到了哪里,任何向量都跟着这些基向量走。这句话同时解释了“行乘列”:两个动作连着做,要写成一个矩阵,唯一的规则就是行乘列。(第 1、2 章)
承诺二:解释为什么 AI 几乎全是矩阵乘法
AI 是从数据里学一个函数;最简单、最好组合的函数是加权混合,也就是矩阵乘法;加一道折痕就能弯出任何形状;而 Transformer 的每一步,查表、打分、混合,都是矩阵乘法。再加上一条算术事实:矩阵乘法的运算量随 n³ 增长,其他运算只随 n² 增长,所以算力几乎都花在它身上。(第 2 到 5 章)
承诺三:看懂一张 GPU 规格表
看算力先问精度和稀疏口径;看单用户速度先看显存带宽;看多卡规模先看互联;最后记住,标称是天花板,大规模训练的实际利用率常在四成左右。(第 6、7 章)
承诺四:在餐巾纸上估算训练一个大模型
C ≈ 6ND,除以“卡数 × 峰值 × 利用率”,就是时间;乘以每卡功耗,就是电;乘以每小时租金,就是钱。10²⁶ FLOP 这个读不出感觉的数,换算过来就是一块 H100 不停地算 8,000 年,或者 10 万块 H100 算一个月。(第 8 章)
图 E-1全书一张图。上一行回答“为什么是矩阵”:从向量到神经网络,每一步都建立在前一步之上。下一行回答“如何变成智能、具体有多大”:从 Transformer 到训练规模,每一步都由矩阵乘法的性质决定。
∞.2三句话,第三次
序章预告过,有三句话会从不同角度反复出现。现在,它们应该不再是需要记住的口号,而是你能自己推出来的结论:
- 矩阵是一个动作。第 1 章从几何推出它,第 4 章在“一层神经网络”里再见到它,第 5 章在“旋转位置编码”里又见到它。
- 乘法就是加权混合。第 2 章在面包店里推出它,第 3 章在滤镜和卷积核里见到它,第 5 章在注意力里再见到它。
- 每一格互不等待,所以能并行;真正的瓶颈常常不是算,而是搬。第 6 章推出它,第 7 章在规格表的带宽一栏见到它,第 8 章在卡间网络和利用率里再见到它。
∞.3本书的核心贡献
- 从“表格”到“动作”
矩阵最本质的身份是一台加工向量的机器;列 = 基向量的去向。 - “行乘列”不是规定,是推论
它是让“两个动作连着做”成立的唯一规则,所以顺序不能交换。 - 乘法是接线
加法只让同位置的数相遇,乘法让每个输入影响每个输出;它也最贵,运算量随 n³ 增长。 - 矩阵是通用接口
叠加原理、局部线性、几十年打磨的 GEMM 与硬件,让各领域的问题都愿意写成矩阵。 - 智能 = 矩阵 × 折痕 × 梯度
没有折痕,多少层都等于一层;学习就是把矩阵里的数一点点调对。 - 并行来自独立,瓶颈在于搬运
每格互不等待,所以能交给上万个核心;算术强度决定了算力能用上几成。 - 规模可以估算
6ND 加上一把正确读懂的尺子,就能在餐巾纸上算出前沿模型的量级。
∞.4最后一道围栏
写到这里,必须防止一种误读:既然 AI“全是矩阵乘法”,那智能就“只不过是”矩阵乘法吗?
一本小说,“只不过是”一堆汉字吗?
从存储上说是。但同样三千个常用字,大多数排列毫无意义,只有极少数排列成了好小说。
那一个大模型,“只不过是”一堆矩阵乘法吗?
从计算上说是。但决定它有没有用的,是矩阵里那上千亿个数具体是多少,而这些数是由数据、目标、架构和大量的人类判断共同决定的。
矩阵运算是
- 现代 AI 的计算基石,几乎所有算力都花在这里
- 理解 AI 成本、速度、规模的最佳入口
矩阵运算不是
- 智能的全部:数据的质量、训练的目标、人类的反馈和判断同样关键
- 理解的保证:会算,不等于懂;模型给出流畅的回答,也不等于它是对的
这道围栏也适用于我们自己。大学时,我们学会了“怎么算”,却没人告诉我们“在算什么”。今天的大模型,某种意义上把这个处境放大到了极致:它能流畅地“算”出答案,却不一定“懂”这个答案。
∞.5留给你的五个问题
最后,没有总结陈词,只有五个问题。它们没有标准答案,值得你在合上书之后再想一想。
- 如果一台机器仅靠海量的“加权混合”就能写诗、编程、解题,那么你自己的思考里,有多少其实也是某种加权混合?又有哪些部分不是?
- 当“生成答案”变得几乎免费,什么会变得更稀缺:一个好问题、一份高质量的数据,还是一个可靠的判断?
- 你的工作里,哪些环节是“每格互不等待”、可以被大规模并行的?哪些环节天生是“斐波那契式”的、必须一步等一步?
- 本书反复强调“标称是天花板,不是日常”。在你评估任何新技术、新产品时,你会问哪些“口径”问题?
- 前沿模型的算力每年增长约 5 倍,同样能力的成本每年降到约三分之一。五年后,今天的哪些“不可能”会变得平常?你准备好了吗?
∞.6延伸阅读
书中每一个数字的出处和核查结果,见书末附录:事实核查与出处。
- 3Blue1Brown:《线性代数的本质》系列视频(本书第 1、2 章的几何直觉,与它一脉相承)
- Gilbert Strang:MIT 18.06《线性代数》课程
- Vaswani 等:《Attention Is All You Need》(2017,Transformer 的原始论文)
- Kaplan 等:《Scaling Laws for Neural Language Models》(2020)
- Hoffmann 等:《Training Compute-Optimal Large Language Models》(2022,Chinchilla)
- Meta:《The Llama 3 Herd of Models》(2024)
- DeepSeek-AI:《DeepSeek-V3 Technical Report》(2024)
- Epoch AI:“Trends in AI”数据与分析
∞.7术语速查
- 向量
- 一串有顺序的数,用来描述一个东西;数的个数叫维度。(第 1 章)
- 矩阵
- 一个动作:把向量变成向量;m×n 的矩阵吃进 n 个数,吐出 m 个数。(第 1 章)
- 线性变换
- 原点不动、直线不弯、格子一样的变换;恰好是矩阵能做的全部动作。(第 1 章)
- 点积
- 对应位置相乘再相加,即加权求和;也是衡量两个向量有多“对味”的打分。(第 2 章)
- 行列式
- 2×2 矩阵的 ad − bc,表示面积放大的倍数;为 0 时信息被压扁丢失。(第 1 章)
- 秩
- 矩阵中真正独立的“花样”数量;低秩近似可以大幅压缩数据。(第 3 章)
- 参数
- 模型各矩阵里所有可调的数;训练就是调它们。(第 4 章)
- 损失
- 模型输出与正确答案差多少的一个数;训练的目标是让它变小。(第 4 章)
- 梯度
- 损失在当前位置往哪个方向增长最快;沿反方向迈一小步就是梯度下降。(第 4 章)
- Token
- 大语言模型处理文字的基本单位,即词块;中文约 1–1.5 字一个。(第 5 章)
- 嵌入
- 把 Token 编号变成向量:到嵌入矩阵里取对应的一行。(第 5 章)
- 注意力
- softmax(Q·Kᵀ)·V:每个词给其他词打分,再按权重混合它们的信息。(第 5 章)
- FFN(前馈网络)
- Transformer 每层里“矩阵、折痕、矩阵”的部分,每个词各自加工,占参数的大头。(第 5 章)
- MoE(混合专家)
- 很多个前馈网络“专家”,每个 Token 只路由给少数几个;总参数大、每次计算量小。(第 5 章)
- KV 缓存
- 生成时把前面每个词的 K、V 存起来复用,省计算但增加显存读取。(第 6 章)
- RAG
- 检索增强生成:先找相关资料塞进提示词,再让模型回答。(第 5 章)
- 向量数据库
- 存放文档向量、用点积(或近似索引)快速找相似内容的数据库。(第 5 章)
- FLOP
- 一次浮点运算;也指运算的总次数。(第 7 章)
- FLOP/s
- 每秒浮点运算次数,衡量速度;常写作 FLOPS。(第 7 章)
- BF16 / FP8 / FP4
- 16、8、4 位的数字格式;位数越少越快越省,但量程或精度越有限。(第 7 章)
- HBM
- 高带宽内存:堆叠在 GPU 旁边的显存,带宽决定逐字生成的速度。(第 6、7 章)
- 算术强度
- 每搬 1 字节数据做多少次运算;H100 需约 295 才能吃满算力。(第 6 章)
- MFU
- 模型算力利用率:实际用于模型计算的算力 ÷ 标称峰值。(第 7 章)
- NVLink
- NVIDIA GPU 之间的高速互联,用于同一台服务器内的卡间通信。(第 6、7 章)
- All-Reduce
- 多张卡把各自的数据(如梯度)汇总求和或求平均、再分发回每张卡的通信操作。(第 6 章)
最后带走
矩阵是一个动作;乘法就是加权混合;每一格互不等待,所以能并行。人工智能的大厦,就建在这三块基石上。
- 会算,不等于懂;懂了“在算什么”,才能看清 AI 的能力、成本与边界。
- 面对任何醒目的数字,先问口径,再做估算。
- 把好问题、好数据和好判断,留给自己。
AAppendix · Fact check & sources
事实核查与出处
书中的数字从哪里来?逐条核对的结果如何?
这本书用了大量数字。为了让你可以自己核对,我们把书中所有可以核查的陈述整理成 40 条,于2026 年 9 月 30 日逐条联网回到原始出处核实:论文原文(arXiv PDF)、厂商官方规格页、官方模型卡、研究机构原文,以及少量百科条目。无法联网核实的,明确标为“假设”。
核查的原则有三条:第一,只认原始出处,不转引二手报道;第二,出处页面上的原话或原表格必须能直接支持书中的说法;第三,书中自己算出来的数,用脚本重新算一遍。
| 结果 | 条数 | 含义 |
|---|---|---|
| 一致 | 32 | 出处直接支持书中说法(含经脚本复算、本地实测一致的) |
| 已修正 | 6 | 核查发现不准确或口径不清,正文已按出处修改 |
| 假设 | 2 | 用于粗算的假设,已注明依据或注明未能核实 |
A.1这次核查改了什么
- Llama 4 训练数据(第 8 章):原文“超过 30 万亿 Token”出自 Meta 博客,本次无法抓取核实;改用官方模型卡:Llama 4 Scout 约 40 万亿、Maverick 约 22 万亿 Token(多模态数据)。
- B200 规格(第 7 章):HGX B200(8 卡):FP16/BF16 36 PFLOPS、FP8 72 PFLOPS 为稀疏口径(“Dense is ½ sparse spec shown”),FP4 为 144|72 PFLOPS(稀疏|稠密)→ 单卡稠密约 2.25 / 4.5 / 9 PFLOPS;DGX B200 显存 1,440 GB、带宽 64 TB/s → 单卡 180 GB、8 TB/s;NVLink 单卡 1.8 TB/s。所抓取的官方页面未给出单卡功耗(仅 DGX B200 整机最大约 14.3 kW),原文“约 1000 W”改为注明此口径。
- Rubin 算力口径(第 7 章):HGX Rubin 页单卡规格:FP16/BF16 4 PFLOPS 注“Dense specification”(稠密);NVFP4 推理 50 PFLOPS 注“specification is sparse”(稀疏);NVFP4 训练 35、FP8 训练 17.5 PFLOPS(稠密);288 GB HBM4、22 TB/s;NVLink 3.6 TB/s;全部为“Preliminary information… subject to change”。据此,H100→Rubin 的 BF16 稠密算力增长约 4 倍(原文写作 2–4 倍)。
- GPT-4.5 估算的表述(第 8 章):Epoch AI:GPT-4 2.1e25(推测级);GPT-4.5 在同一页面分别给出 2.1e26(模型表)与 6.4e25(说明表);Grok-3 4.6e26(Confident);截至 2025 年 6 月识别出 30 多个超过 10²⁵ FLOP 的公开模型。原文“先后给出”改为“同一页面给出两个估计”。
- BLAS 第三级的年代(第 3 章):BLAS 于 1979 年 9 月发布(Lawson 等)。第三级 BLAS(矩阵乘矩阵,含 GEMM)于 1987–1988 年提出,1990 年由 Dongarra 等正式发表于 ACM TOMS。原文“1990 年扩展出”改为“80 年代末提出、1990 年正式发表”。
- “8 万年”的参照物(第 8 章):现代人走出非洲约在 7 万–5 万年前,“8 万年 = 从现代人走出非洲算起”不准确,改为“比现代人走出非洲(约 7 万–5 万年前)还要久”;新石器时代约公元前 10000–2000 年(8,000 年前在其中);南宋 1127–1279 年(800 年前在其中)。
仍需留意闭源模型(GPT-4、GPT-4.5、GPT-5、Grok 3/4)的训练算力,出处本身就是外部研究机构的估算,“一致”只表示书中如实转述了这些估算,不表示估算本身已被官方证实。Rubin 的规格是官方初步信息,量产时可能变化。
A.2模型与训练数据
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| GPT-3:1750 亿参数,训练 3000 亿 Token,训练算力 3.14×10²³ FLOP 第 4 章、第 5 章、第 8 章 | 一致 论文:“175 billion parameters”;“All models were trained for a total of 300 billion tokens”;表 D.1 GPT-3 175B 训练算力 3.14E+23 FLOP。 | Brown et al., Language Models are Few-Shot Learners (2020) |
| Llama 3.1 405B:4050 亿参数,15.6 万亿 Token,3.8×10²⁵ FLOP,最多 16,384 块 H100,MFU 38%–43% 第 4 章、第 5 章、第 8 章 | 一致 论文:405B 参数、15.6T tokens、3.8×10²⁵ FLOPs;“trained on up to 16K H100 GPUs, each running at 700W TDP with 80GB HBM3”;BF16 MFU 38–43%(表 4)。 | Llama Team, The Llama 3 Herd of Models (2024) |
| Llama 3.1 405B 训练约 3,084 万 H100 GPU·时 第 8 章 | 一致 模型卡:Llama 3.1 405B 训练 30.84M GPU·时(H100-80GB,700W);三个尺寸合计 39.3M。 | Meta, Llama 3.1 Model Card |
| Llama 3.1 405B 为 126 层、16384 维;70B 为 80 层、8192 维 第 5 章 | 一致 论文表 3:8B/70B/405B 分别为 32/80/126 层,模型维度 4,096/8,192/16,384,词表 128,000,激活 SwiGLU,位置编码 RoPE。 | Llama Team, The Llama 3 Herd of Models, Table 3 |
| 一层可以“吃进 4096 个数、吐出 14336 个数”(Llama 3 8B 前馈层) 第 1 章 | 一致 论文表 3:8B 模型维度 4,096、FFN 维度 14,336。 | Llama Team, The Llama 3 Herd of Models, Table 3 |
| Llama 3 的 80 亿参数版本用了 15 万亿 Token 训练 第 8 章 | 一致 模型卡:8B 与 70B 的预训练 Token 数为 15T+(“pretrained on over 15 trillion tokens”)。 | Meta, Llama 3 Model Card |
| 原文:Meta 公布 Llama 4 预训练数据超过 30 万亿 Token 第 8 章 | 已修正 原文“超过 30 万亿 Token”出自 Meta 博客,本次无法抓取核实;改用官方模型卡:Llama 4 Scout 约 40 万亿、Maverick 约 22 万亿 Token(多模态数据)。 | Meta, Llama 4 Model Card |
| 典型 Transformer 中前馈网络约占三分之二甚至更多的参数;展开倍数约 3–4 倍 第 5 章 | 一致(推导) 由 Llama 3 表 3 推算 405B 每层:FFN 3×16,384×53,248≈26.2 亿参数,注意力(GQA,8 个 KV 头)≈5.7 亿,FFN 约占 82%;展开倍数 53,248/16,384≈3.25、14,336/4,096=3.5。原始 Transformer 为 d_ff=2048=4×d_model。 | Llama Team, The Llama 3 Herd of Models, Table 3 Vaswani et al., Attention Is All You Need (2017) |
| DeepSeek-V3:总 6710 亿参数、每 Token 激活 370 亿;14.8 万亿 Token;2,048 块 H800;278.8 万 GPU·时;按 2 美元/GPU·时约 557.6 万美元;训练使用 FP8 第 5 章、第 8 章 | 一致 论文:“671B total parameters with 37B activated for each token”;14.8 trillion tokens;“2048 NVIDIA H800 GPUs”;表 1 合计 2,788K GPU·时、按 H800 每 GPU·时 2 美元合 $5.576M,且“只含正式训练,不含此前研究与消融实验”;采用 FP8 混合精度训练。注:2,788K 含预训练、上下文扩展与后训练。 | DeepSeek-AI, DeepSeek-V3 Technical Report (2024) |
A.3方法与论文
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| Chinchilla(DeepMind 2022):算力最优约每个参数 20 个 Token 第 8 章 | 一致(经验值) 论文结论:模型规模与训练 Token 应等比例放大;Chinchilla 为 70B 参数、1.4 万亿 Token(每参数 20 个);表 3 中 67B→1.5T、175B→3.7T、1T 参数→1.27×10²⁶ FLOP。“每参数约 20 个 Token”是由这些结果归纳的经验值。 | Hoffmann et al., Training Compute-Optimal Large Language Models (2022) |
| 训练每个 Token 约 6N 次运算(前向 2N、反向 4N),C ≈ 6ND 第 4 章、第 8 章 | 一致 论文:反向传播约为前向的两倍,“C ≈ 6N floating point operators per training token”(不含嵌入参数)。 | Kaplan et al., Scaling Laws for Neural Language Models (2020) |
| 注意力 = softmax(QKᵀ)V,并除以与维度有关的缩放系数;原始 Transformer 前馈层为 4 倍展开 第 5 章 | 一致 论文:点积“divide each by √dk”后做 softmax;d_model=512、前馈内层 d_ff=2048(4 倍)。 | Vaswani et al., Attention Is All You Need (2017) |
| RoPE 按位置旋转 Q、K 向量来注入位置信息 第 5 章 | 一致 论文:RoPE 用旋转矩阵编码绝对位置,同时在自注意力中引入相对位置依赖。 | Su et al., RoFormer: Enhanced Transformer with Rotary Position Embedding |
| “国王 − 男人 + 女人 ≈ 王后”最早在 word2vec 类词向量中观察到 第 5 章 | 一致 论文:vector(“King”) − vector(“Man”) + vector(“Woman”) 最接近 “Queen” 的向量。 | Mikolov et al., Efficient Estimation of Word Representations in Vector Space (2013) |
| 现代模型常用 SwiGLU 前馈层(三个矩阵) 第 5 章 | 一致 论文:SwiGLU 等 GLU 变体前馈层“have three weight matrices, as opposed to two for the original FFN”;Llama 3 表 3 的激活函数为 SwiGLU。 | Shazeer, GLU Variants Improve Transformer (2020) Llama Team, The Llama 3 Herd of Models, Table 3 |
| 万能逼近定理:足够多神经元可在有界输入范围内任意逼近连续函数(含 ReLU 类激活) 第 4 章 | 一致 万能逼近定理针对紧致(有界闭)定义域上的连续函数;Leshno 等(1993)证明非多项式激活函数(含 ReLU)即具备该性质。 | Wikipedia, Universal approximation theorem |
| LoRA:在原矩阵旁加低秩修正(两个瘦矩阵)来微调 第 3 章 | 一致 论文:冻结预训练权重,在每层注入可训练的低秩分解矩阵。 | Hu et al., LoRA: Low-Rank Adaptation of Large Language Models (2021) |
| HNSW:多层邻居图的近似最近邻检索 第 5 章 | 一致 论文:分层(多层)可导航小世界图的近似最近邻检索。 | Malkov & Yashunin, Efficient and robust approximate nearest neighbor search using HNSW graphs |
A.4GPU 规格
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| H100 SXM:BF16 稠密 989 TFLOPS(稀疏 1979)、FP8 稠密 1979、80 GB HBM3、3.35 TB/s、NVLink 900 GB/s、700 W 第 4 章、第 6 章、第 7 章 | 一致 官方规格(H100 SXM):BFLOAT16 Tensor Core 1,979 teraFLOPS、FP8 3,958 teraFLOPS,页脚注明“* With sparsity”,稠密值即各为一半(989、1,979);80GB;3.35TB/s;TDP 最高 700W;NVLink 900GB/s。 | NVIDIA, H100 Tensor Core GPU 产品规格 |
| H100 SXM:132 个 SM、16,896 个 CUDA 核心、528 个 Tensor Core 第 6 章 | 一致 H100 SXM5:132 SMs、16,896 FP32 CUDA Cores、528 个第四代 Tensor Core、80 GB HBM3。 | NVIDIA 技术博客, NVIDIA Hopper Architecture In-Depth |
| NVLink 比 PCIe 快好几倍 第 6 章 | 一致 官方规格:NVLink 900GB/s,PCIe Gen5 128GB/s(约 7 倍);官方另称 NVLink-C2C 900GB/s “7X faster than PCIe Gen5”。 | NVIDIA, H100 Tensor Core GPU 产品规格 |
| 原文:B200:BF16 稠密约 2.25 PFLOPS、FP8 约 4.5、FP4 约 9;约 180 GB HBM3e、约 8 TB/s;NVLink 1.8 TB/s;约 1000 W 第 7 章 | 部分一致(已修正) HGX B200(8 卡):FP16/BF16 36 PFLOPS、FP8 72 PFLOPS 为稀疏口径(“Dense is ½ sparse spec shown”),FP4 为 144|72 PFLOPS(稀疏|稠密)→ 单卡稠密约 2.25 / 4.5 / 9 PFLOPS;DGX B200 显存 1,440 GB、带宽 64 TB/s → 单卡 180 GB、8 TB/s;NVLink 单卡 1.8 TB/s。所抓取的官方页面未给出单卡功耗(仅 DGX B200 整机最大约 14.3 kW),原文“约 1000 W”改为注明此口径。 | NVIDIA, HGX 平台规格 NVIDIA, DGX B200 规格 |
| 原文:Rubin(2026 官方):BF16 4 PFLOPS(口径待定)、NVFP4 推理 50 PFLOPS、288 GB HBM4、22 TB/s、NVLink 3.6 TB/s 第 7 章 | 已修正(口径已明确) HGX Rubin 页单卡规格:FP16/BF16 4 PFLOPS 注“Dense specification”(稠密);NVFP4 推理 50 PFLOPS 注“specification is sparse”(稀疏);NVFP4 训练 35、FP8 训练 17.5 PFLOPS(稠密);288 GB HBM4、22 TB/s;NVLink 3.6 TB/s;全部为“Preliminary information… subject to change”。据此,H100→Rubin 的 BF16 稠密算力增长约 4 倍(原文写作 2–4 倍)。 | NVIDIA, HGX 平台规格(HGX Rubin NVL8) |
| 最早一代 Tensor Core 做 4×4 小矩阵乘加 第 6 章 | 一致 NVIDIA:Volta 每个 Tensor Core 为 4x4x4 矩阵运算阵列,执行 D = A*B + C(A、B、C、D 均为 4×4)。 | NVIDIA 技术博客, Programming Tensor Cores in CUDA 9 |
| 2:4 结构化稀疏使 Tensor Core 速度翻倍,规格表常印稀疏口径 第 7 章 | 一致 NVIDIA:Sparsity 特性利用细粒度结构化稀疏,“doubling the performance of standard Tensor Core operations”;H100 规格页算力标“* With sparsity”。 | NVIDIA 技术博客, NVIDIA Hopper Architecture In-Depth NVIDIA, H100 Tensor Core GPU 产品规格 |
| 位布局:FP32 1+8+23、BF16 1+8+7、FP16 1+5+10、FP8 E4M3、FP4 E2M1 第 7 章 | 一致 FP32:1 符号、8 指数、23 位显式尾数;bfloat16:1、8、7;FP16:1、5、10;NVIDIA:FP4 为 E2M1(1 符号、2 指数、1 尾数),NVFP4 用 E4M3 FP8 作缩放因子。 | Wikipedia, Single-precision floating-point format Wikipedia, bfloat16 floating-point format Wikipedia, Half-precision floating-point format NVIDIA 技术博客, Introducing NVFP4 |
A.5算力趋势与外部估算
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| 前沿训练算力约每年 ×5;算法效率约每年 ×3;训练成本每年 ×3.5;显存带宽每年约 +28%;最大 AI 数据中心约 110 万 H100 等效;2024 年 OpenAI 约 30% 算力用于推理 第 6 章、第 7 章、第 8 章 | 一致 Epoch AI “Trends in AI”(2026-02-05 更新):前沿训练算力 2020 年起约 5×/年;预训练算力效率约 3.0×/年;训练成本约 3.5×/年;GPU 显存带宽 2008 年起约 +28%/年;已知最大 AI 数据中心(Colossus 2)约 110 万 H100 等效;2024 年 OpenAI 算力支出约 30% 用于推理。 | Epoch AI, Trends in AI |
| 原文:GPT-4 ≈2.1×10²⁵;GPT-4.5 估计 6.4×10²⁵ 与 2.1×10²⁶;Grok 3 ≈4.6×10²⁶;截至 2025 年 6 月 30 多个模型超过 10²⁵ 第 8 章 | 一致(措辞已调整) Epoch AI:GPT-4 2.1e25(推测级);GPT-4.5 在同一页面分别给出 2.1e26(模型表)与 6.4e25(说明表);Grok-3 4.6e26(Confident);截至 2025 年 6 月识别出 30 多个超过 10²⁵ FLOP 的公开模型。原文“先后给出”改为“同一页面给出两个估计”。 | Epoch AI, Over 30 AI models have been trained at the scale of GPT-4 |
| GPT-5 训练算力很可能少于 GPT-4.5;GPT-6 很可能更多;每整数代约 ×100;推理后训练可使预训练算力降约 10 倍;Grok 4 训练约 5 亿美元 第 8 章 | 一致 Epoch AI(2025-09):GPT-5 很可能比 GPT-4.5 用了更少训练算力;GPT-6 “probably more than GPT-4.5”;OpenAI 历史上每个整数代约 ×100;推理后训练技术可使同等表现所需预训练算力降约 10 倍;Grok 4 训练成本约 5 亿美元。 | Epoch AI, Why GPT-5 used less training compute than GPT-4.5 (but GPT-6 probably won’t) |
| 高质量公开人类文本约 300 万亿 Token 量级,可能在 2026–2032 年间用尽 第 8 章 | 一致 Epoch AI:经质量与重复调整后的公开人类文本约 300 万亿 Token;若趋势持续,将在 2026–2032 年间被用尽(过度训练则更早)。 | Epoch AI, Will We Run Out of Data? |
A.6历史与领域知识
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| 原文:BLAS 1979 年发布;1990 年第三级(矩阵乘矩阵,含 GEMM) 第 3 章 | 部分一致(已修正) BLAS 于 1979 年 9 月发布(Lawson 等)。第三级 BLAS(矩阵乘矩阵,含 GEMM)于 1987–1988 年提出,1990 年由 Dongarra 等正式发表于 ACM TOMS。原文“1990 年扩展出”改为“80 年代末提出、1990 年正式发表”。 | Wikipedia, Basic Linear Algebra Subprograms |
| 列昂惕夫因投入产出分析获 1973 年诺贝尔经济学奖 第 3 章 | 一致 诺贝尔奖官网:1973 年经济学奖授予 Wassily Leontief,“for the development of the input-output method…”。 | NobelPrize.org, The Prize in Economic Sciences 1973 |
| 灰度 Y = 0.299R + 0.587G + 0.114B(ITU-R BT.601) 第 3 章 | 一致 Rec. 601 亮度:Y′ = 0.299R′ + 0.587G′ + 0.114B′(严格说作用于伽马校正后的 R′G′B′)。 | Wikipedia, Luma (video) |
| PageRank 用链接矩阵反复迭代计算网页重要性 第 3 章 | 一致 PageRank 可用迭代法/幂法计算:反复用链接矩阵更新重要性向量直至收敛(实际算法另含阻尼因子)。 | Wikipedia, PageRank |
A.7常识与参照物
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| 英文 1 Token ≈ 0.75 个单词;中文约 1–1.5 字/Token;词表通常 10 万–20 万 第 5 章、第 8 章 | 一致(实测) 本书实测:OpenAI o200k 分词器词表 200,019;本书中文正文 32,862 个汉字 → 30,268 个 Token(约 1.09 字/Token);英文论文样本约 0.70 词/Token、4.6 字符/Token。Llama 3 词表 128,000(论文表 3)。 | OpenAI tiktoken(o200k_base 编码,本地实测) Llama Team, The Llama 3 Herd of Models, Table 3 |
| 阅读速度按每分钟约 250 词估算 第 8 章 | 一致(区间内) 维基百科所列成人英文阅读速度多在约 200–355 词/分钟之间,250 词/分钟为区间内的常用取值(估算)。 | Wikipedia, Words per minute |
| 原文:参照物:8 万年“从现代人走出非洲算起”;8,000 年“从新石器时代算到今天”;800 年“从南宋算到今天” 第 8 章 | 部分一致(已修正) 现代人走出非洲约在 7 万–5 万年前,“8 万年 = 从现代人走出非洲算起”不准确,改为“比现代人走出非洲(约 7 万–5 万年前)还要久”;新石器时代约公元前 10000–2000 年(8,000 年前在其中);南宋 1127–1279 年(800 年前在其中)。 | Wikipedia, Recent African origin of modern humans Wikipedia, Neolithic Wikipedia, Southern Song |
A.8本书采用的假设
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| 每户每年约 2,500 度电 第 8 章 | 假设(未核实) “每户每年约 2,500 度”未找到可抓取核实的官方统计,作为粗算假设保留,并在书中表注明示为假设。 | — |
| 每 GPU·时 2 美元;每卡含服务器、网络、制冷约 1.4 kW;MFU 取 40% 第 8 章 | 假设(有依据) 每 GPU·时 2 美元:与 DeepSeek-V3 报告采用的 H800 租价假设一致;每卡 1.4 kW:以 H100 TDP 700 W(已核实)加服务器、网络、制冷的分摊粗估;MFU 40%:取 Llama 3.1 405B 实测 38–43% 的中值附近。 | DeepSeek-AI, DeepSeek-V3 Technical Report, Table 1 Llama Team, The Llama 3 Herd of Models, Table 4 |
A.9本书自行推导的数字
| 书中说法 | 核查结果与出处原话 | 出处 |
|---|---|---|
| 书中自行推导的数字(6ND 验算、GPU·时、天数、电费、年数换算、面包店、点积等) 第 1 章、第 2 章、第 3 章、第 7 章、第 8 章 | 复算一致 书中推导数字均用脚本复算:6ND(GPT-3 3.15×10²³、Llama 3.79×10²⁵、DeepSeek-V3 3.29×10²⁴)、10²⁶ 需约 7,020 万 GPU·时、10 万卡约 29 天、约 98 GWh、约 1.4 亿美元;换算年数(10²⁶≈8,010 年);80 亿人手算 10²⁶ 约 4.0 亿年;面包店 8.5/23.8/10.7 元;点积 11.0/4.1/1.4;表 2-2 运算次数;H100 算术强度 989/3.35≈295。 | — |
怎样继续核对
数字会过时,出处会更新。遇到新数字,先找原始出处,再看口径,最后自己算一遍。
- 论文看原文表格,不看新闻转述。
- 规格看官方脚注:稠密还是稀疏、单卡还是整机、正式还是初步。
- 估算看方法与可信度标注,不把估算当事实。