# 第 2 章 几千亿个旋钮：神经元、参数与学习

> 本章问题：机器里的“学习”是什么？模型文件里装着什么？
> 来源：https://llm.weiborao.link/#ch2

**上一章留下的问题：**我们一直在说机器“学”。可是“学”在机器里到底是什么动作？它从数据里调出来的“规则”存在哪里，长什么样？

“神经元”“神经网络”“参数”“梯度下降”，这些词听起来像是要先学一学期生物和微积分。其实不用。本章只用加法、乘法和“往哪边拧”的直觉，带你一级一级爬上去。台阶是这样排的：

1. **名字从哪来：**大脑里的神经元做了一件什么事？
2. **一个人工神经元：**给几个条件打分，过了门槛就“是”。
3. **学习：**不让人定分数，让机器从例子里自己调。
4. **一个不够：**为什么要把很多神经元连成“网络”、叠成“层”？
5. **很多层怎么一起学：**把错误的责任一层层分下去。
6. **大语言模型与模型文件：**同样的东西，放大一百亿倍，存进硬盘。

### 2.1 名字从哪来：大脑里的神经元

你的大脑里有大量神经细胞，叫**神经元**。粗略地说，一个神经元做的事很简单：它从很多“上游”神经元那里接收信号；有的信号让它兴奋，有的让它平静；这些信号累积起来，**超过某个门槛，它就“放电”**，把信号传给下游；没到门槛，就保持安静。

上世纪中叶，研究者想：能不能用数学模仿这个“收信号、累加、过门槛就传下去”的动作？于是有了**人工神经元**（第 1 章的感知机就是最早的一种）。名字是从生物学借来的，但只借了这一个最粗的轮廓。

##### 人工神经元是

- 一个很小的数学公式：加权求和，再过一道门
- 受生物神经元“累加、过门槛”这一点启发的命名

##### 人工神经元不是

- 对大脑神经元的模拟（真实神经元复杂得多）
- 会“思考”的小单元：如果说有思考，也只存在于亿万个单元的整体配合里

### 2.2 一个人工神经元：打分，再过门槛

周末要不要去爬山？你大概会考虑三件事：天气好不好，朋友去不去，自己累不累。

**第一步，把条件变成数字。**计算机只认数字，所以先把每个条件写成一个数：天气好记 1，不好记 0；朋友去记 1，不去记 0；累的程度从 0 到 1，比如“有点累”记 0.8。这几个数叫**输入**。

**第二步，给每个条件定一个分量。**天气很重要，给 3 分；朋友有点重要，给 2 分；累是减分项，给 −4 分。这些分量叫**权重**：权重大，说明这个条件说话分量重；权重是负数，说明它在“拉后腿”。

**第三步，算总分。**每个输入乘上自己的权重，再加起来：3×1 + 2×1 + (−4)×0.8 = 1.8。这就是“加权求和”，和期末成绩按“平时 30%、期末 70%”算总评是同一回事。

**第四步，过门槛。**有的人很想出门，有的人很宅，所以还要加一个调节门槛高低的数，叫**偏置**。这里设为 −1（说明这人有点宅，总分要多 1 分才够）：1.8 − 1 = 0.8。最后一道“门”规定：结果大于 0 就输出“去”，否则“不去”。这道门叫**激活函数**，它就是生物神经元“过了门槛才放电”的数学版本。

> 【图示】一个人工神经元：三个输入分别乘以权重，加起来再加上偏置，经过激活函数得到输出。例子：天气好乘 3，朋友去乘 2，很累乘负 4，加权求和得 1.8，再加上偏置负 1 得 0.8，大于 0，所以输出“去爬山”。

**图 2-1** 一个人工神经元的全部动作：输入乘权重、加起来、加上偏置、过一道门。权重 3、2、−4 和偏置 −1 决定了它的“性格”：同样的输入，换一组权重，结论可能完全相反。

记住一个关键事实：**这个神经元的全部“判断力”，都装在那几个数里**——三个权重和一个偏置。换一个人，比如一个不怕累的户外爱好者，他的“累”的权重可能只有 −1，同样的输入就会得出“去”。权重和偏置合起来叫**参数**。这个词全书会反复出现，它指的就是这些决定判断的数字。

问：图里的权重 3、2、−4，是谁定的？

答：在这个例子里是我随手写的。

问：如果权重定得不好，比如把“累”的权重写成 +4，会怎样？

答：那它就会越累越想去爬山，判断全错。

问：那么，与其让人去猜权重，能不能拿一堆“过去的周末去没去”的记录，让机器自己把权重调对？

答：能。这就是“学习”。

### 2.3 学习：让机器自己调旋钮

把每个参数想象成调音台上的一个**旋钮**。“学习”就是从例子里把旋钮拧到合适的位置。先看一个只有两个旋钮的最小例子。

假设你开冰淇淋店，记录了 11 天的气温和销量。你想用一个神经元来预测：输入是气温，参数是一个权重 w 和一个偏置 b，输出是“销量 = w × 气温 + b”。这里不需要“门”，因为我们要的是一个数，而不是“是”或“否”。问题是：w 和 b 该是多少？

机器的办法分三步，一直循环：

1. **先猜。**随便设一组 w 和 b，用它把 11 天的销量都“预测”一遍。
2. **量误差。**把预测和真实销量比一比，差多少。把所有差距汇总成一个数（常用的是“差距的平方再求平均”），叫**损失**。损失越小，猜得越准。
3. **拧一点。**对每个旋钮问一句：“把你往上拧一丁点，损失会变大还是变小？变化有多快？”这个“方向加快慢”就叫**梯度**。然后每个旋钮都朝着让损失变小的方向拧一小步，回到第 1 步。

这个循环叫**梯度下降**。它没有任何“理解”的成分，只是在反复地“试一下、看误差、往好的方向挪一点”。可是重复足够多次之后，旋钮会停在一组让预测很准的位置上。

类比：

梯度下降像**在大雾里下山**。你看不见谷底在哪，但能感觉到脚下哪边是下坡、坡有多陡。于是你朝最陡的下坡方向迈一小步，再感觉一次，再迈一步。只要步子别太大（会冲过头）也别太小（会走到天黑），最后总能走到一个低处。“山的高度”就是损失，“你站的位置”就是旋钮的位置。

类比在这里失效：真实的“山”有几千亿个方向，不是三维的地形；而且走到的往往是一个“足够低”的地方，不一定是最低点。

> 【图示】梯度下降示意：横轴是一个参数 w，纵轴是损失（误差）。小球从左上方出发，每一步沿着坡度向下走一段，步子随坡度变缓而变小，最终停在谷底，此时 w 约为 2.07。

**图 2-2** 只看一个旋钮时的梯度下降。纵轴是损失，小球从一个随便猜的位置出发，每一步沿坡度往下挪；坡越陡步子越大，所以越靠近谷底走得越慢。

在这个两个旋钮的例子里，从“w = −0.5、b = 50”这个很差的起点出发，梯度下降大约走一百步，就会停在 w ≈ 2.07、b ≈ 6.2 附近（气温每高 1 度，大约多卖 2 份），平均平方误差从四百多降到 1.7 左右。大语言模型做的是同一件事，只是旋钮从 2 个变成了几千亿个。

### 2.4 一个神经元不够：为什么要“网络”

一个神经元会打分、会过门槛、还能自己学。那为什么不用一个就够了？看一个例子。

**停一下：你想让机器判断“今天的气温舒不舒服”：18 到 26 度之间舒服，太冷太热都不舒服。只用一个神经元（一个输入：气温），能做到吗？**

**参考答案：**

做不到。一个神经元的本事是“打分，再和一道门槛比”，所以它只能切一刀：要么“高于某个温度就舒服”，要么“低于某个温度就舒服”。可是“舒服”是中间的一段，两头都不舒服，需要切两刀。无论怎么调权重和偏置，一个神经元都圈不出中间那一段。

解决办法是**分工，再合并**：让第一个神经元只管“比 18 度暖吗”，第二个只管“比 26 度凉吗”，再让第三个神经元看前两个的结论，判断“两个都是吗”。三个各自只会切一刀的神经元，合起来就能圈出中间那一段。

> 【图示】一个神经元不够的例子：判断气温舒不舒服，18 到 26 度之间才舒服。一个神经元只能画一刀，比如“高于 18 度”，会把 35 度也判成舒服。用两个神经元，一个判断“比 18 度暖吗”，一个判断“比 26 度凉吗”，再用第三个神经元判断“两个都是吗”，就能圈出中间那一段。

**图 2-3** 一个神经元只能切一刀（左）；三个神经元分工合作，就能表达“中间那一段才对”（右）。第一排神经元的输出，成了下一个神经元的输入——这就是“网络”。

这个小例子里藏着神经网络的全部结构思想：

- **神经元的输出可以当作别的神经元的输入**，于是它们能连成一张网，这就是**神经网络**。
- 并排做同一级判断的一组神经元叫一**层**。直接接收原始数据的叫输入层，给出最终结论的叫输出层，中间的叫**隐藏层**（“隐藏”只是因为我们不直接看它们的输出）。
- 层数多的网络叫“深度”网络，**深度学习**的“深”就是这个意思。

判断越复杂，就需要越多的神经元和越多的层。比如认一张照片里有没有猫：第一层的神经元从像素里找出“这里有一条边”；后面的层把边组合成“圆形”“尖角”；再往后组合成“耳朵”“眼睛”；最后一层综合判断“是猫”。每一层只做简单的事，复杂的判断从层层组合里长出来。值得一提的是，这些中间特征并不是人规定的，而是训练时为了把最后的答案做对，被梯度下降自己调出来的。

> 【图示】一个小型神经网络：3 个输入，两层各 4 个神经元的隐藏层，2 个输出。每条连线是一个权重，每个神经元还有一个偏置，共 46 个参数。数据从左往右流动，每一层提取更抽象的特征。

**图 2-4** 一个只有 46 个参数的小网络：3 个输入，两个各有 4 个神经元的隐藏层，2 个输出。每条连线是一个权重，每个圆圈有一个偏置。前面的层学到简单的特征，后面的层把它们组合成更抽象的特征。

**停一下：每个神经元最后都要过一道“门”（激活函数）。如果把门全部拆掉，只做加权求和，叠 100 层会怎样？**

**参考答案：**

叠 100 层也等于 1 层。加权求和是“线性”运算，线性运算接线性运算，结果还是线性运算，就像连续打几次八折等于直接打一个折扣。图 2-3 里，第三个神经元之所以能表达“两个都是”，正是因为前两个神经元先各自过了门。激活函数引入了这种“弯折”（实际常用的门不是“是/否”两档，而是更平滑的版本，比如“小于 0 的一律变成 0”），层与层之间才不会坍缩成一层。有了它，足够大的网络在有界的范围内可以逼近几乎任何函数。

### 2.5 很多层怎么一起学：反向传播

回到“学习”。只有一个神经元时，“每个旋钮往哪边拧”很好算：拧一下，看损失怎么变。可是网络有很多层，最后一层的输出错了，前面每一层的每个旋钮各该负多少责任？比如图 2-3 把 30 度判成了“舒服”，是神经元 ② 的门槛设高了，还是神经元 ③ 的合并规则错了？

1986 年的**反向传播**算法解决的就是这个问题：从输出端的误差出发，**一层一层往回算**，把“责任”按各自对错误的贡献大小分摊给每个旋钮，每个旋钮就知道了自己的梯度。然后，所有旋钮一起按 2.3 节的办法拧一小步。

类比：

一家餐厅收到差评“菜太咸”。店长不会让所有人都罚一样的钱，而是往回追：上菜的没问题，炒菜的放多了酱油，配料的把盐和糖装反了。每个环节按自己对“咸”的贡献改进一点。反向传播就是这条追责链，只不过它用微积分的链式法则，把每一环的“贡献”算得很精确。

到这里，你已经爬完了前五级台阶：神经元是“打分加门槛”；参数是决定打分的数字；学习是用梯度下降调参数；网络是把神经元分工、组合、叠成层；反向传播让很多层能一起学。剩下的只是一个问题：**如果把这一切放大到极致，会怎样？**

### 2.6 大语言模型：一个巨大的神经网络

现在可以给大语言模型一个朴素的定义：**它是一个参数多到几十亿到几千亿的深度神经网络，被训练来预测下一个 Token**。2.2 节说过，“参数”就是所有权重和偏置；一个模型有多少参数，就是它有多少个旋钮。

参数越多，网络的“容量”越大，能记住和组合的规律就越细。图 2-4 的小网络有 46 个参数，Llama 3.1 405B 有 4050 亿个，多出约一百亿倍。

### 2.7 模型就是一个文件

听起来很玄的“大模型”，下载到硬盘上，就是几个文件。

> 【图示】一个模型文件的构成：一个很小的配置文件，描述网络怎么搭；一堆很大的权重文件，存放全部参数。以 Llama 3.1 405B 为例，配置只有几 KB，权重按 BF16 约 810 GB。

**图 2-5** 一个模型 = 一份“搭建说明”+ 一大堆数字。配置文件说明网络有几层、每层多宽；权重文件存放训练好的全部旋钮位置。

权重文件的大小，用一个乘法就能算出来：参数个数 × 每个参数占的字节数。训练时常用 16 位浮点数（BF16），每个参数 2 字节。所以一个 1200 亿参数的模型约 240 GB，一个 4050 亿参数的模型约 810 GB。

为了在显存更小的设备上运行，人们常把每个参数用更少的位数存，这叫**量化**。代价是精度会损失一点。

表 2-1 同一个模型，不同精度下的权重体积

| 精度 | 每参数字节 | 80 亿参数 | 1200 亿参数 | 4050 亿参数 |
| --- | --- | --- | --- | --- |
| FP32（32 位浮点） | 4 | 32 GB | 480 GB | 1,620 GB |
| BF16 / FP16（16 位） | 2 | 16 GB | 240 GB | 810 GB |
| FP8 / INT8（8 位） | 1 | 8 GB | 120 GB | 405 GB |
| INT4（4 位） | 0.5 | 4 GB | 60 GB | 约 203 GB |

只计权重本身；实际运行还需要额外显存存放中间结果（第 6 章的 KV Cache）。

类比：

量化像把一把**刻度精确到毫米的尺子**换成只刻到厘米的尺子。大多数量东西的场合，厘米尺子够用，而且轻便得多；只有在需要精细区分的地方，才会出错。

**停一下：模型文件里，有没有存着“巴黎是法国的首都”这句话？**

**参考答案：**

没有。文件里只有数字，没有任何一句话。“巴黎是法国首都”这个知识，分散地体现在亿万个旋钮的相互配合里：当前文是“法国的首都是”时，这些数字一起作用，让“巴黎”的概率最高。这也解释了为什么模型会“记错”：知识不是一条条存下来的，而是被压进了参数里，提取时可能变形。第 7 章会讲怎样弥补这一点。

学习，就是用误差去*调旋钮*；  
模型，就是*调好的旋钮位置*。

##### 本章带走

神经元 = 打分（加权求和）+ 门槛（激活）；学习 = 用梯度下降调参数；网络 = 把只会切一刀的神经元分工、组合、叠成层；大语言模型 = 几千亿个参数组成的深度神经网络，存成一个文件。

- 一个神经元的判断力全装在参数（权重和偏置）里；换参数就换“性格”。
- 损失衡量“错了多少”，梯度告诉每个旋钮“往哪拧、拧多快”，反向传播把误差的责任一层层分下去。
- 一个神经元只能切一刀，圈不出“中间那一段”；多个神经元组成层、层叠成网络，复杂的判断从组合里长出来。
- 激活函数让层与层不会坍缩成一层，网络才有“深度”。
- 模型文件 = 配置 + 权重；体积 ≈ 参数数 × 每参数字节数，量化可以让它变小。

**于是，下一个问题**：神经网络只会对数字做加法和乘法。可是我们给它的是文字，“草莓”“strawberry”“你好”。文字是怎样变成它能算的数字的？
