在正式开始学习之前,先简单介绍一些机器学习中的基本概念和术语。
传统编程与机器学习
传统编程通常是:
人编写规则,机器根据规则和输入得到输出。
例如,我们明确告诉程序:
1 | 如果成绩 >= 60,则通过; |
也就是说,规则是人提前写好的,机器只是负责执行。
而机器学习的思路则不同:
人提供数据和期望输出,算法从数据中学习规则。
例如,我们给模型很多组输入和对应答案:
1 | 输入:房屋面积、位置、楼层…… |
模型并不知道房价应该如何计算,但它会尝试从这些数据中找到输入和输出之间的关系。
因此,可以粗略地说:
| 方式 | 人提供什么 | 机器做什么 |
|---|---|---|
| 传统编程 | 规则 + 输入 | 根据规则计算输出 |
| 机器学习 | 输入 + 输出 | 从数据中学习规则 |
训练得到的模型,可以理解为机器从数据中学到的规则表示。只不过这些规则不是以条条列举出来的形式存在,而是以数字参数的形式存在,例如权重、偏置等。
模型真正有价值的地方在于泛化:它不仅要记住见过的数据,还要能够对没有见过的新数据做出合理预测。
机器学习类型
机器学习通常可以分为三类:监督学习、无监督学习和强化学习。
监督学习
监督学习指的是:训练数据中既有输入,也有对应的输出。
模型要学习的是:
1 | 输入 -> 输出 |
例如:
- 这里有 10000 张标注了“猫”或“狗”的图片,学会区分它们。
- 这里有房屋特征和对应价格,学会预测房价。
- 这里有邮件内容和“垃圾邮件 / 正常邮件”的标签,学会判断邮件类型。
监督学习是实践中最常见的一类机器学习方法。
无监督学习
无监督学习指的是:训练数据中只有输入,没有人工给出的标签。
模型要自己从数据中发现结构。
例如:
- 这里有 10000 个客户的购买记录,找出自然的客户分组。
- 这里有高维数据,将它降到二维,同时尽量保留原始结构。
- 这里有大量文本,发现其中潜在的主题分布。
无监督学习常用于聚类、降维、数据探索和预处理。
强化学习
强化学习中,模型通常被称为智能体。智能体会在环境中采取行动,并根据结果获得奖励或惩罚。
它要学习的是:
1 | 在什么状态下,采取什么行动,才能获得更高的长期奖励。 |
例如:
- 玩一个游戏,胜利获得奖励,失败受到惩罚。
- 控制机械臂,成功抓起物体获得奖励,动作浪费时间则受到惩罚。
- 在某些场景中,通过奖励信号调整模型的行为策略。
强化学习常用于游戏 AI、机器人控制,以及大语言模型对齐中的 RLHF 等场景。
超越三大类
监督学习、无监督学习和强化学习是最常见的分类方式。但在实际应用中,很多方法并不会完全属于某一类,而是会结合多种思想。
半监督学习
半监督学习使用少量标注数据和大量无标注数据。
例如,医学图像标注成本很高。我们可能只有 100 张标注好的医学图像,但有 100000 张未标注图像。这时,只使用 100 张标注图像可能不够,而完全丢弃未标注数据又很浪费。
半监督学习常见方法包括:
- 标签传播:把相似的数据点连接起来,让已标注数据的标签传播到相似的未标注数据上。
- 伪标签:先用少量标注数据训练模型,再让模型给未标注数据生成预测标签,然后继续训练。
- 一致性正则化:要求模型对原始输入和轻微扰动后的输入给出相似预测。
自监督学习
自监督学习从数据本身构造训练目标,不依赖人工标注。
它的核心思想是:
不需要人工告诉模型答案,而是从数据自身生成答案。
例如:
- 掩码语言模型:遮住句子中的一部分词,让模型预测被遮住的词。
- 下一词预测:给定前面的词,让模型预测下一个词。
- 对比学习:对同一张图片做两种不同增强,让模型知道它们来自同一个原始样本。
自监督学习在形式上很像监督学习,因为模型仍然在预测某个目标。但这些目标不是人工标注出来的,而是从数据中自动构造出来的。
分类与回归
分类和回归是监督学习中最常见的两类任务。
分类
分类任务的输出是离散类别。
例如:
- 这封邮件是不是垃圾邮件?
- 这张图片是猫、狗还是鸟?
- 这个用户会不会流失?
回归
回归任务的输出是连续数值。
例如:
- 这套房子的价格是多少?
- 明天的气温是多少?
- 某个商品下个月的销量是多少?
可以简单对比如下:
| 维度 | 分类 | 回归 |
|---|---|---|
| 输出 | 离散类别 | 连续数值 |
| 例子 | 判断邮件是否为垃圾邮件 | 预测房价 |
| 输出空间 | {猫, 狗, 鸟} | 实数 |
| 常见损失函数 | 交叉熵 | 均方误差、MAE |
| 常见评价指标 | 准确率、召回率、F1 | MSE、MAE、R² |
| 目标 | 找到类别边界 | 拟合数值关系 |
有些问题可以用不同方式建模。
例如股票预测:
- 预测股票明天是涨还是跌,这是分类问题。
- 预测股票明天的具体价格,这是回归问题。
训练集、验证集与测试集
在训练模型时,我们通常会把数据划分为训练集、验证集和测试集。
| 划分 | 用途 | 使用时机 | 典型比例 |
|---|---|---|---|
| 训练集 | 让模型学习参数 | 训练过程中反复使用 | 60% - 80% |
| 验证集 | 调整超参数,比较模型 | 每次训练后使用 | 10% - 20% |
| 测试集 | 评估最终效果 | 最后只使用一次 | 10% - 20% |
训练集
训练集用于让模型学习数据中的规律。
模型会反复查看训练集,根据预测结果和真实答案之间的差距,不断调整自己的参数。
验证集
验证集用于调试训练过程。
例如,我们可以用验证集来选择:
- 学习率应该是多少
- 模型层数应该是多少
- 是否需要正则化
- 训练多少轮比较合适
这些由人提前设定、不会被模型直接学习出来的参数,叫做超参数。
测试集
测试集用于最终评估模型效果。
测试集应该尽量只在最后使用一次。如果我们反复根据测试集结果修改模型,那么测试集也会间接参与模型选择,最终评估结果就会变得不可靠。
对于数据量较小的情况,可以使用 k 折交叉验证。
它会把数据分成 k 份,每次用其中 k-1 份训练,用剩下 1 份验证。重复 k 次后,再取平均结果。这样可以更充分地利用有限数据,也能得到更稳定的性能估计。
过拟合与欠拟合
机器学习的目标不是简单地在训练数据上表现好,而是在没见过的新数据上也表现好。
这就涉及两个常见问题:欠拟合和过拟合。
欠拟合
欠拟合指的是:模型太简单,无法捕捉数据中的真实规律。
例如,真实关系是一条曲线,但我们强行用一条直线去拟合它。此时模型能力不足,即使在训练集上也表现不好。
欠拟合的典型表现是:
- 训练误差高
- 测试误差也高
也就是说,模型连训练数据都没有学好。
过拟合
过拟合指的是:模型太复杂,不仅学习了数据中的真实规律,还记住了训练数据中的噪声。
例如,我们用一条非常弯曲的曲线穿过每一个训练点。它在训练集上表现很好,但遇到新数据时反而预测很差。
过拟合的典型表现是:
- 训练误差低
- 测试误差高
也就是说,模型把训练数据“背”下来了,但没有学到真正通用的规律。
良好拟合
良好拟合指的是:模型既能捕捉数据中的主要规律,又不会过度记忆训练数据中的噪声。
它的典型表现是:
- 训练误差较低
- 测试误差也较低
- 训练误差和测试误差差距不大
偏差与方差
偏差
偏差来自模型本身的错误假设。
如果真实关系很复杂,但模型太简单,就会产生高偏差。
例如,真实关系是非线性的,但我们只使用线性模型:
$$ \hat{y} = wx + b $$
这时模型表达能力不足,很容易欠拟合。
高偏差通常对应欠拟合。
方差
方差表示模型对训练数据变化的敏感程度。
如果模型太复杂,它可能会对训练集中的细小波动非常敏感。换一批训练数据,模型学到的规则就会发生很大变化。
高方差通常对应过拟合。
可以简单总结如下:
| 模型复杂度 | 偏差 | 方差 | 结果 |
|---|---|---|---|
| 太低 | 高 | 低 | 欠拟合 |
| 合适 | 中 | 中 | 泛化较好 |
| 太高 | 低 | 高 | 过拟合 |
总误差可以粗略理解为:
$$ 总误差 = 偏差^2 + 方差 + 不可消除的噪声 $$
其中,不可消除的噪声来自数据本身。例如测量误差、随机因素、遗漏变量等。
我们无法完全消除这部分噪声,因此模型训练的目标之一,就是在偏差和方差之间找到一个合适的平衡点。
关键术语
| 术语 | 常见说法 | 实际含义 |
|---|---|---|
| 模型(Model) | “那个 AI” | 一个带有可学习参数的数学函数,用来把输入映射为输出 |
| 参数(Parameter) | “模型自己学的东西” | 训练过程中被算法自动调整的变量,例如权重和偏置 |
| 权重(Weight) | “每个输入的重要程度” | 控制某个输入特征对输出影响大小的参数 |
| 偏置(Bias) | “额外的偏移量” | 让模型在没有输入或输入为 0 时也能产生非零输出 |
| 训练(Training) | “教 AI” | 通过优化算法调整模型参数,使预测更接近真实答案 |
| 特征(Feature) | “输入列” | 数据中可用于预测的属性 |
| 标签(Label) | “答案” | 训练样本中已知的真实输出 |
| 超参数(Hyperparameter) | “人手动调的设置” | 训练前指定的设置,例如学习率、层数、批大小 |
| 损失函数(Loss Function) | “模型有多错” | 衡量预测值和真实值差距的函数 |
| 优化器(Optimizer) | “怎么改参数” | 根据损失调整模型参数的方法,例如梯度下降 |
| 泛化(Generalization) | “新数据上也能用” | 模型对训练时没见过的数据做出合理预测的能力 |
| 过拟合(Overfitting) | “背下了训练集” | 模型记住了训练数据中的噪声,导致新数据上表现变差 |
| 欠拟合(Underfitting) | “没学明白” | 模型太简单,无法捕捉数据中的真实规律 |
| 正则化(Regularization) | “限制模型太复杂” | 在训练中加入约束,减少过拟合 |
| 交叉验证(Cross-Validation) | “换不同数据块验证” | 多次划分训练集和验证集,得到更稳定的评估结果 |
| 数据漂移(Data Drift) | “世界变了” | 真实输入数据的分布随时间变化,导致模型性能下降 |