跳到主要内容

单个神经元 — 训练到底在做什么

这一章讲三件事: 一个人工神经元的完整定义; 「训练」这个词落到代码上到底是哪几行; 以及一颗神经元天生做不了什么——这条极限决定了下一章必须把神经元连成网络。 全书后面的每个模型都建立在这一章的训练循环上。

1. 顶层全景:从生物神经元抄来的三步

原书从生物神经元讲起:神经细胞通过突触接收其他细胞的信号, 电位超过某个阈值(门槛值)就发放自己的电信号,去兴奋或抑制下游细胞1。 人工神经元照着这个结构抄,只有三步2:

输入 x = (x0, …, xN−1) ← 相当于收到的突触信号

① 加权求和,再加一个偏置: p = w·x + b
│ (w 是权重,b 是偏置)
② 过激活函数: y = H(p)
│ (H 是 Heaviside 阶跃函数:p≤0 出 0,p>0 出 1)

输出 y ∈ {0, 1} ← 相当于「发/不发」

图说:每个箭头旁都是具体的数——输入是实数,权重是实数,偏置(外加的一个可调数)是实数,输出只有 0 和 1。

三个新词当场钉死:

  • 权重(weight):每个输入配的一个数,表示「这份输入重要多少」。求和前先相乘。
  • 偏置(bias):额外的一个可调数,不乘任何输入,直接加在求和结果上。它让分界线不必过原点,后文走查里看效果。
  • 激活函数(activation function):套在求和结果外面的那道「门槛」。本章用最陡的一种——Heaviside 阶跃函数,大于零出 1、小于等于零出 02

2. 主走查:10 个点、1 个权重,训练 100 轮(过一遍数据叫一轮)

这是原书第 1 章的第一个完整例子,所有数字都来自原文,我们逐轮走。

数据:文件里有 10 个点,输入是 x 值,输出是类别标签 0 或 13:

x = [ 0.699, -0.669, -1.262, -0.399, -0.062, -0.551, -1.490, -0.079, 0.973, 0.435 ]
真值 = [ 1, 0, 0, 0, 1, 0, 0, 1, 1, 1 ]

画在图上一眼看出规律:一个阶跃——x 小于某个分界点全标 0,大于全标 14

模型:只有一个输入、一个权重的神经元,输出 (w0 * x > 0) 转成整数5

权重起步是随机抽的:从一个钟形的随机分布——标准正态分布——里抽一个数6

标准正态分布的形状:均值 0、方差——就是数的散开程度——为 1。

训练循环(每轮做四件事,原文给了明确的步骤表)7:

第 i 轮(共 100 轮,η=0.1):

① 随机抽一个点。假设抽中 x = 0.699,真值 = 1
② 用当前权重预测。假设此刻 w0 = -0.42(这个起点是为演示编的,
真实起点是随机数,但更新算式完全一致):
预测 = (w0 * x > 0) = (-0.42 × 0.699 > 0) = 假 → 输出 0
③ 算错误:error = 预测 − 真值 = 0 − 1 = -1
(这颗神经元的错误只有三种可能值:+1、0、-1,因为输出和真值都是 0/1[^8])
④ 按错误更新权重:
w0 ← w0 − η · error · x
= -0.42 − 0.1 × (-1) × 0.699
= -0.42 + 0.070
= -0.35

看清楚第 ④ 步在干什么:这次预测偏低(该是 1 却给了 0),错误是 −1, 更新式 w0 ← w0 − η·error·x 就把 w0 朝 x 的方向推了一点; 反过来若预测偏高,错误是 +1,同一个式子会把 w0 往回拉。 没有任何一处出现了「规则」——分界线在哪,是这 100 次微调的最终结果。 原书说 100 轮是「反复试出来的」轮数,够这个问题收敛(错误不再变小); 训练中能观察到 w0 稳定变成正数,那就是学成了8

换成 2D 数据(平面上的点),唯一的变化是权重从一个数变成一组(每个输入一个), 预测从「一个乘积」变成「点积」——对应项相乘再全部加起来;更新式一个字不用改9

3. 学习率:那个唯一要你来定的数

η 在上面叫「学习率」,它是这段代码里唯一需要人拍板的数10:

η 取值会发生什么
太大一步跨过头,在正确值两侧来回震荡,永远落不下来
太小每步挪一点点,收敛极慢,还可能卡在半路

原书给的补充很实用:实践中常用「学习率随训练进度变化」(先大后小)或自适应学习率来兼得两头10。 还有一个容易被忽略的事实:100 这个轮数没有公式可算,就是试出来的8。 这个领域里「试出来有效」的默认值会反复出现,每次都值得记一笔。

4. 这颗神经元的极限:它只能切一条直线

这是本章最重要的边界。 不管怎么训练,一颗(带阶跃激活的)神经元 只能把 1D 数据按「一个分界点」切开、把 2D 数据按「一条直线」切开11

原书用一组反例数据当场演示了失败:数据里类别变号了三次(非凸形状), 训练完的预测一塌糊涂——它只有一条直线可用,而数据的分界不是直线12

偏置在这里派上用场:没有偏置时,那条分界线被钉死在过原点的位置; 加上偏置(实现上等价于多一个恒为 +1 的输入,配自己的权重), 分界线就能平移到任何位置。原书让读者回头验证:分界点不在原点的数据,加偏置后预测明显变好13

还有一个小而要紧的工程问题:权重跑飞。 训练中权重会漂向很小的值;输出只有 0/1 时,权重越小,错误相对显得越大, 一步更新就可能把权重拽出很远,训练被搅乱14。 对策是权重正则化:每轮更新后把权重向量除以自己的长度,强制它始终待在单位圆上15

这个「长度」用 L2 范数——各分量平方和开根号——来量。顺带记一组记号:L1 范数是各分量绝对值之和;Lp 范数是推广式16

判断(我们的,不是书里的):「权重跑飞」的根因是输出只有两个离散值、 错误信号太糙。下一章把激活函数换成平滑曲线后,错误变成连续值,这个病症会大幅缓解—— 原书把它安排在换激活函数之前讲,读者正好能体会到「为什么需要更好的激活函数」。 如果错,会错在: 如果正则化还有独立的统计动机(比如防过拟合)而不仅是稳定训练, 那本节的归因就只讲了一半——原书在此处只给了稳定性动机。

5. 作者的判断与证据

  • 有证据的:训练循环有效——10 个点的线性数据训练后预测与真值一致(原书图 1-5); 噪声数据同样能学(原书图 1-6);非凸数据必然失败(原书图 1-7)。三组都是跑出来的图,不是推理。
  • 作者的经验之谈(没有证明,只有建议):轮数 100 靠试错;学习率要有取舍; 权重初值取 1 的量级有助收敛7
  • 明确的坦白:练习 1-2 里作者直说,这颗神经元永远无法完美预测这组数据—— 只有一个可调参数的模型,最多收敛到阶跃函数或它的镜像, 有两个点会被系统性地判错17。这句坦白是下一章的整个动机。

6. 边界与局限

边界后果在哪一章解决
只能切一条直线/一个分界点非凸数据不可学第 03 章(多层网络)
输出只有 0/1错误信号只有 ±1/0,训练糙第 03 章(连续激活函数)
无法输出「程度」只能分类,不能预测连续值第 04 章(回归)
权重会跑飞训练不稳定本章正则化压住;深层网络另有方案

另一个原书没展开、但我们该点破的局限:「监督学习」——就是用带人工答案的数据集训练——的标签哪来。 本章的训练数据每个输入都带着人工给的正确答案(0/1 标签), 原书把这叫监督学习——用带标注的数据集训练18。 谁打标签、打标签多贵,要到第 08 章(自监督)和第 14 章(主动学习)才正面回答。

7. 可带走的

  1. 神经元 = 加权求和 + 偏置 + 门槛,三步,没有更多;
  2. 训练 = 猜错就朝减小错误的方向微调,更新式 w ← w − η·error·x 一行写完;
  3. 学习率管步子大小:大了震荡、小了磨蹭;轮数靠试;
  4. 偏置 = 让分界线脱离原点的自由度,实现上就是个恒为 1 的假输入;
  5. 权重跑飞是离散输出的病,正则化(除以向量长度)可压;
  6. 一颗神经元的宿命是线性切分,这是结构极限,与训练好坏无关;
  7. 本章更新式与第 03 章反向传播的关系:后者就是这条式子的「逐层分摊版」。

8. 原文地图

主题原书章原文位置
生物神经元到人工神经元的对应Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:3(搜「computational unit inspired」)
神经元定义(p=w·x+b,Heaviside)Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:20(搜「weighted sum of the inputs」) · text/10-fm-classifying-data-with-a-single-neuron.txt:25(搜「Heaviside step function」)
10 个点的数据与阶跃规律Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:70(搜「y_gt: [1.」) · text/10-fm-classifying-data-with-a-single-neuron.txt:97(搜「step function that assigns」)
单权重神经元实现Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:108(搜「astype(int)」)
权重随机初始化Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:118(搜「standard normal distribution」)
训练循环步骤表Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:157(搜「train the weights」) · text/10-fm-classifying-data-with-a-single-neuron.txt:167(搜「learning rate」)
100 轮与错误三值Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:189(搜「trial and error」)
学习率取舍 NOTEClassifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:193(搜「trade-off」)
线性可分极限Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:234(搜「convex datasets」)
非凸失败演示Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:244(搜「rather unsuccessful attempt」)
偏置的作用Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:418(搜「shift the activation function」)
权重跑飞问题Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:454(搜「wreaking havoc」)
权重正则化与超圆Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:467(搜「(hyper)circle」) · text/10-fm-classifying-data-with-a-single-neuron.txt:475(搜「L1 norm」)
单参数模型的坦白Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:209(搜「far too simple」)
2D 点积版神经元Classifying Data with a Single Neurontext/10-fm-classifying-data-with-a-single-neuron.txt:334(搜「dot product」)

Footnotes

  1. 出处:「Classifying Data with a Single Neuron」第 3 段(text/10-fm-classifying-data-with-a-single-neuron.txt:3,搜「computational unit inspired」)。

  2. 出处:「Classifying Data with a Single Neuron」第 15 段(text/10-fm-classifying-data-with-a-single-neuron.txt:15,搜「vector of inputs」)、第 20 段(text/10-fm-classifying-data-with-a-single-neuron.txt:20,搜「weighted sum of the inputs」)、第 25 段(text/10-fm-classifying-data-with-a-single-neuron.txt:25,搜「Heaviside step function」)。 2

  3. 出处:「Classifying Data with a Single Neuron」第 66 段(text/10-fm-classifying-data-with-a-single-neuron.txt:66,搜「y_gt」)。原文打印出的 x 与 y_gt 数组即本节引用的数值(四舍五入到三位小数)。

  4. 出处:「Classifying Data with a Single Neuron」第 97 段(text/10-fm-classifying-data-with-a-single-neuron.txt:97,搜「step function that assigns」)。

  5. 出处:「Classifying Data with a Single Neuron」第 105-108 段(text/10-fm-classifying-data-with-a-single-neuron.txt:103,搜「neuron_clas_1d」)。实现为 (w0 * x > 0).astype(int)

  6. 出处:「Classifying Data with a Single Neuron」第 118 段(text/10-fm-classifying-data-with-a-single-neuron.txt:118,搜「standard normal distribution」)。

  7. 出处:「Classifying Data with a Single Neuron」第 157 段(text/10-fm-classifying-data-with-a-single-neuron.txt:157,搜「train the weights」)、第 159 段(text/10-fm-classifying-data-with-a-single-neuron.txt:159,搜「Initialize the weights」)、第 167 段(text/10-fm-classifying-data-with-a-single-neuron.txt:167,搜「learning rate」)。 2

  8. 出处:「Classifying Data with a Single Neuron」第 189 段(text/10-fm-classifying-data-with-a-single-neuron.txt:189,搜「trial and error」)。原文:100 轮「as determined through trial and error」;error 总是 +1、0 或 −1;w0 训练后稳定为正。 2

  9. 出处:「Classifying Data with a Single Neuron」第 334 段(text/10-fm-classifying-data-with-a-single-neuron.txt:334,搜「dot product」)。

  10. 出处:「Classifying Data with a Single Neuron」第 193 段(text/10-fm-classifying-data-with-a-single-neuron.txt:193,搜「trade-off」)。 2

  11. 出处:「Classifying Data with a Single Neuron」第 234 段(text/10-fm-classifying-data-with-a-single-neuron.txt:234,搜「convex datasets」)。

  12. 出处:「Classifying Data with a Single Neuron」第 244 段(text/10-fm-classifying-data-with-a-single-neuron.txt:244,搜「rather unsuccessful attempt」)。

  13. 出处:「Classifying Data with a Single Neuron」第 418 段(text/10-fm-classifying-data-with-a-single-neuron.txt:418,搜「shift the activation function」)、第 448 段(text/10-fm-classifying-data-with-a-single-neuron.txt:448,搜「doesn't pass by the origin」)。

  14. 出处:「Classifying Data with a Single Neuron」第 454 段(text/10-fm-classifying-data-with-a-single-neuron.txt:454,搜「wreaking havoc」)。

  15. 出处:「Classifying Data with a Single Neuron」第 467 段(text/10-fm-classifying-data-with-a-single-neuron.txt:467,搜「(hyper)circle」)。

  16. 出处:「Classifying Data with a Single Neuron」第 471-483 段(text/10-fm-classifying-data-with-a-single-neuron.txt:471,搜「Euclidean norm」)。

  17. 出处:「Classifying Data with a Single Neuron」第 209 段(text/10-fm-classifying-data-with-a-single-neuron.txt:209,搜「far too simple」)。原文:仅一个可训练参数时「it can converge to only the Heaviside step function or its opposite」。

  18. 出处:「Summary」第 5 段(text/15-fm-summary.txt:5,搜「supervised learning」)。原书在第 1 章小结里明确把本章的训练方式命名为监督学习。