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