跳到内容

5.3 梯度、条件数与正则化路径:收敛到什么比跑了多少轮更重要

同一份训练数据换一个学习率就发散,工坊主人要求阿花先检查尺度、曲率和目标函数,再讨论训练轮数。

同一份数据,学习率 0.1 时 loss 发散,0.0001 时几乎不动;标准化后两者差距突然缩小。目标函数即使凸,优化速度仍由曲率、尺度、稀疏性和 solver 决定。

本课目标

  • 推导 batch/minibatch gradient 的计算成本;
  • 理解 convexity、Hessian 与 conditioning;
  • 区分 L1、L2 与 Elastic Net 的几何和算法;
  • 用 pipeline/CV 选择正则并验证收敛。

1. Batch gradient descent

线性回归 MSE:

$$ L(w)=\frac1n\lVert Xw-y\rVert_2^2, \quad \nabla L=\frac2nX^T(Xw-y). $$

每次 dense full-batch gradient 通常需要 $O(np)$ 运算,不是笼统 $O(n)$。内存、稀疏矩阵和数据读取也影响成本。

python
def fit_linear_gd(X, y, learning_rate, max_steps, tolerance):
    w = np.zeros(X.shape[1])
    previous = float("inf")
    for step in range(max_steps):
        residual = X @ w - y
        loss = np.mean(residual ** 2)
        gradient = (2.0 / len(y)) * X.T @ residual
        w -= learning_rate * gradient
        if abs(previous - loss) < tolerance:
            break
        previous = loss
    return w, {"steps": step + 1, "loss": loss}

只跑固定 1000 轮不能证明收敛。检查 gradient norm、objective change、参数是否有限和 validation 表现。

2. Convex 不等于优化轻松

Squared loss Hessian:

$$ H=\frac2nX^TX. $$

它总是 positive semidefinite;只有满足相应满秩条件时才 positive definite/严格凸。相关特征使 Hessian 条件数大,等高线狭长,固定 learning rate 沿陡方向震荡、沿平方向缓慢。

标准化改善许多优化器的 conditioning,也让正则惩罚可比较,但不是所有树模型/闭式求解都“必须标准化”。

3. SGD 与 minibatch

  • SGD 用一个样本的无偏/随机梯度估计;
  • minibatch 平衡向量化效率与梯度噪声;
  • epoch 表示大致遍历一次数据,不代表独立样本;
  • shuffle、batch size 和 learning-rate schedule 共同影响轨迹。

数据有时间/群组结构时,随机 shuffle 可能改变训练分布或破坏 stateful 模型。分布式 batch 增大还需调整学习率并验证泛化。

4. 选择 solver

线性/逻辑模型可用:

  • QR/SVD/least-squares solver;
  • normal-equation variants(谨慎数值稳定);
  • gradient/accelerated gradient;
  • Newton、quasi-Newton(L-BFGS);
  • coordinate descent;
  • stochastic variance-reduced 方法。

选择看 $n,p$、稀疏性、loss、penalty、内存和精度。并非“梯度下降扩展到任意规模”;每轮全数据梯度在超大数据上仍昂贵。

5. L2、L1 与 Elastic Net

L2

$$ L(w)+\lambda\sum_jw_j^2. $$

平滑收缩,常在相关特征间分散权重并改善 conditioning;不是“鼓励权重均匀”。

L1

$$ L(w)+\lambda\sum_j|w_j|. $$

非光滑,最优解可含精确零;通常需 coordinate descent、proximal methods 等。相关特征中选哪一列可能不稳定,零系数不证明无预测信息。

Elastic Net

组合 L1/L2,在稀疏与相关组稳定性间调节。两个正则参数/混合比例都要在 validation 内选择。

6. 正则强度和尺度

不同库用 alphalambdaC=1/lambda,还可能对 loss 取 sum 或 mean,参数数值不能跨实现直接比较。

通常不惩罚 intercept;one-hot/drop-reference 策略会影响 penalty symmetry。数值特征未缩放时,同样系数 penalty 对原始单位的函数变化不同。

7. Pipeline 与 CV

python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

candidate = Pipeline([
    ("scale", StandardScaler()),
    ("model", LogisticRegression(max_iter=2000)),
])

search = GridSearchCV(
    candidate,
    param_grid={
        "model__C": [0.01, 0.1, 1.0, 10.0],
        "model__penalty": ["l2"],
    },
    scoring="neg_log_loss",
    cv=group_or_time_aware_cv,
)

具体 solver 与 penalty 兼容性随库版本变化,应查当前官方文档。缩放、缺失处理和 selection 全部在 fold 内 fit。

8. 收敛警告不能忽略

不收敛可能来自:

  • 尺度/条件数差;
  • 完全分离;
  • 正则太弱;
  • max_iter 太小;
  • learning rate 太大;
  • solver 与 penalty/稀疏输入不匹配;
  • 数据含 NaN/Inf 或巨大 outlier。

只把 max_iter 提高十倍可能拖延根因。比较 objective、gradient、参数范围和不同 solver,并在同一 validation protocol 下验证。

9. 正则化路径与稳定性

沿 $\lambda$ 从强到弱记录:

  • train/validation loss;
  • 非零系数数和系数路径;
  • 折间入选频率;
  • calibration/群体误差;
  • 收敛状态和运行时间。

One-standard-error rule 可在性能相近时选择更简单/更强正则方案。最终选择仍依赖业务损失,而非“非零越少越好”。

10. 线性模型为何仍是强 baseline

  • 训练和推断便宜;
  • 稀疏高维可扩展;
  • feature contribution 结构明确;
  • 易校准、监控和部署;
  • 对小数据常更稳定。

但 feature engineering、共线性、外推和概念漂移仍可能失效。解释性来自完整 pipeline 和特征语义,不是模型类标签。

常见误区

  • GD 每轮是 $O(n)$:还要乘特征维度与数据布局。
  • Hessian 总是正定:秩亏时只半正定。
  • L1 自动找出真正变量:相关性和 lambda 会改变选择。
  • 收敛 warning 只需增加轮数:先查尺度、分离和 solver。

练习

  1. 比较未缩放/缩放数据的 Hessian 条件数与 GD 轨迹。
  2. 对 rank-deficient X 判断 Hessian 特征值。
  3. 绘制 L1/Elastic Net 正则路径和折间选择频率。
  4. 在相同 CV 下比较 QR、L-BFGS 与 SGD 的时间和 loss。

小结

线性模型的目标常是凸的,却仍需要正确的数值表示和 solver。正则化既改善泛化与稳定性,也改变 estimand;选择它要看 validation、系数路径和实际决策。

下一章进入树与集成:通过递归分区表示非线性和交互,同时面对深度、方差、boosting 目标与概率校准的新问题。

Built with VitePress | Software Systems Atlas