第 6 章 优化与学习算法

前五章建立了"如何表示数据、如何度量不确定性、如何稳定地算数"三块地基;本章回答第四个问题:给定一个损失函数,参数究竟怎样才能被"算"出来。优化是连接模型定义与模型能力的唯一通道。

学习目标

读完本章,你应当能够:

  1. 判断一个集合是否凸集、一个函数是否凸函数,并用一阶判据或二阶判据(Hessian 半正定)给出证明;
  2. 推导梯度下降、动量法、Nesterov、Adam 的更新式,并解释每一步引入的原因;
  3. 辨析批梯度下降、SGD、Mini-batch SGD 的梯度方差关系,说明为什么梯度噪声既有害也有益;
  4. 写出Adam 偏差校正的完整推导,并解释 AdamW 中权重衰减解耦的必要性;
  5. 说明学习率 warmup 的作用机理,以及固定学习率为什么只能收敛到最优解的邻域;
  6. 使用拉格朗日乘子法与 KKT 条件求解带约束的优化问题,理解对偶问题为 SVM 与正则化所做的铺垫。

前置知识检查

你需要知道在哪一节补齐
梯度的定义与方向含义、链式法则6.3.1 从一阶泰勒展开重新导出梯度下降
多元函数的二阶导数、矩阵正定与半正定6.1.3 二阶判据;第 3 章 3.2 节给出正定矩阵的等价条件
期望、方差、无偏估计6.4.2 从样本平均导出无偏性;第 4 章 4.4 节给出期望与方差的基本运算
指数加权平均的直觉6.4.4 逐步展开动量法的递推式
拉格朗日乘子(高数中的等式约束版本)6.6.1 从等式约束重新推导,并推广到不等式约束
条件数与病态问题6.3.3 条件数对收敛速度的影响;第 5 章 5.5 节给出条件数的数值视角

6.1 凸性:为什么它决定了优化问题的难度

6.1.1 凸集与凸函数

凸集(convex set) 的定义只有一句话:集合 C 是凸集,当且仅当对任意 x, y ∈ C 和任意 θ ∈ [0,1],都有

θx + (1−θ)y ∈ C

这句话的几何含义是:集合中任意两点的连线整条都留在集合内。直线、超平面、半空间、球、多面体都是凸集;圆环、月牙、两个不相交圆盘的并集都不是凸集(连线会跑出去)。

凸函数(convex function) 的定义是其上图像(epigraph)为凸集,等价地可写成 Jensen 形式:对任意 x, y ∈ dom f 与 θ ∈ [0,1],f(θx + (1−θ)y) ≤ θf(x) + (1−θ)f(y)。右侧是两点连成的弦,所以凸函数的直观图像是弦在函数图像上方、图像向下弯曲(像碗)。线性函数既凸又凹,是唯一同时满足两者的函数族。

注意

本章所有 f 均默认定义域为凸集、取值实数,且至少二阶可微。若某处只需一阶可微(如次梯度场景),会显式说明。

6.1.2 一阶判据

定理(一阶判据):可微函数 f 是凸函数,当且仅当对任意 x, y,

f(y) ≥ f(x) + ∇f(x)ᵀ(y − x)

右侧是 f 在 x 处的一阶泰勒展开,即该点的切平面。这个不等式的意思是:凸函数的切平面永远在函数图像下方,切平面是它的一个全局下界。

这条判据是整章最有用的工具,它把"关于函数形状的全局命题"转化成了"关于梯度的一个不等式"。立刻得到两个结论:最优性——若 ∇f(x*) = 0,则 f(y) ≥ f(x*) + 0,故 x* 是全局最小值点;单调性——⟨∇f(x) − ∇f(y), x − y⟩ ≥ 0,即梯度场不会"反着指"。前者就是"凸问题的局部最优即全局最优",证明只有两行,这正是凸性的全部价值。

6.1.3 二阶判据

定理(二阶判据):二阶可微函数 f 是凸函数,当且仅当其 Hessian 矩阵处处半正定(positive semidefinite, PSD):

∇²f(x) ⪰ 0,即对任意 v ≠ 0 都有 vᵀ∇²f(x)v ≥ 0

推导思路:把一阶判据中的 y 取为 x + tv(t 很小),沿方向 v 做一元展开。令 g(t) = f(x + tv),则 g″(0) = vᵀ∇²f(x)v。而一元函数凸 ⟺ g″ ≥ 0,逐个方向成立就得到 PSD。

vᵀ∇²f(x)v 有一个必须记住的解释:它是函数在 x 处沿方向 v 的二阶方向导数,度量的是"往 v 方向走,坡度变化得多快",也就是曲率。所以二阶判据说的是:所有方向的曲率都非负,碗怎么切都是往上翘的。若进一步 ∇²f(x) ≻ 0(正定),称为严格凸,此时最小值点至多一个。

1
2
3
4
5
6
7
8
9
一维情形(f: R → R)
  f''(x) ≥ 0    ∀x     ⟺  f 是凸函数        (碗形)

二维情形
  ∇²f = [[∂²f/∂x₁², ∂²f/∂x₁∂x₂],
         [∂²f/∂x₂∂x₁, ∂²f/∂x₂²]]
  半正定 ⟺ 特征值 λ₁, λ₂ ≥ 0
         ⟺ 行列式 ≥ 0 且 迹 ≥ 0   (仅二维可用这个简化判据)
  一个鞍面 f = x₁² − x₂²:λ = (+2, −2),非凸,x=0 是鞍点而非极小点

6.1.4 保持凸性的运算

真正让凸性成为工程工具的是保凸运算——它们让人可以像搭积木一样直接判定复合损失的凸性。

运算结论说明
非负加权和αf + βg 凸(α, β ≥ 0)多项凸损失相加仍凸
仿射复合f(Ax + b) 凸(f 凸)线性模型能保持凸性的关键
逐点最大值max(f₁, …, f_m) 凸Hinge 损失由此保凸
凸函数复合凸非减函数h(f(x)) 凸(h 凸且非减)如 exp(f)、max(f, 0)
部分变量最小化g(x) = min_y f(x, y) 凸(f 联合凸)对偶问题的保凸基础
取负 / 乘负数不保持−f 是凹函数;Hessian 变号

案例:为什么"凸损失 + 线性模型"一定是凸优化问题。 逻辑回归的损失是

L(w) = Σ_i ln(1 + e^(−y_i wᵀx_i)),其中 y_i ∈ {−1, +1}

拆解成保凸运算的链条:z ↦ ln(1 + e^(−z)) 是凸且非减的(其一阶导 −σ(−z) < 0,二阶导 σ(z)σ(−z) > 0);z_i = y_i wᵀx_i 是 w 的仿射函数;再对 i 求和是非负加权和。三步都是保凸运算,因此 L(w) 关于 w 全局凸,不存在局部极小陷阱。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
显式验证(09-09 选择 Q4 的深层原因)
  单样本损失 ℓ(z) = ln(1 + e^(−z)),z = y·wᵀx
  ℓ'(z)  = −1/(1 + e^(z)) = −σ(−z)
  ℓ''(z) = e^(z)/(1 + e^(z))² = σ(z)·σ(−z)  > 0   (严格凸)
  ∂L/∂w  = Σ_i ℓ'(z_i)·(−y_i x_i) = −Σ_i y_i x_i σ(−y_i wᵀx_i)
  ∇²L    = Σ_i σ(z_i)σ(−z_i)·x_i x_iᵀ  ⪰ 0        (半正定,凸)✓

对照:若把损失换成 MSE,ℓ(z) = (σ(z) − y)²
  ℓ''(z) = 2σ'(z)² + 2(σ(z) − y)σ''(z)
  当 y=1、z=−6 时 σ ≈ 0.0025,代入得 ℓ'' ≈ −0.0049 < 0  ⟹ 非凸

顺带解释了第 9 章要讲的"交叉熵 vs MSE"之争:梯度里 σ′ 因子被约掉(交叉熵导数 σ(z) − y 中不含 σ′)与Hessian 半正定是同一件事的两面——非凸只是表象,根因是 MSE 把 Sigmoid 的饱和非线性卷进了损失函数。

6.1.5 凸性为什么重要,以及非凸怎么办

凸性带来三个别的性质都没有的保证:

  1. 局部最优即全局最优(6.1.2 结论 1);
  2. 一阶方法有全局收敛速率(6.2.2 的下降引理对全程成立,不只是局部);
  3. 对偶间隙为零(6.6.3),从而有 KKT 充分必要条件。

现实中的深度网络损失非凸,处理方式有四类,理解它们的适用边界比记住名称更重要:

思路做法代价 / 局限
接受局部最优直接跑 SGD 到梯度很小就停现代过参数化网络中,绝大多数局部极小点的损失值都接近全局最优
逃离鞍点利用梯度噪声、动量、扰动高维空间中鞍点远多于局部极小点,这才是主要障碍
凸松弛把非凸问题放松成凸问题(如 ℓ₀ → ℓ₁)解的是"代理问题",需论证两者解的一致性
凸替代换损失函数(MSE → 交叉熵)只对本身存在凸表述的模型可用

重要

鞍点才是高维非凸问题的主要障碍。 若某点是局部极小点,要求 Hessian 的 全部 d 个特征值都为正;若某点是鞍点,只需至少一个特征值为负。在高维空间中后者的概率远大于前者,这正是 SGD 的梯度噪声如此重要的原因——见 6.3.3。

6.2 梯度下降族

6.2.1 从一阶泰勒展开导出梯度下降

设 f 可微,在 w_t 处做一阶泰勒展开,并沿方向 d(‖d‖ = 1)走一小步 η:

f(w_t + ηd) ≈ f(w_t) + η∇f(w_t)ᵀd

要让右侧最小化即让 ∇f(w_t)ᵀd 最小。由 Cauchy–Schwarz 不等式,∇f(w_t)ᵀd ≥ −‖∇f(w_t)‖,等号在 d = −∇f(w_t)/‖∇f(w_t)‖ 时取到,因此负梯度方向是下降最快的方向(最速下降法,steepest descent):

w_{t+1} = w_t − η∇f(w_t)

这里有一个常被忽略的限制:泰勒展开只在局部有效。若 η 太大,真实值可能远高于一阶近似,甚至高于 f(w_t),“下降"就变成了"上升”。定量化这一点就得到下降引理。

6.2.2 步长与收敛:下降引理

定义(L-光滑):若 f 的梯度是 Lipschitz 连续的,常数 L > 0,即 ‖∇f(x) − ∇f(y)‖ ≤ L‖x − y‖,则称 f 是 L-光滑的。对二阶可微函数,L 可取为 Hessian 最大特征值的上界:L = max_x λ_max(∇²f(x))。

下降引理:L-光滑函数满足

f(y) ≤ f(x) + ∇f(x)ᵀ(y − x) + (L/2)‖y − x‖²

把 y = x − η∇f(x) 代入:

1
2
f(w_{t+1}) ≤ f(w_t) − η‖∇f(w_t)‖² + (L/2)·η²‖∇f(w_t)‖²
           = f(w_t) − η(1 − Lη/2)·‖∇f(w_t)‖²

括号里的系数决定了每次迭代能不能真的下降:

步长 η系数 η(1 − Lη/2)结果
0 < η < 1/L正,且 η = 1/L 附近最大单调下降,最快的保证步长是 1/L
η = 1/L1/(2L)保证每步至少降 ‖∇f‖²/(2L)
1/L < η < 2/L仍为正,但变小仍下降,但过冲导致震荡
η ≥ 2/L≤ 0,不等式失去保证可能直接发散

结论:η < 2/L 是梯度下降稳定的必要条件,实践中取 η = 1/L 量级再搜索。这解释了工程直觉——曲率越大的损失(L 越大)必须用越小的学习率,学习率不是可以随便调的玄学参数。

6.2.3 条件数如何决定收敛速度

对二次型损失 f(w) = (1/2)wᵀAw − bᵀw,∇f = Aw − b,∇²f = A。把 A 谱分解为 A = QΛQᵀ 并令 u = Qᵀ(w − w*),各分量完全解耦:

1
2
3
u_{t+1,i} = (1 − ηλ_i)·u_{t,i}          (λ_i 为 A 的第 i 个特征值)
各分量收敛 ⟺ |1 − ηλ_i| < 1 ⟺ 0 < η < 2/λ_max
最优步长下最慢分量的收缩因子 ≈ (κ − 1)/(κ + 1),  κ = λ_max/λ_min

这个式子把两件事说透了:收敛速度由 κ = λ_max/λ_min 单独决定,与维度无关(κ = 100 时每步只收缩 98%,需要数百步);最慢的分量对应最小的 λ_min,即损失面最平坦的方向——要走完这个方向必须用大步长,而大步长又会让 λ_max 方向发散,这正是梯度下降在病态问题上"震荡着慢慢爬"的根源。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
等高线视角(κ 很大时)

      λ_min 方向(平坦:等高线稀疏)
        ↑
        |   ●───→  zigzag 震荡(λ_max 方向大步过冲)
        |  ↙ ●
        | ●       理想方向:直指最优
        |↙
        ●━━━━━━━━━━━━━━━━→   λ_max 方向(陡峭:等高线密集)

  修正手段:动量(6.4.2)、自适应步长(6.4.4)、
            白化 / 归一化(第 13 章)、预条件(用 ∇²f 的近似去乘梯度)

提示

记忆锚点:条件数 = 损失面的"长宽比"。所有优化技巧(动量、Adam、归一化)本质上都在做同一件事——削弱长宽比带来的各向异性,让平坦方向走得快、陡峭方向走得稳。

6.3 随机梯度下降

6.3.1 从全量梯度到小批量

真实损失是全部 N 个样本的平均:L(w) = (1/N)Σ_{i=1}^{N} ℓ(w; x_i, y_i)。当 N 达百万级,算一次 ∇L 就要遍历全量数据,代价不可接受。

抽样 B 个样本(B ≪ N)构造小批量(mini-batch)估计:

g_B(w) = (1/B)Σ_{i∈B} ∇ℓ(w; x_i, y_i)

无偏性:若 B 是从 {1, …, N} 中均匀随机抽取,则

1
2
3
E_B[g_B(w)] = (1/B)·Σ_{i∈B} E[∇ℓ(w; x_i, y_i)]
            = (1/B)·B·(1/N)Σ_{i=1}^{N} ∇ℓ(w; x_i, y_i)
            = ∇L(w)                       ✓ 无偏

这是整个深度学习训练的统计学基石。“均匀随机抽取"是必须的前提:若按固定顺序取连续样本,样本间存在相关性,E[g_B] 会带上系统性偏差(例如数据按类别排序时,一个 batch 内全是同一类)。

方差与批大小的关系:设单个样本梯度的协方差为 Σ_g、样本独立抽取,则 Cov(g_B) = Σ_g/B,即 Var(g_B) ∝ σ²/B,标准差按 1/√B 下降。这条式子解释了两个工程事实:批大小翻 4 倍梯度噪声只减半,而计算量翻 4 倍(收益递减);噪声标准差只与批大小有关、与数据规模无关,因此降噪声只能加批,不能加数据量。

6.3.2 三种更新式对照

名称每次用的样本单步梯度代价梯度方差硬件效率
批梯度下降(BGD)全部 NO(N)0(精确梯度)高
随机梯度下降(SGD)1O(1)σ²极低(GEMM 退化为向量运算)
Mini-batch SGDB(常取 32~4096)O(B)σ²/B高(可利用矩阵乘法并行)

更新式三者完全一致,只是 g 的估计方式不同:w_{t+1} = w_t − η_t·g_B(w_t)。

Mini-batch 的工程意义:它同时拿到了 SGD 的"每步都很便宜"和 BGD 的"能用上 GPU 矩阵引擎”。一个 batch 的梯度计算是大 GEMM,算术强度高;而单样本更新是矩阵–向量乘,受显存带宽限制(第 19 章给出完整的 Roofline 分析)。因此批大小首先是一个硬件效率参数,其次才是一个统计参数。

6.3.3 梯度噪声的两面性

噪声的害处很直接:g_B ≠ ∇L,每一步都不是朝着真实最优点走的。噪声的好处同样是决定性的:①逃离鞍点——鞍点处精确梯度为零,BGD 会永远停住,噪声让参数继续漂移直到走出负曲率区;②隐式正则化——噪声让参数停在较宽的平坦极小点而非尖锐极小点,后者对扰动敏感、泛化差(第 8 章从另一角度讲同一件事);③类退火探索——噪声强度约 η/√B,可类比温度,早期高、后期随 η 衰减降温。

1
2
3
4
噪声强度 ∝ η / √B
  ├─ 噪声太大(η 大 / B 小):无法收敛,在最优点附近大幅震荡
  └─ 噪声太小(η 小 / B 大):卡在鞍点或尖锐极小点,泛化变差
  ⟹ 实践策略:先大后小(warmup + 衰减),或"小批训练 + 后期增大批大小"

警告

递增批大小(batch size ramp)不是玄学。 训练后期若保持同一学习率而把批减小,噪声会突然增大,已收敛的参数被打散。反过来,当学习率按余弦衰减到接近零时,可以安全地把批大小线性放大(“平方根缩放规则”:η ∝ √B 保持噪声强度不变),既节省训练步数又不破坏稳定性。

6.4 动量、Nesterov 与 Adam

6.4.1 为什么梯度噪声会影响收敛:Robbins-Monro 条件

在给出算法之前,先明确"收敛"在随机优化中的含义。设 η_t 是第 t 步的学习率,Robbins-Monro 条件为

1
2
Σ_{t=1}^{∞} η_t = ∞        (步长总和发散)
Σ_{t=1}^{∞} η_t² < ∞       (步长平方和收敛)

两条各自的作用完全不对称:第一条保证"能走到"——若 Ση_t < ∞,从任意初值走过的总路程有限,可能压根到不了最优解附近;第二条保证"噪声被压住"——随机梯度的方差项在误差上贡献 Ση_t²·σ² 量级,只有这个和有限,噪声的累积偏差才会消失。

η_t = 1/t 同时满足两条:Σ1/t = ∞(调和级数发散),Σ1/t² = π²/6 < ∞。而任何固定学习率 η_t = η 都违反第二条(Ση² 发散),因此固定学习率的 SGD 只能收敛到最优解附近的邻域并在其中持续震荡——这正是【08-05 选择 Q19】选项 D 被判定错误的原因,也是"凸损失 + SGD 一定收敛到全局最优"的精确边界。邻域半径的直觉是:每步噪声注入量约 η²σ²,稳态下"注入 = 收缩",故半径约 ησ² 量级——想缩小邻域只能减小 η,想让 η → 0 就必须让它按 1/t 这类速率衰减。

6.4.2 动量法(Momentum)

问题:6.2.3 已指出 κ 很大时梯度下降在陡峭方向震荡、平坦方向爬得慢,震荡的根源是相邻两步的梯度方向相反。思路:把历史梯度做指数移动平均(EMA),让同向成分累加、反向成分相消。

1
2
v_t     = β·v_{t−1} + (1 − β)·g_t          ← 速度(动量缓冲区)
w_{t+1} = w_t − η·v_t

递推展开得 v_t = (1 − β)·Σ_{k=0}^{t−1} β^k·g_{t−k}:权重随 k 指数衰减,等效平均窗口约 1/(1−β) 步(β = 0.9 约 10 步,β = 0.99 约 100 步)。两个方向上的行为完全不同,这正是动量能"抑制震荡、加速平坦"的原因:

方向相邻梯度符号v_t 的表现结果
陡峭方向(λ_max)正负交替正负项相消,‖v‖ 被压低步长自动缩小,震荡被抑制
平坦方向(λ_min)长期同号各项累加,‖v‖ 放大到约 1/(1−β) 倍步长自动放大,推进被加速

用 6.2.3 的特征分解可定量算出,动量把每个方向的有效学习率改成 η_eff,i = η/(1 − β(1 − ηλ_i)):λ_i 小时 η_eff ≈ η/(1−β),放大 1/(1−β) 倍;λ_i 大时分母变大、被压低。有效条件数从 κ 收缩到约 √κ,收敛步数从 O(κ) 降到 O(√κ)。

动量法与"重球法(heavy ball)“是同一件事:把 v 解释为速度、w 解释为位置,更新式正是带摩擦项 (1−β) 的离散牛顿第二定律。物理直觉在这里不是比喻,而是字面成立的。

6.4.3 Nesterov 加速梯度(NAG)

问题:标准动量用当前点 w_t 的梯度,但参数实际会被动量推向 w_t − ηβv_{t−1} 附近,在陡坡前"看到梯度时已经冲过去了”。思路:先按动量预走一步到前瞻点(lookahead point),再在前瞻点处取梯度:

1
2
3
4
w̃_t    = w_t − η·β·v_{t−1}                ← 前瞻点(先按惯性探一步)
g_t    = ∇L(w̃_t)                          ← 在探到的位置取梯度
v_t    = β·v_{t−1} + (1 − β)·g_t  (或 v_t = β·v_{t−1} + g_t,两种等价写法)
w_{t+1}= w_t − η·v_t

为什么更快:若前瞻点处的梯度与惯性方向相反,说明"已越过谷底、开始上坡",修正项立刻把速度往回拉,从而在到达陡坡之前就减速;标准动量要等到真正过冲后才能纠正。收敛速率相应从 O(1/t) 提升到 O(1/t²)(凸情形),这就是"加速"一词的来源。

提示

一句话区分:动量是"先看路再走"(用旧位置梯度),Nesterov 是"先迈一步再看路"(用前瞻点梯度)。工程上二者差别通常不大,但 Nesterov 在大 β 时更稳。

6.4.4 Adam:自适应矩估计

动量解决了"方向"问题,但没有解决"每个参数该用多大步长"的问题——6.2.3 表明不同方向的曲率差异极大,而一个标量 η 无法同时适配。Adam(Adaptive Moment Estimation)的核心是为每个参数维度单独维护步长。

1
2
3
4
5
6
一阶矩(梯度均值)  m_t = β₁·m_{t−1} + (1 − β₁)·g_t
二阶矩(梯度平方)  v_t = β₂·v_{t−1} + (1 − β₂)·g_t²
偏差校正            m̂_t = m_t/(1 − β₁ᵗ),   v̂_t = v_t/(1 − β₂ᵗ)
参数更新            w_{t+1} = w_t − η·m̂_t/(√v̂_t + ε)

默认超参:β₁ = 0.9, β₂ = 0.999, ε = 1e−8

偏差校正为什么必须做

初始 m_0 = 0、v_0 = 0,递推展开得 m_t = (1 − β₁)·Σ_{k=1}^{t} β₁^(t−k)·g_k。若梯度大致平稳(g_k ≈ g),则

E[m_t] ≈ (1 − β₁)·g·(1 − β₁ᵗ)/(1 − β₁) = g·(1 − β₁ᵗ)

所以 m_t 是真实一阶矩的 (1 − β₁ᵗ) 倍,是严重低估的估计:t = 1 时 m_1 = 0.1g 只有真值的 1/10,β₁ = 0.9 时要到 t ≈ 22 步才恢复到 90%。除以 (1 − β₁ᵗ) 恰好抵消这个系统性收缩因子,使 E[m̂_t] = E[g]。

二阶矩的校正更关键,因为 β₂ = 0.999 衰减极慢,(1 − β₂ᵗ) 在前几百步都显著小于 1。若不校正,√v̂_t 被严重低估,η·m̂_t/√v̂_t 反而被放大,初期有效步长大得离谱、训练直接发散。

1
2
3
4
5
不校正 vs 校正(β₂ = 0.999)
t   (1−β₂ᵗ)   √v̂ 相对真值     后果
1   0.001     31.6%           步长被放大约 3 倍(若梯度非零)
10  0.00995   99.7%           基本恢复
⟹ 前 ~10 步是 Adam 最危险的窗口,必须靠 warmup 兜住

即便校正后,√v̂_t 的方差在第 1 步仍是无穷大(只有一个样本估计二阶矩),初期步长依然不可靠——这是 6.5.2 中 warmup 必要性的另一半理由。

重要

Adam 的更新量有一个极具工程价值的性质:|Δw| ≈ η·m̂/√v̂,其量级由 m̂/√v̂ ∈ (−1, 1) 界定(因为 √v̂ 是梯度的 RMS 尺度)。也就是说,Adam 的单步更新幅度近似等于 η,与梯度绝对大小无关。这让 Adam 对梯度尺度不敏感——梯度整体乘以常数 c,m̂ 与 √v̂ 同时乘 c,比值不变。

AdamW:权重衰减解耦

L2 正则的传统做法是把惩罚项加进损失:L̃ = L + (λ/2)‖w‖²,于是 g_t ← g_t + λw_t。在普通 SGD 里这等价于每步额外收缩 (1 − ηλ) 倍权重;但在 Adam 里不等价,因为惩罚项的梯度也进了 m 和 v:

1
2
3
4
5
6
解耦前(L2 进损失):
    g_t ← g_t + λ·w_t
    w_{t+1} = w_t − η·m̂_t/(√v̂_t + ε)      ← 衰减量被 √v̂ 归一化,失去"按 λ 均匀收缩"的含义
解耦后(AdamW):
    w_{t+1} = w_t − η·m̂_t/(√v̂_t + ε) − η·λ·w_t = (1 − ηλ)·w_t − η·m̂_t/(√v̂_t + ε)
                         ↑ 梯度更新        ↑ 权重衰减,独立加在外层

为什么解耦更好:λw_t 被 √v̂_t 归一化后,等效衰减强度变成逐维且时变——梯度历史小的维度衰减得少、大的衰减得多,这既不是"均匀收缩范数"的本意,也让 λ 失去"正则化强度"的可调语义。解耦后每个维度每步精确乘 (1 − ηλ),λ 恢复"控制权重范数收缩速率"的含义。

维度Adam + L2(耦合)AdamW(解耦)
衰减在更新式中的位置梯度的加法项,进入 m̂, v̂独立乘法项 (1−ηλ)
等效衰减强度逐维、时变,被 √v̂ 调制逐维均匀,恒定 ηλ
与 Adam 自适应步长的交互有(衰减方向也被归一化)无
λ 的语义模糊明确的权重范数收缩率
实践表现泛化偏弱大模型训练的事实标准

6.5 学习率调度与 warmup

6.5.1 常用调度曲线

学习率是训练中最重要的超参数,原因见 6.2.2:η 必须小于 2/L 才能稳定,而在 1/L 附近下降最快。但 L 会随训练变化(越接近极小点,局部曲率越大),一个固定的 η 无法全程最优。

调度形式适用场景特点
常数η_t = η₀微调、小模型、调试基线简单;违反 6.4.1 第二条,后期在邻域内震荡
Step decay每到里程碑乘 γ(如每 30 epoch × 0.1)传统 CNN 训练需要人工设里程碑;曲线有阶跃
线性衰减η_t = η₀(1 − t/T)Transformer 预训练(常见)平滑;末期步长趋零,收敛干净
余弦退火η_t = η_min + (η₀ − η_min)·(1 + cos(πt/T))/2大模型预训练主流前期衰减慢、中期快、末期极慢;末段"低温精修"效果好
反平方根η_t = η₀/√t满足 Robbins-Monro;理论分析的默认选择Ση_t = ∞、Ση_t² < ∞ 两条都满足
1/t 衰减η_t = η₀/(1 + kt)凸问题理论最优收敛速率最匹配 6.4.1
循环 / One-cycle先升后降回到起点快速收敛实验(super-convergence)需要能承受中途的高学习率
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
余弦退火 vs 线性衰减(η₀ = 1e−3,T = 100 步)

1e−3 |●                         Cosine
     | ●●                       Linear
     |   ●●●___                  
     |        ●●●●●●●●___       
     |                  ●●●●●●  
  0  |________________________●__
     0        50              100
  余弦前期更愿意"多走几步"(衰减慢),
  末期却压得更低(在极小点附近更精细),
  这正是它在大模型预训练中胜出的原因。

6.5.2 warmup 的作用机理

warmup 是在训练最开始用很小的学习率,在若干步内线性爬升到 η₀,然后接余弦或线性衰减。它解决"训练最开始的几步最容易崩"这个问题,有四个具体机理:①Adam 二阶矩估计不可靠——v̂_t 由极少数样本的梯度平方估计而来,第 1 步更是只有一个样本,√v̂_t 的统计波动极大,m̂/√v̂ 可能是个巨大的数,一步就把参数打飞;②参数离最优远、梯度本身很大——随机初始化时每个样本的损失都大,梯度范数处于整个训练的最大值,而 ‖Δw‖ ≈ η(6.4.4 的性质),直接给 η₀ 会让初期参数剧烈跳变;③需要建立稳定的小批量统计量——归一化层(BN/LN)的 running statistics 在前几十步还很粗糙,warmup 给它们一段"低风险"的适应期(第 13 章 13.3 节);④为自适应优化器提供预热轨迹——动量与二阶矩需要若干步才能积累到有意义的窗口长度(1/(1−β₂) = 1000 步)。

警告

warmup 不是万能稳定剂,它与梯度裁剪必须配合使用。 warmup 只约束"平均步长",无法防住偶发的梯度尖峰(如某个异常样本产生 100 倍于常态的梯度)。这类尖峰需要梯度裁剪按范数硬截断(见第 13 章 13.5 节)。反之,只做裁剪不做 warmup,则初期每一步都在裁剪阈值上"贴顶",等效于恒定步长,稳定性仍然不足。【08-05 选择 Q20】把 warmup、梯度裁剪、混合精度并列为三项标准稳定性手段,正是因为它们各自堵住了不同的漏洞。

6.6 约束优化初步:拉格朗日乘子、KKT 与对偶

6.6.1 等式约束与拉格朗日乘子

问题:min_w f(w),约束 h(w) = 0(h: R^d → R^p)。直觉:在最优点 w*,若可行集是一条曲线,则沿曲线移动不能降低 f,即 ∇f(w*) 必须与曲线的切方向正交;而曲线的切方向又与 ∇h(w*) 正交(因为 h 恒为 0)。在 p = 1 时两者必然共线:

∇f(w*) + ν∇h(w*) = 0,ν 称为拉格朗日乘子(Lagrange multiplier)

结论:构造拉格朗日函数 L(w, ν) = f(w) + νh(w),则原问题的最优解满足 ∇_w L = 0 且 ∇_ν L = h(w) = 0——约束优化被转化成无约束问题的一个驻点。ν 的含义(必须记住):ν = −∂f*/∂b,其中 b 是约束右端项 h(w) = b,即 ν 度量"放松一单位约束能带来多少目标函数收益"。它既是"影子价格",也是 SVM 中对偶变量 α 之所以重要的原因。

6.6.2 KKT 条件

问题:同时含等式与不等式约束 min_w f(w),s.t. h_i(w) = 0,g_j(w) ≤ 0。构造 L(w, ν, α) = f(w) + Σ_i ν_i h_i(w) + Σ_j α_j g_j(w)。Karush-Kuhn-Tucker(KKT)条件为

1
2
3
4
5
① 平稳性(stationarity)    ∇_w L = 0
                            ⟹ ∇f(w*) + Σ_i ν_i∇h_i(w*) + Σ_j α_j∇g_j(w*) = 0
② 原始可行性(primal)      h_i(w*) = 0  ∀i,    g_j(w*) ≤ 0  ∀j
③ 对偶可行性(dual)        α_j ≥ 0      ∀j
④ 互补松弛(complementary slackness)  α_j·g_j(w*) = 0   ∀j

第 ④ 条是全部要点所在:α_j > 0 的约束必须恰好取等号(g_j = 0,称为活跃约束),而 g_j < 0 的约束必须 α_j = 0——在最优解处,只有"顶到边界"的约束才起作用。

重要

凸问题中 KKT 是充要条件:若 f、g_j 凸、h_i 仿射,则满足 KKT ⟺ 是全局最优解;非凸问题中 KKT 只是必要条件(驻点,可能是鞍点)。这就是 6.1 节的全部价值——凸性把"必要条件"升级为"充分条件"。

SVM 的伏笔(第 9 章展开):硬间隔 SVM 的约束是 y_i(wᵀx_i + b) ≥ 1,写成 g_i = 1 − y_i(wᵀx_i + b) ≤ 0。由互补松弛,α_i > 0 的样本恰好是那些 y_i(wᵀx_i + b) = 1 的样本——它们落在间隔边界上,就是支持向量(support vector)。于是 w* = Σ_i α_i y_i x_i 这个结论不是巧合,而是 KKT 的直接产物:真正决定分界面的只有支持向量。

6.6.3 对偶问题

定义拉格朗日对偶函数 q(ν, α) = min_w L(w, ν, α)。由于 L 关于 w 是仿射族的逐点最小值,q 必然是凹函数(这正是 6.1.4 中"部分变量最小化保凸"的体现)。对偶问题为

max_{ν, α ≥ 0} q(ν, α)

弱对偶:对任意可行 (ν, α),都有 q(ν, α) ≤ p*(原问题最优值)。证明只需两步:q(ν,α) = min_w L ≤ L(w*,ν,α) ≤ f(w*)(第二个不等号用到 α ≥ 0、g ≤ 0 与 h = 0)。因此对偶最优值永远不超过原问题最优值。

强对偶与 Slater 条件:若问题是凸的且存在严格可行点(存在 w 使所有 g_j(w) < 0),则 q* = p*,对偶间隙为零。此时由 KKT 可解对偶问题得到原问题的解。

对偶为什么有用(三条都将在后续章节复现):

  • 换变量降难度:原问题在 d 维空间(d 可能上万),对偶在 n 维空间(样本数);SVM 正是因为对偶形式里只出现内积 x_iᵀx_j,才天然支持核技巧;
  • 暴露稀疏结构:互补松弛使对偶解自动稀疏(大量 α_i = 0),从而识别出支持向量;
  • 正则化的统一解释:约束形式 min L s.t. ‖w‖ ≤ c 与惩罚形式 min L + λ‖w‖² 在凸问题下是同一个问题的两种写法,λ 与 c 一一对应。这是第 8 章证明"早停 ≈ L2 正则"的数学基础。

6.7 梯度消失与爆炸的优化视角

从优化角度看,梯度消失/爆炸不是"训练技巧问题",而是链式法则在多层复合下的必然结果。

反向传播沿层连乘雅可比矩阵(第 12 章给出完整推导)。设第 l 层的雅可比为 J_l,则

∂L/∂h^(1) = (∂L/∂h^(L))·Π_{l=L}^{2} J_l

若各层雅可比的谱范数平均为 ρ,则梯度范数按 ρ^L 变化。L = 50 层时:

1
2
3
ρ = 0.9   →  0.9^50  ≈ 0.0052      梯度衰减两个数量级(消失)
ρ = 1.1   →  1.1^50  ≈ 117         梯度放大百倍(爆炸)
ρ = 1.0   →  1.0^50  = 1           唯一能稳定传播的情形

优化层面的后果与对策:

现象优化层面的表现对策所在章节
梯度消失浅层参数几乎不更新,‖∇L^(l)‖ 随 l 减小单调递减;损失长期不降ReLU 族激活、残差连接(提供恒等通路,ρ ≈ 1)、归一化层第 13 章
梯度爆炸参数一步跳飞、损失变成 NaN;梯度范数远大于常态梯度裁剪、warmup、混合精度 + 损失缩放第 13 章
Sigmoid 饱和输出层附近的 σ′ ≤ 0.25,连乘后指数衰减换交叉熵损失(σ′ 被约掉)、换激活函数6.1.4、第 9 章

注意

残差连接之所以是深度网络的关键,用本章语言可以一句话说清:它给雅可比连乘式里插入了一个 +I 项,使 ρ 的下界被"托住"在 1 附近,从而让 6.4.1 的步长条件在全部层上同时成立。

本章小结

关键结论一句话表述常见错误
一阶判据凸 ⟺ f(y) ≥ f(x) + ∇f(x)ᵀ(y−x),切平面是全局下界只在局部验证一个点就断言全局凸
二阶判据凸 ⟺ Hessian 处处半正定(λ_i ≥ 0)混淆半正定与正定(后者才有唯一解)
凸性价值局部最优即全局最优;非凸问题中鞍点比局部极小点更常见以为非凸就"一定会卡在局部最优"
下降引理f 每步至少降 η(1−Lη/2)‖∇f‖²;需 η < 2/L忽略"学习率上限由曲率决定",盲目调大
条件数收敛速率由 κ = λ_max/λ_min 决定;慢在平坦方向以为增加迭代次数一定能解决病态问题
SGD 无偏性均匀随机抽样下 E[g_B] = ∇L,Var(g_B) ∝ σ²/B破坏随机性(按标签排序取批)仍指望无偏
固定学习率违反 Ση_t² < ∞,只能收敛到最优邻域认为凸问题 + SGD 必然严格收敛到全局最优
动量v_t = βv_{t−1} + (1−β)g_t;压震荡、放平坦,κ 有效降到 √κ把动量当成"必须加的加速项"而非各向异性修正
Adam 偏差校正m_t 是真实一阶矩的 (1−βᵗ) 倍,必须除回去以为 β₂ = 0.999 时少校正几步没关系
AdamW权重衰减必须放在自适应步长外层把 λw 加进梯度,导致衰减强度被 √v̂ 调制
warmup兜住 Adam 二阶矩不可靠的初期窗口认为 warmup 可替代梯度裁剪
KKT 互补松弛只有活跃约束(g_j = 0)的 α_j 才非零忘记 α_j ≥ 0 是条件之一

自测题

Q1(推导)证明逻辑回归的交叉熵损失关于权重 w 是凸函数,并说明其中哪一步用到了"仿射复合"这一保凸运算。

答案与解析

以 y ∈ {0,1} 的写法:单样本损失 ℓ = −[y ln σ(z) + (1−y) ln(1−σ(z))],z = wᵀx。

第一步,化简:由 1 − σ(z) = σ(−z) 代入得 ℓ = ln(1 + e^z) − yz。其中 ln(1 + e^z) 关于 z 凸且非减;−yz 关于 w 是仿射的(既凸又凹)。

第二步,链式判定:z = wᵀx 是 w 的仿射函数(这一步用到仿射复合保凸);凸且非减函数复合在仿射外层,凸性保持;与仿射项 −yz 相加属于非负加权和,凸性保持;再对 i 求和仍是保凸运算。

第三步,显式二阶验证:ℓ''(z) = e^z/(1+e^z)² = σ(z)σ(−z) > 0,故 ∇²L = Σ_i σ(z_i)σ(−z_i)x_ix_iᵀ。每个 x_ix_iᵀ 是半正定的秩 1 矩阵,正系数加权和仍半正定,∇²L ⪰ 0。

常见错误:把"σ 是非线性函数"当成"损失非凸"的理由。非线性本身不影响凸性——决定因素是复合方向(凸且非减才保凸)与外层是否仿射。反例恰是 MSE:(σ(z)−y)² 中 u ↦ u² 只在 u ≥ 0 上非减,而 σ(z) − y 可能取负值,复合脱离了保凸条件。

Q2(计算)迷你批大小 B = 1 时单样本梯度标准差为 σ = 2.0。把批大小改为 B = 16,梯度标准差是多少?若希望梯度噪声的标准差降到 0.1,需要多大的批?这个结果对"无脑加大 batch 来提升效果"这一做法意味着什么?

答案与解析

由 Var(g_B) ∝ σ²/B,标准差按 1/√B 缩放:

  • B = 16:σ_B = 2.0/√16 = 0.5(批变大 16 倍,噪声只降到 1/4);
  • 要求 2.0/√B = 0.1,即 √B = 20,B = 400。

含义有三层:

  1. 收益递减:噪声按批大小的平方根下降,而计算量按批大小线性增长。从 B=16 到 B=400,算力涨 25 倍,噪声才降到 1/5。
  2. 有噪声底线:方差公式是 σ²/B,与样本总量 N 无关。加数据不能降梯度噪声,只有加批才行;反之,加批不改变泛化所用的数据量,只改变单步估计质量。
  3. 噪声不是纯害处:6.3.3 指出梯度噪声能逃离鞍点并提供隐式正则。把噪声压到 0 会退化成批梯度下降——在高维非凸问题上会卡在鞍点,且更容易收敛到尖锐极小点、泛化变差。因此实践通常停在 B = 32 ~ 4096 这个区间,而不是一味加大。

Q3(辨析)判断正误并说明理由:

(a) 因为逻辑回归的损失是凸函数,所以用固定学习率的 SGD 一定能收敛到全局最优解。 (b) Adam 的一阶矩估计 m_t 在 t = 1 时等于 0.9·g₁(取 β₁ = 0.9),偏差校正后等于 g₁。 (c) AdamW 与 “Adam + L2 正则” 在权重衰减效果上完全等价。

答案与解析

(a) 错。 凸性只保证"局部最优即全局最优",不保证算法能到达它。固定学习率的 SGD 的误差中包含 Ση_t²σ² 这一项,而 Ση² = ∞(发散),因此只能在最优解附近的邻域内持续震荡,违反 Robbins-Monro 的第二条。要做到严格收敛必须让 η_t 衰减,如 η_t = 1/t(Σ1/t = ∞ 且 Σ1/t² < ∞)。这正是【08-05 选择 Q19】选项 D 的错误所在。

(b) 前半错,后半对。 由 m_0 = 0 与递推式 m_1 = β₁·m_0 + (1 − β₁)·g₁,取 β₁ = 0.9 得 m_1 = 0.1·g₁,不是 0.9·g₁;题干给的 0.9·g₁ 把 (1−β₁) 与 β₁ 的位置弄反了。偏差校正那半句是对的:m̂_1 = m_1/(1 − β₁¹) = 0.1g₁/0.1 = g₁。要记住的分工是——1−β₁ 是新信息 g_t 的权重,β₁ 是历史 m_{t−1} 的权重;若把两者对调,历史几乎不衰减、新信息只占一成,指数移动平均就退化成近乎不动的累加器。

(c) 错。 二者不等价,这正是 AdamW 存在的理由。“Adam + L2” 把 λw 加进梯度,于是它也进入 m 和 v,最终衰减量被 √v̂ 逐维、时变地调制,λ 失去了"权重范数收缩率"的语义。AdamW 把衰减写成独立的乘法项 (1 − ηλ),每个维度每步均匀收缩,与自适应步长互不干扰。

Q4(推导 + 应用)写出 KKT 条件,并用互补松弛说明为什么 SVM 中"只有支持向量对分界面有贡献"。

答案与解析

KKT 条件(问题 min f(w) s.t. h_i(w)=0, g_j(w) ≤ 0):

  1. 平稳性:∇f(w*) + Σ_i ν_i∇h_i(w*) + Σ_j α_j∇g_j(w*) = 0;
  2. 原始可行性:h_i(w*) = 0,g_j(w*) ≤ 0;
  3. 对偶可行性:α_j ≥ 0;
  4. 互补松弛:α_j·g_j(w*) = 0 对每个 j。

应用到 SVM:约束为 g_i(w,b) = 1 − y_i(wᵀx_i + b) ≤ 0。由第 4 条,对每个样本 i:

  • 若 α_i > 0,则 g_i = 0,即 y_i(wᵀx_i + b) = 1——样本恰好落在间隔边界上(支持向量);
  • 若 g_i < 0(样本在间隔之外,已被正确分类且有余量),则必有 α_i = 0。

由平稳性对 w 求导得 w* = Σ_i α_i y_i x_i。把 α_i = 0 的项全部删掉,得到 w* = Σ_{i ∈ SV} α_i y_i x_i。

结论:分界面完全由支持向量决定;删除任何非支持向量,分界面不变。这也是第 8 章正则化与对偶的联结点:约束形式 min L s.t. ‖w‖ ≤ c 与惩罚形式 min L + λ‖w‖² 在凸问题下是同一问题的两种写法,λ 与 c 单调对应。

易错点:忘记 α_j ≥ 0。若允许 α_j < 0,互补松弛就推不出"非活跃约束的乘子为零",整个结论崩塌。

Q5(判断)用 6.2.2 的下降引理分析:某损失在当前点的 Hessian 最大特征值为 L = 50。若学习率取 η = 0.1,训练会怎样?应如何调整?

答案与解析

判据是 η < 2/L。代入 2/L = 2/50 = 0.04,而 η = 0.1 > 0.04,超出稳定性上限。下降引理给出系数 η(1 − Lη/2) = 0.1 × (1 − 2.5) = −0.15 < 0,右端变成正数,即不等式不再保证 f 下降——实际表现为损失震荡甚至发散。

调整方式(按优先级):把学习率降到 η ≤ 1/L = 0.02 量级(下降最快的保证步长);若结构允许则改用 Adam 类自适应方法,它按 √v̂ 逐维缩放、对 L 的敏感度显著降低(但 warmup 仍必要,见 6.5.2);加入归一化层(BN/LN)或残差连接,从结构上压低 L(第 13 章);若必须用较大 η,配合梯度裁剪与 warmup 兜住初期尖峰。

常见错误:把"梯度爆炸"归因为数据有问题。梯度爆炸的第一嫌疑永远是 η 与 L 的关系,因为它是结构性的;数据异常只会造成偶发尖峰,而 η > 2/L 会导致每一步都放大误差。区分方法:看梯度范数是否持续增大(结构性)还是偶发尖峰(数据性)。

与真题的关联

真题考查角度对应本章小节
【09-02 选择 Q2】L = (wx+b−y)² 对 w 的梯度链式法则:∂L/∂w = 2(wx+b−y)·x,陷阱项 C 漏掉了内层因子 x6.7(链式法则连乘)、6.1.4(梯度结构)
【08-05 选择 Q19】A:在线学习 ⟺ batch size = 1 的 SGD逐样本更新与 SGD 是同一套更新式6.3.2
【08-05 选择 Q19】B:AdaGrad 在稀疏特征上优于固定学习率按维度累积梯度平方单独缩放步长,稀疏特征累积量小 ⟹ 有效步长更大6.4.4(自适应步长思想)
【08-05 选择 Q19】C:概念漂移下在线学习更适应持续用新样本更新,旧分布影响自然衰减6.3、第 9 章 9.6 节
【08-05 选择 Q19】D:固定学习率能否严格收敛违反 Ση_t² < ∞,只能收敛到最优邻域6.4.1
【09-09 选择 Q4】逻辑回归为何用交叉熵不用 MSEMSE + Sigmoid 的 Hessian 非半正定 ⟹ 非凸;交叉熵保凸6.1.3、6.1.4
【08-05 选择 Q20】warmup / 梯度裁剪 / 混合精度三项稳定性手段各自堵不同的漏洞,不能互相替代6.5.2
【09-02 选择 Q3】过拟合的训练/验证曲线优化过程与泛化的分离:训练 loss 继续降不代表泛化在改善6.3.3(隐式正则)、第 7 章 7.4 节

延伸阅读

  • Boyd, S. & Vandenberghe, L.《Convex Optimization》第 2–5 章(凸集、凸函数、对偶)、第 9 章(无约束与等式约束优化);
  • Goodfellow, I. et al.《Deep Learning》第 8 章(Optimization for Training Deep Models)——本章 6.3、6.4 的直接扩展;
  • Kingma, D. & Ba, J. “Adam: A Method for Stochastic Optimization”(2014)与 Loshchilov, I. & Hutter, F. “Decoupled Weight Decay Regularization”(AdamW,2017);
  • Polyak, B. T. “Some methods of speeding up the convergence of iteration methods”(1964)——动量法的原始文献;
  • Nesterov, Y. “A method of solving a convex programming problem with convergence rate O(1/k²)"(1983);
  • Robbins, H. & Monro, S. “A Stochastic Approximation Method”(1951)——6.4.1 收敛条件的出处。