第10周:大规模机器学习与总结
课程简介
随机梯度下降、Map-Reduce 数据并行、在线学习、课程全回顾。
🎬 本课程视频:吴恩达机器学习 (2014) — 交互式学习笔记
一、大规模机器学习面临的挑战
1.1 大数据时代的到来
在 2014 年 Andrew Ng 录制这门课程时,大数据已经成为一个显著趋势。他提出了一个重要观点:在机器学习中,不是谁有最好的算法获胜,而是谁有最多的数据获胜。
但随着数据量的增长——从万级样本到百万级甚至十亿级——传统的批量梯度下降面临严峻挑战:每轮迭代都需要扫描全部样本,当样本数量很大时,一轮迭代就要花费极长的时间。
1.2 先确认是否需要大规模
在投入大规模机器学习之前,Andrew 建议先画一个学习曲线。如果模型处于高方差状态(训练误差低但仍低于验证误差),增加数据才有帮助。如果模型处于高偏差状态(训练误差和验证误差汇合),增加数据不会有什么效果。
简而言之:先用小规模数据验证模型的有效性,确认模型能从更多数据中获益之后,再投入资源进行大规模训练。
二、随机梯度下降
2.1 从批量到随机
批量梯度下降(BGD):每轮迭代使用全部 m 个样本计算梯度。当 m 很大时,一轮迭代就很慢。
随机梯度下降(SGD):每次迭代只使用一个随机选择的样本来计算梯度和更新参数。
| 特性 | 批量梯度下降 | 随机梯度下降 |
|---|---|---|
| 每次迭代使用的样本数 | 全部 m 个 | 1 个 |
| 每轮迭代计算量 | O(m) | O(1) |
| 收敛路径 | 平滑、稳定 | 曲折、随机振荡 |
2.2 SGD 算法步骤
- 随机打乱整个训练集
- 对于每个样本 i = 1 到 m:
$$\theta := \theta - \alpha \cdot (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)}$$
注意:这里每看到一个样本就立即更新参数——不需要等到看完所有样本。
SGD 的关键特点:
- 外层循环通常只需 1-10 次遍历整个数据集
- 收敛路径有随机振荡
- 最终参数会在最优值附近随机漫步
2.3 SGD 的学习率
SGD 的核心超参数是学习率 α。与 BGD 不同,SGD 通常使用随时间衰减的学习率:
$$\alpha = \frac{\text{常数 1}}{\text{迭代次数} + \text{常数 2}}$$
学习率衰减的原因:SGD 在最优值附近振荡,减小的学习率可以让振荡幅度越来越小。
如何检查 SGD 的收敛?
- 计算每 N 个样本后的平均代价(如每 1000 个样本)
- 绘制平均代价随迭代次数的曲线
- 如果曲线振荡剧烈:增大 N
- 如果曲线下降太慢:增大学习率
def stochastic_gradient_descent(X, y, theta, alpha, num_epochs=5):
m = len(y)
for epoch in range(num_epochs):
indices = np.random.permutation(m)
X_shuffled = X[indices]
y_shuffled = y[indices]
for i in range(m):
prediction = X_shuffled[i].dot(theta)
error = prediction - y_shuffled[i]
gradient = error * X_shuffled[i]
theta = theta - alpha * gradient
return theta
2.4 小批量梯度下降
小批量梯度下降(Mini-Batch Gradient Descent)是 BGD 和 SGD 之间的折中方案——每次使用 b 个样本(通常 b=10 到 100)计算梯度。
优点:
- 比 SGD 更稳定(梯度方差更小)
- 比 BGD 更快(每批只需要计算 b 个样本)
- 可以利用矩阵运算的向量化加速
三、在线学习
在线学习(Online Learning)是 SGD 的一种变体——用于处理持续产生的数据流。与批量/小批量学习使用固定训练集不同,在线学习中数据以流的形式持续到达,模型边接收数据边学习。
典型应用:
1. 物流路由:从用户点击行为中学习
2. 商品推荐:从购买反馈中学习
3. 新闻推送:实时调整推荐
在线学习的一个关键特性:不需要一次性存储全部训练数据——每个样本用完即弃。
四、Map-Reduce 与数据并行
当数据量极大无法在单机上处理时,可以使用 Map-Reduce 框架将计算分布到多台机器上。
Map(映射)步骤:将训练数据分割成多个子集,分别发送到不同的机器。每个机器计算本地子集上的梯度。
Reduce(归约)步骤:协调机器将各机器的梯度求和,然后更新参数。
这个框架可以扩展到几乎任何需要求和计算的机器学习算法。
五、机器学习流水线
5.1 应用范例:照片 OCR
Andrew Ng 用一个完整的照片 OCR 系统展示了机器学习流水线的概念:
步骤 1:文本检测——从图像中找出包含文字的区域
步骤 2:字符分割——将文字区域的字符逐个切分
步骤 3:字符识别——识别每个分割出的字符是什么
5.2 天花板分析
天花板分析(Ceiling Analysis)用于确定流水线中哪个环节还有多大的改进空间。
- 计算当前系统的整体准确率
- 人为地将某个模块替换为完美版本,观察整体准确率的提升
- 对每个模块重复上述过程
- 准确率提升最大的模块就是最值得优先投入的
六、课程全回顾
| 周次 | 核心主题 | 关键算法与概念 |
|---|---|---|
| 第1周 | 监督学习入门 | 线性回归、代价函数、梯度下降 |
| 第2周 | 多变量回归 | 特征缩放、学习率选择、正规方程 |
| 第3周 | 分类与正则化 | 逻辑回归、Sigmoid、过拟合与正则化 |
| 第4周 | 神经网络基础 | 前向传播、激活函数、非线性假设 |
| 第5周 | 神经网络学习 | 反向传播、梯度检验、随机初始化 |
| 第6周 | ML 实践建议 | 偏差/方差诊断、学习曲线、误差分析 |
| 第7周 | 支持向量机 | 大间隔分类器、核函数、SMO |
| 第8周 | 无监督学习 | K-Means 聚类、PCA 降维 |
| 第9周 | 异常检测与推荐 | 高斯分布异常检测、协同过滤 |
| 第10周 | 大规模 ML | SGD、在线学习、Map-Reduce、照片 OCR |
Andrew Ng 的最终建议
- 实践出真知:编程练习比听课更重要
- 诊断先于尝试:先用偏差/方差诊断找到问题类型
- 误差分析驱动改进:用数据指导改进方向
- 从简单开始:先搭简单的端到端系统,再逐步改进
- 重视数据:数据质量比算法选择更重要
第 10 周结束了整个课程。我们学习了大规模机器学习的技术——SGD、在线学习、Map-Reduce 并行——以及如何构建和调试复杂的 ML 流水线系统。更重要的是,我们回顾了整个课程的旅程——从线性回归开始,经过逻辑回归、神经网络、SVM,再到无监督学习和大规模技术。恭喜你完成了这个课程!
SGD 收敛性分析
SGD 的收敛性质与全量梯度下降有本质区别。SGD 的梯度是真实梯度的无偏估计——单个样本的梯度期望等于全量梯度:
$$E[\nabla J_i(\theta)] = \nabla J(\theta)$$
这意味着平均而言 SGD 的方向是正确的,但每一步的具体方向有噪声。这种噪声实际上是 SGD 的一个优点——它可以帮助模型逃离局部最优点(在非凸问题中)。
SGD 的收敛率:在凸函数上,SGD 以 O(1/√T) 的速率收敛(T 是迭代次数),而全量梯度下降以 O(1/T) 收敛。但在大数据场景下,SGD 的每次迭代计算量远小于全量梯度下降,所以总体效率更高。
学习率调度策略
SGD 的学习率调度有多种策略:
- 固定学习率:最简单的策略,但收敛精度有限
- 步长衰减:α = α₀ / (1 + k·t),其中 t 是迭代次数
- 指数衰减:α = α₀ · γᵗ,其中 γ < 1
- 自适应学习率:Adam、RMSProp 等优化器自动调整学习率
自适应学习率方法在实践中非常有效——它们为每个参数维护独立的学习率,根据该参数的历史梯度动态调整。
在线学习的实际应用
在线学习在互联网公司的推荐系统和广告系统中应用广泛。一个典型的 DSP(需求方平台)广告系统每天处理数十亿次广告请求——每次请求都产生一个训练样本。如果将这些数据全部存储再训练,不仅存储成本极高,而且模型更新周期太长。
使用在线学习,模型可以实时地根据用户反馈更新——用户点击了广告(正反馈)或忽略了广告(负反馈)——每次反馈都是一次 SGD 更新。这使得模型能够快速适应热点事件的冲击和用户兴趣的变化。
在线学习的一个变体是Bandit 算法——它在"利用已知最优策略"和"探索未知策略"之间做权衡。这在个性化推荐和广告投放中尤为重要。
课程知识体系的总结
Andrew Ng 的 2014 年机器学习课程虽然已经过去了十多年,但其核心内容仍然是 ML 工程师的必修课。课程的知识体系可以分为四个层次:
第一层:基础模型——线性回归、逻辑回归、正则化——这些是 ML 的基础构建块
第二层:高级模型——神经网络、SVM——代表了更强大的非线性学习能力
第三层:实践方法论——偏差/方差诊断、学习曲线、误差分析——是 ML 项目的工程基石
第四层:高级主题——无监督学习、降维、异常检测、推荐系统——扩展了 ML 的应用范围
继续学习的建议
完成本课程后,Andrew Ng 建议的学习路径:
- 深入学习:斯坦福 CS229(机器学习理论)、CS231n(计算机视觉)、CS224n(自然语言处理)
- 实践项目:在 Kaggle 上参与竞赛,或者在实际工作中应用 ML
- 关注前沿:阅读顶级会议论文(NeurIPS、ICML、ICLR)
- 深度学习专项:继续 Andrew Ng 的深度学习专项课程(Deep Learning Specialization)
最重要的建议是:多动手实践。学习 ML 最有效的方式是在真实数据上运行算法、观察结果、调试改进。
大规模机器学习的内存管理
处理大规模数据时,内存管理成为一个关键问题。数据可能无法全部载入内存——需要采用流式处理策略:
- 内存映射文件(Memory-Mapped Files):将磁盘上的大文件映射到虚拟内存空间,按需加载
- 生成器(Generators):用 Python 生成器逐批次读取数据,避免一次加载所有数据
- HDF5 格式:专为大规模科学计算设计的文件格式,支持分块读取和压缩
- 分布式存储:使用 HDFS、S3 等分布式存储系统,配合 Spark 等计算框架
异步梯度更新
在分布式训练中,参数更新有两种主要方式:
- 同步更新(Sync SGD):所有 worker 计算完梯度后才统一更新——效率受限于最慢的 worker
- 异步更新(Async SGD):每个 worker 独立计算梯度并更新全局参数——效率更高但可能存在参数不一致问题
异步 SGD 的问题是梯度陈旧性:一个 worker 计算的梯度基于旧版本的参数,当它更新时参数可能已被其他 worker 更新了多次。在实践中,可以通过限制陈旧度或使用梯度压缩来缓解这个问题。
在线学习的实际应用案例
在线广告的点击率(CTR)预测是在线学习最成功的应用之一。广告系统需要处理:
- 数亿级别的特征(用户 ID、广告 ID、上下文特征)
- 每天的日志量在 TB 级别
- 用户兴趣和行为模式持续变化
使用 FTRL(Follow The Regularized Leader)算法可以在线学习稀疏模型,产生大量零权重——从而压缩模型存储空间。这是 Google 在广告系统中使用的主要方法。
课程核心知识图谱
为了帮助你记忆整个课程的脉络,我将 10 周的內容组织成一个知识依赖图:
第 1 周(基础)→ 第 2 周(多变量)→ 第 3 周(分类+正则化)
↓
第 4 周(神经网络结构)→ 第 5 周(神经网络学习)
↓
第 6 周(诊断方法) ← 这个方法论适用于所有模型
↓
第 7 周(SVM)→ 第 8 周(无监督)→ 第 9 周(异常检测+推荐)
↓
第 10 周(大规模+总结)
这个依赖图揭示了课程设计的逻辑:前 5 周是基础和核心模型,第 6 周是方法论(独立于具体模型),第 7-9 周是高级模型和扩展应用,第 10 周是大规模处理和全课程总结。
机器学习的职业道德
在课程的最后,Andrew Ng 也提到了机器学习实践者需要关注的道德问题:
1. 公平性:模型是否存在对某些群体的歧视(如招聘算法中的性别偏见)
2. 隐私保护:训练数据中的个人隐私信息如何保护
3. 透明性:模型的决策过程是否可解释
4. 责任归属:模型做出的错误决策(如自动驾驶中的事故)由谁负责
这些道德问题在今天变得更加重要。作为 ML 工程师,你需要时刻记住技术的力量和相应的责任感。
延伸阅读
- 📺 B 站播放列表:吴恩达机器学习 (2014) — 交互式学习笔记
- 📚 更多学习资源,请访问 deeplearning.ai 官网