小区空地上有一个给小朋友玩的沙坑,妈妈规定:小满只能在沙坑里玩,沙坑外面是马路,马路对面是糖果店。每次小满看见糖果,撒腿就往店的方向冲——但他总是被妈妈一把抱回沙坑里,而且抱回的位置特别讲究:不是随便一扔,而是放在“离他越界位置最近的坑边”。跑一次,抱一次;再跑,再抱。最后小满停在沙坑正对糖果店的那个边缘上,再也没有办法更近了——再往前一步就犯规,往后退一步又离糖更远。 这不是育儿故事,而是优化算法“投影梯度法”的完整原型。你想最小化的目标函数像远处的糖果,约束条件像沙坑的围栏,梯度下降是孩子本能的奔跑,而“投影”是妈妈那个精准的抱回动作。本文就用这个画面,把投影梯度的想法、几何、公式、收敛与实战一次讲透。你只需要记住这句话:先按普通梯度走一步,再把这个点投影回可行域——走完,再拉回。

岗位关联

对 AI 从业者来说,掌握投影梯度等于给“带约束的优化问题”配了一把傻瓜钥匙:推荐分解、稀疏建模、预算分配这些常见任务,都能几行代码快速落地,无需自研复杂优化器。

目录
  1. 可视化演示
  2. 问题由来
  3. 算法流程
  4. 投影几何
  5. 常见投影
  6. 收敛性质
  7. 典型应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态对比流水线与标量执行方式的指令吞吐量差异,展示取指、译码、执行、访存、写回五个阶段的并行执行流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

五级流水线执行 IF取指→ID译码→EX执行→MEM访存→WB写回 每周期一条指令进入,理想CPI=1 Throughput = 1 insn/cycle

问题由来

小满第一次冲出沙坑时,妈妈就明白了:光靠喊“回来”是没有用的,孩子眼里只有糖果。于是她立下规矩——只能在沙坑里玩。这个“沙坑”就是约束,而它圈定的合法区域,在数学里叫可行域。AI 训练里到处是这样的沙坑:播放次数不能为负、权重向量的长度不能超过某个上限、投资比例必须加起来等于 100%。

如果不管约束,直接用朴素梯度下降会怎样?梯度会一路把参数推向无约束最优解——那个点可能远在沙坑外的马路上。比如目标函数是 $\displaystyle f(x)=\lVert x-a\rVert^2$,最优解在 $a$ 点;可如果约束是 $\displaystyle \lVert x\rVert\le 1$ 而 $a$ 的模长大于 1,梯度下降只会带着你义无反顾地冲向禁区。

所以必须给朴素梯度加一个“刹车+纠偏”:走一步之后,如果越界就拉回来。这个直觉很朴素——先当没有约束那样走一步,再看结果是否出界,出界就抱回坑边最近的位置。这种“先走再拉回”的思想,就是投影梯度的雏形。

回到比喻:小满每次朝糖果跑,妈妈不阻止他的“方向感”,只是在他越界的瞬间把他抱回坑内最近处。几次之后,小满学会了一个道理——朝着糖果冲没错,但脚底下得踩着沙坑的边界冲。投影梯度的所有神奇,都从这个朴素的画面展开。

min⁡x∈Cf(x)\displaystyle \min_{x \in C} f(x)
这个公式在说:在可行域 C(沙坑)里,找一个让 f 最小的 x(离糖果最近的位置)。
  1. 目标函数 $f(x)$衡量当前参数解有多“坏”的指标,值越小越好,它是我们情绪的来源。
    f(x)\displaystyle f(x)
  2. 参数向量 $x$所有需要调优的变量组成的向量,相当于孩子在沙坑里的坐标。
    x=(x1,x2,…,xn)\displaystyle x = (x_1, x_2, \dots, x_n)
  3. 可行域 $C$沙坑围栏圈出的合法区域,$x$ 只能在这里面取值。
    x∈C\displaystyle x \in C

算法流程

妈妈很快总结出一套固定流程:第一步,小满可以尽情朝糖果的方向迈出一大步(这一步不一定安全);第二步,如果他跑出了沙坑,就把他抱回来,稳稳放在坑边离他最近的位置;第三步,确认站稳后,继续让他朝糖果跑。如此循环,直到小满站在边界上再跑不出新花样为止。

这套流程的数学版本只有一行:

其中 $x_k$ 是第 $k$ 次迭代的位置,$\eta$ 是步长(孩子每步迈多大),$\nabla f(x_k)$ 是梯度(糖果所在的方向),$P_C(\cdot)$ 是投影算子(妈妈抱回的动作)。整个式子做两件事:先算括号里的“走一步”,再算外面的“拉回来”。

PC(⋅)P_C(\cdot) 是这行公式的灵魂,它回答一个问题:如果孩子跑出了沙坑,该把他放回哪里?答案极其简洁——放在沙坑里离他越界位置最近的那个点。这个点一定是沙坑边界上的某处,因为越界点已经在外头了,离它最近的合法点只能贴着边界。

小满最终停下来的位置,正是沙坑边界上朝向糖果的那个点。算法也一样:迭代到梯度步之后投影不变(或变化极小)时,就认为找到了可行域内的最优解。整个流程只有“走”和“拉”两个动作,没有任何花哨的步骤——这正是投影梯度最大的优点:实现极其简单。

xk+1=PC(xk−η∇f(xk))\displaystyle x_{k+1} = P_C\big(x_k - \eta \nabla f(x_k)\big)
  1. 梯度 $\nabla f(x_k)$给出当前点 $f$ 上升最快的方向,我们反着走就是下降。
    ∇f(xk)\displaystyle \nabla f(x_k)
  2. 下降步沿负梯度方向走一步,步长为 $\eta$,得到可能越界的临时点。
    xk−η∇f(xk)\displaystyle x_k - \eta \nabla f(x_k)
  3. 投影算子 $P_C$把任何点“拉回”可行域 $C$ 内离它最近的位置。
    PC(⋅)\displaystyle P_C(\cdot)
  4. 更新迭代把投影结果作为下一轮起点,循环往复。
    xk+1=PC(xk−η∇f(xk))\displaystyle x_{k+1} = P_C\big(x_k - \eta \nabla f(x_k)\big)

投影几何

为什么妈妈总是能把小满放在“最近的坑边”而不是随便哪里?因为“最近”在几何上是一个非常优美的概念。把孩子越界的位置记作 $y$,沙坑(可行域)记作 $C$,那么投影的结果就是 $C$ 中离 $y$ 距离最近的点。用公式说:

这个式子读作:在 $C$ 里找一个点 $x$,使得它到 $y$ 的欧氏距离最短。注意两点。第一,如果 $y$ 本来就在 $C$ 内,那么最近点就是它自己,$P_C(y)=y$——孩子没越界,妈妈根本不用出手。第二,投影有一个重要的几何性质:$y$ 到 $P_C(y)$ 的连线,严格垂直于可行域在投影点处的支撑面。想象小满的手伸出栏杆,妈妈握着他的手往回拉,拉绳的方向一定垂直于栏杆——这样才最短,也最自然。

这个性质叫正交投影,它保证了投影是“直的拉回”而不是“斜着拽回”。斜着拽会引入多余的横向移动,可能把小满从本该到达的位置带偏,影响收敛。数学上正是因为连线的正交性,投影才成为所有“拉回”操作中最不改变既定方向的方案。

沙坑的栏杆不是任意形状,投影总能把孩子放到“沿着垂直方向望过去最近的坑边”。这解释了投影梯度的稳健性:即使小满每次冲出去的方向千奇百怪,妈妈总能精准地把他放回那个唯一的最短回程点——每一步都不浪费,每一步都朝着目标前进。

PC(y)=arg⁡min⁡x∈C12∥y−x∥2\displaystyle P_C(y) = \arg\min_{x \in C} \tfrac{1}{2}\lVert y - x \rVert^2
  1. 越界点 $y$梯度步后跑出沙坑的临时位置。
    y\displaystyle y
  2. 最小化目标在 $C$ 内找到与 $y$ 距离最近的点,这是“妈妈抱回”的决策规则。
    arg⁡min⁡x∈C\displaystyle \arg\min_{x \in C}
  3. 二分之一系数求导时会产生因子 2,写 $\tfrac{1}{2}$ 是为了让导数更清爽,不改变最优点。
    12∥y−x∥2\displaystyle \tfrac{1}{2}\lVert y - x \rVert^2
  4. 欧氏距离衡量两点直线距离的范数,对应“最短路径”的直觉。
    ∥y−x∥\displaystyle \lVert y - x \rVert

常见投影

如果沙坑的形状千奇百怪,妈妈每次都要重新琢磨“最近点在哪”,那这套方法就行不通了。幸运的是,实际工作里最常见的几种沙坑,都能用一张公式表直出答案。第一个是箱约束:每个坐标都限制在一个区间 $[l_i, u_i]$ 内,比如“播放权重不低于 0 且不高于 1”。它的投影就是把每个坐标单独裁剪(clamp)到区间里:

第二个是范数球约束:点必须在以原点为中心、半径为 $r$ 的球内,比如“权重向量的模长不超过 1”。它的投影稍微巧妙一点:如果点没越界就原样返回;越界了,就把整个向量等比缩放到球的边界上,方向保持不变:

这两条公式的共同点是:每个都是闭式解(closed form),一行算出,不需要任何内部迭代。除它们之外,非负象限 $x\ge 0$ 的投影就是把负坐标直接清零——本质是箱约束的下界特例;L1 球(菱形)的投影则需要先排序再裁剪,稍复杂但也是成熟算法。这些“好投影”集合有一个共同品质:计算代价跟一次梯度步差不多,都是 $O(n)$ 量级。

球约束公式再看一眼:

妈妈带小满换过两种沙坑:方形的用裁纸刀式的“裁剪”,圆形的用绳子式的“缩放”。口诀很简单:方形横平竖直,逐坐标切;圆形只保方向,整体压缩。这些公式看起来不起眼,却是投影梯度能从理论走向工程的关键基石。

[PC(y)]i=min⁡(ui, max⁡(li,yi))\displaystyle [P_C(y)]_i = \min\big(u_i,\ \max(l_i, y_i)\big)
PC(y)={y,∥y∥≤rry∥y∥,∥y∥>r\displaystyle P_C(y) =\begin{cases}y, & \lVert y \rVert \le r \\[4pt]r\dfrac{y}{\lVert y \rVert}, & \lVert y \rVert > r\end{cases}
  1. 逐坐标处理箱约束把每一维看成独立的迷你沙坑,互不干扰。
    [PC(y)]i\displaystyle [P_C(y)]_i
  2. 下限裁剪先把数值抬到下界之上,防止低于 $l_i$。
    max⁡(li,yi)\displaystyle \max(l_i, y_i)
  3. 上限裁剪再把结果压到上界之下,形成最终的 clamp。
    min⁡(ui, max⁡(li,yi))\displaystyle \min\big(u_i,\ \max(l_i, y_i)\big)
  4. 越界判定计算点到原点的距离,与半径 $r$ 比较。
    ∥y∥≤r\displaystyle \lVert y \rVert \le r
  5. 原样返回没越界,孩子还在沙坑里,妈妈不动手。
    PC(y)=y\displaystyle P_C(y) = y
  6. 等比缩放越界后保持方向,把长度压成 $r$,落在边界上离 $y$ 最近的位置。
    PC(y)=ry∥y∥\displaystyle P_C(y) = r\frac{y}{\lVert y \rVert}

收敛性质

妈妈渐渐发现,小满能不能安全停在坑边,取决于他每步迈多大。步子太小,半天挪不到位置;步子太大,虽然每次都抱回来了,但总在边界附近来回弹,甚至越弹越远。这个“步子”就是步长 $\eta$,而让算法不乱的尺度,由目标函数的“脾气”决定——数学上叫 L-光滑:

这个式子的意思是:两点离得越近,它们的梯度差越被 $L$ 倍的距离压住。$L$ 越大,函数变化越陡峭,步长就必须越小。理论保证:只要步长满足 $\eta \le 1/L$,每一步目标函数都会稳定下降,不会出现“跑过头”的抖动。

有了这个保证,整条迭代序列会收敛到约束问题的最优解,而且速率有明确公式:

分母是 $2k$,意思是误差按 $1/k$ 的速度收缩——迭代 100 步,误差大约剩 1/100。这跟无约束梯度下降一个量级,说明投影这个“抱回”动作并没有显著拖慢收敛。有趣的是,约束问题的最优解通常就落在边界上:小满最终总是贴在坑边,而不是沙坑中央。

回到沙坑:妈妈给小满定了规矩——“每次只迈出刚好能停住的一小步”。于是小满再也不会在栏杆边弹来弹去,而是稳稳地一圈圈靠近,最后贴在朝向糖果的边界点上。数学里那个 $1/L$ 的步长上限,就是妈妈那句“小步走”的精确翻译。

∥∇f(x)−∇f(y)∥≤L∥x−y∥\displaystyle \lVert \nabla f(x) - \nabla f(y) \rVert \le L \lVert x - y \rVert
f(xk)−f∗≤L2k∥x0−x∗∥2\displaystyle f(x_k) - f^* \le \frac{L}{2k}\lVert x_0 - x^* \rVert^2
  1. 梯度差受控任意两点的梯度差不会超过它们距离的 $L$ 倍,这是光滑性的定义。
    ∥∇f(x)−∇f(y)∥≤L∥x−y∥\displaystyle \lVert \nabla f(x) - \nabla f(y) \rVert \le L \lVert x - y \rVert
  2. 目标间隙第 $k$ 轮的目标值离最优值还差多少,是我们要关掉的“差距”。
    f(xk)−f∗\displaystyle f(x_k) - f^*
  3. 收缩系数光滑常数 $L$ 除以迭代次数 $k$,越大越难、越走越小。
    L2k\displaystyle \frac{L}{2k}
  4. 初始距离起点离最优解越远,前期要“消化”的路程越长。
    ∥x0−x∗∥2\displaystyle \lVert x_0 - x^* \rVert^2

典型应用

最后一个问题:谁真的在用投影梯度?答案是——凡是“沙坑好投影”的地方都在用。先看名声最大的非负矩阵分解(NMF):把用户-物品打分矩阵分解成两个非负因子,因为打分和强度不可能是负数。目标写成:

这里的约束集是非负象限,投影就是逐元素取 $\max(\cdot, 0)$——一行代码的事。因此每轮迭代只需:分别对 $W$、$H$ 做一次梯度步,再把负值清零。对百万级矩阵,这种“便宜投影”的算法能在 GPU 上轻松跑几千步。

第二个常见场景是 L1 球约束:给参数加一个“总预算” $\lVert \beta \rVert_1 \le t$,希望大部分系数被压成 0,得到稀疏模型。L1 球的投影需要排序后做一次平移裁剪,虽然比箱约束麻烦一点,但仍然是高效的闭式方法。第三个场景是投资组合:权重必须非负且加和为 1,投影到单纯形(simplex)后同样可以一路梯度迭代。

这些场景共享同一个特征:可行域的形状“好抱”。非负象限像一面墙,球像一圈圆栏杆,单纯形像一块三角形的沙坑——它们的投影闭式可得,于是“走一步、抱一次”的循环可以在大规模数据上飞速运转。如果有一天你遇到一个投影本身就要解优化问题的约束集,请记住:那时该换工具了,投影梯度只爱“好抱的沙坑”。

min⁡W≥0, H≥0∥X−WH∥F2\displaystyle \min_{W \ge 0,\ H \ge 0} \lVert X - WH \rVert_F^2
  1. 数据矩阵 $X$被分解的原始数据,比如用户对歌曲的收听次数矩阵。
    X∈Rm×n\displaystyle X \in \mathbb{R}^{m \times n}
  2. 低秩分解用两个小矩阵 $W$、$H$ 的乘积近似 $X$,压缩存储并挖掘隐含结构。
    X≈WH\displaystyle X \approx WH
  3. F 范数平方所有元素残差的平方和,衡量近似质量。
    ∥X−WH∥F2\displaystyle \lVert X - WH \rVert_F^2
  4. 非负约束$W$ 和 $H$ 的每一项都必须非负,投影只需把负数清零。
    W≥0,  H≥0\displaystyle W \ge 0,\; H \ge 0

AI 应用场景

推荐系统中的非负矩阵分解

阶段:模型训练(约束优化求解)

解决的问题:用户-物品矩阵需要分解为“用户偏好”和“物品属性”两个因子,可解释性和物理意义要求因子非负(负数收听次数无意义)。传统 SVD 会分解出负值,无法直接解释;投影梯度把每次梯度步后的负值清零,迭代稳定,且每个操作都是逐元素运算,天然适合 GPU 并行。

具体案例:某音乐平台有 100 万用户、20 万首歌曲的稀疏收听矩阵。工程师用投影梯度做 NMF:每轮先对两个因子矩阵做梯度下降,再调用 max(W, 0) 投影,几千步后得到非负因子,用于计算“听完这首歌的用户还喜欢听什么”的相似推荐。

L1 球约束下的稀疏特征选择

阶段:特征工程、模型训练

解决的问题:高维数据里大量特征是噪声,L2 正则只能把系数缩小、不能真正置零。给参数加上 L1 球约束 $\lVert \beta \rVert_1 \le t$,等价于“总预算有限,你必须决定哪些特征值得花钱”,投影到 L1 球后,小系数被自动压缩成 0,得到稀疏可解释的模型。

具体案例:医疗团队用 5000 维血检指标预测疾病风险。数据里大部分指标其实无关。工程师用投影梯度求解带 L1 球约束的逻辑回归,每次迭代后把权重向量投影回 L1 球。训练完成,5000 个特征只剩 42 个非零,医生可以直接解读这些关键指标。

预算约束下的投资组合优化

阶段:决策优化推理

解决的问题:资产配置要求权重非负且加和为 1,这是一个单纯形约束。朴素梯度下降会给出负仓位或总和不为 1 的非法组合;把梯度步结果投影到单纯形上,即可保证每轮输出都是合规的配置方案。

具体案例:量化团队为 50 只股票分配权重,目标是最大化夏普比率,约束是权重非负、加和为 1、单只股票不超过 30%。团队用投影梯度迭代求解:梯度步后做一次单纯形投影,几百轮内得到稳定组合。

Python 演示

python33 行
import math def objective(x):    # 目标:中心在 (2, -1) 的二次函数    return (x[0] - 2.0) ** 2 + 3.0 * (x[1] + 1.0) ** 2 def gradient(x):    # 解析梯度    return [2.0 * (x[0] - 2.0), 6.0 * (x[1] + 1.0)] def project_ball(x, radius=1.0):    # 投影到半径 radius 的球内:没越界原样返回,越界等比缩回    norm = math.sqrt(x[0] ** 2 + x[1] ** 2)    if norm <= radius:        return x    scale = radius / norm    return [scale * x[0], scale * x[1]] def projected_gradient(x0, steps=500, lr=0.1, radius=1.0):    # 投影梯度主循环:先走梯度步,再投影拉回    x = list(x0)    for k in range(steps):        g = gradient(x)        x = [x[i] - lr * g[i] for i in range(2)]        x = project_ball(x, radius)    return x if __name__ == "__main__":    x_star = projected_gradient([0.0, 0.0])    true_x = [2.0 / math.sqrt(5.0), -1.0 / math.sqrt(5.0)]    print("投影梯度解:", [round(v, 6) for v in x_star])    print("理论最优解:", [round(v, 6) for v in true_x])    print("模长:", round(math.sqrt(x_star[0] ** 2 + x_star[1] ** 2), 6))
目的:演示“走完再拉回”的完整流程——梯度步把点推向无约束最优点,球投影把越界的点等比缩回到可行域边界。
  1. def gradient(x):手写解析梯度,这是“孩子朝糖果冲”的方向依据。
  2. def project_ball(x, radius=1.0):核心中的核心:妈妈抱回动作的数学实现。
  3. if norm <= radius:已经在沙坑内就不需要抱回,原样返回。
  4. scale = radius / norm越界时按比例整体缩放,方向不变,这正是圆沙坑的投影几何。
  5. x = [x[i] - lr * g[i] for i in range(2)]每个坐标沿负梯度方向走一步。
  6. x = project_ball(x, radius)走完立即拉回,两步一循环。
  7. true_x = [2.0 / math.sqrt(5.0), ...]手工推导的解析解:把 $(2,-1)$ 归一化到单位圆,用于验证程序。

常见误区

误区刚开始学投影梯度,以为投影就是“越界的数字直接砍到边界上”,无论什么约束集,暴力 clamp 就完事了。

正解投影的准确定义是“找可行域里最近的合法点”,不同几何的沙坑有完全不同的最优拉回方式。箱约束可以逐坐标裁剪,但圆球约束必须把整个向量等比缩放,单纯形约束甚至要先排序再做平移裁剪。如果拿箱约束的公式去投影球约束,得到的根本不是最近点,算法可能完全不收敛。

为何常见:最常接触的箱约束(clamp)太简单直观,“裁纸刀”的印象先入为主,让人忽略了其他集合的几何结构。

误区觉得每次迭代都要额外跑一个内部优化来算投影,开销必然翻倍,不如用其他方法。

正解投影梯度法之所以流行,恰恰因为常用的约束集投影都有闭式解:箱约束、球约束、非负象限、单纯形,全是 $O(n)$ 或 $O(n\log n)$ 直接算出,和梯度步本身同量级。真正需要内部迭代求解投影的是那些“难抱”的约束集,那种场景才应该考虑拉格朗日法或 ADMM。

为何常见:把“一般凸集的投影很贵”这个事实,错误地迁移到了“好投影集合”身上。

误区以为每一步越界都会被拉回,所以步长越大跑得越快,就算冲过头妈妈也会接住。

正解投影只修正位置,不修正“动量”。大步长会让点跳过最优位置,在边界两边反复横跳,甚至越跳越远直到发散。理论上要求步长不超过 $1/L$($L$ 是梯度 Lipschitz 常数),否则连单调下降都不保证。妈妈的“接住”不等于“刹车”,步子大了照样摔。

为何常见:把投影理解成一种安全网,误以为它自带稳定功能,忽略了步长分析。

误区学会了投影梯度这一个工具,就以为所有约束优化问题都能往里套,效果不好是调参问题。

正解投影梯度的前提是“投影足够便宜”。如果约束集是复杂凸锥、半定矩阵锥这类结构,投影本身就要迭代求解,外层再套迭代,整体代价急剧膨胀,这时应该换用内点法、拉格朗日法或 ADMM。方法没有绝对优劣,只有“沙坑好不好抱”的匹配问题。

为何常见:知识面局限于单一算法,看到“简单、通用”的宣传就忽略了它真正的适用边界。

面试题

Q1. 投影梯度法每次迭代的正确顺序是什么?

单选题 · easy

  • A.先投影到可行域,再沿梯度走一步
  • B.先沿梯度走一步,再投影回可行域← 正确答案
  • C.只做投影,不更新梯度
  • D.只沿梯度走,从不检查约束

答案:B。投影梯度的口号是“走完再拉回”:先按普通梯度走一步得到临时点,再把这个点投影回可行域。若先投影再走,相当于在可行域内走完一步后不检查,逻辑反了;只投影或只走步都丢弃了一半的必要操作,无法保证结果落在可行域内。

Q2. 投影算子 $P_C(y)$ 的数学定义是什么?

单选题 · easy

  • A.可行域 C 中离 y 欧氏距离最近的点← 正确答案
  • B.y 关于原点的对称点
  • C.C 的任意一个边界点
  • D.离原点最近的点

答案:A。投影的定义是“找最近点”:$P_C(y)=\arg\min_{x\in C}\lVert y-x\rVert$。它要求的是全可行域内距离最短的点,而不是随便一个边界点,更不是关于原点的对称操作。这就像妈妈一定把小满放在坑边离他最近处,而不是随便一放。

Q3. 以下哪些约束集具有简单的闭式投影?

多选题 · mid

  • A.箱约束 $[l, u]$← 正确答案
  • B.欧氏范数球 $\lVert x\rVert \le r$← 正确答案
  • C.任意非凸集合
  • D.非负象限 $x \ge 0$← 正确答案

答案:ABD。箱约束用逐坐标 clamp,球约束用等比缩放,非负象限是 clamp 到 0 的特例,三者都有闭式解。任意非凸集合的投影通常要解一个非凸优化,没有简单公式,这正是投影梯度的适用边界所在。

Q4. 点 y 到半径 r 的球 $\lVert x\rVert \le r$ 的投影是?

单选题 · mid

  • A.把每个坐标裁剪到 $[-r, r]$
  • B.若模长不超过 r 返回 y,否则返回 $r \cdot y/\lVert y\rVert$← 正确答案
  • C.把 y 沿径向平移 r 个单位
  • D.把 y 的所有坐标取反

答案:B。球约束的投影分两段:没越界原样返回,越界则保持方向、把模长压到 r,即 $r y/\lVert y\rVert$。逐坐标裁剪是箱约束的做法,用在球上会得到错误方向的可疑点;平移和取反更是与“最近点”的定义无关。

Q5. 箱约束 $x \in [l, u]^n$ 的投影公式是?

单选题 · mid

  • A.每个坐标独立执行 clamp 到 $[l_i, u_i]$← 正确答案
  • B.整个向量统一乘以一个常数
  • C.取每个坐标与下界的平均值
  • D.把所有坐标直接置为上界

答案:A。箱约束是对称的矩形沙坑,每维互不影响,所以逐坐标 clamp 就是精确投影。整体缩放会破坏已在区间内的坐标,取均值或直接置上界都不满足“距离最近”的定义。这是箱约束和球约束最直观的区别。

Q6. 投影梯度法收敛通常需要哪些条件?

多选题 · mid

  • A.目标函数梯度满足 L-Lipschitz 光滑条件← 正确答案
  • B.步长取合适值如 $\le 1/L$← 正确答案
  • C.约束集 C 是凸集← 正确答案
  • D.初始点必须落在可行域边界上

答案:ABC。光滑性保证梯度不会突变,合适步长保证每步稳定下降,凸约束集保证投影算子的良定义和非扩张性。初始点并不要求贴边界,从可行域内任意点出发都可以,边界位置是迭代自然收敛的结果而非前提。

Q7. f 是 L-光滑凸函数,步长取 $1/L$ 时投影梯度法的迭代复杂度是?

单选题 · hard

  • A.$O(1/\sqrt{k})$
  • B.$O(1/k)$← 正确答案
  • C.$O(1/k^2)$
  • D.$O(k)$

答案:B。误差上界是 $L/(2k)\lVert x_0-x^*\rVert^2$,分母的 k 说明迭代 k 轮后误差按 $1/k$ 收缩,这是投影梯度在光滑凸问题上的标准一阶速率。$O(1/k^2)$ 是加速方法(如 FISTA)的速率;$O(1/\sqrt{k})$ 通常对应不可导或强凸分析中的保守界。

Q8. 为什么非负矩阵分解(NMF)特别适合用投影梯度求解?

多选题 · mid

  • A.非负约束的投影就是逐元素取 $\max(\cdot, 0)$,极简单← 正确答案
  • B.每步都是闭式解,无需内层迭代← 正确答案
  • C.逐元素操作适合大规模稀疏矩阵的 GPU 加速← 正确答案
  • D.目标函数必须是凸的才能使用

答案:ABC。非负约束的投影只有一行代码,且是完全逐元素的操作,天然并行;配合梯度步形成闭式迭代,没有嵌套循环。投影梯度对非凸目标仍然实用(收敛到稳定点),NMF 本身就非凸,所以“必须凸”的说法不成立。

Q9. 如果梯度步后的点 y 仍在可行域内,投影算子会返回什么?

单选题 · easy

  • A.原样返回← 正确答案
  • B.强制挪到边界上
  • C.挪到原点
  • D.丢弃该次迭代

答案:A。投影是找可行域内最近的合法点;如果 y 本身就在可行域内,距离最近的点就是它自己,$P_C(y)=y$。孩子没有越界,妈妈当然不用出手,强行挪到边界或原点反而制造了无意义的扰动。

Q10. 关于投影梯度法,以下说法错误的是?

单选题 · hard

  • A.本质是走一个未约束梯度步,再把结果投影回可行域
  • B.约束问题的最优解往往落在可行域边界上
  • C.投影算子的计算代价决定了方法是否高效
  • D.对任意约束集,投影都能在 O(n) 闭式完成← 正确答案

答案:D。A 正是投影梯度的核心思想;B 是对的,因为若最优解在内部,约束就不起作用,而真正称得上“约束问题”的场景解多在边界;C 也正确,方法的前提就是投影便宜。D 是错的:只有箱、球、单纯形等好投影集合才有闭式解,任意复杂约束集的投影本身就要迭代求解。