模型复杂度与损失曲线L2、早停与过拟合信号文章目录模型复杂度与损失曲线L2、早停与过拟合信号1. 复杂模型2. 什么是模型复杂度3. 两个目标拟合好又要尽量简单4. L2 正则化把权重往零拉4.1 公式回顾与加深4.2λ \lambdaλ与学习率的拉扯4.3 训练损失上升不一定是坏事5. 早停另一种限制复杂度6. 损失曲线怎么读四种常见形态6.1 震荡Oscillating6.2 突然尖峰Sharp spike6.3 训练降、验证升Divergence6.4 中途变乱Chaotic6.5 和分类指标一起看7. 反过拟合工具箱8. 动手多项式阶数、Ridge 与损失曲线9. 能力边界与常见误区9.1 适用边界9.2 常见误区10. 关键术语速查11. 延伸阅读12. 小结摘要第 18 篇讲了泛化与三分法上一篇第 20 篇讲了类别不平衡但模型侧还有一个旋钮复杂度。复杂模型往往在训练集上更漂亮在测试集上却更差。本文讲清什么是模型复杂度、损失与复杂度的权衡、L2 正则化与早停如何压住过拟合以及四种常见损失曲线该怎么读。与之前的第 7 篇衔接并加深贯穿汽车重量–MPG 示例。1. 复杂模型第 18 篇用「弯弯曲曲的分界线」比喻过拟合训练集上几乎全对测试集上大面积翻车。反过来一条过于简单的直线又可能欠拟合。经验规律可以记成模型训练集测试 / 新数据过于复杂往往更好往往更差过拟合恰到好处够好也够好过于简单也差也差欠拟合奥卡姆剃刀在机器学习里的白话版能解释数据的简单模型优先于复杂模型——不是简单一定对而是复杂要付出泛化代价。新项目上之前写的第 14 篇也建议特征从 13 个强特征起步正是为了避免一上来维度爆炸。2. 什么是模型复杂度复杂度不是抽象玄学在权重模型里常落到来源例子效应参数多 / 权重大高次多项式、很多 One-Hot 维决策边界更「扭」特征多重量 排量 交叉 平方项维度诅咒空间稀疏难泛化训练过久迭代太多开始背训练噪声线性回归y ′ b w 1 x 1 w 2 x 2 y b w_1 x_1 w_2 x_2y′bw1​x1​w2​x2​里∣ w ∣ |w|∣w∣很大意味着输入微小变化会引起输出剧烈变化——对训练点「贴得太紧」对新点就不稳。逻辑回归同理第 07 篇无正则时w ≈ − 4.28 w \approx -4.28w≈−4.28重车概率可贴到 0.02 附近加 L2 后∣ w ∣ |w|∣w∣缩小概率不再极端是同一机制。3. 两个目标拟合好又要尽量简单训练其实在解一个矛盾min ⁡ 损失 vs min ⁡ 复杂度 \min \ \text{损失} \quad \text{vs} \quad \min \ \text{复杂度}min损失vsmin复杂度只压损失复杂度往往上升只追求简单损失又下不去。工程上要找折中点。正则化Regularization就是把复杂度写进目标函数强迫模型「别太复杂」min ⁡ Loss ⏟ 拟合数据 λ ⋅ Complexity ⏟ 惩罚复杂 \min \ \underbrace{\text{Loss}}_{\text{拟合数据}} \underbrace{\lambda \cdot \text{Complexity}}_{\text{惩罚复杂}}min拟合数据Loss​​惩罚复杂λ⋅Complexity​​λ \lambdaλlambda是正则化率越大越偏向简单越小越放任拟合训练集。第 07 篇在 Log Loss 上加λ ∑ w j 2 \lambda\sum w_j^2λ∑wj2​就是 L2 正则化的标准形式。4. L2 正则化把权重往零拉4.1 公式回顾与加深逻辑回归总损失L total − 1 N ∑ i [ y i log ⁡ p i ( 1 − y i ) log ⁡ ( 1 − p i ) ] ⏟ Log Loss λ ∑ j w j 2 ⏟ L2 复杂度 L_{\text{total}} \underbrace{-\frac{1}{N}\sum_i \left[y_i\log p_i (1-y_i)\log(1-p_i)\right]}_{\text{Log Loss}} \underbrace{\lambda \sum_j w_j^2}_{\text{L2 复杂度}}Ltotal​Log Loss−N1​i∑​[yi​logpi​(1−yi​)log(1−pi​)]​​L2复杂度λj∑​wj2​​​λ \lambdaλ权重典型形态风险0$w适中$w过大w → 0 w \to 0w→0模型变钝欠拟合偏置b bb一般不正则化——它只平移决策边界不放大输入波动。L1 正则λ ∑ ∣ w j ∣ \lambda\sum|w_j|λ∑∣wj​∣倾向稀疏部分w ww恰为 0适合顺带做特征筛选L2 更平滑工程里更常见。第 07 篇已对比过本篇放在「泛化单元」里强调调λ \lambdaλ要在验证集上看不是训练 Log Loss 越低越好。4.2λ \lambdaλ与学习率的拉扯学习率η \etaη大梯度步长大权重容易被推离 0。λ \lambdaλ大惩罚项把权重往 0 拽。两者像拔河λ \lambdaλ相对η \etaη太大→ 权重太弱欠拟合λ \lambdaλ相对η \etaη太小→ 权重太强过拟合改学习率后往往要重新搜λ \lambdaλ——第 04 篇的超参思维在这里仍然适用。一个实用口诀先固定学习率到能稳定下降再在验证集上网格搜索λ \lambdaλ或 sklearn 的C CC。汽车 7 车玩具数据上λ 0.01 \lambda0.01λ0.01让w ww从 -4.28 收到 -2.33属于「边界形状变化不大、置信度不再贴死」——这种温和化往往就是 L2 在帮泛化。4.3 训练损失上升不一定是坏事加上 L2 后训练 Log Loss 可能反而变高——因为你多了一项复杂度惩罚。课程里的 playground 练习也强调关键看测试 / 验证损失是否下降。别为了把训练曲线压到最低而关掉正则那常常是在用泛化换漂亮曲线。5. 早停另一种限制复杂度早停Early Stopping不直接算复杂度而是在验证损失开始变差时停止训练相当于限制「能拟合多久」。手段控制什么L2限制权重大小早停限制训练轮次减特征 / 降阶限制模型结构第 18 篇泛化曲线里「训练降、验证升」的分叉点就是早停的天然候选。实践里 L2 早停常一起用。注意早停监控的是验证集损失不是训练集训练损失还能继续降的时候验证可能已经抬头了。6. 损失曲线怎么读四种常见形态理想曲线是训练、验证损失平稳下降后收敛。现实里常遇到以下模式6.1 震荡Oscillating损失上下剧烈抖动。常见原因学习率过大→ 先试减小η \etaη第 04 篇数据里有坏样本、NaN → 对照第 19 篇做清洗可先用极小可信子集试收敛再逐步加数据6.2 突然尖峰Sharp spike某一步损失暴涨。优先查输入是否出现NaN除零、log(0)某个 batch 是否堆满离群点第 16 篇一般不要靠加大学习率来「冲过去」6.3 训练降、验证升Divergence训练损失继续改善验证损失掉头向上——过拟合的经典信号第 18 篇。可尝试减特征、降多项式阶数增大λ \lambdaλ加数据、检查训练/验证分布是否一致第 19 篇早停6.4 中途变乱Chaotic一度正常之后毫无规律。常见线索训练集未充分打乱例如先 100 张狗再 100 张猫batch 组成剧烈变化划分后务必shuffle时间序列任务则按时间切分而非乱切第 19 篇边界。6.5 和分类指标一起看损失曲线是优化过程的体温计业务还要对照第 10、11 篇的 Precision / Recall / AUC。尤其第 20 篇的不平衡场景验证 Log Loss 在降少数类 Recall 仍可能不够——说明光盯一条损失曲线不够要在工作阈值上再看混淆矩阵。7. 反过拟合工具箱把本单元串起来数据侧1820 模型侧本篇 第07篇 ───────────────── ───────────────────── 三分法 / 同分布 控制复杂度特征数、阶数 清洗 / 去重 / 标签可信 L2 调 lambda 不平衡用对指标与 class_weight 早停盯验证损失汽车示例用重量预测 MPGdegree8多项式在 7 个点上训练 MSE 可接近 0验证却爆炸——第 18 篇代码已演示加Ridge线性回归的 L2或降回degree1验证往往恢复正常。分类任务则在LogisticRegression(C1/lambda)上调C CC或λ \lambdaλ配合第 20 篇的class_weight。若你只有一两个强特征如重量先把模型做简单往往比堆十来个交叉特征更稳——这和第 17 篇「交叉维数爆炸」、本篇「维度诅咒」是同一条警告线的两面。8. 动手多项式阶数、Ridge 与损失曲线importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportPolynomialFeatures,StandardScalerfromsklearn.linear_modelimportLinearRegression,Ridgefromsklearn.pipelineimportPipelinefromsklearn.metricsimportmean_squared_error rngnp.random.default_rng(0)weightrng.uniform(2.2,4.6,120)mpg34-4.6*weightrng.normal(0,1.5,120)Xweight.reshape(-1,1)ympg X_train,X_val,y_train,y_valtrain_test_split(X,y,test_size0.25,random_state0)defmake_model(degree,alpha0.0):lrRidge(alphaalpha)ifalpha0elseLinearRegression()returnPipeline([(poly,PolynomialFeatures(degreedegree,include_biasFalse)),(scaler,StandardScaler()),(model,lr),])fordegin[1,5,12]:mmake_model(deg)m.fit(X_train,y_train)print(fdeg{deg:2d}train{mean_squared_error(y_train,m.predict(X_train)):.3f}f val{mean_squared_error(y_val,m.predict(X_val)):.3f})# Ridge on high degreem_ridgemake_model(12,alpha1.0)m_ridge.fit(X_train,y_train)print(deg12 Ridge alpha1.0 val,round(mean_squared_error(y_val,m_ridge.predict(X_val)),3))# 记录每轮不可直接用于 sklearn 的闭式解模型逻辑回归可用 warm_start 画曲线fromsklearn.linear_modelimportLogisticRegressionfromsklearn.datasetsimportmake_classification Xc,ycmake_classification(n_samples800,n_features12,random_state1)Xt,Xv,yt,yvtrain_test_split(Xc,yc,test_size0.25,random_state0)train_losses,val_losses[],[]clfLogisticRegression(max_iter1,warm_startTrue,C0.1,solverlbfgs)for_inrange(80):clf.fit(Xt,yt)fromsklearn.metricsimportlog_loss train_losses.append(log_loss(yt,clf.predict_proba(Xt)))val_losses.append(log_loss(yv,clf.predict_proba(Xv)))best_epochint(np.argmin(val_losses))print(best epoch by val log_loss:,best_epoch)预期deg12训练 MSE 很低、验证很高deg1或Ridge高压下验证更稳。best epoch给出早停参考——不必跑满 80 轮。9. 能力边界与常见误区9.1 适用边界L2 / 早停主要约束权重类模型树模型用深度、叶子数等别的方式控复杂度。正则化救不了「数据完全不代表真实世界」——第 19 篇的数据问题要先解决。训练损失因加了正则项而上升是正常的关键看验证 / 测试。9.2 常见误区误区正解训练损失越低越好对照验证曲线λ \lambdaλ一次调好永久用换学习率、换特征后要重调早停 随便少训几轮盯验证损失最低点特征越多越好维度诅咒先小后大只有模型复杂才会过拟合数据泄漏、重复样本也会「假泛化」验证升了只加数据同时减复杂度、加正则复杂度和数据泄漏无关重复样本、全表标准化也会造成「假好」曲线「曲线好看」的三问训练/验证是否同步改善测试集是否只用过一次线上分布是否仍接近训练10. 关键术语速查术语一句话解释模型复杂度模型拟合数据的「弯曲/敏感」程度正则化训练时惩罚复杂模型L2 正则化惩罚∑ w j 2 \sum w_j^2∑wj2​权重趋向变小λ \lambdaλ/ C正则强度sklearn 里C ≈ 1 / λ C \approx 1/\lambdaC≈1/λ早停验证损失变差前停止训练损失曲线损失随 epoch 变化的曲线泛化曲线训练与验证损失画在一起维度诅咒特征多时空间稀疏难学习11. 延伸阅读资源适合看什么sklearn Ridge线性回归 L2sklearn LogisticRegression C分类中的 L2 强度专栏第 07 篇Log Loss L2 公式与梯度专栏第 18 篇泛化曲线与三分法专栏第 04 篇学习率与调参流程12. 小结过拟合不只有「数据没弄好」一种原因模型太复杂、训太久同样致命。记住两个旋钮L2λ \lambdaλ限制权重大小早停限制训练长度用验证损失曲线决定何时停、λ \lambdaλ取多大。看 train/val 曲线 → 判断过/欠拟合 → 调 lambda / 特征 / 早停 → 测试集终验本篇收束「数据集、泛化与过拟合」单元的模型侧主线下一篇做本单元总复盘从特征工程到划分、不平衡、正则化的一条检查清单再衔接后续进阶主题。系列导航上一篇【机器学习】20—— 类别不平衡下一篇预告数据集与泛化单元复盘从特征到验收的检查清单如果本篇对你有帮助欢迎点赞、收藏、关注博主机器学习专栏持续更新中下次更新不迷路。