
计算机不会阅读。它只能做算术。你曾经聊过的每一个聊天机器人,底层都是规模大到难以想象的算术。这自然会带来一个问题:乘法最后怎么会写出你的邮件?
深入接触这些系统一段时间后,我总会回到同一个判断:这些想法其实很简单。比符号看起来简单,比讲解它们的人说起来简单。你只需要按正确的顺序把它们搭起来。
所以这个系列要做的就是这件事。第一篇分成两部分,Part A 讲的是现代 AI 中最重要的一个事实,而它可以用一句话说完:
一切都会变成向量,而机器通过不断微调数字来学习,直到不再出错。
读完这篇文章,你会准确知道这句话是什么意思,包括真正的方程,以及每个符号的含义。Part B 会用这些部件组装出 ChatGPT。我们先从语言开始,但阅读时请记住一件事:图像、音频、视频,所有这些东西最终都是通过同一个入口进入机器的。后面你会看到这件事为什么重要。
一切都会变成数字
在机器能对 “cat” 这个词做任何事之前,必须先有人把 “cat” 变成数字。
这就是整个游戏。真的如此。你听过的每一次 AI 突破,归根结底都是对同一个问题给出了更好的答案:应该用哪些数字表示这个东西,又该如何调整这些数字?
现代答案叫作向量:一串数字,被当作空间中的一个点。或者按我更喜欢的想象方式,它是一支从原点指向那个点的箭头。“cat” 这个词可能由 768 个数字表示(具体用多少个数字,是设计上的选择;数字越多,能容纳的细微差别越多)。“dog” 也是如此。“helicopter” 也是如此。
关键就在这里。这些数字会被学成这样:含义相近的词,最终会对应到方向相近的箭头。“Cat” 和 “dog” 指向几乎相同的方向。“Helicopter” 则指向完全不同的地方。意义变成了几何。
这些箭头叫作 embeddings(嵌入),而且它们不是手工造出来的。没有人坐下来决定 cat 的 768 个数字。它们是学出来的,背后只有一个简单的训练信号:出现在相似句子里的词,会被推向相似的方向。给机器看足够多的互联网内容,“cat” 和 “dog” 就会自己靠近,因为在无数句子里,它们都会追东西,也都会把桌上的东西撞下来。
这个著名演示来自 Google 在 2013 年发布的一个系统,叫 word2vec。你可以对意义做算术:
king − man + woman ≈ queen
取 king 的箭头,减去 man 的箭头,加上 woman 的箭头,最终落点最近的词就是 queen。从 “man” 到 “woman” 是这个空间里一个稳定的方向,而且你可以从任何地方沿着这个方向走。没有人把它编程进去。它是从数字里自然长出来的。第一次看到它真的生效时,确实会让人有点不安。
这不是玩具,也不只适用于文字。我曾经交付过一个系统,它必须在一栋布满摄像头的大楼里跟踪同一个人。角度不同,光照不同,很多时候你只能看到背影。它的工作方式正是这样:每一次拍到某个人,都会变成一个向量;如果两次拍到的人生成的箭头方向几乎一致,那就是同一个人。系统并不会像你一样知道名字或认识脸。它只是在比较箭头。无论输入是词、人脸还是声音,这一个想法都同样成立。这也是我一直说所有模态最终都通过同一个入口进入机器的原因。
点积:统治一切的那一个操作
如果意义就是方向,我们就需要一种方式来问:两支箭头的方向有多一致?这个操作叫点积,值得花两分钟理解,因为它是整个 AI 中使用最频繁的操作。当你听到 GPU 对 AI 很重要时,GPU 大部分时间做的就是这个,而且是每秒做数十亿次。
两个向量 a 和 b。点积是:
a · b = Σ aᵢ bᵢ = |a| |b| cos(θ)
先看左边。Σ 只是“求和”的指令。aᵢ 表示列表 a 里的第 i 个数字。所以 Σ aᵢbᵢ 的意思是:把两个列表按位置一一相乘,然后把结果加起来。整个计算就这么多。相乘,再相加。
右边解释了我们为什么要关心它。同一个总和,恰好等于两支箭头的长度乘以 cos(θ),其中 θ 是它们之间的夹角。而余弦只是一个刻度盘:当两支箭头指向同一方向时读数为 1,垂直时为 0,方向相反时为 −1。
所以,一个成本很低的计算——相乘再相加——实际上在衡量对齐程度:
- 箭头对齐:很大的正数。含义相似。
- 箭头无关:接近零。
- 箭头相反:负数。
点积就是相似度分数。 Cat · dog 很大,Cat · helicopter 接近零。请牢牢记住这一点,因为在 Part B 里,transformer 内部那个人人都当作深奥魔法的 “attention”,本质上就是在大规模地反复计算同一个东西。
重塑空间的机器
所以,词是箭头。接下来我们需要一台能对它们做点什么的机器。它叫神经网络。我想一步一步把它搭起来,因为它是 transformer 的乐高积木。如果你理解了它,Part B 就会很容易。
从一个神经元开始。它是一个小公式,不是脑细胞:
h = f(w · x + b)
四个符号,四份工作:
- x 是输入。一个向量。比如,一个词的 embedding。
- w 是权重。另一个向量,输入里的每个数字都对应一个权重,用来表示这个神经元有多在意那个数字。注意 w · x 又是我们的点积:这个神经元在给输入打分,看它有多符合自己被训练去识别的模式。
- b 是偏置,一个把分数上移或下移的常数。它设定神经元的阈值,也就是它有多容易被激活。
- f 是激活函数,最后施加的一个小小的非线性弯折。下一节会单独讲它,因为该用哪一种弯折,几乎决定了深度学习的生死。
一个神经元计算一个分数。现在把一整排神经元堆起来,每个神经元都有自己的权重,并把同一个输入喂给它们。把这一整排一次性写出来,就得到:
h = f(Wx + b)
形式一样,但 W 现在是一个矩阵,也就是把所有权重向量堆成的网格;h 则是所有分数组成的向量。然后,关键动作来了:把这个输出再作为输入,喂给下一层。再下一层。这样就是一个多层感知机,也就是 MLP。
我希望你脑子里留下的是这幅图:每一层都会作用在整个可能的输入空间上,然后重塑它。拉伸它,旋转它,折叠它。原始空间里缠成一团、几乎无法分开的东西,比如夹在真诚评论中的讽刺评论,经过足够多次重塑后,会变得清清楚楚、可以分开。深度不是魔法。深度就是把空间多折几次。
继续之前,请记住两件事。第一,网络的全部知识都存在 W 和 b 里,也就是数十亿个普通数字。知识没有别的地方可以藏。第二,当你在 Part B 里听到 “transformer 内部的 MLP block” 时,说的其实就是这个:两层这样的结构,位于 GPT 的每一个 block 里。你现在已经真正理解了 ChatGPT 结构中的一大块。
一个函数选择如何让整个领域停滞
我还欠你讲讲 “f” 的故事。它听起来像脚注。可它左右了深度学习大约十年的命运。
首先,为什么 “f” 要存在?因为没有它,堆叠层数是没有意义的。Wx + b 是线性操作,而一串线性操作会坍缩成一个线性操作。一千层,如果没有弯折,也等于一层。我前面说的那些空间折叠呢?正是这个弯折让折叠成为可能。去掉它,每一层就只是继续拉伸和旋转同一张平面。
那么该用哪一种弯折?跟我走进博物馆看看。
sigmoid 曾经是经典选择:
σ(x) = 1 / (1 + e^(−x))
可以这样读它:把任何数字沿着一条平滑的 S 形曲线压到 0 到 1 的范围里。非常负的输入落在接近 0 的地方,非常正的输入落在接近 1 的地方。它平滑,处处可微,看起来也很像一个神经元从关到开。所有人都在用它。
而它悄悄勒死了深层网络。看 S 曲线远离中心的位置:它会变平。平意味着导数,也就是斜率,在那里几乎为零。为什么这重要?因为你马上会看到,学习是通过把斜率从后往前穿过各层来完成的,过程中会一路相乘。把十层 sigmoid 串在一起,就等于一路乘上十个很小的数字:信号在抵达前面的层之前就缩向了零。网络前端干脆停止学习。这就是梯度消失问题,也是神经网络在 1990 年代和 2000 年代被视为死胡同的重要原因之一。
大约在 2010 年前后流行起来的修复办法,简单得几乎让人觉得冒犯:
ReLU(x) = max(0, x)
整个函数就这一行。输入为负,输出零。输入为正,原样通过。对任何正输入,斜率都正好是 1,因此学习信号可以向后穿过一百层而不缩小。它的计算成本也几乎为零。这个一行替换,是深度学习在 2010 年代突然跑通的真实原因之一。我喜欢这个故事,因为它的教训可以推广:有时候,突破不是增加聪明东西,而是移除那个一直在悄悄害死你的东西。
博物馆里还有现代展厅。今天的前沿模型使用的是 ReLU 更平滑的亲戚:GPT 级模型里的 GELU,可以看作在零附近有一个柔和、概率式弯曲而不是硬拐角的 ReLU;以及 Llama 级模型里的 SwiGLU,它加入了一个学出来的门,用来决定多少信号可以通过。这些差异是真实的,但属于渐进改良,是对 ReLU 洞见的精修,而不是革命。这个博物馆的重点不是展品本身。重点是,一个十分钟前你还没听过的函数,曾经支撑着整个领域,而人们选择它时真正追问的是一个问题:斜率会发生什么?
“错”是什么意思:损失函数
我们现在有了一台装满可调数字的机器。它一开始很蠢:W 和 b 是随机的,所以它的预测只是噪声。学习意味着调整它们。但朝着什么调整?
在机器能变好之前,必须先有人把“错”定义成一个单一数字。这个定义叫损失函数,对语言模型来说,标准选择是交叉熵。公式在这里,然后我们拆开看:
L = − log P(correct next word)
设定是这样的:模型读入一些文本,然后为每一个可能接在后面的词输出一个概率。在这些候选词中,有一个就是训练文本里实际出现的下一个词。损失就是:取模型给这个正确词分配的概率,取它的对数,再取负号。
为什么要取对数?感受一下它的形状:
- 模型说正确词的概率是 1.0,完全确信,完全正确:log(1) = 0。零损失。没有惩罚。
- 概率 0.5:损失 ≈ 0.69。轻微刺痛。
- 概率 0.01,模型非常确信但错了:损失 ≈ 4.6。重罚。
- 概率接近 0:损失会爆炸到无穷大。
对数会把自信的错误变成灾难。一个诚实犹豫的模型只会受到轻微惩罚。一个笃定却错误的模型会被重击。每一步训练中,这种压力都会把概率推向训练文本里的真实答案。
再往下一层,因为这里真的很漂亮。最小化这个损失并不是某种随意的配方。统计学家问了一个世纪:给定数据,怎样选择最能解释它的模型参数?
他们的答案叫最大似然:选择那些让观测数据最可能出现的参数。把代数推完你会发现,最大化数据的概率,和最小化我们的交叉熵损失是同一件事。同一套数学,两套词汇。所以 GPT 训练时,做的是统计学中最经典的事情:寻找一组参数,让它看到的真实互联网,在这组参数下拥有最高的概率。模型不是在背句子。它是在拟合语言上的一个概率分布。
这也是理解语言模型是什么时最诚实的框架,并且会解释 Part B 中很多事情,包括为什么模型在错误时听起来也很自信。错误答案和正确答案来自同一个分布,听起来一样流畅。
学习:往山下滚
现在来到 Part A 的收尾。我们有了一个衡量错误程度的数字。学习就是:让这个数字变小。
想象一片地形。权重 θ 的每一种可能设置都是一个位置。每个位置的海拔就是损失。在这片地形的某处,海拔最低:那里对应着犯错最少、错误最轻的一组权重。训练就是找到通往那里的路。问题是:这片地形有数十亿个维度,而你站在雾里。你看不到山谷。你只能感觉脚下的地面。
那就做最明显的事。感觉哪边是下坡。朝那边迈一步。重复。
“哪边是下坡”有一个名字:梯度,写作 ∇L。它是损失相对于每一个权重的斜率集合,由一个叫反向传播的算法计算出来。反向传播名声很玄,但本质上就是微积分里的链式法则,只是记账极其严谨。完整的更新规则,也就是整个现代世界赖以运行的一行,是:
θ ← θ − η ∇L(θ)
最后一次,逐个符号来看:
- θ(theta):所有权重和偏置,数十亿个数字,也就是你在地形中的位置。
- ←:更新。用后面的东西替换旧权重。
- ∇L(θ)(梯度):最陡上坡的方向,以及它有多陡。
- −:计算机科学里最重要的减号。上坡会让损失更糟,所以要朝反方向走。
- η(eta,也就是学习率):每一步走多大。太大,你会冲过山谷然后反弹;太小,训练会慢到地质年代。我为这个数字浪费过的周末多到不想承认。再看一遍动画:当地面变平时,步子会变小,因为步长会随斜率缩放。小球会自己减速,滑进谷底。
在数万亿个词上把这一行运行数万亿次,随机权重就会变成 GPT。这就是训练。幕后没有第二套机制。
收尾前再看一个镜像,因为你还会再遇到它。把减号换成加号,就得到梯度上升:朝上坡走,用在那个数字衡量的是你想要更多的东西时,比如奖励,而不是错误。下降最小化痛苦,上升最大化收益,同一套机器,指向相反方向。记住这个翻转。在 Part B 里,它会把一个猜下一个词的机器变成一个有帮助的助手。
我们走到了哪里,以及墙上的裂缝
看看你现在已经掌握了什么,因为这已经是机器的大部分了:
- 词变成向量,意义变成几何。
- 点积衡量含义之间的相似度。
- MLP 用 f(Wx + b) 重塑空间,它的知识完全存在权重里。
- 交叉熵定义什么叫错,而它其实是最大似然的另一种说法。
- 梯度下降让权重一路滚下山,直到机器不再出错。
还有三件你本周就能用上的事:
- 当 AI 的回答听起来很自信时,记住它来自哪里。 模型是一个概率分布,正确答案和错误答案听起来一样流畅。自信是一种风格,不是信号。任何重要的东西都要核验。
- “语义搜索”就是点积。 每一个 RAG 系统和“与你的文档聊天”的工具,都是通过比较 embedding 箭头来检索的。当检索漏掉结果时,是因为箭头没有对齐,所以要改写你的查询,说出你真正想表达的意思,而不是你记得的关键词。
- Embeddings 很便宜,你今天就能用。 每个主要 AI 提供商都在出售 embeddings,价格只是几分之一美分。要在你的笔记、工单或产品中“找到和这个类似的东西”,只差一次点积,不需要训练模型。(本系列后续:现代 embedding 模型到底如何训练,我们会一起从零搭建语义搜索)
但基础里有一道裂缝,这也是本文留下的悬念。
上面的一切都把一个词当成只有一支箭头。想想这两句话:“I sat on the river bank”(我坐在河岸上)和 “I withdrew cash from the bank.”(我从银行取钱)。同一个词。同一支箭头。完全不同的意思。固定 embedding 在看到你的句子之前,就已经决定了 “bank” 的意思。而 MLP 会把输入作为一个固定整体吃进去。它没有机制让一个词环顾四周,看看邻居,再调整自己。
语言真正需要的是这样一台机器:“bank” 的箭头会被上下文弯折,在一个句子里被拉向河岸,在另一个句子里被拉向金库。在这台机器里,每个词都能问其他每个词:你和我在当前语境里的意思有关吗?
你已经知道给这种相关性打分的操作了。它就是点积。2017 年,Google 的一个团队想出了如何围绕这个问题构建一整套架构:在所有位置并行地反复提出这个问题,并把这个机制叫作 attention。
Part B 会把它搭起来:transformer、GPT 的每一个部件、一个原始模型如何变成助手、图像如何也悄悄从同一个向量入口进入,以及那些试图取代 attention 的新架构。 订阅,这样你就不会错过!