小叶想给自己的学习工具加一个功能:拿到 AI 初稿后,估计还需要多少时间,才能把它核对、修改到可以提交。这个估计会影响他安排多少任务、预留多少工作时间。如果程序总把复杂任务说得很轻松,日程就容易被打乱;如果总往长了估,又会空出许多本来能用的时间。
AI 很快帮他写好了一个“自动学习历史记录”的程序。运行时,屏幕上不断出现一个名叫 loss 的数,起初很大,后来越来越小。程序还保存了参数、学习率和训练轮数。小叶现在需要判断:这个数降下来,究竟说明什么?参数为什么这样调整?它和“把工作时间安排得更合理”之间,还差哪些环节?
本章围绕这个问题讲损失函数和优化。所有案例数字都是为说明关系设置的教学数据。这里记录的是小叶本人阅读、查证和修改初稿的工作时间,不包含等待老师审批的时间。后面如改变记录或评分规则,会在改变处说明。
一、预测错在哪里,要先有可以比较的对象
先看三份已经完成的任务。它们实际用了 3、5、7 分钟。小叶暂时没有让模型区分任务难度,而是给每份任务都报同一个时间,比如 5 分钟。这个简单方案叫作常数预测,可以作为之后改进时的比较起点。
机器学习里,标签是训练样本中拿来与预测比较的目标值。在这里,标签就是已经记录下来的实际耗时;预测值是模型依据当前规则给出的耗时。标签不是因为叫了这个名字就绝对可靠:漏记一次查证,或者不同记录有的包含修改、有的不包含,都会让模型学到混在一起的口径。先把工作范围说清楚,才谈得上比较。
我们把“预测值减去实际值”称为本章的残差。有的教材采用相反方向,阅读时看清约定即可。这里正数表示高估,负数表示低估。统一报 5 分钟,三条残差分别为 2、0、−2 分钟。
| 实际耗时 | 预测耗时 | 残差 | 对这份任务的含义 |
|---|---|---|---|
| 3 分钟 | 5 分钟 | 2 分钟 | 高估 2 分钟 |
| 5 分钟 | 5 分钟 | 0 分钟 | 刚好一致 |
| 7 分钟 | 5 分钟 | −2 分钟 | 低估 2 分钟 |
三条残差的平均值是零,但三份任务并没有全都预测正确。高估与低估在有符号平均中抵消了。如果小叶用它判断“有没有总体偏向高估”,这个平均有意义;如果用它判断“每份任务预测得准不准”,它就遗漏了两次偏差。
这两种问题可以同时关心。一个模型可能平均不偏,却时常把短任务估成长任务、把长任务估成短任务。另一个模型可能每次都多估半分钟,方向上有偏,但单次误差较小。只看一个有符号平均数,不能完成这两种表现的比较。
因此,我们需要把每份任务的预测与实际差距,转成一个可以用于评价的数。损失函数规定的就是这套评分办法:面对一个预测及其标签,该记多少损失。选好单条记录的评分,再规定怎样汇总所有记录,才能得到程序要努力减小的目标。
如果预测记作 ,实际值记作 ,常见的单条损失有 和 。前者记录偏差的绝对大小,后者把偏差平方。二者都让本例中的高估 2 分钟和低估 2 分钟得到相同评分,但给大偏差分配的影响不同。这一差别会真正改变模型愿意作出的让步。
二、平均绝对误差与均方误差,在乎的是不同的偏差分布
平均绝对误差,常写作 MAE,就是把各条记录的绝对偏差加起来,再除以记录数。统一预测 5 分钟时,这个数表示三条预测平均偏离实际约 1.33 分钟。这个数保留了时间单位,适合回答平均差多少分钟。
均方误差,常写作 MSE,是先对每条偏差平方,再求平均。仍然预测 5 分钟,三条平方误差是 4、0、4,平均为 ,约 2.67。这里的单位是分钟的平方。它不是平均错了 2.67 分钟,不能与前面的 1.33 直接按数值大小比较优劣。对 MSE 开平方得到均方根误差 RMSE,单位才重新回到分钟;本例约为 1.63 分钟。
用一个式子记录这两种汇总。 是记录数,下标 表示第几条记录,求和号表示把这些记录的对应评分加起来:
平方为什么会影响训练?一份任务偏差从 1 分钟变成 2 分钟,绝对误差增加 1,平方误差增加 3;从 4 分钟变成 5 分钟,绝对误差仍增加 1,平方误差却增加 9。已经偏得很远的任务,在平方评分中继续偏远,会付出更大的代价。模型因而更有动力去减小这类大偏差,即使需要让其他任务稍微变差。
把记录另设为 3、5、22 分钟,就能看清这种取舍。这里的 22 分钟是一个明显较长的任务,先假定记录无误。若仍只允许给所有任务报同一个时间,预测 5 分钟与预测 10 分钟的表现如下。
| 统一预测 | 三条绝对偏差 | MAE,分钟 | MSE,分钟² |
|---|---|---|---|
| 5 分钟 | 2、0、17 | 约 6.33 | 约 97.67 |
| 10 分钟 | 7、5、12 | 8 | 约 72.67 |
从 5 改成 10,两个短任务各多偏了 5 分钟,长任务少偏了 5 分钟。按绝对偏差计,总体是增加的;按平方偏差计,把那个特别大的偏差缩小,足以抵过另外两条的变差。因此,两个评分对同一改动给出了相反判断。
进一步看,绝对误差的最好常数预测是这三条记录的中位数 5。把预测从 5 稍往上调,面对 3 和 5 的两条记录,偏差都会增大,面对 22 的那条才会减小;往下调又会使两条较长记录的偏差增大。中间那条记录的位置,把两侧的数量关系分开了。一般情形中,样本中位数可以使常数预测的绝对误差总和最小;偶数条记录时,可能有一段预测值同样好。
平方误差对应的最好常数预测则是平均数,本例为 10。其原因也能从“谁推动得更用力”理解:离预测越远的记录,对调整方向的影响越大。后面讲导数时会看到,这种影响正比于有符号偏差;把所有记录的影响加起来为零,得到的就是平均数。
选择 MAE 或 MSE,要看哪些偏差值得更大程度地避免。小叶如果特别关心少数任务被严重低估造成的安排混乱,平方评分有参考价值,但它同时也重罚严重高估。若两种方向的代价不同,还需要更贴近用途的设计。Google 的损失函数说明列出了这些常见定义及其对较大误差的不同反应。
还有一件事不能交给公式决定:22 分钟究竟是什么。如果是把 2.2 错记成 22,应修正记录;如果这类任务真实存在,而且今后经常要处理,随手删掉就会让模型忽略重要情形;如果它属于工作范围不同的另一类任务,可能应该增加可识别这类任务的输入。损失函数规定如何看待数据中的偏差,并不替我们确认数据从何而来。
三、给低估和高估不同代价,模型的目标就会改变
回到原来的 3、5、7 分钟。假设小叶现在要把预测直接用于预留工作时间。他用一个简化评分表达自己的取舍:少留一分钟记 3 点损失,多留一分钟记 1 点损失。点数是本例设置的评价单位,用来表示低估更麻烦,不是已经测得的真实经济成本。
这就是一种非对称损失。高估和低估相同分钟数,评分不再相同。统一预留 5 分钟时,短任务多留 2 分钟,记 2 点;长任务少留 2 分钟,记 6 点;三份任务合计 8 点。统一预留 7 分钟,三个任务都不会少留,但前两个分别多留 4 和 2 分钟,合计 6 点。按当前规则,7 比 5 更合适。
这个结论并不是说 7 更接近三条记录的中心。它说明预留时间的目标发生了变化:小叶愿意承受一定空余,换取较少的时间不足。对于同一组资料,追求平均接近与追求较少低估,本来就可能给出不同答案。
用一个简短公式把评分规则保存下来:
这里的 表示在 和零之间取较大的值。预测不足时,第一项记录短缺分钟数并乘以 3;预测有余时,第二项记录多留的分钟数。同一份任务只会出现其中一种偏差,刚好一致时两项都为零。公式表达的是两种实际后果怎样进入评价。
还可以判断为什么本例不会一直偏好越长越好。预测超过 7 分钟后,三份任务都已留够;继续增加只会多占时间,没有减少任何短缺。预测在 5 与 7 之间时,每增加一点,两个较短任务各多出一点空余,最长任务却少一份按三倍计算的短缺,合计仍有改善。低于 5 时,逐步把预留提高到 5 分钟,至少能减少两份任务的短缺,这种改善也超过至多一份任务多留时间的代价。所以在这个简化问题中,7 是最好常数。
如果用途变成“向同学尽量准确地介绍通常需要多久”,直接把这个预留值当成典型耗时,就可能误导。一个系统完全可以给出两个不同输出:估计耗时用于了解任务,建议预留用于安排日程。只要名称和评分对应,二者不必强行相同。
这与用 AI 做许多任务相通。让模型减少遗漏、减少误报、减少人工复核、节省等待,通常不是同一个目标。把几个愿望都写成“质量更高”,程序并不知道该怎样取舍。能够给出两种具体错误及其相对代价,已经比单纯要求“尽量准确”多走了一步。代价比例需要根据实际使用修正,不能因为示例用了 3 比 1,就把它当成通用参数。
四、损失曲线的横轴,放的是可以调整的规则
现在先回到对称的均方误差,以便研究参数怎样调整。小叶固定住原来 3、5、7 分钟的标签,只改变统一预测的时间。把这个可调时间记作 ,它就是模型的一个参数。每选一个 ,就得到一套预测和一个 MSE;这些对应关系构成参数的损失曲线。
这幅图的横轴不是第几份任务,也不是训练过去了多久,而是“现在给所有任务报多少分钟”。纵轴表示在同一批记录上,这种规则得到多大损失。沿横轴移动,相当于换规则,再拿固定的三条记录评价。

统一预测 3 分钟时,短任务虽然正好,另外两条分别少估 2 和 4 分钟;统一预测 5 分钟,则变成一条高估 2、一条正确、一条低估 2。后者把大的单次偏差缩小了,所以平方误差更低。继续推高预测,短任务被高估得越来越多,损失又会上升。
本例的曲线可以写成:
后一种写法把两件事分开了:统一预测偏离 5 分钟,会额外产生一项损失;即使预测恰好为 5,三份任务彼此不同,常数规则仍留有 的损失。这个最低值来自当前模型不能区分任务,不是程序还没努力够。
这也是理解优化的起点:在已经选定的模型和评分规则中,寻找损失较小的参数。选择模型、选择数据和选择评分,会改变要找的东西;优化算法本身负责在这个确定的问题里调整参数。若小叶要区分长短任务,就需要让规则使用与任务有关的信息,而不是不断催同一个常数把三种不同时间全猜对。
所谓全局最小值,是允许的整个参数范围中最低的损失;局部最小值,是在某个位置附近找不到更低的值。当前这条碗形曲线只有一个最低点,两者在这里相同。复杂模型的曲面可能有许多低处、平坦区域和不同方向上的起伏,不能仅凭这个一维例子认定所有训练都有同样的形状。
五、导数告诉我们,当前规则朝哪边改有帮助
如果不事先知道最好预测是 5,怎样从当前的 3 分钟开始找?可以先试一个很小的调整,观察损失怎样变。把统一预测略微提高,会让短任务出现一点高估,却能同时减轻另外两条的低估。在当前位置,合起来的作用是改善。
导数把这种局部变化记录下来:参数在当前位置增加很小一段时,损失大约按怎样的比例改变。曲线往右上升,导数为正;往右下降,导数为负。它描述当前附近的变化方向与快慢,不能把这个方向无限延长后仍当成保证。
本例用损失的后一种写法,可以直接求出 。撇号表示对参数 求导。在 时,导数为 −4。这个负号告诉小叶:在 3 分钟附近略微提高统一预测,可以减小损失。数值 4 表示变化率的大小;一次实际改善多少,还取决于提高了多少预测时间。
为什么要说“很小”和“大约”?把调整量记作 ,实际变化恰好是:
第一项是当前斜率带来的变化,第二项来自曲线在移动过程中继续弯曲。在 3 分钟附近增加 0.1 分钟,斜率预计损失下降 0.4,实际下降 0.39;若只增加 0.01 分钟,预计下降 0.04,实际下降 0.0399。变化越小,这个平方项相对于第一项越不显著。导数由此提供一个局部近似,而不是跳到任何远处都有效的直线指令。
当统一预测低于 5,导数为负,提高预测有利;高于 5,导数为正,降低预测有利;恰好为 5 时,导数为零,当前位置两侧的局部推动平衡了。对于现在的平方函数,还能由非负的平方项确认这是最低点。遇到别的函数时,仅看到导数为零不够,例如一座山顶也可能有水平切线。
前面说平方误差喜欢平均数,现在可以把理由接完整。每条平方误差对统一预测的导数是两倍残差;求平均后,总推动由平均残差决定。要让它为零,统一预测就等于标签平均数。这里有符号残差用来指示调整方向,平方误差用来评价偏差大小,各自承担不同作用。
六、负梯度方向与学习率,分别决定往哪走和走多远
利用导数反复更新参数,就是一维情况下的梯度下降。导数为正就把参数减小,导数为负就把参数增大,使调整朝当前损失下降的方向进行。每次究竟改多少,还需要一个乘在导数上的系数,叫作学习率,通常记作 。
减号负责反转上升方向,学习率调节这次改动的幅度。参数是模型用来预测的数,学习率是安排训练过程的设置,常称为超参数。它不直接表示这份任务有多难,而是影响学习时怎样改变预测规则。
以统一预测 0 分钟为起点,当前导数为 −10。学习率设为 0.25,第一次把预测提高到 2.5 分钟。此时不能继续拿最初的 −10 一直更新,而要重新计算当前位置的导数;随着预测靠近 5,调整会逐渐缩小。
| 已经更新的次数 | 学习率 0.25 的统一预测 | 学习率 1 的统一预测 | 学习率 1.1 的统一预测 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 2.5 | 10 | 11 |
| 2 | 3.75 | 0 | −2.2 |
| 3 | 4.375 | 10 | 13.64 |
| 4 | 4.6875 | 0 | −5.368 |
第一种在逐渐靠近最好预测;第二种在两侧来回跳,始终同样远;第三种跳得越来越远,甚至给出了不合理的负耗时。它们用的下降方向公式相同,差别在于一次跨出了多远。局部方向正确,不能保证走过很长距离后仍然更好。

图里还画了学习率 0.75。它同样会越过最低点,但越过的幅度逐渐减小,仍能靠近最优。因此,“参数跨过最低点”本身不是失败;需要看是否在接近、损失是否改善。学习率为 1 时,参数在 0 和 10 之间振荡,但这两个位置的 MSE 相同,损失图会是一条水平线。只看损失的外形,也可能漏掉参数内部的来回跳动。
学习率 0.25 与 0.75 的损失曲线在这张图中重合:一个从同一侧接近,另一个交替越过,但每一步离最低点的距离恰好相同。这是当前对称平方曲线的结果,也进一步说明参数轨迹与损失轨迹记录的是不同信息。
这个简单问题还能给出一个明确判断:每次更新后,参数相对于 5 的有符号偏差,会乘上 。对于正学习率,只要 ,这个偏离的绝对值就逐步缩小;恰好取 0.5,会一步到达 5。这些范围来自本例的曲线弯曲程度,不能直接复制给别的数据和损失。
把损失整体乘以 100,最优参数的位置不变,导数却也乘以 100。同样的学习率会导致大得多的更新。从求和改成求平均、从分钟改成秒,都可能改变梯度的数值尺度。比较“学习率多少合适”时,必须连同当前目标的定义一起看。Google 的梯度下降说明介绍了沿负梯度反复更新参数的基本做法。
下面这段纯 Python 可以直接运行。它把每次更新前的位置和损失打印出来,方便看见参数并不是一次选好,而是逐步调整。
times = [3.0, 5.0, 7.0]
b = 0.0
learning_rate = 0.25
for step in range(6):
residuals = [b - actual for actual in times]
loss = sum(r * r for r in residuals) / len(times)
gradient = 2 * sum(residuals) / len(times)
print(f"{step}: b={b:.4f}, MSE={loss:.4f}")
b = b - learning_rate * gradient
第一次显示的是尚未更新的 0,最后一次显示的是已经更新五次的 4.84375,经四位小数舍入为 4.8438。循环最后还会更新一次,但那次的新参数没有继续打印。理解输出时看清记录发生在更新之前还是之后,可以避免把“执行六次循环”与“最后显示第六次更新结果”混为一谈。
七、参数变成一组数,梯度就要分别说明每个方向
常数预测已经能展示优化过程,却无法区分三份任务。现在加入一个任务开始前就能知道的信息:待核验来源的份数。设原来的三份任务分别有 1、2、3 份来源,对应实际耗时仍是 3、5、7 分钟。来源越多可能需要更多核验工作,我们尝试让模型使用这条信息。
把来源份数记作 。为了让一个参数表示中间规模任务的基准,先把输入改记为 ,于是三条输入是 −1、0、1。这个处理叫作中心化;此处的 2 正好是三条训练输入的平均数。负数表示来源比基准少,并不表示来源份数真的为负。
模型设为 。 表示有两份来源时的预测耗时, 表示每多一份来源,模型在预测中增加多少分钟。一个参数控制整体高低,另一个控制任务规模之间拉开多大差别。后者是拟合出来的预测关系,尚不能当成“多加一份来源必然导致多少分钟”的因果结论。
这一回不能再只画一条横轴:每一对 才确定一套规则。把参数看成一个向量,损失就是这组参数的函数。保持一个参数不动,只改变另一个参数时的局部变化率,叫作对该参数的偏导数;把这些偏导按参数的次序放在一起,就组成梯度向量。
在本例中,平均平方误差可以整理为:
符号 表示梯度,两个分量依次对应 和 。这个损失式为什么能分成两部分?三条标签恰好等于 ,预测与实际的差便由“基准没对齐”和“不同规模之间的间隔没对齐”组成。把三条误差平方再平均时,输入 −1 与 1 的交叉影响相互抵消;三个输入的平方平均为 2/3,于是任务间隔没对齐的那项平方带有这个系数。
因此,本例可以分别看两个错误:基准应该在 5,权重应该在 2。两个参数都到达对应位置,三条训练记录就都被准确预测了。这里出现零损失,是因为给定的三条教学记录恰好落在这条直线上。它说明这批数据被当前模型完全拟合,不足以单独说明过拟合,也不足以证明模型已经适合未来任务。
从 开始,梯度为 。学习率仍取 0.25,两个参数同时根据这次梯度更新,得到 。模型一方面提高所有任务的基准预测,另一方面开始把不同规模的任务区分开。这一步把 MSE 从约 27.67 降到约 7.44。
“同时更新”是说两个新值都由更新前的同一组参数计算。若程序先改了 ,再拿新 计算 的导数,就可能变成另一种更新安排。当前中心化的算例恰好把两项分开了,但一般模型的参数相互影响,不能据此认为更新顺序永远无关。
梯度也可以帮助理解线性代数为什么参与训练。输入被写成向量,权重是一组可调数;前向计算把它们组合成预测,梯度则告诉我们各个可调数对当前损失的局部影响。矩阵计算可以让许多样本同时参与这一步,而不必逐项手写互不相连的规则。
八、参数的数值尺度,会改变同一步更新的效果
前面的梯度分量可以直接放进一个向量,但“数值大”不自动表示“这项能力更重要”。参数采用什么坐标、输入用什么单位,都会影响导数的大小。仍看同一个模型,如果把中心化输入改为原来的 100 倍,为了保持预测不变,对应权重就应缩小到原来的百分之一。
预测功能没有改变,梯度的数值表现却变了。对于平方误差,某个权重的导数包含“残差乘以它对应的输入”这一关系。在预测相同、残差相同的对应位置,把输入放大 100 倍,这个权重方向的导数也会放大 100 倍。继续套同一个学习率,实际预测的改动可能大得多。
这可以解释为什么数据准备会影响优化的顺畅程度。某些方向稍微动一点,损失就变化很多;另一些方向需要较大调整才看得出改善。一个统一步长可能在前者来回跨越,在后者又推进很慢。把输入尺度整理到较可比的范围,是减少这种困难的一种办法。
标准化常进一步用训练输入的均值和标准差做转换,让不同特征在数值尺度上更接近。这里要理解的不是背下一个预处理口令,而是保持“训练看到的数”和“实际预测时看到的数”含义一致。如果训练时用的是中心化来源份数,使用时却直接传原始份数,模型会把另一种含义的输入当成旧坐标。
同样,计算中心和尺度时,应从训练数据确定转换,再把这套转换用于后面的验证、测试和实际任务。否则,模型输入的定义会随每批数据改变,或者提前使用本来准备留作评价的信息。至于任务是否需要缩放、采用什么缩放,要结合数据和算法判断,不能由“数越接近零越好”替代。
当模型变得更深,参数先改变某层的中间结果,中间结果再改变后面的预测,最后影响损失。反向传播就是沿这条计算关系,把最终损失对各个参数的影响逐层算回去。它使用的是复合变化的链式关系;优化器再利用这些梯度决定更新。算梯度和改参数是相连的两步,却不是同一项工作。《动手学深度学习》的反向传播章节展示了这种由后向前计算梯度的关系。
例如,中间量为 ,预测为 。权重稍变,首先按输入 的数值改变中间量; 为负时,权重增加反而会使中间量减小。这个变化再经预测影响平方误差;这就接出了“输入乘以残差”的导数结构。较大网络重复组织这类影响传递,具体规则随每层运算改变。了解这个联系,就可以开始看懂训练的主流程,而不必先手推整个网络。
九、一小批记录给出的方向,未必让整批记录当场变好
前面的每次更新都使用三条记录的平均损失及其梯度,这叫作全批量梯度下降。真实训练数据可能很多,每次全部算完再更新,计算和内存代价较高。另一种办法是每次选一部分记录,先用这部分记录估计方向,这就是小批量训练的基本思路。只用一条随机记录的更新,也是常见的随机梯度方法。
回到常数模型,设统一预测已经是 5 分钟,全量 MSE 达到 。若这一步只抽到实际耗时 3 分钟的任务,它会要求把预测降低;用 0.25 的学习率,预测被改成 4。对刚抽到的任务来说,偏差确实减小了,但另外两条的合计变化让全量 MSE 升到 。
若只抽到 7 分钟那条,更新又会把预测推到 6,全量 MSE 同样升到 。抽到中间的 5 分钟,参数则保持不动。因此,按整批记录评价,当前常数规则已经最优,单条记录仍可能把预测向两边拉。看到训练途中某次损失升高,不能马上判定“梯度写反了”。
如果三条记录被等概率抽取,这个位置的三个单样本梯度是 4、0、−4,平均仍为零。这说明随机梯度在当前参数处可以平均对准全量梯度,但不保证每一步都下降,也不保证更新后损失的平均值等于更新前。平均方向与经过曲线后的平均损失,是两个不同的量。
扩大批量通常有助于减轻抽样带来的方向波动,却也增加单步工作量;训练结果还取决于学习率、数据组成和总计算安排。如果每次总挑最容易的任务,“每批算得很稳定”也不能弥补训练目标被换成简单任务这一问题。
一次迭代通常指一次参数更新;一轮训练,英文常称 epoch,指把训练集完整使用一遍。例如有 120 条记录,每批 20 条,一轮使用完全部记录需要 6 次更新;完整做 5 轮,就是 30 次更新,假定每批都更新且没有额外累计步骤。训练报告中的轮数、步数和样本数因此要分开读。Google 的训练超参数说明介绍了学习率、批量大小和训练轮数的作用。
损失图也要看清画的是什么。当前小批量的平均损失、整个训练集重新计算的损失、另一批验证记录的损失,纵轴即使都叫 loss,也不是同一个统计对象。如果 AI 帮小叶画出一条跳动的线,他需要先确认这条线的记录方式,再决定检查数据、学习率还是程序实现。
十、正则化把“怎样的参数更可取”也写进目标
现在回到有两个参数的模型。无额外约束时, 恰好拟合原来的三条记录。但小叶担心,只有三条记录时,来源份数与耗时之间的变化关系可能被偶然因素放大。他想让模型在解释数据的同时,对较大的权重有所保留。
一种常见做法是正则化:在数据损失之外,加入表达某种偏好的项。L2 正则化使用权重平方的和作为惩罚;在本例只惩罚 ,不惩罚基准 ,目标设为:
是两项相加后的训练目标, 仍然是数据的平均平方误差, 控制权重惩罚有多大影响。这里沿用以分钟和来源份数表示数值的约定,系数负责让两项按约定的尺度合在一起。改变输入单位或参数坐标时,相同的系数未必表达相同偏好。
保持 ,设 。如果继续采用 ,训练数据误差为零,但权重惩罚为 。如果改用 ,三条预测变为 4、5、6 分钟,数据误差为 ,权重惩罚也是 ,合计 。后者虽然更不贴合原记录,却在新的总目标下更好。

为什么不直接把权重压到零?那样完全忽略来源份数,数据误差又回到 。新目标在“贴合三条记录”和“少采用较大权重”之间作出取舍,本例的最低点恰好在 。这个位置由两项在当前尺度上的变化共同决定。
正则化的作用要这样具体理解。它不会自动减少参数个数,也不会凭空验证来源份数是不是好特征。在当前线性模型中,减小 的绝对值会让预测对来源份数的变化不那么敏感;在更复杂的模型里,参数大小与模型行为的关系需要结合结构和尺度分析。不能只看一个权重小了,就宣布真实任务一定做得更好。Google 的 L2 正则化说明给出了权重平方惩罚及其与数据损失组合的形式。
为看清它可能带来的效果,再另设三份没有参与上述参数拟合的任务:来源份数仍为 1、2、3,实际耗时为 4、5、6 分钟。刚才含惩罚的规则在这批记录上 MSE 为零,原来精确拟合训练记录的规则则为 。这个小例说明:牺牲一些训练拟合,可能换来更好的未见记录表现。
但这组新数字是教学设定,不是小叶已经证明的普遍规律。如果新任务也沿着原来的 3、5、7 关系,收缩权重反而会变差。该用多大惩罚,必须依据独立于参数拟合的评价来选择;惩罚越强也可能把确实有用的关系压得过弱。
十一、训练目标在改善,实际任务还需要另外的证据
训练集用于拟合参数,验证集用于比较设置、选择模型或判断何时停止,测试集用于在这些选择完成后作较少受选择过程影响的最终评价。三者的区别主要在于怎样使用,而不是把文件改成三个名字。
如果小叶不断看某批记录的结果,并据此修改特征、惩罚系数或训练轮数,这批记录就在参与模型选择。即使没有直接计算它的梯度,也不能再把它当作完全未参与选择的最终测试证据。反复挑选会让设置逐渐适应这批记录的偶然特点,因此还需要保留合适的最终检验。Google 的数据划分说明解释了训练、验证、测试的不同用途以及重复使用评价数据的问题。
过拟合关心的是这种落差:模型把已有记录中的偶然细节也当成了规律,在训练记录上继续改善,却不能同样帮助新任务。它不能仅由“参数多”“训练损失低”或“某次验证波动”中的一个现象单独确认。小叶需要比较同一评价口径下的训练与未见任务表现,并查看这种差异是否稳定、是否与数据来源有关。
训练与新任务的表现不同,也可能来自任务类型的变化。例如,旧记录只有一种清晰格式,新任务却加入扫描材料。训练损失继续下降,可能仍然解决不了新的识别和查证困难。这时应检查训练数据是否覆盖这些任务,以及现有输入能否帮助模型区分它们。单纯延长训练不会让旧标签自动包含新情况。类似地,同一份任务改几个文件名后同时放入训练和验证,会使“新记录”看起来过于熟悉,评价就失去了原来的用途。
一种实用的训练安排是早停:保留训练过程中的候选参数,根据事先选择的验证指标,停止继续训练并恢复表现合适的候选。它利用了“训练得更久未必让新任务更好”的事实。实际操作一般观察一段变化并允许一定波动,而不是每遇到一个稍差点就马上下结论。
此外,训练用的损失也未必涵盖最终要关心的一切。小叶如果用对称 MSE 训练,再把预测直接当作预留时间,低估造成的安排代价仍可能偏高。他可以在验证时额外统计低估次数、短缺分钟和空余分钟;必要时改变训练目标,或在耗时预测之外单独确定预留策略。选择哪一种,应看哪种错误正在造成实际困难。
平均指标还有另一种遮蔽。假设某个工具在大量短任务上稍有改善,却在少数长任务上严重退步,平均误差仍可能下降。如果长任务正是小叶需要它帮助安排的部分,就要把这些任务单独检查。分组不是为了无限添加指标,而是让评价中真正重要的工作不被数量更多的其他记录淹没。
损失函数因而既是计算工具,也是一个需要接受检查的设计。它清楚地告诉程序什么改动会被奖励,却无法自动保证这套奖励与使用者的所有需要一致。了解这一点,会让我们更善于读训练报告:先问优化了什么、用哪批资料判断,再问数值降低了多少。
十二、回到小叶的工具,决定下一步改什么
小叶现在不会只因屏幕上的 loss 下降就采用模型。他可以先做一个明确比较:原常数规则只能给所有任务报 5 分钟,在三条训练记录上 MSE 为 ;加入事前可知的来源份数后,规则 对这三条记录的 MSE 为零。这个结果支持继续考察来源份数作为输入,而不支持直接承诺未来任务都能精确预测。
在前面另设的留出记录 4、5、6 分钟上,缩小权重的候选确实表现更好。小叶据此可以把它列为值得进一步验证的方案,但三条数据不足以完成实际选型。下一步应按同一工作范围收集更多记录,把核验来源份数等事前信息与耗时对应起来,并把需要代表的任务类型放进评价中。若日程要计算等待审批,还应另行记录等待,不能拿当前只含本人工作的模型直接估计提交完成时点。
对耗时预测本身,他可以先比较 MAE、MSE 及不同任务上的偏差;对时间安排,则另看低估带来的短缺。若实际确认低估比高估更麻烦,就用相应代价比较预留方案,而不是把“典型耗时”和“建议预留”混用为一个数。这样,改变损失有明确用途,留下原评价也有助于看清付出了什么代价。
在让 AI 编写程序时,小叶可以提出具体要求:明确耗时记录包含哪些工作,展示一小批输入、预测与残差;写清总目标中各项如何汇总;记录梯度和更新前后的参数;分别保存训练与验证结果。若更新发散,先核对评分尺度、输入尺度和学习率;若训练改善而新任务无改善,就检查任务覆盖、模型表达与选择过程。不同现象指向不同工作,不必全部归结为“模型不够强”。
日常与 AI 对话时,补充上下文通常是在改变它这次作答所依据的信息,不能直接等同于本章这样的参数训练。本章知识的作用,是帮助我们理解可训练系统怎样被推动、评价一个自动改进过程有没有朝需要的方向前进,也能检查 AI 给出的训练方案是否自洽。
至此,前面线性代数各章的线索接到了一起:把任务写成合适的数据表示,选择保留与组合哪些信息,再用明确目标调整参数。表示决定模型看得到什么,结构决定它怎样使用,损失决定怎样的输出被认为更好,优化决定参数怎样朝这个目标变化。小叶接下来要做的,是让这些选择在实际记录上得到检验,而不是继续追逐一个没有说明含义的下降数字。
练习与参考分析
练习一:两套误差各有什么代价
小叶比较两套模型在同四条任务上的绝对偏差。甲为 0、0、0、8 分钟,乙为 3、3、3、3 分钟。按 MAE 和 MSE 分别会选择谁?仅凭这组绝对偏差,能否判断哪套更适合避免预留时间不足?
参考分析: 甲的 MAE 为 2 分钟、MSE 为 16 分钟²;乙分别为 3 分钟和 9 分钟²。MAE 更偏好甲,MSE 更偏好乙。甲把全部偏差集中在一份任务上,乙让每份都承担中等偏差,平方评分对前者的大偏差惩罚更重。
但绝对偏差没有告诉我们高估还是低估。甲的 8 分钟可能是多留,也可能是少留;乙的四个偏差也可能方向不同。若要按不足时间的代价选择,需要恢复有符号残差,并明确多留与少留怎样评分。不能从 MSE 较低直接推出预留更安全。
练习二:错误代价反过来,原建议还合适吗
仍用原来的 3、5、7 分钟记录,只允许统一预测。现在少留一分钟记 1 点,多留一分钟记 3 点。比较预测 3、5、7 分钟的总损失,并判断是否仍应采用第三节的 7 分钟。
参考分析: 预测 3 分钟时,只有短缺,合计 6 点;预测 5 分钟时,高估 2 分钟记 6 点、低估 2 分钟记 2 点,合计 8 点;预测 7 分钟时,多留的 6 分钟合计 18 点。当前规则下,三个候选中应选 3。
进一步看,在 3 到 5 之间提高预测,会让最短任务的高估按三倍增加,只让另外两条短缺各减少一份,总体变差;低于 3 又会增加全部任务的短缺。超过 5 后,继续提高预测会让至少两份任务的高估增加,代价也超过至多一份任务短缺减少的收益。因此 3 也是本题允许范围内的最好常数。改变的是评价中的取舍,不是三条实际耗时。原来的预留建议不能脱离当时的代价比例直接搬来。
练习三:从平均改为求和,需要重看什么
常数模型使用 3、5、7 分钟标签,从 开始。小叶把 MSE 改为平方误差总和,却保留学习率 0.25。第一次更新会到哪里?如果希望参数轨迹与原来的平均损失、学习率 0.25 完全相同,学习率应怎样调整?
参考分析: 三条记录的平方误差总和是原 MSE 的三倍,梯度也放大三倍。起点梯度由 −10 变为 −30,第一次更新到 7.5。要保持每一步改动相同,应把学习率除以三,改成 。
原样保留 0.25,并不在这个例子中导致发散。相对于平均损失,它等效于学习率 0.75,会交替跨过 5 并逐渐接近。正确判断是轨迹已经改变,需要结合新尺度分析稳定性;不能把“忘记调整学习率”机械等同于“必定训练失败”。两种损失的最优参数仍相同。
练习四:分别调整基准与任务差异
第七节模型第一次更新后为 。仍用完整三条记录、MSE 和学习率 0.25,请求出第二次更新的参数,并解释两个参数各自完成了什么改善。
参考分析: 在这组旧参数处,两个梯度分量为 −5 与 。同时更新得到 。平均平方误差约为 2.09 分钟²,比第一次更新后的约 7.44 更低。
基准提高,使模型整体接近三条任务的中心耗时;权重提高,使来源较多与较少的任务之间拉开更合适的预测差别。这里不是先把基准“完全训好”再训练权重,而是同一次利用两个方向的信息。两项能够如此清楚地分开,与当前中心化输入和整齐的教学数据有关。
练习五:惩罚越强,模型就一定越好吗
保持第十节模型和数据,把 分别取 0、、2。可利用数据损失对 的导数为 、惩罚的导数为 ,求每种设置的最优权重。由此能否直接选出真实应用中的最好设置?
参考分析: 令两项导数之和为零,可以得到最优权重依次为 2、1、0.5;基准都为 5。惩罚越强,当前模型越不愿让预测随来源份数大幅变化,训练记录中的任务差异被压得更小。
这只说明训练目标下的取舍。若来源份数确实稳定地预示较大的耗时差异,压得太小会失去有用信息;若原三条的变化偏强,适当压小又可能有帮助。需要用合适的验证记录比较,再用未参与选择的数据评价。不能比较三个设置各自带不同惩罚项的总目标数字,就把最小者当成预测最准的模型。
练习六:低损失报告还缺哪些可判断的信息
AI 告诉小叶:“已训练 100 轮,loss 降低了九成,现在可以自动安排学习任务。”已知它没有说明 loss 的定义、评价数据和时间记录范围。请给出一个能逐步判断这份报告的检查过程,并说明哪些发现会改变下一步行动。
参考分析: 先查损失究竟如何计算,是否包含正则化、是否改过单位或求和方式,再查看初始与最终预测的实际偏差。九成是相对初始值的变化;如果初始规则很差,剩下的一成仍可能不能用。如果统计口径中途改变,百分比甚至不能直接比较。
再查这条曲线来自训练记录还是未参与拟合的资料,选模型时用了哪些结果,是否有相同任务跨集合重复。若只是训练拟合改善,应先做合适的新任务评价;若新任务中特定类型仍被严重低估,应检查任务覆盖、输入和目标代价,而不只是继续增加轮数。
最后把预测接回安排用途:记录是否包含查证与修改,是否包含等待,预留不足与空余各造成什么影响。若模型只预测本人工作时间,就不能直接承诺含外部审批的完成时点。把预测范围、评价范围和要做的决定接起来,才知道程序究竟已经解决了哪一部分。