残差网络(ResNet)解决梯度消失问题

残差网络ResNet由何凯明在2015年提出,解决了深度学习中网络退化的难题,尤其是梯度消失问题。通过引入残差块的“短路”机制,ResNet使得深层网络的梯度能直接传递到浅层,避免了梯度消失,从而可以构建更深的网络并提高计算效率。

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

一、 引言

​ 残差网络(ResNet)是何凯明在2015年提出的。可以说该网络模型的提出是CNN图像史上的里程碑事件。它解决了当时传统CNN网络发展所遇到的瓶颈——网络深度问题。当时,人们普遍认为网络的深度越深,网络的效果会越好。但是随着人们的研究发现,更深的网络居然会使得网络效果变差,这也就是网络的退化,而梯度消失则是导致网络退化的一个重要因素。何凯明提出的ResNet正是解决了问题,将14年VGG的19层网络提高到了ResNet惊人的152层,并且获得了更好的网络效果。

img

二、梯度消失:

​ 当一个深层网络的激活函数全部采用sigmod函数时,会导致梯度消失的出现。可以从数学角度计算一下为什么会出现梯度消失(非严格证明)。

​ 假设一个最简单的网络,如图。

img

​ 其中, X i X_{i} Xi X i + 1 X_{i+1} Xi+1

### Residual Network (ResNet) 如何解决 Gradient Vanishing 和 Gradient Explosion #### 背景介绍 深度神经网络在训练过程中常常会遇到梯度消失和梯度爆炸的问题。这些问题主要源于反向传播算法中梯度的累积方式,尤其是在深层网络中,信号经过多次乘法运算后容易被放大或缩小到不可控的程度。 #### ResNet 的核心思想 残差网络ResNet)通过引入 **跳跃连接(skip connections)** 来构建一种新的网络结构。这种结构允许信息绕过某些层直接传递给后续层,从而有效缓解了梯度消失和梯度爆炸问题[^1]。 --- #### 解决 Gradient Vanishing 的原理 在传统前馈神经网络中,随着层数增加,梯度可能逐渐变小甚至趋近于零,这被称为梯度消失现象。ResNet 通过定义残差块来重新设计网络架构: - 残差块的核心公式为 \( F(x) + x \),其中 \( F(x) \) 表示网络某一层的学习部分,\( x \) 是输入。 - 这种加法操作使得每一层只需要学习输入与输出之间的差异(即残差),而不是完整的映射关系。因此,即使在网络很深的情况下,优化目标也更容易实现[^3]。 此外,由于存在恒等映射路径(identity mapping),即使某些权重趋于零,也不会完全阻断梯度流动,从而显著减轻了梯度消失的影响。 --- #### 解决 Gradient Explosion 的机制 梯度爆炸通常发生在激活函数导数过大或者权重重初始化不当的情况下。ResNet 中的跳连结构同样对此有所帮助: - 跳跃连接提供了一条稳定的梯度回传通道,减少了因复杂非线性变换而导致的误差放大幅度。 - 结合正则化技术(如 Batch Normalization 或 Weight Initialization),进一步控制了每层参数的变化范围,防止梯度过大引发不稳定行为[^2]。 以下是基于 PyTorch 实现的一个简单 ResNet 模型代码片段,展示了其基本构成单元——残差块的设计思路: ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_channels, out_channels, stride=1): super(BasicBlock, self).__init__() # 主干卷积层 self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels * self.expansion, kernel_size=3, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels * self.expansion) # 下采样分支用于调整维度匹配 self.shortcut = nn.Sequential() if stride != 1 or in_channels != out_channels * self.expansion: self.shortcut = nn.Sequential( nn.Conv2d(in_channels, out_channels * self.expansion, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(out_channels * self.expansion) ) def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) # 添加 shortcut connection out += self.shortcut(identity) out = self.relu(out) return out ``` 上述代码实现了基础版本的残差模块,包含了两个连续的卷积操作以及一个可选的下采样快捷通路。 --- #### 总结 ResNet 利用跳跃连接解决梯度消失和梯度爆炸两大难题。它不仅简化了深层次网络的训练难度,还提升了模型性能,在多个领域取得了突破性的成果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值