很多人在学机器学习的时候,第一个困惑往往不是“模型怎么实现”,而是“模型到底在优化什么”。训练集上loss明明一直在降,验证集上却越来越差;换个损失函数,收敛速度完全不一样;加了正则项,效果反而变好了。这些现象背后,其实都指向同一组基础概念——损失函数、风险函数、经验风险最小化、结构风险最小化。这组概念就是《统计学习方法》第一章里最核心的理论地基,也是从“拍脑袋选模型”走向“按逻辑选模型”的分水岭。
这篇笔记就是围绕这一节写的。我会把书中那几页公式拆开揉碎,讲清楚每个符号到底在说什么,为什么要这样定义,以及ERM和SRM在实际训练里是怎么“指挥”优化过程的。适合刚入门机器学习、正在啃这本书的读者,也适合学完公式但总觉得“差点意思”的人。读完你至少能明白:我们平时训练模型时那个loss,究竟是拿什么代替了什么。
1. 这一节在整本书里的位置:从“怎么学”到“学什么”
1.1 监督学习中藏着的一个共同套路
先退一步看整个监督学习。不管是线性回归、逻辑回归、决策树还是神经网络,它们要解决的问题都是一样的:给定输入空间X和输出空间Y,我们希望找到一个从X到Y的映射。这个映射就是模型,通常记作f(X)。
但“找一个映射”这个说法太模糊了。这个空间里可能的映射有无数个,怎么挑?书里给出的回答非常有条理——统计学习的三要素:模型的假设空间、策略、算法。模型决定了你在多大的范围里找,算法决定了你怎么去找,而策略决定了你用什么标准来判断“哪个映射更好”。
这一节讲的就是策略,而且是整个统计学习里最重要的策略思想。后面的监督学习方法——感知机、逻辑回归、SVM、决策树,本质上是不同的模型和不同的损失函数组合出来的具体实例。而它们背后的“找最优”逻辑,全部统一在经验风险最小化和结构风险最小化的框架里。
所以这一节虽然公式不多,但它是一个总纲。看懂它,再去看任何具体模型的推导,会觉得那些公式根本不是新东西,只是把“损失函数”换成具体形式而已。
1.2 把学习问题翻译成优化问题
书里的“策略”部分实际做了这么一件事:把“学得好不好”这个模糊的感觉,变成一个可以求最小值的目标函数。
具体分两步。第一步是定义损失函数,用来度量“单个样本上,模型的预测值和真实值差了多少”。第二步是定义风险函数,用来度量“在整个数据分布上,模型平均错得有多严重”。有了这两个定义,学习问题就变成了:在所有候选函数f中,找一个让风险最小的那个。
这里我想多说一句。很多初学者会觉得这一步是多余的——直接拿训练集数据算一算平均误差不就行了?为什么要扯出“分布”和“期望”这种看不见摸不着的东西?
因为训练集只是从真实世界里抽样出来的少数样本。模型真正要面对的,是未来所有可能出现的输入。如果只盯着训练集上的平均误差,模型可能把训练集背下来,却没有学到真正的规律。这就是过拟合的根源。所以理论框架上,你必须先在“整个数据分布”层面定义一个理想目标,然后再想办法用有限样本去近似它。这个“理想目标”就是风险函数,那个“近似”就是经验风险。
2. 损失函数:度量“错得有多离谱”的尺子
2.1 先给符号做个定位
书中把损失函数记作L(Y, f(X)),其中X是输入,Y是真实输出,f(X)是模型预测值。注意这个函数的两个自变量不是X和Y,而是“真实值Y”和“预测值f(X)”。它回答的问题是:如果真实答案是Y,我的模型猜成了f(X),这个错误应该记多少分?
为什么非得单独定义这么一层?因为“错误”的严重程度在不同场景下是完全不同的。预测房价差了5万和预测癌症差了5万,代价能一样吗?“错多少”必须由你根据实际问题来定义,模型只负责在这个定义下优化。这正是损失函数的意义——它把你对错误的容忍度,翻译成一个可微的数学函数。
2.2 四种常见损失函数,各有各的脾气
《统计学习方法》这一节里列了四种损失函数,我建议不要只背公式,而是感受它们各自的“性格”。
0-1损失最简单:预测对了就是0,错了就是1。它不关心你错得有多远,只关心对错。这个函数在分类问题里非常直观,但它有两个致命问题:不连续、不可导,很难做梯度优化。所以实际训练中很少直接用0-1损失作为目标函数,它通常只作为最终的评估指标。
平方损失是回归问题里最常见的选择:L = (Y - f(X))²。它的特点是“错得越远,惩罚越重”——误差翻倍,惩罚变成四倍。这导致平方损失对异常值非常敏感。如果你的数据里有一个离群点,模型会拼命去迁就它,因为它的惩罚太大了。
绝对损失是平方损失的温和版:L = |Y - f(X)|。它只按比例惩罚误差,对异常值的抵抗力更强。但它的问题是在误差为0处不可导,优化的时候不如平方损失那么顺滑。
对数损失在分类问题里地位特殊:L = -log P(Y|X)。它惩罚的不是“预测值距离真实值多远”,而是“给真实标签分配的概率有多低”。如果你给真实标签分配的概率是0.1,损失是log(0.1)的绝对值;如果概率是0.9,损失就很小。这也是交叉熵损失的本质来源,几乎所有现代分类模型都在用它的某种变体。
3. 期望风险与经验风险:理论和现实的分界线
3.1 风险函数为什么带着“期望”二字
有了损失函数,下一步很自然:把所有样本上的损失平均起来,得到一个总的“平均错误程度”。但问题来了——理想情况下,你应该在所有可能的样本上平均,即在整个联合分布P(X, Y)上求期望。
这就是书中定义的期望风险(也叫风险函数):
R_exp(f) = E[L(Y, f(X))]
写成积分形式就是∫L(y, f(x))P(x, y)dxdy。它代表的是:如果模型f被用在真实世界中的所有数据上,平均每个样本会带来多少损失。这个值越小,模型就越“真的好”。
所有机器学习理论都从这个定义出发。但请注意,这个定义里有一个几乎不可能满足的前提——我们不知道P(X, Y)到底是什么。如果知道,就不需要学习了,直接算出最优函数就行了。统计学里所有关于“泛化”的理论,本质上都是在跟这个“不知道分布”的现实做斗争。
3.2 经验风险:拿有限样本去“估计”那个不可能算的期望
既然期望风险算不出来,怎么办?书里给出的思路特别朴素:用训练集上的平均值来代替。
R_emp(f) = (1/N) Σ L(y_i, f(x_i))
这就是经验风险。它把“所有样本上的期望”换成了“手里能看到的样本上的平均”。大数定律告诉我们,当样本量N足够大的时候,这个平均值会依概率收敛到真实的期望。换句话说,数据越多,经验风险就越接近风险函数。
经验风险最小化(ERM)就是把“最小化期望风险”这个做不到的任务,替换成“最小化经验风险”这个做得到的任务。逻辑上没毛病,实践中有隐患:训练数据再大,也只是真实分布的冰山一角。如果模型疯狂压榨经验风险,完全可以在训练集上做到损失为0——代价是它把训练集里的噪声也当成规律记下来了,到了新数据上立刻现原形。
这就是为什么后面必须引入结构风险最小化。不引入的话,ERM在数学上完全站得住脚,但在实践中必然过拟合。统计学习理论里有一个核心不等式和经验风险有关——泛化误差界。它告诉我们,经验风险和真实风险之间的差距,与样本量成反比,与假设空间的复杂度成正比。这个不等式等价于说:不能光看训练集loss,模型本身的复杂度也会影响它在新数据上的表现。
4. 经验风险最小化与结构风险最小化:从拟合到泛化
4.1 为什么ERM管不住过拟合
用一个具体场景来感受。假设你有一组带噪声的样本点,它们真实规律是二次函数,但训练集里有一些噪声干扰。如果一个模型的空间足够大,可以完美穿过每一个点——每个样本的损失都是0,经验风险完美达到最小值。但这条扭曲的曲线在没见过的点上表现极差。
问题出在哪?ERM只关注一件事:让训练误差最小。它完全没有考虑“模型的表达能力强到什么程度才算合适”。高次多项式能把训练点串起来,线性函数只能给出一条直线,两种模型都能把经验风险压到一定程度,但高次多项式的经验风险可以压到更低——哪怕它捕捉到的全是噪声。
这就是过拟合的本质:经验风险最小化不惩罚复杂度。只要模型够复杂,不管数据有多少,它都能把训练集拟合得越来越完美。可这种“完美”对泛化毫无帮助,甚至有害。
4.2 正则化:把“复杂度”变成模型要付出的代价
结构风险最小化(SRM)的做法是,在经验风险后面加一个惩罚项:
R_srm(f) = (1/N) Σ L(y_i, f(x_i)) + λJ(f)
这里的J(f)表示模型的复杂度,λ是控制惩罚力度的系数。优化目标从“只看训练误差”变成了“训练误差和复杂度一起算账”。如果模型复杂度很高,即使训练误差很低,总风险也可能居高不下。这样模型就会自我克制:只学那些“能明显降低训练误差”的复杂结构,对那些没啥用、纯粹为了拟合噪声的复杂度,宁可不要。
书里的公式里,λJ(f)被称为正则化项或惩罚项。L2正则化让模型的参数尽量靠近0,L1正则化会让不重要的参数直接变成0。本质上,正则化项的数学效果是“压缩假设空间”——把那些又复杂又不太有用的假设提前排除掉。
SRM的思想其实非常朴素,跟奥卡姆剃刀一个逻辑:在效果差不多的前提下,选更简单的模型。正则化就是把这个哲学原则翻译成了可微的数学语言。
4.3 两个最小化在“实操层面”是什么样的
可能还有人觉得这些都是纯理论,跟实际训练的关系不大。我直接说我观察到的对应关系。
平时用深度学习框架训练模型,你写的那个loss函数,往往是这么拼出来的:
loss = 数据损失项 + λ * 权重衰减项
这个式子就是结构风险最小化的直接实例。数据损失项是对应经验风险(平均后的损失),权重衰减项对应着J(f)(通常是参数平方和)。你训练时设置的weight_decay参数,就是那个λ。调整λ,就是调整结构风险里的惩罚力度。
所以你看,教材上这一节,并不是为了考试才存在的一堆公式。它就是你现在写代码时那个优化目标的正式定义。搞懂了它,你就搞懂了为什么要调正则化系数,为什么不加正则化模型会飘。
5. 损失函数和正则项的实战搭配:我的选择顺序
5.1 回归和分类场景下,我一般这样挑损失
完整的理论框架搭好之后,落回实际操作:不同的场景应该选哪个损失函数?
回归问题里,我的习惯是默认MSE(平方损失),但先看一眼数据里有没有明显的异常值。如果数据很干净,MSE收敛快、梯度顺滑,是最省心的选择。如果数据里明显有离群点,改成MAE(绝对损失)会更稳,但它的梯度在0附近不连续,收敛稍微慢一点。还有一种折中做法是Huber损失,小误差时表现为平方损失,大误差时表现为绝对损失,既有MSE的顺滑,又有MAE的稳健。
分类问题里,二分类场景我几乎不会用MSE。它把分类问题当作回归来做,梯度在sigmoid输出饱和区几乎消失,训练效率极差。交叉熵损失(对数损失的离散形式)天然适配概率输出,梯度在错误分类时大、正确分类时小,学习节奏更合理。多分类问题的标准选择就是softmax + 交叉熵,这也是为什么你在图像分类任务里永远能看到这个组合的原因。
下面这个表是我在实际选择loss时的心得总结:
| 任务类型 | 推荐损失函数 | 原因 | 注意点 |
|---|---|---|---|
| 回归(数据干净) | MSE | 收敛快,梯度好算 | 注意异常值放大效应 |
| 回归(有离群点) | MAE / Huber | 对异常值稳健 | MAE零点不可导,需要处理 |
| 二分类 | 交叉熵(对数损失) | 梯度自然,收敛稳定 | 不要用MSE替代 |
| 多分类 | softmax + 交叉熵 | 概率解释清晰 | 标签用one-hot编码 |
| 排序/检索 | 各类排序损失 | 直接优化排序指标 | 需要成对采样 |
5.2 正则化系数λ到底怎么调
再讲一个实际项目里反复踩过的坑——λ的选择。
λ太小,正则化形同虚设,模型照样过拟合;λ太大,模型被压得太狠,所有参数都趋向0,模型变成一条几乎水平的直线,欠拟合。我在某个项目里的经验是:先设一个很小的λ值(比如1e-4或1e-5),让模型正常训练一轮,观察训练集损失和验证集损失的变化趋势。如果训练集损失持续下降、验证集损失在某个点开始回升,说明模型进入过拟合状态了,这时再逐步增大λ,直到验证集损失不再过早反弹。
更系统的做法是网格搜索λ的取值范围(比如1e-5到1e-1之间按对数间隔取几个值),对每个λ在验证集上评估一次。逻辑上,λ本质上是模型复杂度和拟合精度之间的一个交换参数,你要找的是那个“在训练误差没有明显恶化的情况下,模型复杂度被压得最狠”的平衡点。
还有一个细节值得提:模型最后几层的参数,哪怕在L2正则化下,通常也不希望被太强的权重衰减压制,因为最后一层的偏差和缩放会直接影响预测的稳定性。很多框架里对不同的参数组可以设置不同的weight_decay,我一般会让最后的全连接层用较小的λ,前面的特征提取层用正常λ。
6. 啃这一节时我踩过的坑
6.1 把“损失函数”和“风险函数”当成一回事
这是我最初读这节时最严重的误解。我一度以为损失函数就是风险函数,只不过一个看单个样本、一个看全部样本。其实风险函数是在损失函数基础上按数据分布做期望,而期望风险里权重的是“真实分布P(X, Y)”。
理解这个区别后,很多后续概念就好懂了。比如正则化为什么叫“结构风险”而不是“正则化风险”——因为它修正的不只是数值上的loss,而是整个“风险”的定义,把模型结构本身纳入了风险度量。
6.2 不知道经验风险最小化和最大似然估计是一回事
一个很有趣的底层联系:当对数损失被用作经验风险时,经验风险最小化等价于最大似然估计。最小化负对数似然,本质上就是在最大化似然函数。推导里完全不用额外假设。
这意味着,你在做逻辑回归时用的交叉熵损失训练,统计意义上就是在做极大似然估计。这个概念打通之后,以后在模型不确定性估计、贝叶斯方法里再遇到“负对数似然”,就不会觉得是新东西了。
6.3 只把“结构风险”理解为L2正则化
结构风险里那个J(f)是一个抽象概念,L2正则只是它的一个具体实例。J(f)还可以是L1正则、平滑度惩罚、核函数空间的范数、甚至某些情况下模型的“描述长度”。
比如决策树剪枝,不依赖于L2范式,但它的惩罚逻辑——限制树的深度和叶子节点数量——也完全符合结构风险最小化的框架。把思维停留在“结构风险=L2正则”上,会限制你对剪枝、dropout、早停这些手段的统一理解。其实它们都是在某一个维度上增加了模型的复杂度惩罚,殊途同归。
6.4 读书时跳过了“假设空间”这个桥梁
这一节开头一段还讲了假设空间的概念——所有候选模型组成的集合。损失函数和风险函数定义在这个空间之上,优化目标是在这个空间里搜索。我第一遍读的时候没重视,后来看各种模型对比时才意识到:模型的容量、正则化的效果、贝叶斯模型平均的合理性,全部依赖“假设空间”这个框架。当你感觉“loss忘了正则化”“哪些函数不该在搜索范围里”时,问题的根源其实都在假设空间这一层。
7. 最后分享一点自己的读书体会
我每次把这本书第一章翻完,都会有一种“原来后面所有东西都在说同一件事”的通透感。最大似然、贝叶斯估计、正则化、交叉验证、dropout,这些名词看起来五花八门,但它们的核心动机都是同一个:我们没法直接优化真实风险,只能在有限数据上做近似优化,同时想办法让这种近似不至于跑偏。
这本书的厉害之处在于,它用一个极简的形式化框架,把“学习”这件事降维成了“定义损失+定义风险+最小化风险”。你之后见到的所有模型,基本都能在这个框架里找到自己的位置。如果一开始读的时候觉得公式太多,不用急,先挑这一节的骨架——损失函数、期望风险、经验风险、结构风险——画一张关系图记在心里,再往里面填细枝末节。
最后一个小方法:我学这部分的时候,把每一节里出现的符号都单独整理在一张表里,包括符号含义、连续型写法、离散型写法,以及它在后面哪些章节里还会出现。等学到感知机、逻辑回归时,翻出来对照,很多突然看不懂的公式瞬间就有了归属感。强烈建议你也试试。