概述
这一讲讨论的是 机器学习(Machine Learning)。它回答的核心问题是:
当我们很难把规则一条条写给机器时,能否让机器直接从数据中学出规律?
这一讲的逻辑主线:
- 先对比 基于知识的人工智能 与 基于学习的人工智能,说明为什么机器学习会成为主流;
- 再给出机器学习的基本定义:它本质上是 从数据到模型、从样本到规律 的过程;
- 然后进入机器学习前非常关键、但在很多课程里容易被忽略的一环:特征工程(feature engineering);
- 接着分别讲三大类方法:
- 监督学习(supervised learning)
- 无监督学习(unsupervised learning)
- 强化学习(reinforcement learning)
- 最后把它们放回实际应用里去理解:推荐系统、分类、聚类、博弈、机器人控制、自动驾驶等。
机器学习 = 用数据构造特征,用特征训练模型,用模型完成预测、分类、聚类或决策。
目录
为什么需要机器学习
基于知识的人工智能
早期人工智能的一个重要思路是:
- 先由人类专家总结知识;
- 再把这些知识写成规则;
- 最后让机器按照规则进行推理。
最典型的规则形式就是:
- 如果……那么……(if…then…)
例如:
- 如果天气阴且湿度大,那么会下雨;
- 如果下雨,那么河水可能暴涨;
- 如果河水暴涨,那么房屋可能被淹。
把这些规则串起来,机器就能形成一条推理链。
这类方法在一些任务上非常有效,例如:
- 定理证明;
- 专家系统;
- 某些规则清晰、领域封闭的问题。
基于知识方法的局限
它的问题也很明显:
-
知识难以穷尽
- 现实世界的规则太多,人很难全部手工写出来。
-
知识获取成本高
- 需要专家长期整理、编码、维护。
-
泛化能力有限
- 一旦遇到规则库之外的新情况,系统就容易失效。
-
面对不确定性不够灵活
- 现实世界里很多问题并没有那么“干净”的逻辑条件。
所以,人工智能逐渐从“把规则灌给机器”转向“让机器自己从数据里学规律”。
基于学习的人工智能
机器学习的代表性起点通常追溯到 Arthur Samuel 在 1959 年提出的定义:
让机器具有一种不需要明确编程也能学习的能力。
直观理解就是:
- 不是人把所有规则都提前写好;
- 而是给机器数据、反馈和目标;
- 机器自己去调整内部参数,逐渐学会任务。
Samuel 在跳棋程序中的实验很经典:
- 只告诉机器游戏规则、一些大致思路和参数;
- 然后让机器不断调整;
- 最终机器的棋力甚至超过程序设计者。
这说明:
学习能力本身,可以替代大量手工规则设计。
机器学习的基本概念
什么是机器学习
机器学习可以概括为:
- 从数据中提取特征;
- 学习一个映射函数(mapping function);
- 使原始数据被映射到某个任务空间;
- 从而完成分类、回归、聚类或决策。
例如:
- 输入图像,输出“人 / 狗 / 车”等类别;
- 输入文本,输出“喜悦 / 愤怒”等情感标签;
- 输入用户行为数据,输出推荐结果;
- 输入环境状态,输出行动策略。
所以它的本质不是“记住样本”,而是:
从样本中抽象出可迁移的模式。
机器学习的三大类
从数据利用方式看,机器学习通常分为三类:
1. 监督学习
- 数据 有标签;
- 目标是学习输入到输出的映射;
- 常见任务:
- 分类(classification)
- 回归(regression)
2. 无监督学习
- 数据 无标签;
- 目标是发现数据内部的结构、模式或分布;
- 常见任务:
- 聚类(clustering)
- 降维(dimensionality reduction)
3. 强化学习
- 数据不是静态样本,而是交互过程;
- 学习主体通过与环境互动来学习;
- 核心信号不是标签,而是 奖励(reward);
- 典型任务:
- 游戏博弈
- 机器人控制
- 自动驾驶决策
机器学习的初心是“化繁为简,大道至简”。
现实中的数据往往:
- 维度高;
- 噪声多;
- 结构复杂;
- 直接观察难以发现规律。
机器学习做的事,就是:
- 用模型把复杂数据压缩成更简单的表示;
- 把杂乱无章的样本整理成可解释、可预测、可决策的结构。
从这个角度说,机器学习就是一种 数据抽象技术。
机器学习中的特征工程
什么是特征
特征(feature) 是用于描述数据的属性或维度。
例如,要预测一个人的收入,可以使用:
- 年龄;
- 受教育程度;
- 工作经验;
- 地理位置。
这些就是特征。
特征可以分为:
- 数值型特征:年龄、收入、温度、长度;
- 类别型特征:性别、城市、学历、职业类别。
特征是模型看世界的方式。
模型性能好不好,很多时候不只取决于算法本身,更取决于你给它看的“世界表示”是否合理。
什么是特征工程
特征工程(feature engineering) 是对原始数据进行处理、转换和优化的过程,使其更适合机器学习模型学习。
它的核心是:
把原始数据变成模型更容易利用的信息。
特征工程的目标
1. 提高数据可用性
通过处理:
- 缺失值;
- 重复数据;
- 异常值;
- 格式不一致;
让数据更干净、更规范。
2. 增强模型预测能力
通过构造更有意义的特征,让模型更容易发现潜在模式。
3. 简化模型训练
通过筛选有效特征、降低维度,减少无关信息干扰,提高训练效率。
特征工程的一般步骤
1. 数据清洗
原始数据常见问题:
- 缺失值;
- 异常值;
- 重复样本;
- 录入错误。
常见处理方法:
- 用均值 / 中位数 / 众数填补缺失值;
- 删除严重缺失的样本;
- 用统计方法检测异常值;
- 对异常值进行修正、截断或删除。
2. 特征选择
不是所有特征都有用。
有些特征:
- 与目标几乎无关;
- 冗余严重;
- 甚至会误导模型。
所以要从大量候选特征中挑出最有信息量的一部分。
常见思路:
- 过滤法(filter):先用统计关系筛选,例如相关系数;
- 包裹 / 递归思想:反复训练模型,看哪些特征带来更好结果。
3. 特征转换
把原始特征变成模型更容易处理的形式。
常见方法:
归一化(normalization)
把特征缩放到某个固定区间,常见是 。
用途:
- 避免不同量纲差异过大;
- 加快训练过程;
- 防止某些大数值特征“压制”其他特征。
标准化(standardization)
把特征变成:
- 均值为 0;
- 方差为 1。
它特别常见于:
- 线性模型;
- 支持向量机;
- 基于距离的算法。
4. 特征构造
由已有特征生成新的特征。
例如:
- 从日期中提取星期、月份、季节;
- 把收入和年龄组合成“收入/年龄比”;
- 把连续年龄分箱成“青年、中年、老年”。
很多时候,模型不是不会学,而是你根本没把有用信息显式提供给它。
5. 类别特征编码
很多模型不能直接处理字符串类别,因此要转成数字。
常见方法:
标签编码(label encoding)
- 给每个类别一个整数编号;
- 例如:男 = 0,女 = 1。
独热编码(one-hot encoding)
- 把类别变成二进制向量;
- 例如:
- 男 = [1, 0]
- 女 = [0, 1]
独热编码通常更安全,因为它不会人为引入类别之间的大小顺序。
特征工程为什么重要
在机器学习中,数据质量往往比模型选择更重要。
原因很直接:
- 再先进的模型,如果输入特征没有信息量,也学不出东西;
- 相反,特征设计得好,哪怕模型不复杂,也可能效果很好。
在很多实际问题里,真正困难的不是“选哪个模型”,而是:
- 该把什么当作输入特征;
- 如何让这些特征真正反映任务结构。
这点在人文社科、推荐系统、经济预测、用户分析等任务里尤其明显。
监督学习
监督学习的定义
监督学习使用的是 带标签数据。
训练集通常记为:
其中:
- 表示输入样本;
- 表示对应标签;
- 表示样本数量。
监督学习的目标是学习一个映射函数:
也就是:
- 输入一个样本;
- 输出尽量接近真实标签的预测结果。
监督学习的三个核心元素
1. 标注数据:学什么
模型需要知道“什么是正确答案”。
2. 学习模型:如何学
也就是用什么模型来表达输入与输出的关系。
3. 损失函数:学到否
损失函数用来衡量:
- 模型预测得对不对;
- 错了多少;
- 参数该往哪个方向调整。
损失函数
损失函数(loss function)衡量预测值与真实值之间的差距。
若把模型记作 ,则监督学习训练的目标通常写成:
也就是:
找到一组参数,使训练集上的总损失尽可能小。
常见损失函数
1. 0-1 损失
适合表达分类对错,但优化时往往不方便。
2. 平方损失
回归任务非常常见。
3. 绝对损失
对异常值的敏感度通常小于平方损失。
训练集、验证集、测试集
这是监督学习最基本的实验设置。
1. 训练集(training set)
- 用来训练模型参数;
- 相当于学生平时做练习。
2. 验证集(validation set)
- 用来调参、选模型;
- 相当于模拟考。
3. 测试集(test set)
- 用来评估最终性能;
- 相当于正式考试。
最重要的要求:
三者之间不能有重叠。
否则测试结果就不可信。
经验风险与期望风险
经验风险(empirical risk)
模型在训练集上的平均损失。
直观理解:
- 你在已见过的数据上表现怎样。
期望风险(expected risk)
模型在真实数据分布上的平均损失。
直观理解:
- 你在未来、未见过的数据上表现怎样。
两者关系:
- 样本足够多时,经验风险会逼近期望风险;
- 但现实中样本有限,所以两者往往不一样。
这正是泛化问题的根源。
过拟合与欠拟合
欠拟合(underfitting)
模型太简单:
- 连训练集都学不好;
- 训练误差大;
- 测试误差通常也大。
过拟合(overfitting)
模型太复杂:
- 把训练集甚至噪声都“记住”了;
- 训练误差很小;
- 测试误差却变大。
结构风险最小化
经验风险最小化只关心:
- “在训练集上误差小不小”。
但这不够,因为模型可能过拟合。
所以要加上对模型复杂度的约束:
其中:
- 第一项:经验风险;
- 第二项:模型复杂度惩罚(正则项);
- :平衡二者的强度。
这就是 结构风险最小化(structural risk minimization) 的思想。
不要只追求把训练集拟合得特别好,还要控制模型别太复杂。
回归任务与分类任务
监督学习常见任务分两大类。
1. 回归(regression)
预测的是 连续数值。
例如:
- 房价预测;
- 气温预测;
- 销量预测;
- 二氧化碳浓度预测。
2. 分类(classification)
预测的是 离散类别。
例如:
- 苹果 / 桔子;
- 猫 / 狗;
- 垃圾邮件 / 正常邮件;
- 良性 / 恶性。
线性回归
最简单的回归模型就是一元线性回归:
其中:
- 是输入;
- 是输出;
- 是待学习参数。
它的思想很朴素:
- 假设输入和输出之间大体满足线性关系;
- 再从数据中估计最合适的 。
参数怎么求
对每个样本点 ,模型预测值记为:
误差常用平方形式表示:
总目标就是最小化均方误差:
这就是最小二乘法(ordinary least squares, OLS)的核心思想。
多元线性回归
如果输入不止一个特征,就得到:
也可写成更紧凑的形式:
含义很简单:
- 每个特征都有一个权重;
- 最后加权求和得到预测值。
Logistic Regression
线性回归有个典型问题:
- 输出范围是 ;
- 对离群点比较敏感;
- 不适合直接处理二分类概率输出。
于是引入 sigmoid 函数:
再令:
就得到逻辑斯蒂回归:
它的好处是:
- 输出范围在 ;
- 可以解释为概率;
- 特别适合二分类问题。
sigmoid 的直观理解
- 当 很大时,输出接近 1;
- 当 很小时,输出接近 0;
- 当 时,输出是 0.5。
所以它天然适合作为“属于正类的概率”。
分类任务的一个直观例子
假设模型写成:
其中:
- 颜色和大小是输入特征;
- 是模型参数。
给定训练样本:
- 苹果记为 1;
- 桔子记为 0;
就希望模型输出 尽量接近真实标签 。
于是可以设计损失函数,例如:
然后不断调整参数,让损失越来越小。
这其实已经把监督学习的核心过程讲完了:
- 先定义模型;
- 再定义损失;
- 然后不断调参数最小化损失。
模型评估:分类指标
- TP:真正例
- FP:假正例
- TN:真反例
- FN:假反例
1. 准确率(Accuracy)
表示总体预测正确的比例。
问题:
- 当类别极不平衡时,准确率可能具有误导性。
2. 错误率(Error Rate)
3. 精确率(Precision)
表示:
- 被模型预测为正例的样本中,真正为正例的比例。
4. 召回率(Recall)
表示:
- 所有真正正例中,被找回来的比例。
5. F1-score
它是 precision 和 recall 的调和平均。
适用场景:
- 当你既关心查准率,也关心查全率时。
监督学习的优势与局限
优势
-
目标明确
- 有输入,也有标准答案,训练目标清晰。
-
应用成熟
- 图像分类、语音识别、文本翻译、诊断预测等都很成功。
-
算法丰富
- 从线性模型到深度学习,工具链非常成熟。
-
效果强
- 在大量高质量标注数据支持下,性能常常很高。
局限
-
强依赖标注数据
- 标注成本高,尤其在医学、法律等专业领域。
-
对数据分布敏感
- 训练集和实际场景分布偏差较大时,模型容易失效。
-
泛化能力有限
- 遇到新任务往往要重新标注、重新训练。
-
传统方法较依赖特征工程
- 深度学习缓解了这一点,但并未彻底消除。
-
易出现过拟合
- 尤其在模型复杂、数据不足时。
无监督学习
无监督学习的定义
无监督学习不使用标签。
它面对的是一组没有标准答案的数据:
目标不是预测某个已知输出,而是:
- 发现数据中的内在结构;
- 找出相似样本;
- 揭示潜在模式;
- 做组织、压缩或表示学习。
所以无监督学习特别适合:
- 标签难获得;
- 想先探索数据本身长什么样;
- 不知道应该如何定义答案的场景。
无监督学习的直观例子
假设收集了一堆水果图片,但不知道它们的名字。
这时:
- 不能做监督学习,因为没有“苹果 / 香蕉 / 桃子”的标签;
- 但仍可以让模型根据相似性自动分组。
最终可能形成:
- 苹果一组;
- 香蕉一组;
- 桃子一组。
这就是 聚类(clustering)。
聚类的核心思想
聚类就是:
把相似的样本放在一起,把不相似的样本分开。
应用很广:
- 商品分组;
- 用户分群;
- 论文主题归类;
- 图像分割;
- 异常检测前处理。
K 均值聚类(K-means)
这是最经典的无监督学习算法之一。
它的目标是:
- 给定 个无标签数据点;
- 把它们划分到 个簇(cluster)中;
- 使同一簇内更相似,不同簇间更不同。
输入与输出
- 输入: 个样本,无标签;
- 输出: 个聚类结果。
相似度度量
K 均值常用 欧氏距离(Euclidean distance):
距离越小,说明样本越相似。
算法步骤
第一步:确定簇数
这是用户事先指定的。
第二步:初始化质心
随机选取 个点作为初始簇中心(centroid)。
第三步:分配样本
对每个数据点,计算它到每个质心的距离,并把它分配给最近的那个质心对应的簇。
第四步:更新质心
对每个簇,计算簇内样本均值,把这个均值作为新的质心。
若第 个簇记为 ,则其质心可写成:
第五步:重复迭代
不断重复“分配样本”和“更新质心”两个步骤,直到:
- 达到最大迭代次数;
- 或前后两次质心几乎不再变化。
K 均值的直观理解
- 先随便放几个“代表点”;
- 再让每个样本找到离自己最近的代表点;
- 然后让代表点移动到各自成员的中心位置;
- 反复几轮以后,分组就稳定了。
K 均值的应用
- 图像分割;
- 文档聚类;
- 商品推荐;
- 大规模论文自动归类。
无监督学习的优势与局限
优势
-
不需要标签
- 节省大量人工标注成本。
-
擅长探索数据结构
- 能发现事先未知的模式和群体。
-
适合海量原始数据
- 特别适用于行为分析、文本分析、基因数据等。
-
能作为其他任务前处理
- 例如可视化、降维、推荐、异常检测。
局限
-
结果难评估
- 因为没有标准答案,常需要结合领域知识解释。
-
对算法和参数敏感
- 例如 K 值选错,聚类结果可能完全不同。
-
对噪声和异常值敏感
- 少量脏数据就可能影响整体分组。
-
计算成本可能较高
- 特别在大规模高维数据上。
-
结果可能过度简化
- 某些方法会忽略复杂的非线性结构。
强化学习
强化学习的基本思想
强化学习不是“看题做题”,而是“边试边学”。
它主要解决的是:
在一个不断变化的环境里,应该怎么行动,才能长期收益最大?
与监督学习相比:
- 监督学习:直接给标准答案;
- 强化学习:不给标准答案,只给奖励或惩罚。
强化学习的核心:
用奖励信号代替直接监督,让智能体通过试错逐步学会策略。
强化学习的六个核心概念
1. 智能体(agent)
执行动作、做决策的主体。
例如:
- 游戏角色;
- 机器人;
- 自动驾驶系统;
- 棋类 AI。
2. 环境(environment)
智能体之外的一切。
环境会:
- 接收动作;
- 改变状态;
- 返回奖励。
3. 状态(state)
智能体对当前环境的描述或编码。
它回答的是:
- “我现在处在什么情况?”
4. 动作(action)
智能体在当前状态下采取的行为。
5. 奖励(reward)
环境对动作结果给出的反馈。
- 正奖励:鼓励;
- 负奖励:惩罚。
6. 策略(policy)
策略是“在什么状态下做什么动作”的规则。
强化学习最终学到的,通常就是一个好的策略。
经过反复试错,策略逐渐优化。
强化学习的特点
1. 没有显式标签
它不会告诉你“这一步的标准答案是什么”。
2. 通过互动学习
必须和环境不断交互。
3. 重视长期收益
有时一个动作眼前没收益,但能为后续带来更大奖励。
4. 适合序列决策问题
因为动作会影响下一时刻状态。
强化学习的应用
- AlphaGo:围棋;
- AlphaStar:星际争霸;
- 机器人动作控制;
- 自动驾驶决策;
- 复杂资源调度与路径规划。
强化学习的难点
-
探索 vs 利用
- 已知有效的动作要不要继续用?
- 还是去尝试新动作?
-
奖励延迟
- 有些动作的好坏,要很久以后才知道。
-
状态空间可能很大
- 现实任务通常远比小迷宫复杂。
-
训练成本高
- 往往需要大量试错。
所以强化学习很强,但也往往最难训练、最依赖设计。
三类学习方法对比
1. 监督学习
- 有没有标签:有
- 学什么:输入到输出的映射
- 典型任务:分类、回归
- 代表关键词:损失函数、训练集、泛化、过拟合
2. 无监督学习
- 有没有标签:没有
- 学什么:数据内部结构
- 典型任务:聚类、降维
- 代表关键词:相似性、簇、模式发现
3. 强化学习
- 有没有标签:没有直接标签,但有奖励
- 学什么:状态到动作的策略
- 典型任务:博弈、控制、序列决策
- 代表关键词:智能体、环境、奖励、策略