深度学习(二) 正则、BN、梯度消失

本文深入探讨深度学习中的正则化策略,包括L1/L2正则、数据增强、早停、参数共享和dropout。接着分析Batch Normalization(BN)的作用,解释它如何解决内部协变量转移并加速学习,同时具有一定的正则化效果。此外,文章还讨论了梯度消失和爆炸的原因及解决方案,如ReLU激活函数、BN层和残差网络。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度学习(二) 正则、BN、梯度消失

2.1 正则化

  • L1、L2正则
  • 数据增强,例如加入随机噪声,输入时加入,在隐藏层加入(方差极小的噪声);图像平移,旋转,色彩变化
  • Early stopping 验证集的训练误差在一定轮数没有降低,则停止训练
  • 参数共享 Weight Sharing CNN
  • Bagging,构建不同的数据集,训练不同的模型,取平均,降低方差
  • dropout 随机化断开连接。可以被认为是在深度神经网络做中bagging 提供了类似的bagging的集成。与bagging不同的是,dropout中的网络共享参数 bagging每一个模型训练到收敛,而drop out中的网络的每一个网络没有训练到收敛。预测的时候,每一个单元的参数要预乘以p。除了正则,drop out还带在模型中引入了稀疏性,引入输出向量的稀疏性
  • BN 有一定的正则化作用,他在mini-batch上取平均,加入噪音,加入了正则
  • 对抗样本训练 在训练完成的网络上,构造对抗样本, x+αΔxJ(w;x,y) x + α Δ x J ( w ; x , y )

2.2 Batch Normalization
  covariate shift
    这个现象指的是训练集数据分布与预测集数据分布不一致。这个问题的解决方法是重新赋予训练集数据新的权重。
    对于样本 xi x i ,它在训练集中的分布是 q(xi) q ( x i ) ,在 预测集中的真实分布是 p(xi) p ( x i ) ,它的新权重就是 p(xi)q(xi) p ( x i ) q ( x i )
    分布如何确认?
      从训练集与验证集采样数据,分别标注为1,-1,
      训练LR分类器进行分类,如果测试集上的表现好,则训练集数据分布不一致

p(z=1|xi)=p
### 深度学习中的正则化方法 #### 正则化的概念 正则化是一种用于防止机器学习模型过拟合的技术。其核心思想是在优化目标函数中加入额外的约束条件,使得模型更加泛化,从而提高在未见数据上的表现。 --- #### L1 和 L2 正则化 ##### L1 正则化 L1 正则化通过向损失函数添加权重参数绝对值的总和作为惩罚项来实现。这种方法倾向于使不重要的特征对应的权重变为零,因此具有稀疏性的特点[^2]。 数学表达式如下: \[ \text{Loss} = \text{Original Loss} + \lambda \sum_{i=1}^{n}|w_i| \] 其中 \( w_i \) 表示第 i 个权重,\( \lambda \) 是控制正则化强度的超参数。 ##### L2 正则化 (Ridge 正则化) L2 正则化则是通过对权重参数平方和进行惩罚来减少过拟合的风险。相比 L1,L2 不会强制将某些权重置为零,而是均匀地减小所有权重的大小[^1]。 数学表达式如下: \[ \text{Loss} = \text{Original Loss} + \frac{\lambda}{2}\sum_{i=1}^{n}w_i^2 \] 以下是基于 PyTorch 的简单实现代码: ```python import torch import torch.nn as nn import torch.optim as optim class Model(nn.Module): def __init__(self, input_size, output_size): super(Model, self).__init__() self.fc = nn.Linear(input_size, output_size) def forward(self, x): return self.fc(x) def l2_regularization(model, lambda_l2): l2_norm = sum(p.pow(2.0).sum() for p in model.parameters()) return lambda_l2 * l2_norm model = Model(input_size=10, output_size=1) criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) lambda_l2 = 0.01 # 假设输入和标签已知 inputs = torch.randn(5, 10) labels = torch.randn(5, 1) outputs = model(inputs) loss = criterion(outputs, labels) + l2_regularization(model, lambda_l2) loss.backward() optimizer.step() ``` --- #### Dropout 正则化 Dropout 是一种在训练过程中随机丢弃部分神经元的方法,以此降低网络对特定神经元组合的依赖程度,增强模型的鲁棒性[^3]。具体来说,在每次前向传播时,按照一定概率(通常为 0.2 到 0.5)临时移除一些神经元及其连接关系。 PyTorch 中可以轻松实现 Dropout: ```python class DropoutModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(DropoutModel, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.dropout = nn.Dropout(p=0.5) # 设置 dropout 概率为 0.5 self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.dropout(x) # 应用 dropout return self.fc2(x) model = DropoutModel(input_size=10, hidden_size=20, output_size=1) ``` 需要注意的是,Dropout 只会在训练阶段生效;而在推理阶段会被自动禁用。 --- #### Batch Normalization (BatchNorm) BatchNorm 并不仅仅是一个正则化技术,但它确实可以通过规范化每一层输入分布的方式间接起到一定的正则作用。它的主要功能在于加速收敛并减轻梯度消失/爆炸问题。 下面是 BatchNorm 在 PyTorch 中的应用实例: ```python class BNModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(BNModel, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.bn = nn.BatchNorm1d(hidden_size) # 添加批量归一化层 self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = torch.relu(self.bn(self.fc1(x))) # 对隐藏层输出应用批标准化 return self.fc2(x) model = BNModel(input_size=10, hidden_size=20, output_size=1) ``` --- #### 各种正则化方法对比总结 | **方法** | **优点** | **缺点** | |----------------|-------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | L1 正则化 | 提供稀疏解,易于解释 | 收敛速度较慢 | | L2 正则化 | 防止过拟合的同时保持所有特征的重要性 | 不具备稀疏特性 | | Dropout | 显著提升模型泛化能力 | 训练时间可能增加 | | BatchNorm | 加快训练过程、稳定数值范围 | 如果批次较小可能导致不稳定 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值