chapter 01 / ml-foundations · 预计学习时间 90-120 分钟

机器学习入门
核心概念

AUDIO // 本章语音导读
本章目录
  1. 什么是机器学习:换一种方式写程序
  2. 三大学习范式
  3. 机器学习的语言:数据、模型、损失
  4. 线性回归:第一个完整推导
  5. 解析解:正规方程
  6. 梯度下降:整个深度学习的引擎
  7. 交互实验室:亲手训练一个模型
  8. 泛化:机器学习真正的难题
  9. 偏差-方差分解
  10. 代码实战:NumPy 从零实现
  11. 章节测验

什么是机器学习:换一种方式写程序

传统编程是这样的:人类理解问题,把解法写成规则,计算机执行规则。

规则 + 数据  ──▶  计算机  ──▶  答案

但有一类问题,人类自己也说不清规则。你能认出一张照片里有猫,但你写不出「猫的 if-else 判定规则」——耳朵尖?折耳猫呢?有毛?无毛猫呢?规则爆炸了。机器学习把流程反过来:

数据 + 答案  ──▶  计算机  ──▶  规则(模型)

我们不告诉计算机「怎么做」,而是给它大量「输入 → 正确输出」的例子,让它自己找出从输入映射到输出的函数。这就是机器学习的本质:从数据中自动寻找函数

更严格的定义来自 Tom Mitchell(1997):

如果一个程序在任务 T 上的性能(用指标 P 衡量)随着经验 E 的增加而提升,就说它在「学习」。
例:垃圾邮件过滤器 —— T = 分类邮件,P = 分类准确率,E = 用户标记过的邮件。用户标得越多,过滤越准 → 它在学习。
为什么「找函数」这个说法是字面意义上准确的?
因为一切 ML 模型最终都是一个数学函数 $f$:图像分类是 $f: \mathbb{R}^{224\times224\times3} \to \{1..1000\}$(像素到类别);ChatGPT 是 $f: \text{前文 token 序列} \to \text{下一个 token 的概率分布}$。「训练」就是在一个巨大的函数空间里,用数据当线索,搜出那个最好的 $f$。后面所有章节——从线性回归到 GPT——都只是「函数长什么样」和「怎么搜」这两件事的不断升级。

三大学习范式

监督学习(Supervised Learning)

数据集是成对的 $(x, y)$:输入 $x$ 配有人类标注的正确答案 $y$(标签)。模型学习映射 $f(x) \approx y$。按 $y$ 的类型分两类:

无监督学习(Unsupervised Learning)

只有 $x$,没有标签。模型自己发现数据内部的结构:

强化学习(Reinforcement Learning)

没有现成的标签,但有奖励信号。智能体(agent)在环境中行动,环境反馈奖励,目标是学会最大化长期累积奖励的策略。AlphaGo、机器人控制、以及——划重点——训练 ChatGPT 的 RLHF 和训练推理模型(OpenAI o 系列、DeepSeek-R1)的核心技术,第 8 章详讲。

范式数据形态学到什么典型例子
监督学习$(x, y)$ 成对映射 $f(x)\to y$图像分类、房价预测
无监督学习只有 $x$数据的结构/分布聚类、PCA、生成模型
强化学习状态、动作、奖励最优策略 $\pi(a|s)$AlphaGo、RLHF
大语言模型把三者全用上了:预训练是自监督学习(用「预测下一个词」从无标签文本里自造监督信号,介于监督与无监督之间);SFT 微调是监督学习;RLHF/RLVR 对齐是强化学习。学完本课程你会完整走过这条链路。

机器学习的语言:数据、模型、损失

先统一术语,后面 11 章都用它们:

把这句话刻进脑子里,它是全部现代 AI 的骨架:机器学习 = 模型(参数化函数)+ 损失(差多少)+ 优化(怎么调参让损失变小)。GPT-4 与线性回归的区别只是这三件套各自的复杂度。

开始推导前,先看一个把「学习的直觉」讲得最好的视频。它名义上讲神经网络,但「网络在学什么、参数是什么」的画面会给你接下来所有数学一个直觉锚点:

VIDEO 01
But what is a neural network?(神经网络到底是什么?)
3Blue1Brown · 深度学习系列 第1集 18:40
观看指南 · 带着这 3 个问题看
  • 02:42 神经元就是「装着一个数的容器」——对应我们刚说的:模型只是函数。
  • 05:30 权重和偏置(weights & biases)——这就是参数 $\theta$ 的真身。注意听它说这个网络有 13002 个参数:「学习」就是为这 13002 个旋钮找到正确位置。
  • 12:30 为什么要分层?特征的层层抽象。第 3、4 章会反复回到这个画面。
  • 建议开启字幕(设置 → 字幕 → 自动翻译 → 中文)。

线性回归:第一个完整推导

现在用最简单的模型把「三件套」完整走一遍。别因为它简单就跳过——梯度下降、损失面、学习率这些概念在这里看得最清楚,到了第 6 章的 Transformer,数学骨架还是这一套。

模型

假设输出和输入是线性关系。单特征时:

$$\hat{y} = f_\theta(x) = wx + b$$

$w$(权重/斜率)和 $b$(偏置/截距)就是参数,$\theta = (w, b)$。帽子 $\hat{y}$ 表示「预测值」,区别于真实值 $y$。多特征时写成向量内积 $\hat{y} = \mathbf{w}^\top \mathbf{x} + b$。

损失:均方误差(MSE)

对每个样本,误差是 $\hat{y}^{(i)} - y^{(i)}$。把所有样本的误差平方后取平均:

$$L(w, b) = \frac{1}{n} \sum_{i=1}^{n} \left( wx^{(i)} + b - y^{(i)} \right)^2$$
为什么是平方,而不是绝对值或四次方?
三个理由,越往后越深刻:
可导性:$|e|$ 在 0 处不可导,平方处处光滑可导,方便求梯度。
惩罚结构:平方对大误差的惩罚是二次增长的——错 2 倍,罚 4 倍。四次方惩罚太猛,会被离群点完全绑架(你可以在下面的 Playground 里加两个离群点亲眼看看平方损失已经多怕离群点了)。
概率解释(最深刻):如果假设噪声服从高斯分布 $y = wx + b + \varepsilon,\ \varepsilon \sim \mathcal{N}(0, \sigma^2)$,对参数做最大似然估计,写出对数似然取负,剩下的恰好就是 MSE。也就是说「最小化 MSE = 假设高斯噪声下的最大似然」。同样的套路(假设分布→最大似然→损失函数)在第 2 章会推出交叉熵,在第 7 章会推出 LLM 的预训练目标。损失函数从来不是拍脑袋选的。

解析解:正规方程

$L(w,b)$ 是参数的二次函数——一个碗形曲面,存在唯一最低点。微积分告诉我们:最低点处偏导数为零。直接求:

$$\frac{\partial L}{\partial w} = \frac{2}{n}\sum_{i=1}^n \left(wx^{(i)} + b - y^{(i)}\right)x^{(i)} = 0$$ $$\frac{\partial L}{\partial b} = \frac{2}{n}\sum_{i=1}^n \left(wx^{(i)} + b - y^{(i)}\right) = 0$$

两个方程两个未知数,解出(推导:由第二式得 $b = \bar{y} - w\bar{x}$,代入第一式整理):

$$w^* = \frac{\sum_i (x^{(i)} - \bar{x})(y^{(i)} - \bar{y})}{\sum_i (x^{(i)} - \bar{x})^2} = \frac{\text{Cov}(x, y)}{\text{Var}(x)}, \qquad b^* = \bar{y} - w^*\bar{x}$$

多特征情形用矩阵写法更优雅。把所有样本堆成矩阵 $X \in \mathbb{R}^{n \times d}$(每行一个样本,并入一列全 1 来吸收 $b$),标签堆成 $\mathbf{y} \in \mathbb{R}^n$,则 $L(\mathbf{w}) = \frac{1}{n}\|X\mathbf{w} - \mathbf{y}\|^2$。对 $\mathbf{w}$ 求梯度并令其为零:

$$\nabla_\mathbf{w} L = \frac{2}{n} X^\top (X\mathbf{w} - \mathbf{y}) = 0 \;\;\Longrightarrow\;\; \boxed{\mathbf{w}^* = (X^\top X)^{-1} X^\top \mathbf{y}}$$

这就是著名的正规方程(Normal Equation)

既然有公式直接算,为什么还需要后面的梯度下降?两个致命问题:① 求逆 $(X^\top X)^{-1}$ 的复杂度是 $O(d^3)$——GPT 级别 $d$ 上万亿,宇宙毁灭前算不完;② 解析解只在线性模型 + MSE 这种特例下存在,神经网络的损失面坑坑洼洼,根本没有闭式解。所以现代 AI 的真正引擎是下一节的迭代法。

梯度下降:整个深度学习的引擎

换一种思路:不直接解方程,而是从随机位置出发,一小步一小步走下坡,走到坑底

梯度 $\nabla_\theta L$ 是一个向量,指向损失上升最快的方向。所以反着走:

$$\theta_{t+1} = \theta_t - \eta \, \nabla_\theta L(\theta_t)$$

$\eta$ 是学习率(learning rate)——每步迈多大。对我们的线性回归,把上一节算好的偏导拿来用,每一步更新就是:

$$w \leftarrow w - \eta \cdot \frac{2}{n}\sum_i (\hat{y}^{(i)} - y^{(i)})\, x^{(i)}, \qquad b \leftarrow b - \eta \cdot \frac{2}{n}\sum_i (\hat{y}^{(i)} - y^{(i)})$$
注意梯度公式的形状:误差 × 输入。直觉:误差越大、该特征数值越大,这个参数要背的锅越多,调整越狠。这个「误差×输入」的形状会在第 3 章反向传播推导里再次出现——反向传播本质上就是用链式法则把「误差该怎么分锅」逐层传回去。

三种喂数据的方式

变体每步用多少数据特点
批量梯度下降 BGD全部 $n$ 个梯度准、方向稳,但每步贵;数据大时不可行
随机梯度下降 SGD1 个每步极快但方向抖动大;噪声反而帮助跳出局部坑
小批量 Mini-batch$B$ 个(如 32~512)实践标准。GPU 并行友好,噪声适中。LLM 训练的 batch 可达数百万 token

学习率:最重要的超参数

不要只看文字——去下面的实验室把学习率滑块拉到最右边,亲眼看一次发散。这个画面比任何公式都难忘。

先看两个视频巩固。第一个用「下山」把梯度下降讲透;第二个是 StatQuest,把每一步算术掰开揉碎,适合想跟着手算一遍的你:

VIDEO 02
Gradient descent, how neural networks learn(梯度下降:神经网络如何学习)
3Blue1Brown · 深度学习系列 第2集 21:01
观看指南 · 带着这 3 个问题看
  • 04:45 损失面(cost surface)的可视化——我们 Playground 里损失曲线的高维版本。
  • 06:10 「负梯度方向 = 下降最快的方向」的几何直觉,对应公式 $\theta \leftarrow \theta - \eta\nabla L$。
  • 09:30 13002 维空间里的下坡——理解「训练 GPT」与「拟合直线」在数学上是同一件事。
VIDEO 03
Gradient Descent, Step-by-Step(梯度下降,一步一步算给你看)
StatQuest with Josh Starmer 23:54
观看指南 · 选看,适合想手算一遍的同学
  • 05:00 用真实数字算截距的梯度——和我们 §6 的公式逐项对应。
  • 12:20 同时更新两个参数(斜率+截距)——注意必须「同时」更新,不能先更一个再用新值算另一个。
  • 18:00 步长(学习率)与收敛判据。

交互实验室:亲手训练一个模型

linear-regression.train

点击画布添加数据点(或选预设数据集)→ 点「开始训练」看蓝色直线被梯度下降一步步拉到位。红色竖线 = 每个点的残差(误差),黄色曲线 = 损失随迭代的下降轨迹。必做实验:①把学习率拉到最大看发散;②加两个离群点看 MSE 被绑架;③切到 SGD 看抖动。

w = 0 b = 0 step = 0 MSE = 0
在 SGD 模式下损失曲线为什么到了低位还一直抖、不再继续下降?
SGD 每步只看一个随机样本,梯度是真实梯度的无偏但有噪声的估计。接近最优点后,真实梯度趋近 0,但单样本梯度的噪声还在,所以参数在最优点附近随机游走,损失在一个「噪声地板」上振荡。解决办法是学习率衰减:噪声幅度正比于 $\eta$,逐步调小 $\eta$ 就能收敛得更深。这正是 LLM 训练用余弦衰减调度的原因之一。

泛化:机器学习真正的难题

到目前为止我们只让损失在训练数据上变小。但训练的真正目的,是模型在没见过的数据上表现好——这叫泛化(generalization)。这是 ML 与单纯的优化的本质区别。

过拟合的本质不是「模型大」,而是「模型从有限数据里记住了不可重复的偶然规律」。判断标准永远是:训练误差和验证误差的差距。差距大 = 过拟合。现代 LLM 参数巨大却不严重过拟合,因为数据更巨大(万亿 token 级),而且只训练一个 epoch 左右——第 7 章细讲这个微妙平衡(以及"grokking"等反直觉现象)。

数据划分的纪律

集合用途典型占比
训练集 train更新参数 $\theta$~80%
验证集 validation调超参数(学习率、模型大小)、早停~10%
测试集 test只在最后用一次,报告最终性能~10%

为什么验证和测试要分开?因为你会根据验证集表现反复调超参——调多了,超参就「偷偷拟合」了验证集,验证分数虚高。测试集是从未参与任何决策的"裁判"。数据少时用 K 折交叉验证:分 K 份,轮流留一份验证,取平均。LLM 时代这个纪律同样存在,变成了「评测集污染(benchmark contamination)」问题——评测题混进预训练数据,分数就不可信了。

偏差-方差分解

欠拟合/过拟合可以写成精确的数学。设真实关系 $y = g(x) + \varepsilon$,噪声 $\varepsilon$ 均值 0 方差 $\sigma^2$。在固定点 $x$ 处,对「换不同训练集训练出的模型 $\hat{f}$」求期望,期望平方误差可以严格分解为三项(推导:加减 $\mathbb{E}[\hat{f}(x)]$ 后展开平方,交叉项期望为零):

$$\mathbb{E}\big[(y - \hat{f}(x))^2\big] = \underbrace{\big(g(x) - \mathbb{E}[\hat{f}(x)]\big)^2}_{\text{偏差}^2} + \underbrace{\mathbb{E}\big[(\hat{f}(x) - \mathbb{E}[\hat{f}(x)])^2\big]}_{\text{方差}} + \underbrace{\sigma^2}_{\text{不可约误差}}$$
经典理论说偏差和方差此消彼长(U 形测试误差曲线)。但 2019 年的「双下降(double descent)」研究发现:模型大到能完美插值训练数据之后,继续加大,测试误差竟然再次下降。这是「为什么 LLM 越大越好」的理论背景之一,也是经典统计学习理论与深度学习实践最著名的裂缝。记住这个伏笔。

代码实战:NumPy 从零实现

把本章全部数学翻译成 30 行代码。逐行读,每一行都能对应到前面的公式:

python · linear_regression_from_scratch.py
# 从零实现线性回归:正规方程 vs 梯度下降
import numpy as np

rng = np.random.default_rng(42)

# ---- 造数据:y = 2.5x + 1.0 + 高斯噪声 ----
n = 200
x = rng.uniform(0, 10, size=n)
y = 2.5 * x + 1.0 + rng.normal(0, 1.5, size=n)

# ---- 方法一:正规方程  w* = (XᵀX)⁻¹Xᵀy ----
X = np.column_stack([x, np.ones(n)])        # 拼一列 1 吸收偏置 b
w_closed = np.linalg.solve(X.T @ X, X.T @ y) # 比显式求逆更稳定
print(f"解析解   w={w_closed[0]:.4f}, b={w_closed[1]:.4f}")

# ---- 方法二:批量梯度下降 ----
w, b = 0.0, 0.0          # 随机起点(这里取 0)
eta = 0.01               # 学习率
for step in range(2000):
    y_hat = w * x + b                 # 前向:预测
    err = y_hat - y                   # 误差向量
    grad_w = 2 * np.mean(err * x)     # ∂L/∂w = (2/n)Σ err·x  「误差×输入」
    grad_b = 2 * np.mean(err)         # ∂L/∂b = (2/n)Σ err
    w -= eta * grad_w                 # 沿负梯度走一步
    b -= eta * grad_b
    if step % 500 == 0:
        print(f"step {step:4d}  MSE={np.mean(err**2):.4f}  w={w:.3f} b={b:.3f}")

print(f"梯度下降 w={w:.4f}, b={b:.4f}   # 与解析解一致 ✓")

生产环境一行搞定(但现在你知道这一行背后发生了什么):

python · sklearn 版本
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(x.reshape(-1, 1), y)
print(model.coef_[0], model.intercept_)   # ≈ 2.5, 1.0
代码里为什么用 np.linalg.solve 而不是 np.linalg.inv 再乘?
数值稳定性。inv 显式求逆再相乘,误差会被条件数放大两次;solve 用 LU 分解直接解线性方程组,更快也更稳。当特征高度相关(多重共线性)时 $X^\top X$ 接近奇异,这个差别会变成天壤之别。工程细节也是技术实力的一部分。

最后,看一眼这一切通向哪里。Karpathy(前 OpenAI 创始成员、前特斯拉 AI 总监)这个演讲是「从本章到 LLM」最好的桥梁——你会发现他讲的「训练就是压缩」「下一词预测」,骨架正是你刚学完的 模型+损失+优化:

VIDEO 04 · 展望
Intro to Large Language Models(大语言模型入门)
Andrej Karpathy 59:48
观看指南 · 现在只需看前 18 分钟
  • 00:00 LLM = 两个文件:参数文件 + 跑参数的代码。参数就是本章的 $\theta$,只不过有 700 亿个。
  • 04:17 训练 = 有损压缩互联网。损失函数视角的另一种表述。
  • 07:50 下一词预测为什么能逼出「理解」。
  • 18 分钟之后讲微调和 Agent,等学到第 8、11 章再回来看,体验完全不同。

章节测验