第1章 机器学习基础
一句话定位:用"找函数"视角搭起机器学习全流程。
文章导读(读完你将获得)
- 能用一句话解释:机器学习到底在"学"什么、为什么要学它
- 掌握一套可复用的训练流程:建模 → 定义损失 → 优化 → 评估
- 分清回归/分类/结构化输出三类任务,并知道各自常用损失
- 能手算一次梯度下降的参数更新,理解学习率与收敛/发散的关系
- 知道模型失败的两大根因:模型偏差 与优化问题,并能从训练曲线读信号
1. 直觉引入
你每天都在做"凭经验做预测":
- 看了上周销量,估今天订单会不会爆;
- 看了体检指标,判断风险是不是升高;
- 看了历史点击,猜明天视频会不会火。
核心矛盾/瓶颈(一句话):
我们想要一个能从数据中"自动找出规律"的函数,但人写不出来,只能让机器去"找"。
把机器学习想成:你给机器很多"例题"(输入 + 标准答案),机器要学出一套"解题公式"(函数),以后遇到新题也能做对。
2. 符号与概念速查
| 符号/术语 | 含义 | 常见误解 |
|---|---|---|
| xxx | 输入特征(feature) | 误以为"特征越多越好",忽视噪声与泄漏 |
| yyy | 真实标签(label) | 误以为标签一定准确;现实中常含噪声 |
| y^\hat yy^ | 模型预测值 | 误以为预测必须精确;更重要是可泛化 |
| fθ(⋅)f_\theta(\cdot)fθ(⋅) | 模型/函数,θ\thetaθ 为参数 | 误以为"模型=算法";模型是可学习的函数族 |
| θ\thetaθ | 参数(权重/偏置的集合) | 误把超参数(学习率等)当参数 |
| L(θ)L(\theta)L(θ) | 损失函数:衡量参数好坏 | 误以为"损失越小越好"就等于"线上越好" |
| 学习率 η\etaη | 每步走多远 | 误以为越大越快;太大会发散 |
| 训练集/验证集/测试集 | 用来学习/调参/最终评估 | 误把测试集当验证集反复调参(信息泄漏) |
| 过拟合 | 训练好、泛化差 | 误以为"测试差=过拟合";也可能是优化失败或数据不匹配 |
| 偏差/方差 | 欠拟合/对数据波动敏感 | 误把"模型深=一定过拟合"当定律 |
3. 核心机制
3.1 机器学习到底在做什么?
类比:
把"找函数"想成"给一条弹性很强的曲线定形"。训练数据是地面上的钉子,你希望曲线穿过钉子附近,同时别扭得太夸张(否则遇到新钉子就崩)。
最小必要定义:
机器学习就是在一个函数族 {fθ}\{f_\theta\}{fθ} 里,找到参数 θ\thetaθ,让预测 y^=fθ(x)\hat y=f_\theta(x)y^=fθ(x) 尽量贴近真实 yyy。
为什么需要它?不用会怎样?
- 需要:复杂任务(语音识别/图像识别/推荐)无法手写规则。
- 不用:你只能写"if-else 规则",遇到稍微变化的场景就失效,维护成本爆炸。
3.2 三类任务:回归、分类、结构化输出
- 回归(输出一个数):房价、温度、PM2.5。常用损失:MSE/MAE。
- 分类(输出一个类别):垃圾邮件、猫狗识别。常用损失:交叉熵。
- 结构化学习(输出一个结构):生成文字、生成图像、翻译。常用损失:序列交叉熵或更复杂的对齐/感知损失。
3.3 微型例子(可手算/可推导):一次梯度下降到底在算什么?
我们用最简单的线性回归:
y^=wx+b \hat y = wx + b y^=wx+b
给两条训练数据:(x1,y1)=(1,2)(x_1,y_1)=(1,2)(x1,y1)=(1,2),(x2,y2)=(2,3)(x_2,y_2)=(2,3)(x2,y2)=(2,3)。
用均方误差(为了好算,写成平均平方误差的一半):
L(w,b)=12N∑i=1N(y^i−yi)2 L(w,b)=\frac{1}{2N}\sum_{i=1}^{N}(\hat y_i - y_i)^2 L(w,b)=2N1i=1∑N(y^i−yi)2
假设初始 w0=0, b0=0w_0=0,\;b_0=0w0=0,b0=0,则预测:y^1=0,y^2=0\hat y_1=0,\hat y_2=0y^1=0,y^2=0。
误差:e1=−2, e2=−3e_1=-2,\;e_2=-3e1=−2,e2=−3。
梯度(你只要记住:对 www 的导数会多乘一个 xxx):
∂L∂w=1N∑i=1N(y^i−yi)xi,∂L∂b=1N∑i=1N(y^i−yi) \frac{\partial L}{\partial w} = \frac{1}{N}\sum_{i=1}^{N}(\hat y_i-y_i)x_i \quad,\quad \frac{\partial L}{\partial b} = \frac{1}{N}\sum_{i=1}^{N}(\hat y_i-y_i) ∂w∂L=N1i=1∑N(y^i−yi)xi,∂b∂L=N1i=1∑N(y^i−yi)
代入数值(N=2N=2N=2):
∂L∂w=12[(0−2)⋅1+(0−3)⋅2]=12(−2−6)=−4 \frac{\partial L}{\partial w} = \frac{1}{2}[(0-2)\cdot 1 + (0-3)\cdot 2] = \frac{1}{2}(-2-6)=-4 ∂w∂L=21[(0−2)⋅1+(0−3)⋅2]=21(−2−6)=−4
∂L∂b=12[(0−2)+(0−3)]=−2.5 \frac{\partial L}{\partial b} = \frac{1}{2}[(0-2)+(0-3)] = -2.5 ∂b∂L=21[(0−2)+(0−3)]=−2.5
设学习率 η=0.1\eta=0.1η=0.1,梯度下降更新:
w1=w0−η∂L∂w=0−0.1⋅(−4)=0.4 w_1 = w_0 - \eta \frac{\partial L}{\partial w}=0-0.1\cdot(-4)=0.4 w1=w0−η∂w∂L=0−0.1⋅(−4)=0.4
b1=b0−η∂L∂b=0−0.1⋅(−2.5)=0.25 b_1 = b_0 - \eta \frac{\partial L}{\partial b}=0-0.1\cdot(-2.5)=0.25 b1=b0−η∂b∂L=0−0.1⋅(−2.5)=0.25
这一小步的意义:
你没有"拍脑袋调参数",而是沿着"让损失下降最快"的方向走了一步。学习率决定步子大小:太小走不动,太大跨过山谷直接飞出赛道。
3.4 图1(必须):机器学习全流程(可渲染 Mermaid)
偏差(模型不够)
优化/数据问题
过拟合
定义任务与指标
回归/分类/结构化
准备数据
特征x与标签y
选择模型族 f_θ
线性/树/神经网络
定义损失 L(θ)
MSE/交叉熵/正则
优化求 θ_opt
梯度下降/变体
评估与诊断
训练/验证/测试曲线
失败原因?
正则/早停/数据增强
4. 严谨表述
4.1 统一的数学框架
给定数据集 D={(xi,yi)}i=1N\mathcal D=\{(x_i,y_i)\}{i=1}^ND={(xi,yi)}i=1N,选择参数化函数族 fθf\thetafθ,学习问题写成:
θ∗=argminθ L(θ) \theta^* = \arg\min_{\theta} \; L(\theta) θ∗=argθminL(θ)
其中损失通常是经验风险 + 正则项:
L(θ)=1N∑i=1Nℓ(fθ(xi),yi)+λΩ(θ) L(\theta)=\frac{1}{N}\sum_{i=1}^{N}\ell\big(f_\theta(x_i),y_i\big) + \lambda\Omega(\theta) L(θ)=N1i=1∑Nℓ(fθ(xi),yi)+λΩ(θ)
- ℓ(⋅)\ell(\cdot)ℓ(⋅):单样本损失(MSE、交叉熵等)
- Ω(θ)\Omega(\theta)Ω(θ):复杂度惩罚(如 ∥θ∥22\|\theta\|_2^2∥θ∥22)
- λ\lambdaλ:权衡拟合与复杂度的超参数
4.2 梯度下降与"为什么能工作"
基本更新:
θt+1=θt−η∇θL(θt) \theta_{t+1}=\theta_t-\eta\nabla_\theta L(\theta_t) θt+1=θt−η∇θL(θt)
关键假设(边界条件):
- 如果 LLL 是凸的(如线性回归 + MSE),合适的 η\etaη 下可收敛到全局最优。
- 深度网络的 LLL 往往非凸,但实践中仍常得到足够好的解;此时"能否学好"更依赖优化细节、初始化、归一化等工程因素。
常见误解澄清:
- "卡在局部极小值"经常被过度强调;更常见的问题是:学习率不合适、梯度噪声过大、数据/标签质量差、训练策略不稳定。
4.3 回归与分类的典型损失
- 回归:MSE
ℓMSE(y^,y)=12(y^−y)2 \ell_{\text{MSE}}(\hat y,y)=\frac{1}{2}(\hat y-y)^2 ℓMSE(y^,y)=21(y^−y)2 - 二分类:对数似然/交叉熵(用 Sigmoid 概率 p=σ(z)p=\sigma(z)p=σ(z))
ℓCE(p,y)=−(ylogp+(1−y)log(1−p)) \ell_{\text{CE}}(p,y)= -\big(y\log p + (1-y)\log(1-p)\big) ℓCE(p,y)=−(ylogp+(1−y)log(1−p)) - 多分类:Softmax + 交叉熵(pk=ezk∑jezjp_k=\frac{e^{z_k}}{\sum_j e^{z_j}}pk=∑jezjezk)
4.4 批量(mini-batch)与 epoch(训练的时间单位)
在实现中通常用 mini-batch 近似全量梯度:
∇L(θ)≈1B∑i∈B∇ℓ(fθ(xi),yi) \nabla L(\theta) \approx \frac{1}{B}\sum_{i\in\mathcal B}\nabla\ell\big(f_\theta(x_i),y_i\big) ∇L(θ)≈B1i∈B∑∇ℓ(fθ(xi),yi)
- 一次参数更新:用一个 batch 算梯度并更新
- 一个 epoch:把全部数据都用过一次(可能发生多次更新)
5. 关键结论与失效场景
-
机器学习=在函数族里找最合适的函数。
失效:函数族选得太窄(模型偏差大),再怎么训也上不去。
-
损失函数是"训练的方向盘",指标是"业务的终点"。
失效:损失与业务指标不一致(如只优化点击率但忽略留存),训练越好线上越糟。
-
训练差不一定是过拟合,可能是优化没做对。
失效:学习率过大导致震荡/发散,或初始化/归一化不当导致梯度异常。
-
更复杂的模型不是原罪;关键是泛化控制。
失效:数据量少、噪声大、特征泄漏时,复杂模型容易记住训练集。
-
"先基线、再加复杂度"是最稳的工程策略。
失效:跳过基线直接上大模型,诊断空间爆炸,无法定位问题。
6. 工程视角:训练与实现的坑
- 训练损失不降:
- 现象:loss 基本水平线;accuracy 也不动。
- 排查:学习率太小/梯度为零(激活饱和)、数据与标签对不上、模型输出维度错误。
- 训练损失下降但验证损失上升(典型过拟合):
- 现象:train loss ↓,val loss ↑,val 指标开始变差。
- 处理:正则化(L2L_2L2、dropout)、早停、数据增强、减少模型容量。
- 训练损失震荡甚至爆炸:
- 现象:loss 大幅波动,偶尔 NaN。
- 处理:减小学习率、梯度裁剪、检查输入是否未归一化、混合精度的数值稳定性。
- 验证集"看起来很好",上线很差:
- 现象:离线指标高但线上不行。
- 坑位:数据泄漏(未来信息混入特征)、切分方式不合理(同用户跨集合)、分布不匹配。
- batch size 改了,效果完全变样:
- 现象:大 batch 更稳但泛化变差,小 batch 噪声大但可能泛化更好。
- 经验:先固定 batch,调好学习率/调度,再逐步尝试扩大 batch。
- 指标"卡住"别只加层:
- 现象:深一点反而更差。
- 处理:先确认优化没问题(学习率、初始化、归一化、残差/跳连)。
- 训练曲线诊断口诀:
- train/val 都差:偏差大或优化失败
- train 好 val 差:过拟合或验证集不匹配
- train 波动大:学习率/批量噪声/数值不稳
- 别忘了最硬的基线:
- 线性模型/树模型往往能快速告诉你"数据有没有信号"。没有信号,上大模型只会更惨。
7. 本章练习
7.1 基础练习
-
题目: 你要预测"明天温度",这属于回归还是分类?请写出一个可能的输入特征集合。
答案要点: 回归;特征可包括今天温度、湿度、气压、风速、历史同日温度等;强调特征必须可获得且不泄漏未来。 -
题目: 为什么我们要把数据分成训练集/验证集/测试集?
答案要点: 训练集学参数;验证集选超参数与早停;测试集只做最终一次评估;反复用测试集调参会导致过度乐观(信息泄漏)。 -
题目: 学习率太大和太小各会出现什么训练现象?
答案要点: 太大:loss 震荡或发散,可能 NaN;太小:loss 降得极慢,训练像"没学"。
7.2 进阶练习
-
题目: 对线性回归 y^=wx+b\hat y=wx+by^=wx+b 与 MSE,推导 ∂L∂w\frac{\partial L}{\partial w}∂w∂L、∂L∂b\frac{\partial L}{\partial b}∂b∂L。
答案要点: 使用链式法则;得到 1N∑(y^i−yi)xi\frac{1}{N}\sum (\hat y_i-y_i)x_iN1∑(y^i−yi)xi 与 1N∑(y^i−yi)\frac{1}{N}\sum (\hat y_i-y_i)N1∑(y^i−yi);说明为何对 www 会出现 xix_ixi。 -
题目: 你训练一个更深的网络,发现 5 层的训练损失反而比 4 层大。请给出至少 3 种可能原因,并说明你会看哪些曲线/日志来验证。
答案要点: 可能是优化失败(学习率、初始化、梯度消失/爆炸)、正则/归一化配置不当、训练策略差(batch/调度);看 train loss 是否震荡、梯度范数、学习率曲线、激活分布、是否出现 NaN。
8. 小结与下一章衔接
这一章把机器学习抽象成"找函数":你先选一个函数族 fθf_\thetafθ,用损失 L(θ)L(\theta)L(θ) 衡量好坏,再用优化算法把参数推向更小的损失。现实中失败常来自三类:模型不够(偏差)、优化不给力、以及训练与泛化不一致(过拟合/分布不匹配)。下一章会把这些失败模式拆开,给出更系统的实践方法论与诊断手段。
下一章会复用的 3 个点:
- 训练/验证/测试的分工与信息泄漏风险
- 从训练曲线判断"偏差 vs 优化 vs 过拟合"
- 超参数(学习率、batch size、正则)对结果的决定性影响
图2(必须):训练循环与数据划分
测试(最终评估) 验证(调参/早停) 训练(更新参数) 数据集 测试(最终评估) 验证(调参/早停) 训练(更新参数) 数据集 loop [每个 epoch] 训练集(多次 epoch) 前向预测 ->> 计算损失 ->> 反向传播 参数更新(一次或多次 batch) 输出模型(当前 θ) 评估并选择超参数/早停点 反馈(继续训练 or 停止) 最终模型(冻结) 只评估一次,报告指标
本章参考资料
- 课程:李宏毅,《机器学习(2021 春)》第 1 讲(Machine Learning basics:Regression / Classification / Optimization)。
- 教材:Ian Goodfellow, Yoshua Bengio, Aaron Courville,《Deep Learning》,Chapter 5--6(Optimization & Training)。
- 教材:Christopher M. Bishop,《Pattern Recognition and Machine Learning》,Chapter 1--3(Probabilistic modeling, linear models)。
- 教材:Kevin P. Murphy,《Machine Learning: A Probabilistic Perspective》,Chapter 3--8(Supervised learning, linear regression/classification)。
- 书籍:Trevor Hastie, Robert Tibshirani, Jerome Friedman,《The Elements of Statistical Learning》,Chapter 2--7(Bias-variance, linear methods)。
- 官方文档:PyTorch Docs,Autograd & Optimizers(理解梯度、更新与学习率调度)。