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

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

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

p(z=1|xi)=
### 深度学习梯度消失和梯度爆炸的概念及解决方法 #### 概念解释 在深度学习中,梯度消失和梯度爆炸是两个常见的优化问题。 - **梯度消失**是指在网络层数较深的情况下,由于反向传播过程中梯度逐层相乘,某些情况下可能导致梯度变得极小甚至接近于零的现象[^1]。这种现象会使得深层网络难以有效训练,因为参数无法被显著更新。 - **梯度爆炸**则是指在反向传播过程中,梯度逐层累积并逐渐增大,最终导致数值不稳定的情况[^4]。这种情况通常发生在权重较大或者激活函数的选择不当时。 这两种问题的根本原因在于反向传播算法的本质——它是一种基于链式法则的计算方式。随着网络深度增加,梯度可能呈现指数级缩小或放大,从而引发上述两种极端情况[^5]。 --- #### 解决方案概述 以下是针对梯度消失和梯度爆炸的一些常见解决方案: ##### 1. 预训练加微调 预训练可以通过先在一个大规模数据集上完成初步训练,再将其迁移到目标任务上来缓解梯度消失的问题。这种方法能够提供更好的初始条件,减少深层网络中的梯度退化风险。 ##### 2. 梯度剪切 对于梯度爆炸问题,梯度剪切是一个有效的策略。具体而言,在每次迭代时设定一个阈值,如果当前梯度超出此范围,则对其进行缩放处理以保持稳定[^2]。这种方式可以直接控制梯度大小,避免其无限增长。 ##### 3. 权重正则化 通过引入 L1 或 L2 正则项来约束模型复杂度也是应对梯度爆炸的有效手段之一。这有助于抑制过大的权值变化,进而降低发生梯度失控的可能性。 ##### 4. 更改激活函数 传统 Sigmoid 函数容易造成饱和区域内的梯度过小而引起消失效应;因此可以选择替代性的非线性单元如 ReLU 及其变体形式(Leaky ReLU, ELU),这些改进型激活函数能够在一定程度上减轻此类困扰。 ##### 5. Batch Normalization (BN) 批量归一化技术通过对每一批次的数据进行标准化操作,可以使隐藏层输入维持较为合理的分布状态,从而改善梯度流动状况,并加速收敛速度[^3]。 ##### 6. Residual Networks (ResNets) 残差连接允许信息绕过多个层次传递至更远端节点处,这样即使存在较多中间转换也不会完全阻断原始信号路径,极大地促进了超深架构下的正常运作能力. ##### 7. Long Short-Term Memory (LSTM) Network 特别适用于序列建模任务场景下克服长期依赖关系带来的挑战,LSTMs内部设计巧妙地包含了遗忘门控机制等组件用于调节记忆细胞内容更新频率及时机安排等方面考虑周全所以能较好地规避掉单纯RNN所面临的那些棘手难题比如严重的grad-vanish等问题. --- ### Python 实现示例 以下是一些常用技巧的具体实现代码片段: ```python import torch.nn as nn from torch.optim import Adam # 定义带BatchNorm的卷积模块 class ConvBlock(nn.Module): def __init__(self, in_channels, out_channels): super(ConvBlock, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU() def forward(self, x): return self.relu(self.bn(self.conv(x))) # 设置梯度裁剪功能 def clip_grad_norm_(model, max_norm): nn.utils.clip_grad_norm_(model.parameters(), max_norm) # 构造简单的ResNet块 class BasicResBlock(nn.Module): expansion = 1 def __init__(self, inplanes, planes, stride=1): super(BasicResBlock, self).__init__() self.main_path = nn.Sequential( nn.Conv2d(inplanes, planes, kernel_size=3, stride=stride, padding=1), nn.BatchNorm2d(planes), nn.ReLU(), nn.Conv2d(planes, planes * self.expansion, kernel_size=3, padding=1), nn.BatchNorm2d(planes * self.expansion)) downsample = None if stride != 1 or inplanes != planes * self.expansion: downsample = nn.Sequential( nn.Conv2d(inplanes, planes*self.expansion, kernel_size=1, stride=stride), nn.BatchNorm2d(planes * self.expansion)) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.main_path(x) if self.downsample is not None: residual = self.downsample(x) out += residual return nn.ReLU()(out) ``` --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值