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)$。内存、稀疏矩阵和数据读取也影响成本。
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. 正则强度和尺度
不同库用 alpha、lambda、C=1/lambda,还可能对 loss 取 sum 或 mean,参数数值不能跨实现直接比较。
通常不惩罚 intercept;one-hot/drop-reference 策略会影响 penalty symmetry。数值特征未缩放时,同样系数 penalty 对原始单位的函数变化不同。
7. Pipeline 与 CV
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。
练习
- 比较未缩放/缩放数据的 Hessian 条件数与 GD 轨迹。
- 对 rank-deficient X 判断 Hessian 特征值。
- 绘制 L1/Elastic Net 正则路径和折间选择频率。
- 在相同 CV 下比较 QR、L-BFGS 与 SGD 的时间和 loss。
小结
线性模型的目标常是凸的,却仍需要正确的数值表示和 solver。正则化既改善泛化与稳定性,也改变 estimand;选择它要看 validation、系数路径和实际决策。
下一章进入树与集成:通过递归分区表示非线性和交互,同时面对深度、方差、boosting 目标与概率校准的新问题。