监督学习 · 01

监督学习简介

监督学习三要素——模型、策略、算法。从形式化定义到损失函数、泛化、正则化,一篇打通监督学习的骨架。

25 min read

什么是监督学习

机器学习的核心问题是:从数据中学出一个函数。

监督学习是最直接的一种形式——给你一堆"输入-输出"的配对 {(x1,y1),(x2,y2),,(xN,yN)}\{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\},你要从中学出一个映射 ff,使得面对没见过的新输入 xxf(x)f(x) 能给出靠谱的预测。

这里有三个空间:

  • 输入空间 X\mathcal{X}:所有可能的输入。比如一张 28×2828 \times 28 的灰度图就是 R784\mathbb{R}^{784} 中的一个点。
  • 输出空间 Y\mathcal{Y}:所有可能的输出。分类问题是有限集合 {0,1}\{0, 1\}{1,2,,K}\{1, 2, \dots, K\};回归问题是 R\mathbb{R}
  • 假设空间 F\mathcal{F}:你认为 ff "长什么样"的候选集合。比如"所有线性函数"f(x)=wTx+bf(x) = w^T x + b,或者"所有三层神经网络"。

学习的过程,就是从假设空间 F\mathcal{F} 中挑出那个最好的 ff^*

"最好"是什么意思?这就引出了三要素。

三要素:模型、策略、算法

李航把监督学习拆成三个正交的选择,这个分解极其干净:

模型:假设空间 F\mathcal{F}

你先得决定候选函数长什么样。这个决定直接约束了模型的表达能力:

假设空间参数量能拟合的函数
线性函数 wTx+bw^T x + bd+1d + 1直线/超平面
kk 阶多项式(d+kk)\binom{d+k}{k}光滑曲线
三层神经网络几千~几万任意连续函数(理论上)
Transformer几亿~万亿几乎任何序列映射

假设空间太小(如用直线拟合正弦),再怎么优化也学不好——欠拟合。假设空间太大(如用万亿参数去拟合 10 个数据点),容易把噪声也学进去——过拟合。这个张力贯穿整个机器学习,本文后半部分会详细展开。

策略:损失函数 L(y,f(x))L(y, f(x))

模型定好了,怎么判断哪个 ff 好?需要一个数字来衡量"预测值 f(x)f(x) 离真实值 yy 有多远"——这就是损失函数

常见的损失函数:

0-1 损失:L(y,y^)=1(yy^)\text{0-1 损失:} \quad L(y, \hat{y}) = \mathbb{1}(y \neq \hat{y}) 平方损失:L(y,y^)=(yy^)2\text{平方损失:} \quad L(y, \hat{y}) = (y - \hat{y})^2 绝对损失:L(y,y^)=yy^\text{绝对损失:} \quad L(y, \hat{y}) = |y - \hat{y}| 交叉熵损失:L(y,p)=ylogp(1y)log(1p)\text{交叉熵损失:} \quad L(y, p) = -y \log p - (1-y) \log(1-p)

不同的损失函数对误差的惩罚方式不同——点击下面的按钮感受一下:

yy^y - \hat{y}LL
L=(yy^)2L = (y - \hat{y})^2

误差越大惩罚越重(二次增长)。回归的标配。

在训练集上的平均损失叫经验风险

Remp(f)=1Ni=1NL(yi,f(xi))R_{\text{emp}}(f) = \frac{1}{N} \sum_{i=1}^{N} L(y_i, f(x_i))

学习的目标就是找到使经验风险最小的 ff^*。但直接最小化经验风险容易过拟合——所以实际中往往加上正则化项,变成结构风险最小化

minfF1Ni=1NL(yi,f(xi))+λΩ(f)\min_{f \in \mathcal{F}} \frac{1}{N} \sum_{i=1}^{N} L(y_i, f(x_i)) + \lambda \Omega(f)

Ω(f)\Omega(f) 惩罚模型的复杂度,λ\lambda 控制惩罚力度。正则化的几何意义在本文后面会画清楚。

算法:怎么找最优的 ff^*

模型定了,损失定了,剩下的就是优化——怎么从假设空间里找到损失最小的那个 ff

  • 闭式解:线性回归的正规方程 w=(XTX)1XTyw^* = (X^T X)^{-1} X^T y,一步到位。但只有少数简单模型有。
  • 梯度下降:算出损失对参数的梯度,沿反方向走一小步。绝大多数模型的标配。
  • 随机梯度下降(SGD):每次只用一小批数据算梯度,牺牲精度换速度。深度学习全靠它。
  • 坐标下降:每次只优化一个参数,其他固定。Lasso 回归的经典解法。

三要素的关系是正交的:你可以用线性模型 + 平方损失 + 梯度下降(= 线性回归),也可以用线性模型 + Hinge 损失 + 对偶方法(= SVM),还可以用神经网络 + 交叉熵 + Adam(= 深度分类器)。每个选择可以独立替换。

三类问题

监督学习按输出的类型分成三大类:

xyŷ = wx + b

回归:输出连续值。模型拟合一条线(或曲面),预测 y 的具体数值。

分类(classification):输出是离散标签。二分类 y{0,1}y \in \{0, 1\}(垃圾邮件/正常邮件),多分类 y{1,2,,K}y \in \{1, 2, \dots, K\}(手写数字识别)。模型输出的是决策边界——把输入空间切成不同区域。

回归(regression):输出是连续值 yRy \in \mathbb{R}。房价预测、温度预测。模型输出的是一条曲线或曲面,尽量贴近数据点。

序列标注(tagging):输入是一个序列 x=(x1,x2,,xT)x = (x_1, x_2, \dots, x_T),输出也是一个序列 y=(y1,y2,,yT)y = (y_1, y_2, \dots, y_T)。比如词性标注(每个词标一个词性)、命名实体识别(标出人名、地名、机构名)。这类问题的输出之间有依赖关系——"北京"后面跟"大学",第一个标注为 B-ORG 的话第二个大概率是 I-ORG。隐马尔可夫模型和条件随机场就是专门处理这种结构化输出的。

生成模型与判别模型

监督学习的方法可以分为两大阵营,它们解决同一个问题但思路完全不同。

判别模型(discriminative):直接学习条件概率 P(YX)P(Y|X) 或决策函数 f(X)f(X)。不关心数据是怎么生成的,只关心"给定输入,输出是什么"。

生成模型(generative):先学习联合概率分布 P(X,Y)P(X, Y),再用贝叶斯定理算出 P(YX)=P(XY)P(Y)P(X)P(Y|X) = \frac{P(X|Y) P(Y)}{P(X)}。它对数据的生成过程建模——"这类数据长什么样"。

判别模型生成模型
学什么P(YX)P(Y \mid X)f(X)f(X)P(X,Y)=P(XY)P(Y)P(X, Y) = P(X \mid Y) P(Y)
代表算法Logistic 回归、SVM、决策树、神经网络朴素贝叶斯、HMM、高斯混合模型
优点直接优化分类准确率,通常更准能生成新数据,可以处理缺失特征
缺点不能生成数据需要更强的假设(如特征独立)
数据需求相对少相对多

一个直觉:判别模型是"画边界",生成模型是"理解分布"。

现代深度学习以判别模型为主流(分类器、回归器)。但生成模型在大模型时代迎来了爆发——GPT 本质是一个生成模型(学习 P(next tokencontext)P(\text{next token} \mid \text{context})),扩散模型也是生成模型。

模型评估与选择

训练完了模型,怎么知道它好不好?绝对不能用训练集来评估——那就像考试偷看答案。

核心概念:

  • 训练误差:模型在训练数据上的平均损失。只要模型足够复杂,训练误差可以降到任意低——但这不代表模型好。
  • 测试误差:模型在从未见过的新数据上的平均损失。这才是我们真正关心的——泛化能力

标准做法是把数据分成三份:

  1. 训练集(~70%):用来调参数
  2. 验证集(~15%):用来选模型、调超参数
  3. 测试集(~15%):最终评估,只用一次

当数据量不够大时,用 kk 折交叉验证——把数据分成 kk 份,轮流拿一份做验证、其余做训练,取 kk 次结果的平均。常用 k=5k = 5k=10k = 10

过拟合和欠拟合的判断很简单:

  • 训练误差高,测试误差高 → 欠拟合。模型太简单。
  • 训练误差低,测试误差高 → 过拟合。模型记住了噪声。
  • 训练误差低,测试误差也低 → 泛化良好。

偏差-方差权衡

为什么过拟合会发生?一个经典的分解给出了答案。把模型的预测误差分解为三个部分:

期望泛化误差=偏差2+方差+不可约误差\text{期望泛化误差} = \text{偏差}^2 + \text{方差} + \text{不可约误差}
  • 偏差(bias):模型的预测平均值和真实值之间的差距。偏差高 = 模型太简单,系统性偏离真相 → 欠拟合
  • 方差(variance):模型对训练数据的敏感度。换一组训练数据,预测就大幅变化 = 方差高 → 过拟合
  • 不可约误差(irreducible error):数据本身的固有噪声,是任何模型预测误差的下限,无论模型多好都无法消除。

关键洞察:偏差和方差是此消彼长的。 模型越复杂,偏差越低(能拟合更复杂的函数),但方差越高(对训练数据的微小变化过度反应)。模型越简单,方差低但偏差高。

模型复杂度偏差方差训练 loss测试 loss
太低高(欠拟合)
刚好最低
太高很低高(过拟合)

这个权衡是所有 ML 的核心张力——无论模型多先进,你都在跟它搏斗。

过拟合的几何:曲线穿过每个点

让我们直观地看这个过程。下面是一个多项式回归的交互演示——用不同阶数的多项式去拟合 20 个带噪声的数据点。真实函数是 y=x3xy = x^3 - x(灰色虚线),一个三次多项式:

多项式阶数3
拟合良好训练 MSE 0.0175测试 MSE 0.0821
训练集测试集真实函数 y = x³ − x
真实函数是三次多项式(灰色虚线)。阶数 = 3 时拟合曲线几乎重合真实函数——过拟合发生在更高阶时,模型开始追逐噪声而非规律。

观察三种情况:

阶数 = 1(直线):模型太简单,一条直线无法捕捉三次曲线的 S 形弯曲。训练和测试误差都高。这是欠拟合。

阶数 = 3:三次多项式完美匹配真实函数的形状。训练误差接近噪声的下限,测试误差最低。这是泛化良好的状态。

阶数 ≥ 9:模型有足够的自由度穿过每一个训练点——训练误差接近零。但曲线在数据点之间追逐噪声,测试误差反而飙升。这就是过拟合的典型症状。

注意一个关键信号:训练误差单调下降,测试误差先降后升。 那个"U 形"测试误差曲线的底部,就是最佳模型复杂度。

怎么对抗过拟合?控制多项式阶数是一种粗暴的方法——直接砍掉特征。实际中更常见的做法是保留所有特征,但通过限制权重的大小来给模型"戴上紧箍咒"——这就是正则化

L2 正则:圆形约束

L2 正则化(Ridge 回归 / weight decay):

Lreg=L+λw2=L+λiwi2\mathcal{L}_{\text{reg}} = \mathcal{L} + \lambda \|\mathbf{w}\|^2 = \mathcal{L} + \lambda \sum_i w_i^2

λ\lambda 控制惩罚力度。λ\lambda 越大,模型被"推"向更小的权重。

约束优化视角:L2 正则等价于带约束的优化问题:

minwL(w)s.t.w2t\min_{\mathbf{w}} \mathcal{L}(\mathbf{w}) \quad \text{s.t.} \quad \|\mathbf{w}\|^2 \leq t

为什么惩罚项 λw2\lambda \|\mathbf{w}\|^2 等价于约束 w2t\|\mathbf{w}\|^2 \leq t?这是拉格朗日乘子法的结论(凸优化篇讲过):惩罚力度 λ\lambda 越大,相当于约束半径 tt 越小。

约束区域是一个圆形(高维是球)。想象损失函数的等高线就像在碗底滴水后不断向外扩散的椭圆水波——最优解就是水波向外扩张时,第一次触碰到圆形约束边界的那个点。通常两个权重都不为零。

L1 正则:菱形约束与稀疏

L1 正则化(Lasso):

Lreg=L+λw1=L+λiwi\mathcal{L}_{\text{reg}} = \mathcal{L} + \lambda \|\mathbf{w}\|_1 = \mathcal{L} + \lambda \sum_i |w_i|

区别只是把平方换成了绝对值。但这个微小的变化带来了截然不同的几何:约束区域变成了菱形(高维是多面体)。

菱形的特点是有尖角。同样想象水波向外扩散——等高线(椭圆形)在菱形的尖角处更容易相切——而尖角恰好落在坐标轴上,意味着某个 wi=0w_i = 0

这就是 L1 正则化的核心特性:产生稀疏解。 某些权重精确为零,等于模型自动做了特征选择。

拖动下面的约束半径看 L1 和 L2 的区别:

约束半径 t1.00
约束最优:w₁ = 0.97, w₂ = 0.24
无约束最优w₁w₂
L2 正则的约束区域是圆形。最优解是 loss 等高线与圆的切点——通常两个权重都不为零。
拖动半径 tt 改变约束强度。

L1 vs L2 对比:

特性L2(Ridge)L1(Lasso)
约束形状圆(球)菱形(多面体)
权重都非零,趋向小的值部分精确为零
稀疏性
特征选择
概率解释高斯先验拉普拉斯先验
适用场景权重都重要只有少数特征有用

概率视角:正则化项可以理解为对参数的先验分布概率篇里贝叶斯推断的延伸)。L2 假设权重服从高斯分布(倾向小的、非零的值),L1 假设权重服从拉普拉斯分布(倾向集中在零附近、偶尔有大的尖峰)。

最朴素的真理:更多的数据能治愈过拟合。 当数据点密密麻麻填满空间时,再复杂的模型也难以通过疯狂震荡来"作弊"——这也是为什么 LLM 要用几万亿 token 来训练。

这个想法在前沿里