直觉理解
传统编程是人写规则、机器执行;机器学习是给机器大量例子,让它自己从数据里总结出规则。这个「规则」就是一个带参数的函数(模型),「总结」的过程就是调整参数(训练),目标是让模型在没见过的新数据上也表现良好(泛化)。
定义与公式
四个要素
以有参数模型的监督学习为例,常见的训练流程可以拆成四部分;聚类、近邻方法和强化学习等需要相应调整这个框架:
- 数据:样本 以及(可能有的)标签 。
- 模型:带参数 的函数 ,例如线性模型、决策树、神经网络。
- 损失函数:衡量预测 与目标的差距,见损失函数。
- 优化方法:调整 让平均损失变小,深度学习中基本都是梯度下降。
训练就是求解:
按监督信号分类
- 监督学习:每个样本都有标签。输出是离散类别的叫分类,输出是连续数值的叫回归。
- 无监督学习:没有标签,从数据本身发现结构,如聚类、降维。
- 自监督学习:从数据本身构造标签。语言模型「用前文预测下一个 token」就是自监督,这让它能利用海量无标注文本。
- 强化学习:没有现成的正确答案,智能体在环境中行动,根据奖励信号学习策略。
数据集划分
- 训练集:用来更新参数。
- 验证集:用来选择超参数、决定何时停止训练。
- 测试集:只在最后用一次,估计模型在新数据上的真实表现。
测试数据如果混进了训练数据(数据污染),评测结果可能虚高。大模型的预训练语料覆盖大量网页、代码等来源,容易与公开基准重叠,但不能据此声称模型训练数据覆盖了整个互联网。
参数与超参数
- 参数:模型通过训练学到的量,如神经网络的权重。
- 超参数:训练前人为设定的量,如学习率、批大小、层数、训练轮数。
训练的基本单位
- 批次(batch):一次前向和反向计算处理的一组样本;使用梯度累积时,一次参数更新会合并多个微批次(microbatch)。
- 步(step):完成一次参数更新。
- 轮(epoch):把整个训练集完整过一遍。大模型常按不同权重采样各个数据源,有些数据会被重复使用,有些只用到一部分,因此更常报告训练 token 数和各来源的有效轮数。
泛化
模型在训练集上表现好不够,关键是在新数据上表现好。训练误差低、测试误差高就是过拟合,两者都高就是欠拟合,见过拟合与正则化。
代码示例
用最小二乘拟合一条直线,体会「数据、模型、损失、优化」四要素:
import numpy as np
rng = np.random.default_rng(0)
x = rng.uniform(-1, 1, size=100)
y = 3 * x + 0.5 + rng.normal(0, 0.1, size=100) # 数据:真实规律是 y = 3x + 0.5
X = np.stack([x, np.ones_like(x)], axis=1) # 模型:y = w*x + b
idx = rng.permutation(100)
train, test = idx[:80], idx[80:] # 划分训练集与测试集
w, b = np.linalg.lstsq(X[train], y[train], rcond=None)[0] # 优化:最小化平方误差
mse = lambda i: np.mean(np.square(X[i] @ [w, b] - y[i])) # 损失:均方误差
print(round(w, 2), round(b, 2), round(mse(train), 4), round(mse(test), 4))在 AI 中的作用
- 大语言模型的预训练就是规模极大的自监督学习,见语言模型和预训练。
- 训练、验证、测试的划分与数据污染问题,贯穿评测基准。
- 强化学习在大模型的后训练中扮演重要角色,见RLHF、RLAIF与RLVR。