配音

第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 算法步骤

  1. 随机打乱整个训练集
  2. 对于每个样本 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. 对每个模块重复上述过程
  4. 准确率提升最大的模块就是最值得优先投入的

六、课程全回顾

周次 核心主题 关键算法与概念
第1周 监督学习入门 线性回归、代价函数、梯度下降
第2周 多变量回归 特征缩放、学习率选择、正规方程
第3周 分类与正则化 逻辑回归、Sigmoid、过拟合与正则化
第4周 神经网络基础 前向传播、激活函数、非线性假设
第5周 神经网络学习 反向传播、梯度检验、随机初始化
第6周 ML 实践建议 偏差/方差诊断、学习曲线、误差分析
第7周 支持向量机 大间隔分类器、核函数、SMO
第8周 无监督学习 K-Means 聚类、PCA 降维
第9周 异常检测与推荐 高斯分布异常检测、协同过滤
第10周 大规模 ML SGD、在线学习、Map-Reduce、照片 OCR

Andrew Ng 的最终建议

  1. 实践出真知:编程练习比听课更重要
  2. 诊断先于尝试:先用偏差/方差诊断找到问题类型
  3. 误差分析驱动改进:用数据指导改进方向
  4. 从简单开始:先搭简单的端到端系统,再逐步改进
  5. 重视数据:数据质量比算法选择更重要

第 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. 固定学习率:最简单的策略,但收敛精度有限
  2. 步长衰减:α = α₀ / (1 + k·t),其中 t 是迭代次数
  3. 指数衰减:α = α₀ · γᵗ,其中 γ < 1
  4. 自适应学习率:Adam、RMSProp 等优化器自动调整学习率

自适应学习率方法在实践中非常有效——它们为每个参数维护独立的学习率,根据该参数的历史梯度动态调整。

在线学习的实际应用

在线学习在互联网公司的推荐系统和广告系统中应用广泛。一个典型的 DSP(需求方平台)广告系统每天处理数十亿次广告请求——每次请求都产生一个训练样本。如果将这些数据全部存储再训练,不仅存储成本极高,而且模型更新周期太长。

使用在线学习,模型可以实时地根据用户反馈更新——用户点击了广告(正反馈)或忽略了广告(负反馈)——每次反馈都是一次 SGD 更新。这使得模型能够快速适应热点事件的冲击和用户兴趣的变化。

在线学习的一个变体是Bandit 算法——它在"利用已知最优策略"和"探索未知策略"之间做权衡。这在个性化推荐和广告投放中尤为重要。

课程知识体系的总结

Andrew Ng 的 2014 年机器学习课程虽然已经过去了十多年,但其核心内容仍然是 ML 工程师的必修课。课程的知识体系可以分为四个层次:

第一层:基础模型——线性回归、逻辑回归、正则化——这些是 ML 的基础构建块
第二层:高级模型——神经网络、SVM——代表了更强大的非线性学习能力
第三层:实践方法论——偏差/方差诊断、学习曲线、误差分析——是 ML 项目的工程基石
第四层:高级主题——无监督学习、降维、异常检测、推荐系统——扩展了 ML 的应用范围

继续学习的建议

完成本课程后,Andrew Ng 建议的学习路径:

  1. 深入学习:斯坦福 CS229(机器学习理论)、CS231n(计算机视觉)、CS224n(自然语言处理)
  2. 实践项目:在 Kaggle 上参与竞赛,或者在实际工作中应用 ML
  3. 关注前沿:阅读顶级会议论文(NeurIPS、ICML、ICLR)
  4. 深度学习专项:继续 Andrew Ng 的深度学习专项课程(Deep Learning Specialization)

最重要的建议是:多动手实践。学习 ML 最有效的方式是在真实数据上运行算法、观察结果、调试改进。

大规模机器学习的内存管理

处理大规模数据时,内存管理成为一个关键问题。数据可能无法全部载入内存——需要采用流式处理策略:

  1. 内存映射文件(Memory-Mapped Files):将磁盘上的大文件映射到虚拟内存空间,按需加载
  2. 生成器(Generators):用 Python 生成器逐批次读取数据,避免一次加载所有数据
  3. HDF5 格式:专为大规模科学计算设计的文件格式,支持分块读取和压缩
  4. 分布式存储:使用 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 工程师,你需要时刻记住技术的力量和相应的责任感。

延伸阅读