返回博客

从神经网络到Transformer

AI 聊天的本质,说穿了就是疯狂猜下一个词。这篇从"机器怎么认出手写数字"讲起,一路串到 Transformer 的向量化、注意力和温度。

TransformerNeural Network

从"认出一个数字"到"猜出下一个词":用大白话讲清楚 AI 到底在干什么

今天学完 Transformer,真的有种不做笔记不行的冲动。

但我整理的时候发现一个问题:如果直接上来讲 Transformer,会有一堆词压根没法解释——什么向量、什么层、什么权重,全是悬在空中的。所以我决定换个顺序,先讲一个特别经典、特别小的例子:让机器认出一张图片里写的是几。把这个搞明白了,我们就能够发现 Transformer 不过是同一套思路的放大版。

好了,我们开始。

一、先说清楚:机器学习到底在学什么

机器学习这个词听着玄,说穿了就一句话:我想用已经知道的东西,去预测还不知道的东西。

比如我手上有一万张房子的照片和它们的成交价,我想训练一个东西,以后再来一张新照片,它能告诉我这房子大概值多少钱。这就是机器学习。

深度学习,是机器学习里的一个特定流派——专指用"多层神经网络"来做这件预测的方法。先别管"多层神经网络"具体是什么,你就记住:它是一种预测工具,跟最简单的线性回归(就是中学学的 y = kx + b 找一条最拟合的直线)本质上是一家人,只是复杂得多、能拟合的东西离谱得多。

那它怎么学会预测的?靠训练。训练就是不停地给它看"题目和答案",让它自己调整内部的参数,直到它能在新题目上也答对。你可以把训练理解成:一个学生狂刷题,刷到形成了肌肉记忆。

二、一个最小的例子:让机器认出手写数字

这是我觉得整个深度学习里最好的入门例子,简单到可以全程在脑子里跑一遍。

假设我们要让机器认出 0 到 9 的手写数字。我们先得把"一张图"变成机器能吃的东西——一串数字

怎么变?给一个 28×28 的小方格,一共 28×28 = 784 个格子。我们在上面手写一个数字,数字笔画经过的格子是亮的,没经过的是暗的,笔画还有深浅。每个格子的明暗,我们用一个 0 到 1 的数表示(0 是纯黑,1 是纯白,中间是灰)。

这样一张图就变成了 784 个数。再把这个 28×28 的方阵"摊平"成一条,就得到了一个长度为 784 的向量。说白了,一张图片在机器眼里,就是 784 个数排成的一列。

接下来是关键的结构。我们想要的输出是什么?是 0 到 9 这十个数字各自的"可能性"。所以我们在最右边放 10 个格子,每个格子里的数表示"我觉得这张图是这个数字的概率"。哪个格子的数最大,机器就判定是哪个数字。

那从左边的 784 个数,怎么走到右边的 10 个数?我们在中间塞两层"中间层",每层 16 个格子(这个 16 是随便定的,你定别的也行)。于是整条路就是:

784(输入) → 16(中间层一) → 16(中间层二) → 10(输出)

中间层先看成黑盒就好——信息从左往右一层层传,每经过一层就被"加工"一次,最后流到那 10 个格子里,数最大的那个就是答案。

这就是神经网络做判断的全貌了。是不是没那么吓人?数字识别只是个开胃菜,同样的结构,换个输入输出,就能拿去识别汉字、识别图像,甚至——后面会讲到——处理语言。

三、黑盒里到底装了什么:权重、偏置、激活函数

好的,现在我们把黑盒拆开看一眼。

从一层到下一层,机器到底做了什么运算?它需要两个参数和一个函数。

第一个参数是权重(weight)。 下一层的每个格子,都要去"参考"上一层所有格子的值。但不是平均参考——有的格子重要,有的不重要。权重就是给每条连接打的分:这条连接重要,权重大;不重要,权重小甚至为负。说得夸张点,权重就是模型的大脑,它决定了模型整个的行为模式。而权重的值,正是训练过程中一点点调出来的。

第二个参数是偏置(bias)。 算完加权和之后,再加上一个偏置值,相当于给这个格子设一个"触发门槛"——要足够亮我才认。

那个函数叫激活函数。 加权求和再加偏置,得到的是一个范围乱七八糟的数。激活函数负责把它"压"回一个合理的范围,同时给整个系统引入非线性(没有它,叠多少层都等于一层,啥也学不会)。最基础的教程里用的是 Sigmoid,它能把任何数压到 0 到 1 之间。实际工程里现在更常用 ReLU,因为它训练起来更快、拟合效果更好。

所以一层到下一层,本质就是:对上一层的数做一次"加权求和 + 加偏置 + 过激活函数"。 整个网络,就是这套动作重复好几遍。

到这里你应该能体会到一件事:不管多复杂的神经网络,核心都是一堆实数数组(也就是张量),一层层地被变换成新的实数数组。输入是实数数组,每个中间层是实数数组,输出还是实数数组。记住这个画面,因为 Transformer 也是这么回事。

四、换个任务:从"认数字"到"猜下一个词"

好,地基打完了,我们上楼。

Transformer 干的活,换了个任务:给定一段话,猜出下一个词最可能是什么。 你平时用的那些聊天 AI,本质就是把这件事反复做——猜一个词,接上,再猜下一个,再接上……一个字一个字蹦出来的。(严格说,这种"猜下一个词"的玩法对应的是 GPT 这一类自回归模型;Transformer 这个架构本身还能干别的,比如翻译,但我们这篇就盯着"猜下一个词"讲。)

它的整个流程,可以拆成几步,你会发现每一步都和上面那个数字识别遥相呼应。

第一步,把文字变成数字。 跟图片要变成 784 个数一样,文字也得先变成数。先把一段话切成一个个token(你可以粗略理解成"词"或"词的一部分"),然后每个 token 用一个向量来表示。这个"把词变成向量"的方法,叫 embedding(词嵌入)

我当时学到这儿是真的觉得天才——它等于把语言文字硬生生塞进了数学世界。一旦词变成了向量,词和词的关系就能用几何来算了:意思相近的词,向量方向也相近。想找近义词?找方向接近的向量就行。

怎么衡量两个向量"方向接近"?用点积。两个向量点积为正,说明方向大致一致;为零,说明垂直、不相干;为负,说明方向相反。所以点积可以当成一把尺子,量两个词"对不对得上"。这把尺子后面立刻就要用到。

五、Transformer 的两个核心动作:注意力 + 前馈层

token 变成向量之后,真正的处理开始了。Transformer 主要靠两个模块交替工作。

第一个是注意力模块(Attention)。 它干的事,是根据上下文,更新每个词的向量,让词义变准确

举个例子。"苹果"这个词,光看 embedding 是死的、固定的。但放进句子就不一样了:"苹果发布了新手机"里它指公司,"我买了几斤苹果"里它指水果。注意力机制干的,就是让"苹果"这个向量去环顾四周的词,把上下文的信息吸收进来,从一个"只代表这个词本身"的死向量,变成一个"编码了上下文"的活向量。

它具体怎么环顾?这里稍微展开一点(入门可以先跳过,但理解了会很爽)。每个词的向量会被拆出三个角色:

  • Query(我想找什么)
  • Key(我能提供什么)
  • Value(如果被选中,我真正交出去的信息)

一个词用自己的 Query 去和其他所有词的 Key 做点积(还记得点积是那把"对不对得上"的尺子吗,这儿就用上了),算出"我该关注谁、关注多少",然后按这个关注度,把大家的 Value 加权融合进来。融合完,这个词的新向量就带上了上下文。这就是"通过相关性更新词义"的真相。

第二个是前馈层(也就是多层感知机,MLP)。 注意力让词之间"互相通气"之后,前馈层接着对每个词的向量单独做一次变换——注意,这一步各个词之间是不通信的,各管各的,但用的是同一套变换规则。你可以理解成:注意力负责"交流信息",前馈层负责"各自消化"。

然后呢?重复。 注意力 + 前馈层算一轮,这样的轮次会堆叠很多层。每过一轮,每个 token 的向量就被打磨得更"懂上下文"一点。一层层下来,向量从"光是这个词"逐渐变成"这个词在这整段话里到底是什么意思"。

最后,用最后一个 token 的向量去预测下一个词。这个向量经过这么多层的加工,已经浓缩了前文所有信息,拿它来猜下一个词,正合适。

(你看,这和数字识别是一个模子:输入是实数数组,中间一层层变换,最后输出一组"可能性"。)

六、最后一步:softmax 和那个叫"温度"的旋钮

模型最后吐出来的,是一大堆词各自的"分数",杂乱无章。要把它变成能用的概率,得过一道 softmax——它的作用就是把这堆分数归一化成加起来等于 1 的概率分布,这样模型才好"挑"出下一个词。

这里有个特别好玩的旋钮,叫温度(Temperature,记作 T),它就拧在最后这步 softmax 上:

  • T 大:概率分布被拉平,各个词的机会更均匀,输出更随机、更天马行空,有创造性,但也容易跑偏。
  • T 小:概率分布变尖,高分的词更容易被选中,输出更确定、更保守。
  • T 趋近于 0:每次都死磕概率最高的那个词,完全不带随机。

你调 AI 的"创意程度",调的其实就是这个 T。

最后补一个你平时一定遇到过的现象:上下文长度限制。Transformer 在猜下一个词时,能往前看的文本量是有上限的。这就是为什么有些模型聊久了会"失忆",把前面说过的东西忘掉——不是它笨,是它能同时盯着的窗口就那么大,早期的内容滑出窗口就看不见了。

写在最后

把今天的东西串一遍:

机器学习是"用已知预测未知";神经网络是把输入变成一串数,经过一层层"加权求和 + 偏置 + 激活函数"的变换,最后输出一组可能性;Transformer 则是把这套思路用在语言上——先把词变成向量,再靠注意力让词互相吸收上下文、靠前馈层各自消化,层层堆叠之后,用最后一个 token 去猜下一个词。

你可能发现了,这一整篇我都在讲机器怎么做判断(也就是前向传播)。但还有一个更要命的问题没碰:那些权重,机器一开始是不会的,它怎么把权重一点点学对的?

这就是下一篇要讲的反向传播。简单剧透一下:它的思路是"先猜,然后看错得多离谱,再顺着这个误差倒推回去,告诉每个权重该往哪个方向调一点点"。我学明白了再来写。

好了,今天就到这儿。

Discussion