从课程地图进入优化问题
为什么合在一起讲: 封面给出课程、章节与时间,章节地图随即指出本讲将按“小数据 → 大数据 → 应用”推进;两页共同建立阅读坐标。
Methods and tools for big data · Summer 2026
源文件: c5.pdf
从回归残差与梯度下降出发,经由 PRAM 的 work-depth、batch/SGD/Hogwild!,落到 Spark 实现、PCA 降维与线性规划。
OVERVIEW 01
如何把平方损失优化从单机梯度下降扩展到并行处理器和 Spark,同时知道 batch、SGD 与 Hogwild! 在什么条件下合适。
回归与最小二乘、凸性和步长、PRAM/DAG/work-depth、Brent 定理、batch/SGD 复杂度、竞态与无锁稀疏更新。
共享内存与分布式通信的差异;RDD、map、reduce、cache、broadcast 与 synchronisation barrier 对迭代算法的约束。
能从目标函数推到每轮和总复杂度,读懂关键图与算法,并根据 m、n、ε、稀疏性和通信条件作实现选择。
OVERVIEW 02
残差 → 平方损失 → 梯度更新 → 并行归约 → work/depth → SGD → 竞态/Hogwild! → 分布式通信 → Spark。
P007-P008 在三维凸二次函数上求梯度,从 X0 算到 X1,并给出 X6、固定步长和 Hessian 的代价。
P004 读垂直残差;P011 读依赖 DAG;P029 读 V、M、m 的正交分解,连接 PCA 最大方差与最小残差。
P010 从小数据切到大数据,P024 切到应用;P028 指出共享内存 Hogwild! 不能原样搬到带 barrier 的 Spark。
OVERVIEW 03
| 单元 | 页码 | 类型 | 共同任务 | 补足 / 视觉重点 |
|---|---|---|---|---|
| U01 · 从课程地图进入优化问题 | P001-P002 | 导读 | 建立章节范围和三段路线。 | 源页公式与文字 |
| U02 · 从回归残差到平方损失目标 | P003-P005 | 概念 / 视觉 | 把预测误差明确成平方和目标。 | 上下文补足;视觉重点 |
| U03 · 为什么不存在通吃的优化算法 | P006 | 概念 | 把视野扩到不同搜索结构并建立算法选择原则。 | 源页公式与文字 |
| U04 · 梯度下降、凸性与三维二次算例 | P007-P008 | EXAMPLE | 建立梯度下降机制并完成一个数值算例。 | 上下文补足;源页公式与文字 |
| U05 · Batch 与 stochastic:先看直观差异 | P009 | 对比 | 给出 batch 与 SGD 的直观对照表。 | 源页公式与文字 |
| U06 · DAG、work-depth 与 Brent 定理 | P010-P013 | 模型 | 建立并行算法的 work-depth 计量和有限处理器界。 | 上下文补足;视觉重点 |
| U07 · 平方损失的并行梯度与完整复杂度 | P014-P017 | 推导 / 复杂度 | 把该框架应用到最小二乘的目标、梯度和多轮更新。 | 上下文补足;源页公式与文字 |
| U08 · SGD 的更新、误差阶与总成本 | P018-P019 | 对比 | 用同一套指标量化 SGD 的收益和代价。 | 源页公式与文字 |
| U09 · 从竞态到 Hogwild! 的无锁稀疏更新 | P020-P022 | 算法 | 用稀疏性把竞态从必须锁定的问题改写为可容忍的低概率冲突。 | 上下文补足;源页公式与文字 |
| U10 · 单机并行与分布式通信的选择 | P023 | 综合 | 把算法复杂度转译成单机 GPU 与分布式集群的部署倾向。 | 源页公式与文字 |
| U11 · 从应用地图到 Spark 实现假设 | P024-P025 | 应用导入 | 固定 Spark 场景和 n、m 的内存假设。 | 源页公式与文字 |
| U12 · Spark batch 梯度下降的数据流与瓶颈 | P026-P027 | 算法 | 把 full batch 更新映射为 Spark 的 RDD、map、reduce 和同步迭代。 | 上下文补足;源页公式与文字 |
| U13 · Spark 为何更适合 mini-batch 而非原样 Hogwild! | P028 | 系统权衡 | 解释共享内存 Hogwild! 与 Spark stage/barrier 的不匹配,并给出 mini-batch 折中。 | 上下文补足;源页公式与文字 |
| U14 · PCA:最大化投影等价于最小化残差 | P029 | 应用 / 视觉 | 从数据维数入手,在优化前减少模型与通信规模。 | 上下文补足;视觉重点 |
| U15 · 线性规划与 simplex 的改进方向 | P030 | 应用 | 展示线性约束下通过 pivot 改进目标的另一类优化方法。 | 上下文补足;源页公式与文字 |
| U16 · 用五个问题闭合本讲主线 | P031-P032 | 回顾 | 用源页五问检查从算法、复杂度到系统实现的完整掌握。 | 源页公式与文字 |
OVERVIEW 04
| 公式 / 模型 | 变量与条件 | 用途 | 单元 / 页码 |
|---|---|---|---|
| f(\alpha x+(1-\alpha)y)\leq\alpha f(x)+(1-\alpha)f(y) | \alpha\in[0,1];凸函数 | 保证驻点不落在非全局局部最小 | U04 / P007 |
| X_{k+1}=X_k-\alpha\nabla f(X_k) | X_k 参数;\alpha 步长 | 梯度下降更新 | U04 / P007-P008 |
| T_1/p\leq T_p\leq T_1/p+T_\infty | PRAM;work 与关键路径 | 估计有限 p 处理器时间 | U06 / P012-P013 |
| F(w)=\sum_i\lVert x_i^\top w-y_i\rVert_2^2 | m 样本;n 维模型 | 平方损失与两层并行 | U07 / P014-P017 |
| \nabla F(w)=2\sum_i x_i(x_i^\top w-y_i) | 强凸、可微、L-smooth | batch 完整梯度 | U07 / P017 |
| O(\log(1/\varepsilon)\log mn) | batch;理想并行归约 | 完整 batch depth | U07 / P017-P019 |
| w_{k+1}=w_k-\alpha\nabla F_{s_k}(w_k) | s_k 均匀随机样本 | SGD 单样本更新 | U08 / P018-P019 |
| w^{(k)}\leftarrow w^{(k)}-\alpha[\nabla F_j(w)]^{(k)} | 稀疏非零坐标;无锁 | Hogwild! 坐标更新 | U09 / P022 |
| V^2=M^2+m^2 | 均值中心化;正交投影 | PCA 最大投影与最小残差等价 | U14 / P029 |
从回归残差建立平方损失,理解梯度下降、凸性、步长和 batch/SGD 的直观差异。
P001-P009
模块衔接: 课程先在不引入分布式成本的条件下把优化对象和更新规则讲清,再进入并行模型。
为什么合在一起讲: 封面给出课程、章节与时间,章节地图随即指出本讲将按“小数据 → 大数据 → 应用”推进;两页共同建立阅读坐标。
为什么合在一起讲: P003 定义回归和平方和,P004 把误差画成观测点到拟合线的垂直残差,P005 再把这一误差抽象成目标函数;三页完成“统计问题 → 几何证据 → 优化形式”的闭环。
回归先区分因变量与自变量。以 P004 为例,Protein 是输入,Sugar 是响应;模型接收横坐标并给出蓝线上的预测。linear、logistic 和 polynomial 的形式不同,但给定参数后,每个样本都会产生一个预测和一个误差。
P003 用 sum of squares 评价整组预测:把每个样本的残差平方后相加。参数学习随之变成明确的最小化任务,目标是让所有样本的总误差尽量小。
红点是观测,蓝线是预测,黑色竖线是在固定 Protein 值下沿 Sugar 轴量出的预测误差。红点在线上方时残差为正,在线下方时为负;平方后两类误差都贡献正值。图中较长的黑线在平方和里权重更大,所以拟合会优先压低大的偏差。
横纵轴都以克为单位,残差沿 Sugar 方向测量。这幅图用来固定误差的定义:同一 Protein 值下,比较观测 Sugar 与蓝线预测 Sugar 的差。
P005 把依赖输入 x 的函数 f 叫作 objective function 或 criterion;做最小化时又常叫 cost、loss 或 error function。这些词在本讲里承担同一角色:用一个标量判断当前参数好坏,梯度下降负责把它压低。
在残差均值已控制、样本数固定的回归设置中,平方和与残差方差只差比例因子或自由度修正,因此课件把最小化平方误差和写成最小化方差。
从一张拟合图可写出优化任务:选择模型参数,计算每个样本的预测残差,平方并求和,再寻找总和最小的位置。P007 给出寻找最小值的梯度下降机制,P015 再把同一个目标写成向量形式并拆成可并行的逐样本项。
U01 给出了 Small data 作为第一入口。
把预测误差明确成平方和目标。
定义变量 → 读残差图 → 抽象为目标函数和损失。
进入不同优化问题和算法选择,随后学习梯度下降。
本页解释: 这一页给出后续优化问题的来源:模型参数并非凭直觉挑选,而是由误差函数决定。这里的 logistic 原文写作 logistics,结合上下文应理解为 logistic regression;翻译保留正确术语但不把拼写错误扩展成新概念。
本页解释: 先看蓝线给出的预测,再看每个红点到蓝线的黑色竖直距离。这个有正有负的竖直差就是残差;平方和把这些距离平方后相加,因此较长残差会被更强地惩罚。图只展示几何关系,没有给出拟合方程或样本表,不能从中反推精确系数。
本页解释: P003 的“预测误差”在这里被抽象成可优化的函数。平方既消除符号抵消,也让离群的大残差贡献按二次速度增长。最后一句应放在课件的回归设定中理解:当残差围绕零组织时,平方和与残差方差只差样本数或自由度等比例因子。
本单元页间主线: P003 回归分析基础 → P004 残差图 → P005 优化问题与平方损失。
上下文补足: “平方和最小”等价于“方差最小”需要残差中心和归一化口径固定。若模型带偏置、使用不同权重或比较不同样本数,比例因子和自由度需要单独处理。本补足只限制课件结论的适用范围,不改变其后续复杂度推导。
为什么合在一起讲: 本页用三个结构差异很大的问题引出 No Free Lunch,单页独立回答“为什么算法选择必须依赖问题”。
芯片布线关心几何交叉,排课关心离散冲突,旅行商关心排列与路径长度。三者都能写成最小化,却有不同的变量、约束和邻域操作;同一个搜索策略不会在三类结构上自动保持优势。
课件的结论是:没有对所有搜索问题都最好的方法。后面的 batch、SGD、Hogwild! 也应按这个标准阅读。比较对象不是一个脱离环境的“最快算法”,而是问题曲率、数据稀疏性、目标误差、内存与通信共同决定的合适方案。
U02 把回归写成一个具体最小化问题。
把视野扩到不同搜索结构并建立算法选择原则。
三个例子显示结构差异,No Free Lunch 总结其后果。
进入梯度下降,并在一个凸二次函数上完整执行更新。
本页解释: 三个例子分别涉及布局、组合冲突与路径选择,决策变量和可行域完全不同。No Free Lunch 在本讲承担的是选择原则:后面比较 batch、SGD、Hogwild! 和 Spark 实现时,不能只问“谁最快”,还要同时看数据规模、稀疏性、同步与通信。
本单元页间主线: P006 优化问题举例与 No Free Lunch。
为什么合在一起讲: P007 给出算法、停止条件和凸性保证,P008 立即把梯度、方向、步长和六次迭代代入具体函数;题意与解法不可拆开。
对 X=(x_1,\ldots,x_n) 而言,梯度收集各坐标偏导,指向函数增长最快方向。最小化使用负梯度,标准一步写作 X_{k+1}=X_k-\alpha\nabla f(X_k)。课件说“选择方向并继续向下”,P008 的数值更新明确了这里实际减去梯度。
梯度为零只是驻点条件。P007 加入凸性不等式,是为了排除局部低谷:凸函数任意两点之间的函数值不超过端点线性插值,因而不存在比当前局部谷底更低的隐藏区域。若进一步强凸,最小值唯一,后文还可给出误差收敛率。
目标函数 f(X)=0.5x_1^2+0.2x_2^2+0.6x_3^2 的三个偏导分别是 x_1、0.4x_2、1.2x_3。在 X_0=(-2,2,-2) 处,梯度是 (-2,0.8,-2.4)。课件把它称为最陡下坡方向,但数值更新使用的是减去该向量;严格说,梯度本身是最陡上升方向,负梯度才是下坡方向。
步长为 1 时,X_1=X_0-\nabla f(X_0):第一坐标变成 0,第二坐标从 2 降为 1.2,第三坐标从 -2 跳到 0.4。三个方向的曲率不同,所以收缩速度不同;到 X_6 时第三坐标约为 0.0000256,第二坐标仍约为 0.0569。
沿某个坐标看,步长过小会让每次变化很少;步长过大则可能从谷底一侧跳到另一侧,甚至发散。这个例子中第三坐标系数最大,梯度对同样坐标值反应更强,固定步长最容易在高曲率方向发生过冲。
因此步长不是与问题无关的常数。P014 后面给出在 L‑Lipschitz 梯度条件下取 α<1/L 的理论界,用曲率上界限制稳定步长。
P008 最后用 Taylor expansion 引出 Hessian。梯度只告诉当前斜率,Hessian 还描述各方向曲率;用曲率校正更新可把不同尺度的坐标统一起来,并允许课件所说的步长 1。代价是构造并求解二阶系统,直接求逆复杂度记为 O(n^3),当模型维数很大时未必划算。
这正呼应 U03:一阶法每步便宜但可能多走很多步,二阶法每步昂贵却可能更快靠近最小值。算法选择取决于维数、曲率和可用计算资源。
U03 说明算法选择依赖问题结构。
建立梯度下降机制并完成一个数值算例。
定义更新与凸性 → 求梯度 → 代入 X0 → 解释 X6、步长和 Hessian。
U05 先做 batch/SGD 直观比较,随后进入并行成本模型。
本页解释: 梯度指出函数增长最快的方向,所以最速下降使用负梯度。课件把停止条件写成梯度在所有方向为零;这个条件只说明到达驻点,凸性才把驻点提升为全局最小值。图中凸性不等式表达“弦在线上、函数图像在线下”。
本页解释: 更新实际使用 X_{k+1}=X_k-\nabla f(X_k)。例如第一坐标从 -2 变为 -2-(-2)=0;第二坐标变为 2-0.8=1.2;第三坐标变为 -2-(-2.4)=0.4。不同二次系数带来不同收缩速度。课件后半所说的 Taylor/Hessian 对应二阶方法的入口;求逆更贵,但曲率信息能校正各方向尺度。
本单元页间主线: P007 梯度下降与凸性 → P008 梯度下降算例。
上下文补足: 课件所述 Taylor/Hessian 路线可理解为 Newton 类方法。典型更新为 X_{k+1}=X_k-H_f(X_k)^{-1}\nabla f(X_k)。实际实现通常求解线性系统而非显式求逆;O(n^3) 是稠密直接法的量级,不代表所有稀疏或近似二阶方法。
为什么合在一起讲: 这页是后续定量比较的预告,独立保留可避免把未经复杂度模型支持的直觉与 P017-P019 的结论混在一起。
Batch 使用全数据,一步慢但方向稳定,达到目标误差所需迭代少;SGD 一步只看随机样本,一步快却需要更多迭代。课件左右栏的“slow but fast to converge”和“fast but slow to converge”必须按这两个时间尺度理解。
课件把 batch 描述为最优、SGD 描述为足够好,并认为随机性有助于逃离局部最小值。对前面给定的强凸问题,局部最小值并非核心困难;这组话更像面向一般非凸优化的直觉。P019 会把可比较部分收敛到 work、depth 与 ε。
U04 已建立普通梯度下降的一次更新。
给出 batch 与 SGD 的直观对照表。
按数据使用、随机性、单步成本、收敛与解质量成对比较。
进入 Big data 模块,用 DAG 和 work-depth 给“快慢”统一计量。
本页解释: 这里的“快/慢”分属两个尺度:一次迭代的成本与达到目标误差所需迭代数。后文 P017-P019 会把直觉写成 work、depth 和误差精度的数量级;“最优”与“足够好”也依赖课件所设的凸性和停止条件。
本单元页间主线: P009 Batch 与 stochastic 梯度下降预览。
用 DAG、work-depth 和 Brent 定理分析平方损失,并比较 batch、SGD、Hogwild! 在共享内存与分布式环境中的代价。
P010-P023
模块衔接: 定性快慢被改写为 work、depth、迭代数和通信轮次,算法选择开始依赖执行架构。
为什么合在一起讲: P010 切换到 Big data,P011 用 DAG 表达依赖,P012 定义 T1/Tp/T∞,P013 用 Brent 定理连接有限处理器;四页共同建立后文复杂度分析的统一语言。
P010 高亮 Big data,意味着问题从“更新公式怎么写”转向“哪些操作能同时做”。P011 把每条指令画成 DAG 节点;若 u 依赖 v,则必须等 v 完成后才能得到 u。图中 a 是最终结果,向下连接 b、k、c 等依赖分支。
互不相连的分支可以并行,例如 a 所需的 b、k、c 在其各自依赖满足后可同时准备;同一条链上的节点不能调换。沿图从 a 到叶节点的最长依赖链,给出了算法无法被更多处理器消除的串行部分。
T_1 是单处理器时间,可视为完成全部基本操作的总工作规模;T_p 是实际给 p 个处理器后的完成时间;T_\infty 假设可用处理器无限,时间由依赖链决定,因此对应 depth 或 critical path。
P012 的问题可直接从 DAG 读取:若最长依赖链有四层,即使每层所有节点同时完成,计算仍需四个单位时间。更多处理器分摊同层 work,关键路径保留顺序。
Brent 定理给出 T_1/p\leq T_p\leq T_1/p+T_\infty。左边是容量下界:p 个处理器每单位时间最多消化 p 份工作。右边说明可以把调度做到接近理想均分,额外损失不超过一条关键路径量级。
当 T_1/p 远大于 T_\infty 时,增加处理器能近似线性加速;当 T_1/p 已经很小,关键路径占主导,再加处理器收益有限。于是 T_1 和 T_\infty 缺一不可:只看总工作不知道并行上限,只看深度不知道资源不足时的代价。
课件关于 CPU 数的结论处在 PRAM 设定中:共享内存访问等成本,不计网络、缓存一致性和锁竞争。后文的 Hogwild! 与 Spark 则把这些系统成本放回分析。
分析顺序很直接:先画依赖,算总 work,再找 depth,最后用处理器数估计 T_p。P016-P017 会把这套方法用于平方损失的求和和梯度。
U05 只有定性“快/慢”,尚无统一成本尺度。
建立并行算法的 work-depth 计量和有限处理器界。
模块切换 → DAG 依赖 → 三个时间量 → Brent 上下界。
把平方损失与梯度拆成并行求和,计算完整 batch 梯度下降复杂度。
本页解释: 与 P002 相比,深色高亮从 Small data 移到 Big data。接下来的问题不再只是更新公式是否正确,而是依赖链、处理器数、并行深度和通信能否支撑大规模数据。
本页解释: 这张图的箭头从结果节点朝它所依赖的子任务画出,因此读图时从 a 向下追踪先决工作。独立分支可以同时执行,沿依赖链必须串行。最长依赖链决定即使处理器无限多也无法缩短的时间。
本页解释: T_1 近似总工作量,T_\infty 是关键路径长度。无限处理器只能同时执行互不依赖的节点,不能打破 DAG 上的先后关系,所以 T_\infty 不会自动变成 0。课件把 work 写成时间乘处理器数;更一般地,它是所有基本操作的总数。
本页解释: 下界 T_1/p 来自“总工作至少要由 p 个处理器分担”;上界说明调度开销可控制在理想均分时间再加一条关键路径。最后一句关于增加 CPU 的判断属于理想 PRAM 模型:现实机器可能受通信、缓存和同步影响,处理器更多并不保证实际运行时间单调改善。
本单元页间主线: P010 章节组织:进入大数据 → P011 Directed Acyclic Graph → P012 Work-depth model → P013 Brent 上下界。
上下文补足: 对 P011,work 由全部节点贡献,depth 只由最长依赖链贡献。宽而浅的图有大量并行机会;窄而深的图即使节点不多,也受串行链约束。这一区分将直接用于 P016 的树形求和。
为什么合在一起讲: P014 建立逐样本损失和与收敛条件,P015 特化为最小二乘,P016补上并行归约,P017 才能推得一次和完整梯度下降的 work/depth;这是一个连续推导。
总体目标 F(w)=\sum_{i=1}^{m}F_i(w,x_i,y_i) 把 m 个样本贡献相加。对平方损失,单项是 \lVert x_i^\top w-y_i\rVert_2^2:先做长度 n 的内积,再形成残差与平方。不同样本之间独立,单个内积的不同乘加也能拆分,所以课件把 m 称为数据并行,把 n 称为模型并行。
目标值和梯度都需要聚合全部样本。梯度 2\sum_i x_i(x_i^\top w-y_i) 的每项是长度 n 的向量;每个处理器可先算局部向量,随后按坐标归约。两者都保留相同的 mn 总算术规模。
若按 P016 的 Basic summation 把所有元素串行累加,work 与 depth 都是 O(n);这会浪费处理器。树形归约第一层同时算相邻两项,下一层再合并部分和,层数为 O(\log n)。总加法数没有下降,所以 work 仍为 O(n)。
把同一思路用到样本和坐标,可在理想 PRAM 下把 mn 份工作安排为对数深度。P017 因而给目标值和梯度都标为 work O(mn)、depth O(\log mn)。这里的对数深度假设有足够处理器和并行归约结构。
梯度算完后,参数按 w_{k+1}=w_k-\alpha\nabla F(w_k) 更新。第 k+1 次梯度必须用新的 w_{k+1} 才能计算,迭代之间形成一条串行链,不能像样本项那样同时展开。
在强凸、可微且梯度 L‑Lipschitz 的课件条件下,取 \alpha<1/L 可得到几何收敛:误差每轮按固定比例缩小,因此达到 \varepsilon 需要 O(\log(1/\varepsilon)) 轮。这个迭代数不是来自并行求和,而是来自优化误差递减。
每轮 depth 是 O(\log mn),轮数是 O(\log(1/\varepsilon));由于轮与轮串行,总 depth 相乘为 O(\log(1/\varepsilon)\log mn)。总 work 同理是 O(mn\log(1/\varepsilon));P017 只把总 depth 写在页上,P019 会把总 work 一并列出。
这个推导给出一个重要分界:样本内与样本间的算术能高度并行,优化迭代链不能。后面 SGD 会通过减少每轮样本把单步 work 降低,却会付出更多迭代。
这里的数量级建立在平方损失、强凸性、L‑smooth、理想 PRAM 与树形归约上。把它部署到集群后,梯度传输、参数广播和慢节点等待会进入每轮时间;P023 与 P027 接着用通信轮数和 Spark 数据流分析这些成本。
U06 提供了 DAG、work、depth 与 Brent 的分析框架。
把该框架应用到最小二乘的目标、梯度和多轮更新。
逐样本目标 → 并行归约 → 单轮 work/depth → 收敛轮数 → 总 depth。
改成单样本随机梯度,比较降低单步成本与增加迭代数的后果。
本页解释: 求和形式把数据维度和模型维度分开:m 是样本数,n 是每个样本和参数的维数。强凸性给出唯一且有曲率下界的谷底,L‑Lipschitz 梯度限制曲率上界;\alpha<1/L 让每步不至于越过稳定区。后面的复杂度结论都以这些理论条件为背景。
本页解释: x_i^\top w 是第 i 个样本的线性预测,减去 y_i 得到标量残差;标量上的 \lVert\cdot\rVert_2^2 就是平方。按样本拆分求和可让不同处理器计算不同 F_i;单个内积的 n 个坐标也可并行归约,因此出现数据并行和模型并行两层结构。
本页解释: 串行循环的每次加法都依赖上一次的 s。并行归约改成两两相加:第一层约做 n/2 次,第二层约做 n/4 次,直到剩一个和。总加法数仍是 n-1,但依赖层数只有 \lceil\log_2 n\rceil。这正是 P017 中内积与跨样本求和深度为对数级的来源。
本页解释: 每个样本的长度 n 内积带来线性总工作,不同坐标和不同样本可以树形归约,所以理想深度写成对数级。完整算法的迭代之间不能同时执行,因为第 k+1 步依赖 w_k;因此总深度是“每步深度 × 迭代数”。这也解释了为什么单步高度并行仍不等于整个优化过程无串行瓶颈。
本单元页间主线: P014 回到梯度下降:经验风险 → P015 平方和损失 → P016 并行求和 → P017 梯度下降的 work 与 depth。
上下文补足: 8 个数串行相加需要 7 个依赖步骤;树形归约分三层完成:4 次并行加法、2 次并行加法、1 次加法。work 仍是 7,depth 从 7 降为 \log_2 8=3。这就是 P016 目标复杂度的具体形状。
为什么合在一起讲: P018 定义随机单样本更新并给出迭代阶,P019 把它与 batch 的单轮和总 work/depth 对齐;两页共同回答“便宜的一步是否带来便宜的全过程”。
SGD 在第 k 轮均匀抽取索引 s_k,只算 \nabla F_{s_k}(w_k) 并更新 w_{k+1}=w_k-\alpha\nabla F_{s_k}(w_k)。由于不再遍历 m 个样本,单轮 work 从 O(mn) 降为 O(n);长度 n 的内积和向量操作可归约到 O(\log n) depth。
这一步是有噪声的完整梯度估计。不同随机样本给出不同方向,轨迹会抖动,因而课件采用的误差轮数从 batch 的 O(\log(1/\varepsilon)) 变为 O(1/\varepsilon)。
Batch 总 work 是 O(mn\log(1/\varepsilon));SGD 总 work 是 O(n/\varepsilon)。前者随样本数 m 线性增长,后者在课件模型中与 m 脱钩,却对高精度 \varepsilon 更敏感。
例如只从数量级看,数据极大而容许中等误差时,省掉每轮全数据扫描可能占优;若要求极小误差,1/\varepsilon 的轮数会快速压过对数项。课件因此用问句收尾,而不是宣布固定赢家。
Batch 总 depth 为 O(\log(1/\varepsilon)\log mn);SGD 为 O(\log n/\varepsilon)。SGD 单轮 depth 低,但轮数多,并且轮与轮仍依赖前一个参数。低单轮 depth 并不自动等于低总 depth。
还有一个尚未计入的系统问题:多个处理器若同时做 SGD,会读写同一 w。P020-P022 将显示,真正难点不是单个随机梯度怎么算,而是并发更新是否需要锁。
先确定数据规模 m、模型维度 n 和目标误差 ε,再看硬件能否提供理想归约。最后还要加入同步与通信。这样得到的是条件化选择:单机共享内存、GPU 数量、稀疏性与分布式网络会改变同一复杂度式子的实际代价。
P019 把两种方法放在同一误差符号 \varepsilon 下,比较的是同一目标差或解误差的收敛阶。表中的 \log(1/\varepsilon) 与 1/\varepsilon 说明高精度目标会显著放大 SGD 的迭代数。
随机梯度的方差和步长安排也会影响实际轨迹。本讲保留源页给出的迭代阶,下一单元转向并发写入,把复杂度表外的共享参数成本加入讨论。
U07 已算出 full batch 的单轮与完整成本。
用同一套指标量化 SGD 的收益和代价。
定义随机更新 → 给误差轮数 → 并列单轮与总复杂度 → 保留条件化结论。
进入共享内存并发,处理竞态、锁与 Hogwild!。
本页解释: SGD 用 \nabla F_{s_k} 作为完整梯度的随机估计。一次更新只看一个长度为 n 的样本,所以单步便宜,但噪声让收敛从课件给出的对数迭代阶退化为 O(1/\varepsilon)。最后两条共同表达一个折中:减少每步样本数通常能节省总计算,但节省比例不能只用“样本减少多少倍”机械推断。
本页解释: 比较必须同时代入 m、n 和目标误差 \varepsilon。Batch 每步处理全部 m 个样本,却只需对数级迭代数;SGD 每步与 m 无关,却需要 1/\varepsilon 级迭代。数据规模、精度要求与硬件并行度不同,交叉点也不同,因此这一页刻意以问题收尾。
本单元页间主线: P018 Stochastic gradient descent → P019 Stochastic 与 batch 复杂度。
为什么合在一起讲: P020 暴露共享参数上的旧读与覆盖,P021 比较全局锁和稀疏碰撞,P022 才给出 Hogwild! 算法;三页是一条完整的问题—条件—方案链。
在 PRAM 设置中,所有 CPU 都读写同一 w。一次 SGD 更新包含读取参数、计算随机梯度、写回新参数。若两个 CPU 同时读到旧值,它们各自完成计算后再写回,后一次写入可能覆盖前一次更新;即使没有整向量覆盖,某些坐标也会丢失增量。
问题的根源不是梯度公式错误,而是 read–modify–write 缺少原子性。把 w 加全局锁可以恢复顺序语义,却会让所有处理器排队,SGD 的并行收益随之消失。
样本 x_i=(x_i^{(1)},\ldots,x_i^{(n)}) 若稀疏,单次梯度只更新与非零特征对应的少量 w^{(k)}。两个处理器随机抽到的样本支持集常常不重叠,于是它们可同时写不同坐标,无需为整向量加锁。
即使支持集偶尔重叠,课件的判断是碰撞概率在大数据稀疏场景中较低。这个判断依赖特征分布:若少数热门坐标在几乎所有样本中非零,实际冲突仍可能集中发生,Hogwild! 的优势会下降。
每个处理器独立重复三步:从 \{1,\ldots,m\} 随机采样 j;读取共享内存中当下可见的 w 并计算 F_j(w) 与 \nabla F_j(w);只对样本非零坐标做 w^{(k)}\leftarrow w^{(k)}-\alpha[\nabla F_j(w)]^{(k)}。算法没有全局锁,也不等待其他 CPU 完成。
因此某个梯度可能基于稍旧的参数,写入顺序也不确定。Hogwild! 接受这种异步噪声,以换取接近 CPU 数量的线性加速;可接受的前提是目标更新稀疏、步长和延迟不会让误差失控。
P022 先采样索引 j,随后写出 x_i^{(k)}\neq0。这里应按所采样样本的非零坐标执行更新;逐页翻译保留原式,并标出这一处记号跳变。
“直到达到期望误差条件”给出停止目标。实现时可定期汇总或抽样评估当前误差;Hogwild! 取消的是参数更新的全局锁,误差监测仍可按系统需要安排。
Batch 的并行点在一轮内部:各处理器算局部梯度,再同步归约。Hogwild! 的并行点跨越更新本身:处理器不等归约,直接异步改参数。两种方案分别把同步成本放在“每轮一次”和“尽量不锁”,这会直接影响单机与分布式系统的选择。
U08 证明 SGD 单步便宜,但还没有说明多处理器如何共享参数。
用稀疏性把竞态从必须锁定的问题改写为可容忍的低概率冲突。
竞态案例 → 全局锁代价 → 稀疏支持集 → 无锁坐标更新。
U10 将共享内存结论与分布式通信并列,给出部署选择。
本页解释: 一次 SGD 更新不是原子操作,而是 read–compute–write 三阶段。两个处理器若读到同一旧版本 w,后写回者可能抹去先写回者的部分更新,这就是 race condition(竞态)。P021 不会先用全局锁解决,而是检查更新坐标是否足够稀疏。
本页解释: 稀疏样本只触碰一小组参数坐标。不同 CPU 随机抽到的样本若支持集不重叠,它们的写入互不冲突;即便偶尔重叠,损失也可能小于锁带来的持续串行化。这里的“很可能较低”是课件提出的工作假设,不是对任意数据都成立的保证。
本页解释: 算法让每个处理器独立采样、读取共享参数并写回相关坐标,不设置全局同步点。稀疏性降低坐标冲突,随机性让偶发的陈旧更新可被后续迭代吸收。原页先采样 j、后在非零条件中写 x_i^{(k)};这是页内索引不一致,按算法语义应是所采样样本的坐标,但翻译保留原式并在此标出。
本单元页间主线: P020 并行 SGD 的共享内存风险 → P021 锁与稀疏更新 → P022 Going Hogwild!。
上下文补足: Hogwild! 的课件结论针对稀疏代价函数。稠密特征、长时间陈旧读、过大步长或热点坐标都会增加干扰。它的工程价值来自“少量误差比持续加锁便宜”,不是把竞态本身宣称为正确同步。
为什么合在一起讲: 本页把前面的 PRAM 深度、Hogwild! 与分布式通信轮数收束成一个架构选择,适合独立作为 Big data 模块结论。
普通 SGD 单轮 depth 低,却难以让多个处理器同时更新;Hogwild! 借助稀疏性把它变成接近 embarrassingly parallel。Batch 每轮工作多,但局部梯度天然可拆分并归约。
跨机器时,参数或梯度需要通信。课件把通信轮数近似为迭代数:batch 为 O(\log(1/\varepsilon)),stochastic 为 O(1/\varepsilon)。因此单机多 GPU 常偏向 stochastic,共享内存和高速互联能支撑频繁更新;分布式系统更常用 batch,以较少轮次换取每轮较大的并行工作。
先问内存模型:同机共享参数还是跨机通信;再问数据稀疏性是否支持无锁更新;最后用 ε 对应的迭代数估算同步轮次。这个顺序比只比较每轮 FLOPs 更接近课件的最终判断。
U09 给出共享内存上无锁 SGD 的条件。
把算法复杂度转译成单机 GPU 与分布式集群的部署倾向。
PRAM 对照 → 通信轮数 → 单机与分布式选择。
进入 Applications,用 Spark 的 RDD、broadcast 和 barrier 检验这些结论。
本页解释: 单机共享内存里,Hogwild! 可以让多个处理器直接更新同一参数;跨机器时,每轮更新需要传输或聚合参数,迭代次数就变成通信轮数。于是 SGD 的低单步 work 未必能抵消更多通信,而 batch 的规整归约更适合集群。
本单元页间主线: P023 Batch、SGD 与部署环境。
把梯度更新映射到 Spark 的 RDD/map/reduce/broadcast/barrier,并用 PCA 与线性规划观察优化思想的迁移。
P024-P030
模块衔接: 在给出算法复杂度后,回到真实系统的存储、同步和通信,再扩展到降维与约束优化。
为什么合在一起讲: P024 将章节高亮切到 Applications,P025 随即固定 Spark、模型可入内存且样本数不受限的场景;两页共同定义实现问题的边界。
前面已经知道 batch 易归约、SGD 迭代多、Hogwild! 依赖共享内存。P024 的 Applications 高亮表示现在要把这些判断放进一个真实执行框架,而不是重新介绍梯度下降。
工具选择决定可用执行原语;batch 或 stochastic 决定每轮读多少样本;数据大小与稀疏性决定内存和冲突。课件指定 Spark,并假设模型维数 n 足够小可放入内存,而样本数 m 不设上限。
这意味着不能把完整数据复制到每台机器,但可以反复传递相对较小的参数 w。最终问题“如何在集群存储数据”自然导向按行分区的 RDD。
实现需要回答三件事:样本分区是否复用,参数每轮发送几次,局部梯度如何聚合。P026 给出基线流程,P027 专门追问通信瓶颈,P028 再检验 SGD/Hogwild! 是否适配 Spark 的同步边界。
U10 已给出单机与分布式的算法选择。
固定 Spark 场景和 n、m 的内存假设。
应用切换 → 工具/算法/规模问题 → 模型可入内存、数据需分区。
构造 batch gradient descent 的 RDD-map-reduce 更新循环。
本页解释: 深色高亮移到 Applications。前两部分建立了算法和并行成本模型;接下来把这些约束放进 Spark,并用 PCA 与线性规划说明优化思想如何连接其他方法。
本页解释: 这里明确了系统边界:模型向量维数 n 可在每台机器或 driver 端持有,样本数 m 可以很大,因此数据必须分区。接下来的 Spark 设计会按行把样本放入 RDD,并在每轮把相对较小的 w 带到计算端。
本单元页间主线: P024 章节组织:进入应用 → P025 实现前的选择。
为什么合在一起讲: P026 给出六步 RDD 流程,P027 紧接着检查参数发送、mapper 语义和通信成本;实现与性能审查必须一起讲。
数据先按行放入 RDD,每一行对应样本 p。map 使用当前参数 w 把样本变成局部梯度 \nabla F_p(w);reduce 把所有局部梯度相加;driver 或控制端据此更新 w。然后从 map 梯度这一步开始下一轮,直到误差条件满足。
第 2 步提到 closure,表示 map 函数携带计算所需的参数环境。第 3 步 cache 让 RDD 的样本分区跨迭代复用,避免每轮重新从上游读取或重算。源页称 cache 为 action;在解释层应关注它的目的,即把迭代数据保留在内存。
map 阶段没有样本间依赖,正对应 P015 的 data parallelism。每个任务只读 w 并输出梯度,不应原地修改共享参数。reduce 阶段执行树形向量求和,对应 P016 的并行归约;其输出长度是模型维数 n。
更新 w 发生在聚合之后,这形成清晰的同步屏障:所有任务使用同一轮参数,完整梯度确定后才进入下一轮。这是 batch 方法确定性和易并行的系统表达。
第一组问题围绕 w:每轮是否随任务重复发送,mapper 是否只读,它相对带宽和内存有多大,以及是否应使用 broadcast。P025 的 n 可入内存假设允许保存参数;广播频率仍决定网络成本。
第二组问题转向端到端时间。样本 RDD 被 cache 后,反复扫描可留在内存;参数广播、梯度 shuffle/reduce、慢任务等待和迭代轮数共同决定瓶颈。应据 n、分区数、网络与轮数逐项估算。
每轮局部计算约随本分区样本数乘 n 增长,通信至少要分发或引用 w 并归约长度 n 的向量。数据越多,局部计算越能摊薄固定广播成本;模型越大,参数与梯度传输越突出。
因此优化不是简单增加 mapper 数。任务过细会制造更多调度与归约开销,任务过粗又降低并行度。P028 进一步说明,Spark 的容错屏障让细粒度异步 Hogwild! 更难实现。
U11 已固定 Spark、n 可入内存、m 可很大的场景。
把 full batch 更新映射为 Spark 的 RDD、map、reduce 和同步迭代。
存储并缓存样本 → map 局部梯度 → reduce 求和 → 更新参数 → 检查广播与通信。
比较 Spark 上的 SGD/Hogwild! 限制,并引出 mini-batch。
本页解释: 一次迭代的数据流是“分区样本 → 局部梯度 → 树形聚合 → driver 更新参数”。cache 避免每轮从原始存储重建 RDD;map 阶段彼此独立,reduce 实现 P016 的并行求和。更新后的 w 会成为下一轮 map 的只读输入,因此迭代之间仍有同步边界。
本页解释: 这一页只提出检查项,没有在源页给出答案。结合 P025 的 n 可放入内存假设,mapper 应把 w 当只读参数;真正需要审视的是每轮分发 w、归约长度为 n 的梯度,以及迭代次数带来的重复通信。P028 会说明 Spark 的同步机制为何限制无锁 SGD。
本单元页间主线: P026 Spark 中的 batch 梯度下降 → P027 Spark batch 的瓶颈问题。
上下文补足: closure 让任务获得计算环境,cache/persist 让重复迭代复用样本分区,broadcast 适合向 executors 分发只读参数。它们解决的是不同问题,不能把 cache 当作参数同步,也不能把 broadcast 当作可写共享内存。
为什么合在一起讲: 本页独立比较 Hogwild! 的异步共享内存要求与 Spark 的 broadcast/barrier 执行,并给出随机接受和 mini-batch 两种替代。
Hogwild! 希望处理器随时读取和写回共享参数;Spark 的 mapper 要等 broadcast 完成,下一次 broadcast 又要等当前 mapper、reducer 全部结束。每轮都存在同步屏障,正是 Hogwild! 想避免的协调。
Spark 用 lineage、stage 和重算获得容错,这要求执行边界清晰。把共享内存的无锁细粒度更新原样搬进这种模型,会失去近似连续的异步写入。
第一种是尝试随机更新,只接受能降低目标的候选;第二种是 mini-batch:每轮选“许多”样本而非一个,并在这个子集上执行 batch 更新。后者在随机性与规整 map/reduce 之间折中。
mini-batch 增大单轮计算,使 broadcast 与 barrier 成本能被更多样本摊薄;同时比 full batch 少处理数据。批大小因此是系统参数,也是优化噪声参数。
SGD 的 O(1/ε) 迭代倾向意味着通信轮数多,Spark 屏障会放大这一缺点。mini-batch 试图用每轮更多工作换更少或更有效的同步轮次,延续了本讲一贯的 work、depth 与通信权衡。
U12 已建立 Spark batch 的同步 map-reduce 循环。
解释共享内存 Hogwild! 与 Spark stage/barrier 的不匹配,并给出 mini-batch 折中。
回顾 SGD/Hogwild! → 指出 broadcast/barrier → 提出随机接受与 mini-batch。
转向降维应用,用 PCA 在进入优化前减少数据维数。
本页解释: Hogwild! 依赖共享内存中的细粒度异步写入,而 Spark 的 stage/broadcast/reduce 以批次和屏障推进,不能原样复制该执行模型。mini-batch 是系统折中:每轮仍能用 map/reduce 并行,但比 full batch 少读样本;相比单样本 SGD,又能摊薄广播与同步成本。
本单元页间主线: P028 Spark 中的 stochastic 梯度下降。
上下文补足: broadcast 变量在 worker 端是只读副本,不能让所有任务像 PRAM 那样原地改同一个 w。把两者区分开,才能理解 P028 为什么把 barrier 视为 Hogwild! 的限制。
为什么合在一起讲: 这一页同时给出大数据降维策略、PCA 目标和 V/M/m 几何图,完整回答“为什么 PCA 能作为梯度下降前的近似步骤”。
当原始维数太大,先用 PCA 把数据投影到较低维子空间,再在近似数据上运行梯度下降。这样降低单样本向量长度 n,因而同时降低内积、梯度、参数和通信规模;代价是丢失被舍弃方向上的信息。
黄色 V 是均值中心化后的样本向量,绿色 M 是它在虚线候选主轴上的投影,红色 m 是从投影点到原向量端点的正交残差。三者构成直角三角形,因此 V^2=M^2+m^2。
对固定 V,左侧长度不变。最大化投影 M 会自动最小化残差 m;对全部样本求和后,最大投影方差与最小平方重构误差成为同一几何选择。
课件用“最大化 \mathbb{E}[XX^\top] 的方向”概括协方差方向。均值中心化让二阶矩对应方差结构;PCA 选最大特征值对应的轴。将残差平方和写成目标后,也可用优化方法寻找重构误差最小的方向。
PCA 与本讲优化线的连接在于投影—残差关系:保留方差大的方向,同时压低正交残差。选出的轴会缩小后续模型的 n,直接改变前文含 n 的计算和通信量。
U13 讨论如何在 Spark 中降低每轮同步压力。
从数据维数入手,在优化前减少模型与通信规模。
降维策略 → 投影几何 → 方差最大化与残差最小化等价。
最后用线性规划说明“选择改进方向”还能连接离散的 simplex pivot。
本页解释: 先把总向量 V 分解为轴上投影 M 和正交残差 m。对固定样本,V^2 不变,所以增大投影能量 M^2 与减小残差能量 m^2 是同一目标的两种写法。PCA 用前者找主轴,最小二乘式优化用后者度量重构误差。
本单元页间主线: P029 梯度下降与 PCA。
上下文补足: 若数据未中心化,投影能量会混入均值偏移,主轴不再只描述围绕均值的方差。P029 明确写出 mean centered data,正是为了让方差最大化与图中的正交分解直接对应。
为什么合在一起讲: 本页从线性目标、线性约束到 simplex pivot 构成一个完整应用类比,独立保留可清楚标出它与梯度下降的相同语言和不同机制。
目标是在线性等式或不等式约束限定的可行域内最大化线性函数。最大化可以通过目标取负改写为最小化,因此能够与本讲统一使用“让目标下降”的语言。
simplex 从一个基本解出发,通过选择 pivot 移动到更好的基本解。不同 pivot 规则会产生不同路径和收敛速度;课件把最佳 pivot 类比为寻找最能改进目标的方向。
两种方法的移动方式不同:梯度下降在连续空间按局部导数更新,simplex 沿可行多面体的边在基本解之间跳转。二者都反复改进目标,线性约束的几何结构使本页采用 pivot。
P006 已用旅行商等问题说明优化结构多样,P030 再次回到算法适配:即使都能写成最小化,线性约束结构会导向 simplex。它为 No Free Lunch 提供了一个具体收尾。
U14 用连续投影几何连接 PCA 和平方残差。
展示线性约束下通过 pivot 改进目标的另一类优化方法。
定义线性规划 → 最大转最小 → 基本解与 pivot → 最佳改进方向。
进入课程回顾,按五个问题检查主线是否闭合。
本页解释: 这页借用“沿改进方向前进”的共同语言连接梯度下降与 simplex,但两者机制不同:梯度下降沿连续空间的梯度更新,simplex 在可行多面体的基本可行解之间移动。源页把主元选择写成都会到达最优解;实际理解仍需配合可行性、终止规则及退化等条件,因此这里把它标作应用类比而非同一算法。
本单元页间主线: P030 线性规划。
上下文补足: 原页把“任意 pivot 导向最优解”作为讲义结论。实际使用时还需合法 pivot 规则、可行起点、终止与退化处理。本补足只防止把应用类比误读成无条件实现保证。
用源课件五个问题检查 batch/SGD、PRAM、Hogwild! 与 Spark 的完整知识链。
P031-P032
模块衔接: 应用部分结束后不再引入新模型,直接按五项能力收束本讲。
为什么合在一起讲: P031 把学习目标整理成五问,P032 结束课程;两页共同完成回顾与收束,没有新增技术分支。
第一、二问要求定义 batch 与 stochastic 并比较单轮和总成本;第三问要求用 PRAM、work、depth 分析并行性;第四问要求说明 Hogwild! 的随机采样、稀疏坐标和无锁更新;第五问要求把 batch/SGD 放进 Spark 的 map、reduce、broadcast 与 barrier。
完整回答从平方损失 F(w) 出发,说明 batch 与 SGD 如何取梯度,再给出 m、n、\varepsilon 下的 work/depth;接着把共享内存竞态和分布式通信放入选择,最后落到 Spark 的迭代数据流。
P032 只显示 Thank you 和课程标志。它不提供新结论,因此本讲知识链在 P031 的五问处已经闭合。
U15 完成最后一个应用类比。
用源页五问检查从算法、复杂度到系统实现的完整掌握。
五个问题回收全讲,结束页不再增加内容。
无;本讲结束。
本页解释: 这五问正好覆盖本讲主线:更新粒度、并行成本模型、无锁稀疏更新和 Spark 同步实现。它们要求能说明机制与条件,而不只是背出术语。
本页解释: 结束页重复课程封面的 Hadoop 标志,不再引入新概念。
本单元页间主线: P031 Key points → P032 结束页。
完整讲解
本章放在课程中的位置
这讲不是把优化当作孤立的数学主题。课程名指向 big data,章节名是 Optimization,因此后面所有算法都会同时接受两个标准:目标函数是否下降,以及数据规模、处理器和通信是否允许这样算。
P001 的作者与学期信息保留了来源边界。P002 则把 Optimization 放在中心,三条分支不是并列术语表,而是后续页面的真实顺序。
三段式知识路线
Small data 部分先从回归、平方误差和普通梯度下降建立更新规则。Big data 部分加入 PRAM、DAG、work、depth,再比较 batch、SGD 与 Hogwild!。Applications 部分把前面的结论带入 Spark,并连接 PCA 与线性规划。
读图时应关注分支颜色:P002 高亮 Small data,P010 改为 Big data,P024 再改为 Applications。这个视觉变化就是模块切换标记。
阅读时要守住的主线
全讲反复改变的是计算粒度:先对一个残差定义损失,再对全部样本求和;随后把总梯度拆到处理器;最后在共享内存或集群中决定同步方式。每次“扩展”都不会改变优化目标,却会改变单步成本与系统瓶颈。
本单元在知识链中的位置
无;这是课程入口。
建立章节范围和三段路线。
P001 定位课程,P002 给出主题地图并高亮第一段。
进入回归与最小二乘,把优化目标具体化。
逐页详解P001-P002 · 2 页逐句翻译 · 本页解释
课程标题
本页解释: 封面把本讲定位为大数据课程的优化章节。黄色 Hadoop 标志是课程视觉识别,不提供额外技术结论。
章节组织:小数据入口
本页解释: 图中 Small data 分支为深色,表示本段先从单机、基础统计与普通梯度下降入手;大数据和应用将在 P010、P024 依次切换。
本单元页间主线: P001 课程标题 → P002 章节组织:小数据入口。