
这两年“机器学习”这个词几乎无处不在但很多入门的朋友都会卡在一个特别尴尬的节点代码能跑通了模型也能出结果了可一被问到“期望风险最小化、经验风险最小化和结构风险最小化到底在说什么”就有点说不太清楚。其实这三个概念不是孤立的理论术语它们是整个监督学习的地基。理解了它们你才算真正知道机器学习算法“在学习什么”也能解释很多实际中的怪现象比如为什么模型训练集上效果很好、一到测试集就崩为什么加个正则项就能缓解过拟合。这篇文章我就围绕这三条学习准则把它们的原理、推导逻辑和实操取舍一次讲透。1. 从“认识猫”说起机器学习究竟在定什么规矩1.1 一个简单任务背后的三个关键问题先想象一个非常接地气的场景我们要做一个图像分类器任务是让机器“认识猫”。我见过很多初学者一上来就抱着神经网络结构啃但我更建议先从另一个角度想机器最初根本不知道“猫”是什么我们只能给它一堆标注好的图片有的标签是猫有的标签是狗。它要做的是从这些例子中“猜”出一条规律这条规律能解释我们给它的数据也能对没见过的图片做出正确判断。这时候三个问题就绕不开了怎么判断一个规律“好”还是“不好”这就需要一个量化标准也就是损失函数用来衡量模型预测与真实标签之间的差距。该在多大的范围内找规律所有可能的函数都去试显然不现实所以需要设定一个假设空间比如线性模型、决策树集合、神经网络结构等。找到规律之后怎么保证它在新数据上同样有效这就涉及“学习准则”的选择不同的准则代表了不同的取舍策略。机器学习里的“学习准则”本质上就是回答最后那个问题的一套决策规则。而期望风险最小化、经验风险最小化、结构风险最小化就是三种最主要的准则。1.2 损失函数一切“风险”的基本单位在进入三种准则之前需要先把“风险”这个词讲明白。机器学习说的风险并不是指亏钱那种风险而是一个数学期望在某个数据分布下模型预测错误带来的损失的平均值。比如我们常用0-1损失来判断分类模型预测对了损失为0预测错了损失为1。还有一个更平滑的版本是平方损失用于回归预测值和真实值差得越远惩罚越大。还有分类任务里经常用的交叉熵损失它能把模型输出的概率分布与真实标签分布之间的差异映射成一个非负数值。这些损失函数有一个共同点它们都是把“预测结果”和“真实结果”放在一起算出一个具体的数。有了这个数我们就可以定义模型的“风险”——即使用这个模型时平均下来要承担多大的损失。接下来要介绍的三种准则本质上就是对“哪种风险应该被最小化”给出不同的答案。2. 期望风险最小化理论上完美的“天花板”2.1 期望风险的数学定义与直觉期望风险最小化Expected Risk Minimization, ERM这里的ERM缩写偶尔也有别的指代注意看上下文是理论上最理想的准则。首先我们需要知道训练样本并不是凭空冒出来的它们来自一个真实的联合分布记为P(x, y)其中x是输入特征y是真实标签。在这个分布之下一个模型f的期望风险R(f)定义为R(f) E[L(y, f(x))] ∫ L(y, f(x)) dP(x, y)这个式子读起来有点吓人翻译成人话就是把世界上所有可能的输入x和对应的标签y都遍历一遍每一个都算一次损失L(y, f(x))再做加权平均权重就是这个(x, y)组合出现的概率。直觉上如果有一个模型能让这个期望损失最小那它就是全局最优的模型因为它保证了在任何真实数据上的平均表现都最好。这个理想的解被称为贝叶斯最优模型在分类任务中对应贝叶斯最优分类器。在实际中我们训练模型的终极目标就是无限逼近这个最优解。2.2 为什么期望风险只能“想”不能“算”问题来了既然期望风险这么完美直接把它最小化不就行了答案是不能。原因在于真实的联合分布P(x, y)对我们来说是未知的。你手里只有一批样本但样本只是从这个分布中抽出来的一部分你并没有办法看到整个分布的全貌。举个直观的例子你想统计全城市所有人的身高期望风险视角下需要精确知道每个人的身高和占比但你实际上只能拿到一小部分人的数据。如果你用这一小部分人的平均身高去代表全城那就会出现偏差。所以期望风险最小化是一个理论层面的“天花板”它是我们追求的最终方向但由于分布未知这个期望值根本无法精确计算。于是研究者们自然想到了另一个可行的替代方案用手里已有的样本数据来估计这个期望这就是经验风险最小化。3. 经验风险最小化用样本代替总体的“务实之选”3.1 从数学期望到样本均值经验风险最小化Empirical Risk Minimization的思路非常直接没有全量数据那我用训练集里的有限样本求一下损失的平均值不就行了这个平均值就是经验风险R_emp(f)R_emp(f) (1/N) * Σ L(y_i, f(x_i))其中N是训练样本数。根据大数定律当样本量N足够大的时候样本均值会收敛到数学期望。也就是说只要数据足够多经验风险就能近似等于期望风险最小化经验风险也就能近似达到最小化期望风险的效果。这就是为什么我们平时训练模型本质上都在做一件事最小化训练集上的平均损失。logistic回归用的是交叉熵损失线性回归用的是均方误差它们都是经验风险最小化准则在不同损失函数下的具体实例。3.2 “死记硬背”为什么不是好策略如果只追求训练集上损失最小会出现一个非常典型的反面教材过拟合。当模型把自己的能力都用在了“记住”训练样本上尤其是记住了样本中的噪声和个别特例它在训练集上的损失可以降到极低甚至为0但一旦遇到新样本就完全失灵。这就好比一个学生复习备考时把练习册的每一道题的答案都背下来了但考试题目稍微变一下问法他就不会了。因为他并没有掌握背后的规律只是在死记硬背。经验风险最小化的目标函数只关心“在见过的数据上表现好不好”完全不关心“在没见过的新数据上表现怎么样”所以当假设空间很大、模型很灵活的时候它很容易走向“死记硬背”这条路。这里还有一个特别容易混淆的点训练误差低不代表泛化误差低。泛化误差才是我们真正关心的也就是模型在新数据上的表现。经验风险最小化直接优化的是训练误差如果训练误差和泛化误差之间差距过大就说明模型已经“记住”而不是“学会”了。3.3 数据规模与模型复杂度的博弈经验风险最小化到底靠不靠谱主要取决于两个因素的博弈一是训练数据量二是模型复杂度。训练数据量越大经验风险越能接近期望风险模型就越不容易被个别样本带偏。而模型复杂度越大假设空间越大找到一个在训练集上分数很低但在新数据上很差劲的模型的概率就越高。这两个因素之间需要一种平衡机制来约束否则只要模型足够复杂经验风险值可以无限地逼近0但这对真实应用毫无意义。这也解释了为什么在深度学习出现之后尤其依赖大数据集本质上就是在用海量样本把经验风险推向期望风险。但即便数据量很大如果我们想用一个更复杂的模型依然需要额外的约束手段。这就是下一节要讲的结构风险最小化的切入点。4. 结构风险最小化给经验风险“踩刹车”4.1 正则化项与损失函数如何“合伙”工作结构风险最小化Structural Risk Minimization, SRM不打算放弃经验风险而是在它后面再加上一项“惩罚”用来约束模型的复杂度。它的目标函数长这样R_srm(f) (1/N) * Σ L(y_i, f(x_i)) λ * J(f)其中第一项就是我们熟悉的经验风险第二项J(f)是正则化项用于衡量模型本身的复杂程度λ是一个用来调节前后两项权重的超参数。这个公式的意图很明确我们希望模型在训练集上的损失尽量小但同时不希望模型变得太复杂。λ大对复杂模型的惩罚就重模型会更保守倾向于简单结构λ小惩罚轻模型可以更大胆地去拟合训练数据。这个机制很像开车时的油门与刹车经验风险是踩油门正则化项是踩刹车两者配合才能把车开得稳。4.2 常见的正则化手段L1、L2、Dropout等在机器学习里“复杂度”可以有很多种定义方式因此正则化项也有不同的形式。最常用的是L2正则化也叫权重衰减它在损失函数后面加上所有权重平方和的一半乘以λ。L2正则化会让权重整体变小但不会直接让某一个权重变成精确的0它更倾向于让所有特征都被用上但用量都少一点。L1正则化也不难理解它加的是所有权重的绝对值之和。L1的一个显著特性是稀疏性——在优化过程中它能把一些不重要的权重压缩到精确的0相当于帮我们做了特征选择。在一些高维稀疏场景下L1的思路特别实用。如果你用深度学习Dropout也可以从结构风险的角度来理解。它通过随机丢弃一部分神经元本质上迫使模型不能过度依赖某一条特定路径从而降低模型的有效复杂度起到正则化的作用。还有一种非常基础的正则化手段是早停early stopping在训练过程中实时监控验证集上的表现一旦验证集损失开始上升就停止训练这也能避免模型在后半段开始“死记硬背”。4.3 λ怎么选超参数搜索的工程经验理论上结构风险最小化提供了比经验风险更稳定的方法但真正落地的时候λ怎么设置就变成了一个绕不开的问题。我在实际项目里比较常用的方法有几种如果项目比较小可以先从一组对数空间均匀分布的取值里做网格搜索比如[0.0001, 0.001, 0.01, 0.1, 1, 10]再配合交叉验证来挑。如果数据量中等可以用带交叉验证的网搜优化搜索很多机器学习工具库都内置了类似机制。如果特征特别多、训练很大也可以先用一小部分数据快速试几组λ找到量级之后再在最优量级附近精细搜索。有一个常常被忽略的细节λ的值与数据规模、特征尺度都有关。数据量越大同样的λ起到的约束作用会相对变弱因为经验风险这一项本身会更稳定。特征值如果数量级差距很大正则化项的作用也会被扭曲。所以做正则化之前建议先对特征做标准化再去调λ这一步能省下不少调试时间。5. 三种准则的对照关系与实操选择5.1 从观测数据到模型选择的“三个层次”很多人会把三种准则当成三种互斥的算法其实它们更像是同一个问题的三个层次。期望风险是一个理想化的目标只存在于理论上经验风险是用样本近似期望风险但容易过拟合结构风险进一步约束模型复杂度是在有限样本下更安全的选择。放到模型选择的场景里这个层次感就更清晰了。我们在训练一个模型时最理想的情况自然是最小化期望风险但因为分布未知做不到。退而求其次我们在训练集上直接做经验风险最小化这是可以实施的但很容易出过拟合。再进一步我们加上正则化约束得到结构风险最小化的解这才是实践中绝大多数监督学习算法真正在求解的目标。可以拿一把尺子来对比这三种准则准则目标函数是否可在实践中直接计算主要风险期望风险最小化E[L(y, f(x))]否分布未知仅理论参考经验风险最小化(1/N)ΣL(y_i, f(x_i))是过拟合结构风险最小化经验风险 λJ(f)是需要调λ太大会欠拟合5.2 一个线性回归案例从最小二乘到岭回归光讲概念确实有点干我用线性回归来做一个具体演示。线性回归最朴素的解法是最小二乘法它的目标就是让预测值与真实值的平方误差之和对所有训练样本最小。这本质上就是经验风险最小化在回归任务里的落地。但如果你手头有几百个特征而样本只有几十条最小二乘法的结果会非常不稳定系数方差极大甚至出现无穷多组解这就是典型的经验风险最小化带崩模型的情况。此时加一个L2惩罚项就变成了岭回归也就是对权重向量做2范数正则化对应结构风险最小化。在实际实验中你会发现一个看似简单的“加一项”操作能让模型稳定很多因为模型的复杂度受到了约束不再跟着噪声乱跳舞。如果换L1惩罚项就得到LASSO它在岭回归的基础上还能自动把部分特征权重压到0。同一套结构风险最小化框架只是换了J(f)的定义实际效果就有很大差异。这种差异并不是哪一种是“最好”的而是不同场景下对稀疏性和稳定性需求的取舍。5.3 高频问题排查与避坑实录在实际操作中我见过不少和朋友反复踩坑的地方这里整理成一张速查表方便排查问题。现象可能原因处理思路训练误差低测试误差很高过拟合经验风险有偏加正则化、增大数据量、简化模型、早停训练误差和测试误差都高欠拟合或模型容量不足换更复杂模型、增加特征、减小λ增加正则项后训练误差明显上升λ过大约束过强调小λ或换成更温和的L2正则训练集大小变化时模型表现波动大模型对样本噪声敏感增加样本量、做特征标准化、使用交叉验证特征量纲差异大正则化效果差正则项被大数值特征主导先标准化/归一化再训练个人经验上还有一个很多初学者不会注意到的细节不要拿网格搜索得到的最优λ直接在全部训练数据上重新训练之后再拿测试集去报告指标。这种流程会让测试集信息间接渗透到模型选择中导致评估结果虚高产生“信息泄漏”。正确做法是先用训练集内部的交叉验证选好λ然后固定λ在全量训练集上训练最终模型最后只用一次测试集做评估。这个流程看起来简单但确实能避免很多不一致的实验结果。最后再分享一个小技巧如果你在强烈的过拟合中可以先把λ设为一个偏大的值观察模型能否“活下来”然后逐步减小λ。用这种“从稳到优”的思路来调参往往比一上来就追求训练集上的漂亮指标要快很多。