深度学习正则化
通过控制容量、权重衰减、Dropout、合理增强和提前停止改善神经网络泛化。
学习前需要掌握
背景与问题
深网能拟合复杂训练关系,也可能把噪声和偶然模式记住。正则化通过参数偏好、数据变化或训练时间约束降低这种风险,但需要首先确认验证协议可信。
概念定义
深度学习正则化是一组限制或引导学习过程的方法,包括权重衰减、Dropout、数据增强、容量控制和早停。它们的机制不同,应按问题选择并做受控比较。
直观理解
与其要求模型把每个训练细节都记到极致,更希望它学到对合理扰动和独立样本稳定的规则。
核心原理
L2 惩罚在损失中加入参数平方和,梯度会多出与权重成比例的项;AdamW 的解耦权重衰减则直接按比例缩小参数,不把衰减项混进自适应梯度矩估计。二者在自适应优化器中不能直接视为同一实现。
数据增强把任务允许的不变性写进训练数据,例如图像水平翻转必须不改变标签含义。若数字、医学方向或时序因果关系不允许某种变换,该增强就会制造标签错误。Dropout 则随机扰动隐藏表示,并在评估关闭。
早停利用验证趋势限制训练时间;它仍是一种模型选择。若反复用测试集选择强度,测试集也会被间接拟合。多种正则同时增强可能导致欠拟合,应该保留简单基线并逐项比较。
单参数区分数据损失与 L2 惩罚
- 参数 w=2,数据目标为 w=3
- 数据损失为 (w−3)²
- L2 系数为 0.1,惩罚定义为 0.1w²
正则把梯度从 -2 改为 -1.6,减弱向较大权重移动的幅度。
本例最小化 ,解析最优值为 3/1.1,约 2.727,而不是 3。这说明正则主动引入偏好,允许训练拟合变差以换取潜在泛化收益。
该收益必须在独立数据上验证;若真实任务就需要大权重,过强惩罚会带来偏差。这里没有真实数据,不能从手算目标宣称准确率提高。
数学表达
核心表达
第一项公式采用未除以 2 的 L2 定义;第二项是训练期反向缩放 Dropout,m 为保留概率 1-p 的二元掩码。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1数据损失为 1,惩罚为 0.4。
- 2总损失为 1.4,梯度为 -2+0.4=-1.6。
代码对应位置
示例 1单参数区分数据损失与 L2 惩罚的最小验证:使用完整构造输入核对单参数区分数据损失与 L2 惩罚,输出只表示本例计算。
计算与实现步骤
- 数据损失为 1,惩罚为 0.4。
- 总损失为 1.4,梯度为 -2+0.4=-1.6。
代码实现
示例 1
单参数区分数据损失与 L2 惩罚的最小验证
example_01.py用途:使用完整构造输入核对单参数区分数据损失与 L2 惩罚,输出只表示本例计算。
import torch
w = torch.tensor(2., requires_grad=True)
data = (w - 3).square()
penalty = 0.1 * w.square()
total = data + penalty
total.backward()
print(f"data={data.item():.1f} penalty={penalty.item():.1f} total={total.item():.1f} grad={w.grad.item():.1f}")
print(f"optimum={3 / 1.1:.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对单参数区分数据损失与 L2 惩罚,输出只表示本例计算。
w- 模型权重或当前待优化参数。
Step 1 · 1–8 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
w = torch.tensor(2., requires_grad=True)
data = (w - 3).square()
penalty = 0.1 * w.square()
total = data + penalty
total.backward()
print(f"data={data.item():.1f} penalty={penalty.item():.1f} total={total.item():.1f} grad={w.grad.item():.1f}")
print(f"optimum={3 / 1.1:.6f}")预期输出或运行结果
data=1.0 penalty=0.4 total=1.4 grad=-1.6 optimum=2.727273
常见错误 · 3 条
- 增强改变标签
- 保存最后而非最佳
- 正则过强
实际应用
- 降低训练集记忆风险
- 用验证集选择衰减、增强和早停强度
常见错误
- 增强改变标签
- 保存最后而非最佳
- 正则过强