残差网络(ResNets)的残差块(Residual block)

本文介绍了ResNets(残差网络)如何解决深度神经网络中的梯度消失和梯度爆炸问题。通过引入跳跃连接或残差块,ResNets允许信息直接传递到深层,使得训练深度可达100层以上的网络成为可能。作者还讨论了普通网络在增加深度时训练误差增加的问题,并对比了ResNets在训练表现上的优势。

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

来源:Coursera吴恩达深度学习课程

五一假期结束了,听着梁博的《日落大道》,码字中。非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过100层。ResNets是由残差块(Residual block)构建的,首先看一下什么是残差块。

上图是一个两层神经网络。回顾之前的计算过程:

在残差网络中有一点变化:

如上图的紫色部分,我们直接将a^[l]向后,到神经网络的深层,在ReLU非线性激活函数前加上a^[l],将激活值a^[l]的信息直接传达到神经网络的深层,不再沿着主路进行,因此a^[l+2]的计算公式为:

加上a^[l]后产生了一个残差块(residual block)。插入的时机是在线性激活之后,ReLU激活之前。除了捷径(shortcut),你还会听到另一个术语“跳跃连接”(skip connection),就是指a^[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层。

ResNet的发明者是何恺明(Kaiming He)、张翔宇(Xiangyu Zhang)、任少卿(Shaoqing Ren)和孙剑(Jiangxi Sun),他们发现使用残差块能够训练更深的神经网络。所以构建一个ResNet网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络。首先回忆一个普通网络(Plain network),这个术语来自ResNet论文。如下图:

变成ResNet的方法是加上所有跳跃连接,每两层增加一个捷径,构成一个残差块。如下图所示,5个残差块连接在一起构成一个残差网络。

假设使用标准优化算法(梯度下降法等)训练一个普通网络,如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对,网络深度越深模型效果越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练,随着网络深度的加深,训练错误会越来越多。

但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。对x的激活,或者这些中间的激活能够到达网络的更深层。这种方式有助于解决梯度消失和梯度爆炸问题,在训练更深网络的同时,又能保证良好的性能。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

### 残差块Residual Block)概念 残差块是一种特殊的网络结构设计,旨在解决深层神经网络训练过程中遇到的退化问题。随着网络层数增加,传统卷积神经网络可能会遭遇梯度消失或爆炸现象,导致性能下降甚至饱和。通过引入跳跃连接(skip connection),即让输入直接绕过若干层传递到后续某一层作为加法操作的一部分,使得模型能够更容易地学习残差映射而非原始映射。 这种机制不仅有助于缓解上述提到的问题,还带来了其他优势[^3]: - 更好地保持局部特征信息; - 减少计算资源消耗; - 提升收敛速度并改善最终表现; 具体而言,在标准残差单元内部通常会包含两个或多个权重层以及批量归一化和激活函数等组件。对于给定输入 \( x \),经过一系列变换后的输出记作 \( F(x, W_i) \),其中 \( W_i \) 表示该阶段所涉及参数集合,则整个模块产生的实际响应可表示为: \[ y = f(F(x,W_i)+x) \] 这里 \( f(\cdot) \) 代表非线性激活函数,而 \( +x \) 即所谓的“捷径”或者说是跳接部分。 当应用于深度脉冲神经网络(SNNs)时,由于后者特有的离散时间特性及其独特的二值化激活方式,简单移植自人工神经网络(ANNS)的设计模式往往无法达到理想效果。例如,早期尝试仅用脉冲神经元代替ReLU的做法就遇到了困难,因为这并不能有效支持真正的残差学习过程[^1]。 为了克服这些挑战,研究者们探索了多种改进方案,其中包括但不限于寻找适合表达恒等映射的形式、调整反向传播算法以适应SNN特点等等。特别是SEW ResNet架构展示了如何巧妙运用脉冲信号本身的性质来构建有效的残差路径,从而实现了更好的身份映射能力[^4]。 ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, inplanes, planes, stride=1, downsample=None): super(BasicBlock, self).__init__() self.conv1 = conv3x3(inplanes, planes, stride) self.bn1 = nn.BatchNorm2d(planes) self.relu = nn.ReLU(inplace=True) self.conv2 = conv3x3(planes, planes) self.bn2 = nn.BatchNorm2d(planes) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值