整理自李宏毅 2025「生成式 AI 导论」第 5 讲。前 4 讲讲的是”训练好的模型怎么用”,这一讲讲的是”模型怎么训练出来的”。
1. 核心问题:通过数据找函数
前面我们知道 LLM 是一个函数 f(x) → 概率分布。但这个函数是怎么找到的?
机器学习 = 通过数据,自动找到一个好用的函数。
为了讲清楚原理,用一个简单案例:“给定一份 PPT,预测老师要讲多久”。
2. 三步流程
步骤 1: 定义目标 → Loss Function(怎么判断好坏)
步骤 2: 画定范围 → Model(可选的函数有哪些)
步骤 3: 寻找最优 → Optimization(怎么找到最好的那个)
2.1 定义目标:Loss Function
准备训练数据(输入 + 标准答案),定义”预测值和真实值的差距”。
MSE(均方误差):
L = (1/N) × Σ (预测值 - 真实值)²
L 越小 → 函数越好。
2.2 画定范围:Model
特征工程:把非数值输入转成数字。PPT → [页数, 总字数, 标题长度…]
线性模型:Y = W₁×页数 + B
- W₁ 和 B 是参数(未知数)
- 所有可能的 (W₁, B) 组合 = 函数的搜索空间
神经网络:
Y = B + Σ Cᵢ × max(0, Wᵢ×X + Bᵢ)
max(0, x)= ReLU 激活函数- 叠加足够多 → 理论上逼近任意曲线
- 多层叠加 = 深度学习
2.3 寻找最优:Gradient Descent
目标:找到让 Loss 最小的参数组合。
梯度下降:
1. 随机初始化参数
2. 计算当前点的梯度(Loss 对参数的偏导数)
3. 参数 = 参数 - Learning Rate × 梯度
4. 重复 2-3 直到收敛
关键超参数:
| 参数 | 太大 | 太小 |
|---|---|---|
| Learning Rate | 学习暴走,跳过最优点 | 收敛极慢 |
| Batch Size | 更新慢但方向稳定 | 更新快但方向震荡 |
Batch Gradient Descent:不用全量数据算 Loss,每次用一小批(Batch)就更新一次。所有 Batch 过一遍 = 1 个 Epoch。
3. 验证 + 过拟合
训练完要做第 4 步:验证——用模型没见过的数据测试。
过拟合(Overfitting)
训练 Loss 很低,验证 Loss 暴涨。
本质:模型把训练数据的”噪音”都记住了,而不是学到通用规律。
比喻:驾校里学会了”看这个贴纸就向右打”,上路后没有贴纸就完蛋。
解决方法
| 方法 | 做什么 |
|---|---|
| 换训练数据 | 确保训练数据和实际使用场景一致 |
| 特征工程 | 用更有信息量的特征(如”每页平均字数”比”总字数”更好) |
| Early Stopping | 训练中持续监测验证 Loss,开始上升时停止 |
| 缩小模型 | 减少参数量/层数,限制函数空间 |
测试集泄露
反复在测试集上调参 → 最终对测试集过拟合 → Benchmark 分数高但实际不行。
这就是为什么 Benchmark 不等于真实能力(呼应第 4 讲)。
4. 对 Java 开发者的类比
| ML 概念 | Java 类比 |
|---|---|
| 训练数据 | 单元测试用例(input + expected output) |
| Loss Function | 断言失败的计数 |
| Model | interface 定义(约束了实现的形状) |
| 参数 | 实现类里的成员变量 |
| 梯度下降 | 自动调参,让所有测试通过 |
| Overfitting | 为每个测试用例写了 if-else 硬编码,换数据就崩 |
| Validation | 集成测试(用不同于单测的数据验证) |
| Early Stopping | 发现集成测试开始失败就停止改代码 |
5. 要点总结
找函数三步:
1. Loss(好坏标准)
2. Model(搜索空间)
3. Optimization(怎么搜)
+ 验证(防止过拟合)
深度学习为什么强:神经网络理论上能表示任意函数,搜索空间足够大。代价是训练难度高(容易卡住、过拟合)。
参考
- 李宏毅 2025「生成式 AI 与 ML 导论」第 5 讲:YouTube
- 课程网页:NTU Speech Lab