示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本篇文章围绕 NYU Deep Learning Spring 2020 课程第 14 周第 3 讲docs/ja/week14/14-3.md对应英文原文 docs/en/week14/14-3.md展开系统讲解过拟合オーバーフィッティング的成因、直接正则化方法权重衰减 / L1 / Dropout / 早期停止、间接正则化手段BatchNorm、数据扩充、迁移学习并延伸到用 Dropout 估计预测不确定性的贝叶斯神经网络思想。读完本文你将掌握在 PyTorch 中配置weight_decay、Dropout、BatchNorm1d等关键 API 的完整姿势并能借助仓库中的 12-regularization.ipynb 与 13-bayesian_nn.ipynb 复现全部实验。一、过拟合模型太强也是一种问题1.1 欠拟合、正常拟合与过拟合考虑一个回归问题。根据模型复杂度与数据复杂度之间的关系模型可以处于三种状态欠拟合過少適合 / underfit模型的表达能力不足以刻画数据中的真实模式训练误差与泛化误差都偏高正常拟合right-fit模型既能学到数据背后的规律又不至于记住噪声过拟合過剰適合 / overfit模型表达能力超过数据所需——深度神经网络正是典型情况——它有能力同时拟合真实数据和噪声从而在当前任务上给出糟糕的解。我们真正想要的是让模型拟合数据背后的分布而不是拟合噪声。尤其希望在不降低模型容量power的前提下做到这一点。深度学习模型往往比严格必要的能力强得多这种余量让训练更轻松但也带来了过拟合风险因此需要用正则化手段来对冲。1.2 用故意过拟合来调试网络过拟合并非总是坏事。在调试阶段它可以成为有力的工具取训练数据的一小部分子集哪怕只是一个 batch甚至是一组随机噪声张量训练网络并确认它能够在这份小数据上过拟合。如果连这份数据都学不进去往往说明代码里存在 bug。这是一个非常实用的工程技巧先用极小数据集验证网络具备学习能力、梯度链路通畅再去排查数据管线或模型结构问题。仓库中的 12-regularization.ipynb第 28 号 cell 定义FeedforwardNeuralNetModel第 31 号 cell 实现训练循环正是可以在 IMDB 文本分类任务上逐一开/关正则化开关的完整实验台。二、正则化给模型注入先验知识2.1 什么是正则化正则化正則化 / regularization通过向模型注入先验知识来对抗过拟合为参数指定一个先验分布等价于在可学习的函数集合上施加限制。正则化强度直接决定验证性能正则化太弱 → 无法解决过拟合正则化太强 → 模型效果大打折扣。Ian Goodfellow 给出的经典定义是正则化是我们对学习算法所做的任何修改其目的在于降低泛化误差generalization error而非降低训练误差training error。这句话点出了关键判断一种手段是否是正则化看它是否只致力于缩小训练误差与验证误差之间的鸿沟。2.2 初始化技巧把先验种进权重我们可以按照特定分布初始化权重从而为网络参数选择先验。一个经典选项是Xavier 初始化PyTorch 中对应torch.nn.init.xavier_normal_/torch.nn.init.xavier_uniform_。恰当的初始化让各层信号在前向、反向传播中保持尺度稳定间接帮助训练更平稳、降低对正则化的依赖。三、直接正则化方法3.1 权重衰减Weight DecayL2 / 岭回归 / 高斯先验权重衰减是第一种正则化技术在传统机器学习中广泛使用但在神经网络中常被低估。PyTorch 中它直接作为优化器的参数出现例如 SGD 或 Adam 的weight_decayoptimizer torch.optim.Adam(model.parameters(), lr1e-3, weight_decay0.005)它还有几个等价称呼揭示了同一件事的不同视角L2 正则化惩罚项形式Ridge / 岭回归统计学习视角高斯先验贝叶斯视角等价于对参数施加零均值高斯分布先验。从目标函数看未加正则化时参数上的训练目标与更新式为$$J_{\text{train}}(\theta) J^{\text{old}}_{\text{train}}(\theta)$$$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}_{\text{train}}(\theta)$$加入权重衰减后在目标函数上添加罚项$$J_{\text{train}}(\theta) J^{\text{old}}_{\text{train}}(\theta) \underbrace{\frac\lambda2 {\lVert\theta\rVert}2^2}{\text{penalty}}$$对应更新式变为$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}{\text{train}}(\theta) - \underbrace{\eta\lambda\theta}{\text{decay}}$$新增项-ηλθ会在每次更新时把参数 θ 向零拉一点这就是权重衰减decay名称的由来。超参数 λ 控制衰减强度。注意一个实现细节在 PyTorch 的 SGD/Adam 等优化器中weight_decay直接作用于参数更新项等价于上式的 decay 项而不是把 L2 项并入 loss 再求梯度——两者在大多数优化器尤其是带动量的下并不严格等价。3.2 L1 正则化LASSO / 拉普拉斯先验 / 稀疏先验L1 正则化在 PyTorch 优化器中同样可以作为选项使用别名包括LASSOLeast Absolute Shrinkage Selector Operator拉普拉斯先验Laplacian prior稀疏先验Sparsity prior。从贝叶斯视角看L1 等价于对参数施加拉普拉斯分布先验与高斯先验相比拉普拉斯分布在零点附近集中了更多的概率质量因此更容易把参数压到恰好为零。同样从原始更新出发L1 添加的罚项是$$J_{\text{train}}(\theta) J^{\text{old}}_{\text{train}}(\theta) \underbrace{\lambda{\lVert\theta\rVert}1}{\text{penalty}}$$更新式变成$$\theta \gets \theta - \eta \nabla_{\theta} J^{\text{old}}{\text{train}}(\theta) - \underbrace{\eta\lambda\cdot\mathrm{sign}(\theta)}{\text{penalty}}$$与 L2 的关键区别L2 均匀地缩短参数向量的长度而 L1 会杀死置零那些靠近参数空间坐标轴的成分。直观结果是 L1 产生稀疏权重天然适合做特征选择。PyTorch 实现提示PyTorch 优化器的weight_decay默认是 L2 形式要实现 L1通常需要像 12-regularization.ipynb 第 31 号 cell 中注释代码所示把 L1 范数手动加到 loss 上再反向传播# Toggle 1: L1 norm, add to original loss # fc1_params torch.cat([x.view(-1) for x in model.fc1.parameters()]) # loss 0.001 * torch.norm(fc1_params, 1)在 12-regularization.ipynb 中模型的三个正则化开关分别对应Toggle 1是 L1 罚项作用于fc1参数、Toggle 2是优化器的weight_decay0.005L2、Toggle 3是torch.dropout(out, 0.8)。每打开一个开关训练循环与权重直方图第 37 号 cell都会给出可对比的分布结果。3.3 Dropout训练无数个子网络的集成Dropout 的思想是在训练过程中随机把一定比例的神经元置零从而阻止网络学习从输入到输出的单一固定通路。深度网络参数量巨大有可能把输入背下来而有了 Dropout每次前向都是在一个不同的网络上进行的——它等价于同时训练了无数个彼此不同的子网络让记忆输入变得极其困难。因此 Dropout 是控制过拟合、增强对输入微小扰动鲁棒性的有力手段。PyTorch 中通过nn.Dropout(p)设置随机丢弃率import torch.nn as nn model nn.Sequential( nn.Linear(64, 128), nn.ReLU(), nn.Dropout(p0.5), # 训练时以 50% 概率随机置零神经元 nn.Linear(128, 10), )也可以用函数式接口torch.dropout(out, 0.8)见 12-regularization.ipynb 第 28 号 cell 的 Toggle 3 注释。推理阶段如何处理训练结束后推理时不再使用 Dropout。为了构造最终的推理网络需要对 Dropout 期间产生的所有子网络做平均在实现上等价于把所有权重乘以缩放因子 $1/(1-p)$p 为丢弃率——这正是 PyTorch 在model.eval()时自动完成的事训练时激活值被除以 $1-p$ 以保持期望一致。3.4 早期停止Early Stopping训练过程中一旦验证损失开始上升就可以停止训练并采用此前找到的最佳权重。这能防止权重继续增大到损害验证性能的程度。实践中的常见做法是每隔固定间隔计算一次验证性能当验证误差连续若干次不再下降时即停止并保留最佳检查点。12-regularization.ipynb 第 31 号 cell 给出了朴素版早期停止的实现骨架——每次评估验证集时若当前准确率超过历史最佳就保存模型if accuracy best_accuracy: best_accuracy accuracy # 之后可以加载这个验证集上的最佳模型 torch.save(model.state_dict(), best_model.pth)四、间接正则化副作用带来的正则效果有些技术本身并不是正则化器却带有正则化参数的副作用值得一并掌握。4.1 批归一化Batch Normalization问批归一化如何让训练更高效答应用批归一化后可以使用更大的学习率。BatchNorm 的设计初衷是抑制神经网络的内部协变量偏移internal covariate shift尽管学界对其真实机理仍有大量争论。其本质是把对网络输入做归一化的逻辑扩展到每一层隐层的输入在每层之前计算当前 batch 的均值与方差用这批统计量归一化流入值从而让后续每层都接收到分布更稳定的输入。正则化副作用由于每个 batch 都不同同一个样本在不同 batch 中会被略微不同的统计量归一化网络因而看到同一输入的多种轻微变体这促使网络对输入的细微扰动更鲁棒、从而帮助抑制过拟合。附带的好处是训练明显更快。PyTorch 用法13-bayesian_nn.ipynb 第 4 号 cell 展示了同类模型结构此处以 1D 特征为例nn.Sequential( nn.Linear(20, 20), nn.BatchNorm1d(20), nn.ReLU(), )4.2 更多数据与数据扩充收集更多数据是防止过拟合最直接的办法但往往代价高昂甚至不可行数据扩充Data Augmentation使用 Torchvision 的变换翻转、旋转、裁剪、颜色扰动等教网络对扰动不敏感同样具有正则化效果。4.3 迁移学习Transfer Learning与微调Fine-Tuning迁移学习TF仅在预训练网络之上训练最终分类器通常用于数据量较少的情形微调FT同时训练预训练网络的部分或全部层通常用于数据量较大的情形。问一般什么时候冻结预训练模型的层答当训练数据很少时。针对数据量 × 分布相似度组合的四种一般情形数据少 分布相似直接做迁移学习只训分类头数据多 分布相似做微调让特征提取器也进一步优化数据少 分布不同应移除特征提取器末尾若干层——这些层过度特化于源任务数据多 分布不同可以训练全部部分。另外可以对不同层使用不同的学习率来进一步提升性能例如特征提取器用小学习率、新分类头用大学习率。五、实验结果解读Dropout 与 L1/L2 的真实效果为了把过拟合与正则化的讨论落到实处课程用 12-regularization.ipynb 在 IMDB 情感二分类上生成了三组可视化原图位于 docs/images/week14/14-3。无 Dropout 的损失曲线图 7训练损失远低于验证损失二者持续分离——这是教科书式的过拟合信号。有 Dropout 的损失曲线图 8训练损失与验证损失几乎连续重叠说明模型在验证集作为样本外数据的代理上泛化良好。当然真正的样本外性能还需要独立的留出测试集来测量。正则化对权重分布的影响图 9L1 正则化红色直方图在零点出现尖峰说明大多数权重被压成精确的零零附近的小红点才是模型的非零权重——典型稀疏解L2 正则化紫色/蓝色峰值紧贴零大多数权重接近零但非零——收缩而非稀疏无正则化权重更自由围绕零呈类似正态分布的散布。这与 3.1、3.2 中的数学推导完全一致L2 均匀收缩向量长度L1 沿坐标轴杀权重。早期停止示意图验证损失先下降后回升训练应在拐点验证损失开始恶化附近停止并使用此前的最佳权重。六、延伸用 Dropout 估计预测不确定性贝叶斯神经网络我们关心神经网络的不确定性是因为网络需要知道自己有多确信。例如构建一个预测方向盘转向控制的网络时必须知道预测的置信度。6.1 从单点预测到置信区间利用带 Dropout 的网络丢弃率为 r通常做法是推理时切换到验证模式、用全部神经元得到单一预测并对权重乘以 $1/(1-r)$ 以补偿训练期丢弃。但这只能给出一个预测值。要得到置信区间需要对同一输入做多次预测推理时保持训练模式继续随机丢弃神经元多次前向后由于每次丢弃的神经元不同同一输入会得到不同的预测用这批预测估计均值与置信区间。这正是MC Dropout蒙特卡洛 Dropout的核心思想。13-bayesian_nn.ipynb 完整实现了该流程训练一个带nn.Dropout(p0.05)与nn.Linear的小网络y x·sin(x)回归任务然后对密集输入xx做 100 次前向计算均值与标准差并绘制置信带net.train() # 推理时保持训练模式保留 Dropout y_hat list() with torch.no_grad(): for t in range(100): y_hat.append(net(xx.view(-1, 1)).squeeze()) y_hat torch.stack(y_hat) mean y_hat.mean(0) std y_hat.std(0) # 绘图mean ± std 即置信区间红色线代表预测均值紫色阴影区表示不确定性预测方差。从图 10、图 11 可观察到这些不确定性估计并未校准且随激活函数ReLU / Tanh不同而变化数据点附近的不确定性较低有监督信号约束所观察到的方差是可微函数因此可以对它做梯度下降最小化从而获得更自信的预测。七、正则化超参数与 EBM 损失项的实用问答7.1 多个损失项如何相互作用EBM 模型在基于能量的模型EBM中总损失可以由不同项直接求和估计。一个常见损失项是惩罚潜在变量长度的项向量长度大致与其维度数成正比减小维度会让向量变短、编码信息变少。在自编码器设置中这能确保模型保留最重要的信息——因此对潜在空间做信息瓶颈的一种方式就是降低潜在空间的维度。7.2 如何确定正则化超参数正则化强度实践中确定最优正则化强度通常采用贝叶斯超参数优化Bayesian hyper-parameter optimization网格搜索Grid Search随机搜索Random Search。一个省时的经验这类搜索中前几个 epoch 通常就足以判断正则化是否在起作用因此不必把模型完整训练到收敛——先用短训练快速筛选超参数再对少数候选做完整训练即可。八、总结与动手建议方法PyTorch 入口效果备注权重衰减 (L2)优化器参数weight_decay如Adam(lr1e-3, weight_decay0.005)权重均匀收缩、接近零但不为零即岭回归 / 高斯先验L1 正则化手动把torch.norm(params, 1)加入 loss权重稀疏、精确置零LASSO / 拉普拉斯先验优化器无内置 L1Dropoutnn.Dropout(p)或torch.dropout(x, p)打破固定通路、集成无数子网络eval()时自动补偿缩放早期停止训练循环中监测验证损失 保存最佳检查点防止权重过度增长见 12-regularization.ipynb cell 31BatchNormnn.BatchNorm1d/2d稳定层输入、允许大学习率、有正则副作用见 13-bayesian_nn.ipynb cell 4数据扩充Torchvisiontransforms教网络对扰动不敏感—迁移学习 / 微调冻结层 不同层学习率数据少用 TF、数据多用 FT四种数据×分布情形见 4.3MC Dropout 不确定性net.train() 多次前向估计预测均值与置信区间见 13-bayesian_nn.ipynb cell 9-11建议的动手路径打开 12-regularization.ipynb依次切换三个 ToggleL1、weight_decay、dropout观察训练/验证损失曲线与第 37 号 cell 的权重直方图再运行 13-bayesian_nn.ipynb对比net.eval()与net.train()两种推理模式下预测曲线的差异。当你把训练误差—验证误差的差距作为第一性指标来审视每一种技术时过拟合就不再是玄学而是一套可以被量化、被调控的工程问题。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐NYU-DLSP20 课程笔记深度学习的过拟合与正则化实战Weight Decay、Dropout、早停与贝叶斯不确定性NYU DLSP20 课程笔记深度学习的过拟合与正则化实战Weight Decay、Dropout、早停与贝叶斯不确定性 导读 本文基于 NYU DLSP示例工程NYU-DLSP20 课程笔记PPUU——基于不确定性正则化的密集交通驾驶策略学习NYU DLSP20 课程笔记PPUU——基于不确定性正则化的密集交通驾驶策略学习 导读 本文整理自 NYU Deep Learning Spring 202示例工程PyTorch 深度学习中过拟合的对抗之道NYU-DLSP20 第 14.3 讲正则化技术全景解析PyTorch 深度学习中过拟合的对抗之道NYU DLSP20 第 14.3 讲正则化技术全景解析 导读 本文是 NYU Deep Learning Spri示例工程上一篇easy-vibe 生鲜电商微服务系统实战从 PRD 需求拆分到网关联调上线的完整开发指南下一篇Sa-Token 轻量级 Java 权限认证框架实战指南从一行代码登录到注解与路由拦截鉴权创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考