跳到主要内容

回归与训练工程 — 从「预测连续值」到「数字孪生」

这一章讲三件事: 分类网络怎么一步改成回归网络(输出连续的数); 训练工程的三件套——分批更新、数据三分、过拟合监视; 以及一个能改变你对「模型上限」看法的项目:网络学得比训练数据本身还准。 前两章是「训练是什么」,这一章是「训练怎么操盘」。

1. 顶层全景

分类(前三章) 回归(本章)
───────────── ─────────────
输出 = 0 / 1 或 10 个概率 输出 = 一个连续的数(如 -0.3、2.7)
出口套 sigmoid / softmax 出口不套任何函数(线性直通)
错误信号只有 ±1/0(MNIST 前的小例子) 错误 = 预测 − 真值,本身就是连续数
│ │
└──────────────┬──────────────────────┘

同一套训练循环:预测 → 算损失 → 反向传播 → 更新

图说:上一章的更新式 w ← w − η·error·x 在回归里原封不动—— 因为更新量正比于平方误差对权重的导数,这条式子本来就是为平方误差设计的1。 变的只有出口和错误信号的「粗细」。

2. 核心原理

2.1 线性神经元:一条过原点的线

一维数据的回归,一颗带线性激活的神经元就够:输出 = w0·x。 训练后预测紧贴真值——只要数据本来就是一条直线2

它的极限也一眼见底:只有一个可调参数,拟合出的线必须过原点; 对弯曲的数据,它只能给出「一条过原点的直线」这个它唯一会画的答案3。 (配偏置能摆脱原点,摆脱不了「直」。)

2.2 回归网络:隐藏层带弯、出口不带弯

两层版的关键改动只有一处:隐藏层照旧用 sigmoid(负责弯), 出口层什么激活都不加(负责直)——损失对出口权重的导数恒为 1, 梯度反传的公式其余部分原样照抄4

出口要「直」的原因值得停一拍:要预测的量本身没有任何「必须落在 0 和 1 之间」之类的约束, 再套一道 S 形只会把预测强行压进一个范围,平白添错。 隐藏层的弯负责表达力,出口的直负责不添乱——这个分工在后面所有网络里反复出现。

层数的收益和分类时一致:原书练习里给出对照, 达到同样性能,三层网络需要的神经元数和训练轮数都明显少于两层5

2.3 主走查:光镊里的一颗微球(从坐标到力)

主走查用本章的项目:给一颗被激光夹住的微球(光学镊子,显微镜下的「光之夹钳」, 靠激光压强对微小粒子施力,可以测 DNA、马达蛋白受到的力)6, 输入它的三维坐标,输出它受到的三维力。

输入:粒子坐标 (x, y, z) ← 数量级 10⁻⁶ 米
│ 原始数值太小,先重标定到 ~1 的量级再喂给网络[^7]

密集网络:3 → 256 → 256 → 256 → 3
│ 133,379 个可调参数;损失 = L1(预测与真值差值的绝对值)

输出:力的三个分量 (Fx, Fy, Fz) ← 数量级 10⁻¹⁵ 牛顿(飞牛,记作 fN)

数据从哪来?用较精确的传统算法(几何光学工具箱 OTGO,把激光拆成 10 万条光线逐条算力) 预先生成约 10⁵ 个数据点;网络训练 100 个 epoch7

结果一行:训练完,预测的平均绝对误差约 30 fN—— 而这套系统里力的典型量级是几千 fN,误差只占百分之一的量级,可直接当仿真器用8

真正反直觉的在这里:把网络预测和「训练它的那份几何光学数据」摆在一起对比, 网络不仅复现了训练数据,还比训练数据更准9。 机制是:几何光学把连续的激光拆成有限条光线,算出的力上叠着一层锯齿状的伪影; 网络的结构复杂度(能表达多弯的曲线)刚好「学得动光滑的力曲线、学不动叠加的锯齿」—— 拟合时把伪影当噪声平均掉了。拟合本身成了一次滤波。

这个项目在原书里叫数字孪生:给一个物理系统(或一个昂贵的仿真器)建一个学出来的替身, 替身跑得比真身快几个数量级,于是原本算不起的实验规模变得算得起10

2.4 批量训练(一次攒一小撮样本、用平均误差信号更新):一次看一批,梯子更稳

到此为止每次更新只用一个样本(原书叫 online 训练)。 批量训练的「批量」就是「一次攒一小撮样本」:不再逐样本更新,而是攒一小批,用平均误差信号更新一次。 平均带来两个好处:误差景观被抹平、梯度估计更稳,权重更新不再被个别离谱样本拽来拽去11

三个极端摆在一起看12:

策略每次更新用多少数据特点
online1 个样本反馈最勤,但路线抖
批量(mini-batch)一小批中间大小最好——原书明说
最陡下降(steepest-descent)全部数据最稳也最贵

原书还给了两个进阶技巧。其一,随训练推进逐渐增大批大小, 效果接近逐渐减小学习率——2018 年有专门论文论证过这个替换(Smith 等, 「别降学习率,增大批量」)13。其二,每个 epoch(完整过一遍训练集)前随机打乱样本顺序, 否则同一顺序反复出现会给网络注入偏差;打乱后 MSE 曲线不再单调下降, 要叠一条滑动平均的平滑线才能看清趋势14

监控训练时,MSE 曲线的两种画法各有用途:线性坐标看绝对变化,对数(一格顶十倍的压缩)坐标看相对变化15

2.5 数据三分:训练、验证、测试

本章最有长期价值的工程制度:把数据分成三份,各司其职16——

份数干什么谁碰它
训练集拟合权重反向传播
验证集盯着泛化(对新数据的本领),调超参数人(不参与权重更新)
测试集训练全部结束后做最终评估只许碰一次

经验比例:七成训练,剩下的分给验证和测试17;而且要用随机抽样来分, 顺序切前 70% 会引入偏差(比如数据按时间排时,你把「未来」全留给了验证集)18

过拟合就藏在训练/验证曲线的分岔里:训练误差一路下降, 验证误差先降后——模型开始背训练数据的细节,牺牲了对没见过的数据的判断力, 此时它「只对训练数据有用」19。 反面是欠拟合:模型太简单,训练、验证两边的误差都降不下去20

验证集还有一个用途:早停——验证误差开始回升就停训练。 原书当场泼了冷水:验证误差在训练中会波动、会出好几个局部低谷, 「到底是不是真过拟合了」没有干净的判据,于是实践中长出一堆经验规则21

判断(我们的,不是书里的): 数据三分的本质是把「考试」和「作业」分开。 验证集是随堂练习(用来调整学习策略),测试集是期末考(只能考一次, 考多了——比如反复按测试集挑模型——它就退化成另一份作业,成绩再度失真)。 实践中「测试集泄漏」是评估造假最常见的来源。 如果错,会错在: 如果某领域的惯例就是把验证和测试合一(原书承认术语本身就有混用16), 那么泄漏风险要按那个惯例评估,不能一概而论。

3. 作者的判断与证据

  • 有证据的:回归训练收敛(原书图 2-3、2-6)、批量优于 online(练习 2-19 让读者自己验证)、 光镊项目的 30 fN 误差与「比训练数据更准」的对比图(原书图 2-16 到 2-18),全是实测。
  • 作者的经验之谈:中间批大小最好;打乱顺序;数值量级差异大时先重标定22
  • 明确坦白:早停「说起来简单做起来难」,验证误差波动让停训时机变成经验活21

4. 边界与局限

边界说明
2D 网络学不动非线性(弯的规律)练习 2-14:出口直、隐藏弯的两层网络在非线性数据上力不从心,要更深23
归一化会抹掉长期趋势原书提醒:气温数据若先归一化,数年尺度的缓变会被抹掉;应考虑先去趋势24
批量不是越大越好增大噪声有时帮网络逃出坏位置(第 03 章 MNIST 项目已点过)
数字孪生只在训练分布内可靠光镊网络学的是特定参数(激光功率 5 mW、水介质、玻璃微球)下的力;换系统要重训

本章的数据集只有 50 个样本(2.5 节的划分演示)、项目用了 10⁵ 个点—— 两个量级都远小于后面章节(几万张图起步),数据三分与过拟合的制度却在同样的代码里, 这正是它值得单独一章的原因。

5. 可带走的

  1. 分类改回归只动出口:去掉出口激活、错误变连续,训练机器照旧;
  2. 隐藏层负责弯,出口负责直——这个分工贯穿全书;
  3. 中间批大小最好;增大批量可替代降低学习率(有论文背书);
  4. 每个 epoch 打乱样本顺序,MSE 曲线要配平滑线读;
  5. 训练/验证/测试三份:验证管调参,测试只许碰一次;
  6. 过拟合=验证误差回升;欠拟合=两边都降不下去;早停听着简单,时机靠经验;
  7. 数字孪生:给昂贵仿真器学个快速替身;拟合的平滑性顺带滤掉了训练数据的伪影—— 「网络可以比训练数据更准」不是玄学,是结构复杂度恰好匹配了信号的尺度;
  8. 量级差太多(10⁻⁶ 米、10⁻¹⁵ 牛)先重标定到 ~1。

6. 原文地图

主题原书章原文位置
更新式=平方误差的导数Regressing Data with a Single Neurontext/18-fm-regressing-data-with-a-single-neuron.txt:100(搜「square error」)
线性神经元极限Regressing Data with a Single Neurontext/18-fm-regressing-data-with-a-single-neuron.txt:133(搜「lacks the necessary complexity」)
回归网络出口线性Regressing Data with a Two-Layer Neural Networktext/19-fm-regressing-data-with-a-two-layer-neural-network.txt:25(搜「sigmoid() activation function」) · text/19-fm-regressing-data-with-a-two-layer-neural-network.txt:82(搜「delta_b = error」)
三层收益(练习)Regressing Data with a Two-Layer Neural Networktext/19-fm-regressing-data-with-a-two-layer-neural-network.txt:116(搜「substantially less」)
online/批量/最陡下降Training Using Batchestext/20-fm-training-using-batches.txt:3(搜「online training」) · text/20-fm-training-using-batches.txt:7(搜「steepest-descent training」)
批量平滑误差景观Training Using Batchestext/20-fm-training-using-batches.txt:5(搜「smooth out the error landscape」)
中间批大小最好Training Using Batchestext/20-fm-training-using-batches.txt:9(搜「intermediate batch size」)
预测-真值图与对角线Training Using Batchestext/20-fm-training-using-batches.txt:43(搜「bisectrix」)
线性/对数坐标Training Using Batchestext/20-fm-training-using-batches.txt:150(搜「logarithmic scale」)
打乱顺序、MSE 不再单调Training Using Batchestext/20-fm-training-using-batches.txt:179(搜「monotonically」)
增大批量替代降学习率Seminal Works and Further Readingtext/24-fm-seminal-works-and-further-reading.txt:3(搜「Don't Decay the Learning Rate」)
数据三分定义Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:3(搜「training, validation, and testing」)
早停及其困难Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:7(搜「early stopping」)
七成经验比例Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:11(搜「70 percent」)
随机划分防偏差Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:38(搜「unwanted biases」)
过拟合定义与曲线分岔Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:121(搜「known as overfitting」)
欠拟合Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:125(搜「Underfitting」)
测试集误差更大Dividing Data into Multiple Datasetstext/21-fm-dividing-data-into-multiple-datasets.txt:141(搜「clear sign of overfitting」)
数字孪生定义Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:3(搜「digital twin」)
光镊背景Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:5(搜「optical tweezer」)
数值重标定Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:144(搜「rescale them to make them of order 1」)
网络结构与参数量Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:222(搜「hidden_features」) · text/22-fm-project-2a-emulating-a-physical-system.txt:224(搜「133,379」)
100 epochsProject 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:283(搜「100 epochs」)
MAE 30 fN 对照几千 fNProject 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:346(搜「30 fN」)
比训练数据更准Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:376(搜「higher than that of the training data」)
Bronte Ciriza 2022 论文Project 2A: Emulating a Physical Systemtext/22-fm-project-2a-emulating-a-physical-system.txt:13(搜「Faster and More Accurate」)

Footnotes

  1. 出处:「Regressing Data with a Single Neuron」第 100 段(text/18-fm-regressing-data-with-a-single-neuron.txt:100,搜「square error」)。原文:权重更新正比于平方误差对权重的负导数。

  2. 出处:「Regressing Data with a Single Neuron」第 102-106 段(text/18-fm-regressing-data-with-a-single-neuron.txt:104,搜「Much improved predictions」)。

  3. 出处:「Regressing Data with a Single Neuron」第 133 段(text/18-fm-regressing-data-with-a-single-neuron.txt:133,搜「lacks the necessary complexity」)。

  4. 出处:「Regressing Data with a Two-Layer Neural Network」第 75-83 段(text/19-fm-regressing-data-with-a-two-layer-neural-network.txt:82,搜「delta_b = error」)。出口层 delta_b = error × 1(线性激活的导数为 1)。

  5. 出处:「Regressing Data with a Two-Layer Neural Network」第 116 段(text/19-fm-regressing-data-with-a-two-layer-neural-network.txt:116,搜「substantially less」)。

  6. 出处:「Project 2A: Emulating a Physical System」第 5 段(text/22-fm-project-2a-emulating-a-physical-system.txt:5,搜「optical tweezer」)。

  7. 出处:「Project 2A: Emulating a Physical System」第 109 段(text/22-fm-project-2a-emulating-a-physical-system.txt:109,搜「105 optical force data points」)与第 283 段(text/22-fm-project-2a-emulating-a-physical-system.txt:283,搜「100 epochs」)。

  8. 出处:「Project 2A: Emulating a Physical System」第 346 段(text/22-fm-project-2a-emulating-a-physical-system.txt:346,搜「30 fN」)。

  9. 出处:「Project 2A: Emulating a Physical System」第 376 段(text/22-fm-project-2a-emulating-a-physical-system.txt:376,搜「higher than that of the training data」)。

  10. 出处:「Project 2A: Emulating a Physical System」第 3 段(text/22-fm-project-2a-emulating-a-physical-system.txt:3,搜「digital twin」)、第 13 段(text/22-fm-project-2a-emulating-a-physical-system.txt:13,搜「several orders of magnitude faster」)。

  11. 出处:「Training Using Batches」第 5 段(text/20-fm-training-using-batches.txt:5,搜「smooth out the error landscape」)。

  12. 出处:「Training Using Batches」第 3 段(text/20-fm-training-using-batches.txt:3,搜「online training」)、第 7 段(text/20-fm-training-using-batches.txt:7,搜「steepest-descent training」)、第 9 段(text/20-fm-training-using-batches.txt:9,搜「intermediate batch size」)。

  13. 出处:「Training Using Batches」第 218 段(text/20-fm-training-using-batches.txt:218,搜「increasing the batch size」)与「Seminal Works and Further Reading」第 3 段(text/24-fm-seminal-works-and-further-reading.txt:3,搜「Don't Decay the Learning Rate」)。

  14. 出处:「Training Using Batches」第 179 段(text/20-fm-training-using-batches.txt:179,搜「monotonically」)、第 208 段(text/20-fm-training-using-batches.txt:208,搜「smoothed version」)。

  15. 出处:「Training Using Batches」第 150 段(text/20-fm-training-using-batches.txt:150,搜「logarithmic scale」)。

  16. 出处:「Dividing Data into Multiple Datasets」第 3 段(text/21-fm-dividing-data-into-multiple-datasets.txt:3,搜「training, validation, and testing」);术语混用见第 9 段(text/21-fm-dividing-data-into-multiple-datasets.txt:9,搜「holdout」)。 2

  17. 出处:「Dividing Data into Multiple Datasets」第 11 段(text/21-fm-dividing-data-into-multiple-datasets.txt:11,搜「70 percent」)。

  18. 出处:「Dividing Data into Multiple Datasets」第 38 段(text/21-fm-dividing-data-into-multiple-datasets.txt:38,搜「unwanted biases」)。

  19. 出处:「Dividing Data into Multiple Datasets」第 121 段(text/21-fm-dividing-data-into-multiple-datasets.txt:121,搜「known as overfitting」)。

  20. 出处:「Dividing Data into Multiple Datasets」第 125 段(text/21-fm-dividing-data-into-multiple-datasets.txt:125,搜「Underfitting」)。

  21. 出处:「Dividing Data into Multiple Datasets」第 7 段(text/21-fm-dividing-data-into-multiple-datasets.txt:7,搜「early stopping」)。 2

  22. 出处:「Project 2A: Emulating a Physical System」第 144 段(text/22-fm-project-2a-emulating-a-physical-system.txt:144,搜「rescale them to make them of order 1」)。

  23. 出处:「Regressing Data with a Two-Layer Neural Network」第 110 段(text/19-fm-regressing-data-with-a-two-layer-neural-network.txt:110,搜「doesn't perform well on nonlinear data」)。

  24. 出处:「Predicting Temperature with Recurrent Neural Networks」第 96 段(text/53-fm-predicting-temperature-with-recurrent-neural-net.txt:96,搜「detrending」)。原书在下一章讲时序数据时给出的提醒,本章归一化讨论的自然延伸。