什么是监督学习
机器学习的核心问题是:从数据中学出一个函数。
监督学习是最直接的一种形式——给你一堆"输入-输出"的配对 ,你要从中学出一个映射 ,使得面对没见过的新输入 , 能给出靠谱的预测。
这里有三个空间:
- 输入空间 :所有可能的输入。比如一张 的灰度图就是 中的一个点。
- 输出空间 :所有可能的输出。分类问题是有限集合 或 ;回归问题是 。
- 假设空间 :你认为 "长什么样"的候选集合。比如"所有线性函数",或者"所有三层神经网络"。
学习的过程,就是从假设空间 中挑出那个最好的 。
"最好"是什么意思?这就引出了三要素。
三要素:模型、策略、算法
李航把监督学习拆成三个正交的选择,这个分解极其干净:
模型:假设空间
你先得决定候选函数长什么样。这个决定直接约束了模型的表达能力:
| 假设空间 | 参数量 | 能拟合的函数 |
|---|---|---|
| 线性函数 | 直线/超平面 | |
| 阶多项式 | 光滑曲线 | |
| 三层神经网络 | 几千~几万 | 任意连续函数(理论上) |
| Transformer | 几亿~万亿 | 几乎任何序列映射 |
假设空间太小(如用直线拟合正弦),再怎么优化也学不好——欠拟合。假设空间太大(如用万亿参数去拟合 10 个数据点),容易把噪声也学进去——过拟合。这个张力贯穿整个机器学习,本文后半部分会详细展开。
策略:损失函数
模型定好了,怎么判断哪个 好?需要一个数字来衡量"预测值 离真实值 有多远"——这就是损失函数。
常见的损失函数:
不同的损失函数对误差的惩罚方式不同——点击下面的按钮感受一下:
误差越大惩罚越重(二次增长)。回归的标配。
在训练集上的平均损失叫经验风险:
学习的目标就是找到使经验风险最小的 。但直接最小化经验风险容易过拟合——所以实际中往往加上正则化项,变成结构风险最小化:
惩罚模型的复杂度, 控制惩罚力度。正则化的几何意义在本文后面会画清楚。
算法:怎么找最优的
模型定了,损失定了,剩下的就是优化——怎么从假设空间里找到损失最小的那个 。
- 闭式解:线性回归的正规方程 ,一步到位。但只有少数简单模型有。
- 梯度下降:算出损失对参数的梯度,沿反方向走一小步。绝大多数模型的标配。
- 随机梯度下降(SGD):每次只用一小批数据算梯度,牺牲精度换速度。深度学习全靠它。
- 坐标下降:每次只优化一个参数,其他固定。Lasso 回归的经典解法。
三要素的关系是正交的:你可以用线性模型 + 平方损失 + 梯度下降(= 线性回归),也可以用线性模型 + Hinge 损失 + 对偶方法(= SVM),还可以用神经网络 + 交叉熵 + Adam(= 深度分类器)。每个选择可以独立替换。
三类问题
监督学习按输出的类型分成三大类:
回归:输出连续值。模型拟合一条线(或曲面),预测 y 的具体数值。
分类(classification):输出是离散标签。二分类 (垃圾邮件/正常邮件),多分类 (手写数字识别)。模型输出的是决策边界——把输入空间切成不同区域。
回归(regression):输出是连续值 。房价预测、温度预测。模型输出的是一条曲线或曲面,尽量贴近数据点。
序列标注(tagging):输入是一个序列 ,输出也是一个序列 。比如词性标注(每个词标一个词性)、命名实体识别(标出人名、地名、机构名)。这类问题的输出之间有依赖关系——"北京"后面跟"大学",第一个标注为 B-ORG 的话第二个大概率是 I-ORG。隐马尔可夫模型和条件随机场就是专门处理这种结构化输出的。
生成模型与判别模型
监督学习的方法可以分为两大阵营,它们解决同一个问题但思路完全不同。
判别模型(discriminative):直接学习条件概率 或决策函数 。不关心数据是怎么生成的,只关心"给定输入,输出是什么"。
生成模型(generative):先学习联合概率分布 ,再用贝叶斯定理算出 。它对数据的生成过程建模——"这类数据长什么样"。
| 判别模型 | 生成模型 | |
|---|---|---|
| 学什么 | 或 | |
| 代表算法 | Logistic 回归、SVM、决策树、神经网络 | 朴素贝叶斯、HMM、高斯混合模型 |
| 优点 | 直接优化分类准确率,通常更准 | 能生成新数据,可以处理缺失特征 |
| 缺点 | 不能生成数据 | 需要更强的假设(如特征独立) |
| 数据需求 | 相对少 | 相对多 |
一个直觉:判别模型是"画边界",生成模型是"理解分布"。
现代深度学习以判别模型为主流(分类器、回归器)。但生成模型在大模型时代迎来了爆发——GPT 本质是一个生成模型(学习 ),扩散模型也是生成模型。
模型评估与选择
训练完了模型,怎么知道它好不好?绝对不能用训练集来评估——那就像考试偷看答案。
核心概念:
- 训练误差:模型在训练数据上的平均损失。只要模型足够复杂,训练误差可以降到任意低——但这不代表模型好。
- 测试误差:模型在从未见过的新数据上的平均损失。这才是我们真正关心的——泛化能力。
标准做法是把数据分成三份:
- 训练集(~70%):用来调参数
- 验证集(~15%):用来选模型、调超参数
- 测试集(~15%):最终评估,只用一次
当数据量不够大时,用 折交叉验证——把数据分成 份,轮流拿一份做验证、其余做训练,取 次结果的平均。常用 或 。
过拟合和欠拟合的判断很简单:
- 训练误差高,测试误差高 → 欠拟合。模型太简单。
- 训练误差低,测试误差高 → 过拟合。模型记住了噪声。
- 训练误差低,测试误差也低 → 泛化良好。
偏差-方差权衡
为什么过拟合会发生?一个经典的分解给出了答案。把模型的预测误差分解为三个部分:
- 偏差(bias):模型的预测平均值和真实值之间的差距。偏差高 = 模型太简单,系统性偏离真相 → 欠拟合。
- 方差(variance):模型对训练数据的敏感度。换一组训练数据,预测就大幅变化 = 方差高 → 过拟合。
- 不可约误差(irreducible error):数据本身的固有噪声,是任何模型预测误差的下限,无论模型多好都无法消除。
关键洞察:偏差和方差是此消彼长的。 模型越复杂,偏差越低(能拟合更复杂的函数),但方差越高(对训练数据的微小变化过度反应)。模型越简单,方差低但偏差高。
| 模型复杂度 | 偏差 | 方差 | 训练 loss | 测试 loss |
|---|---|---|---|---|
| 太低 | 高 | 低 | 高 | 高(欠拟合) |
| 刚好 | 中 | 中 | 中 | 最低 |
| 太高 | 低 | 高 | 很低 | 高(过拟合) |
这个权衡是所有 ML 的核心张力——无论模型多先进,你都在跟它搏斗。
过拟合的几何:曲线穿过每个点
让我们直观地看这个过程。下面是一个多项式回归的交互演示——用不同阶数的多项式去拟合 20 个带噪声的数据点。真实函数是 (灰色虚线),一个三次多项式:
观察三种情况:
阶数 = 1(直线):模型太简单,一条直线无法捕捉三次曲线的 S 形弯曲。训练和测试误差都高。这是欠拟合。
阶数 = 3:三次多项式完美匹配真实函数的形状。训练误差接近噪声的下限,测试误差最低。这是泛化良好的状态。
阶数 ≥ 9:模型有足够的自由度穿过每一个训练点——训练误差接近零。但曲线在数据点之间追逐噪声,测试误差反而飙升。这就是过拟合的典型症状。
注意一个关键信号:训练误差单调下降,测试误差先降后升。 那个"U 形"测试误差曲线的底部,就是最佳模型复杂度。
怎么对抗过拟合?控制多项式阶数是一种粗暴的方法——直接砍掉特征。实际中更常见的做法是保留所有特征,但通过限制权重的大小来给模型"戴上紧箍咒"——这就是正则化。
L2 正则:圆形约束
L2 正则化(Ridge 回归 / weight decay):
控制惩罚力度。 越大,模型被"推"向更小的权重。
约束优化视角:L2 正则等价于带约束的优化问题:
为什么惩罚项 等价于约束 ?这是拉格朗日乘子法的结论(凸优化篇讲过):惩罚力度 越大,相当于约束半径 越小。
约束区域是一个圆形(高维是球)。想象损失函数的等高线就像在碗底滴水后不断向外扩散的椭圆水波——最优解就是水波向外扩张时,第一次触碰到圆形约束边界的那个点。通常两个权重都不为零。
L1 正则:菱形约束与稀疏
L1 正则化(Lasso):
区别只是把平方换成了绝对值。但这个微小的变化带来了截然不同的几何:约束区域变成了菱形(高维是多面体)。
菱形的特点是有尖角。同样想象水波向外扩散——等高线(椭圆形)在菱形的尖角处更容易相切——而尖角恰好落在坐标轴上,意味着某个 。
这就是 L1 正则化的核心特性:产生稀疏解。 某些权重精确为零,等于模型自动做了特征选择。
拖动下面的约束半径看 L1 和 L2 的区别:
拖动半径 改变约束强度。
L1 vs L2 对比:
| 特性 | L2(Ridge) | L1(Lasso) |
|---|---|---|
| 约束形状 | 圆(球) | 菱形(多面体) |
| 权重 | 都非零,趋向小的值 | 部分精确为零 |
| 稀疏性 | 否 | 是 |
| 特征选择 | 否 | 是 |
| 概率解释 | 高斯先验 | 拉普拉斯先验 |
| 适用场景 | 权重都重要 | 只有少数特征有用 |
概率视角:正则化项可以理解为对参数的先验分布(概率篇里贝叶斯推断的延伸)。L2 假设权重服从高斯分布(倾向小的、非零的值),L1 假设权重服从拉普拉斯分布(倾向集中在零附近、偶尔有大的尖峰)。
最朴素的真理:更多的数据能治愈过拟合。 当数据点密密麻麻填满空间时,再复杂的模型也难以通过疯狂震荡来"作弊"——这也是为什么 LLM 要用几万亿 token 来训练。