论文阅读学习 - ResNet - Identity Mappings in Deep Residual Networks

本文详细分析了ResNet中的恒等映射在深度残差网络中的作用,指出其能有效避免梯度消失问题,促进信息在前向和后向传播中的直接传递。通过对比不同类型的恒等映射,证明了使用恒等跳跃链接和预激活层(ReLU和BN)的残差单元有利于网络训练和泛化。实验表明,恒等映射的使用对于网络优化至关重要,防止了梯度消失和爆炸,确保了模型的有效学习。

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

论文阅读学习 - ResNet - Identity Mappings in Deep Residual Networks

[Paper]

[Code-Torch - Deep Residual Networks with 1K Layers]

摘要:

对深度残差网络理论分析.

残差构建模块中,采用恒等映射(identity mapping)作为 skip connetions 和 after-addition activation时, forward 和 backward 可以从一个 block,直接传递到任何其他 blocks.

阐述恒等映射的重要性.

1. 残差单元和跳跃链接 Skip Connections

深度惨差网络ResNets 是由许多堆积的残差单元 Residual Units 组成.

如 Fig (a). 每个残差单元可以表示为:

yl=h(xl)+F(xl,Wl) y l = h ( x l ) + F ( x l , W l ) (1)

xl+1=f(yl) x l + 1 = f ( y l ) (2)

其中, xl x l xl+1 x l + 1 为第 l l 个残差单元的输入和输出, F 为残差函数(如,堆积的两个 3×3 3 × 3 的卷积层).

h(xl)=xl h ( x l ) = x l 为恒等映射.

f f 为 ReLU 函数,element-wise相加后的操作.

W l = { W l , k | 1 k K } 为第 l l 个残差单元的权重集. K 是残差单元的层数( K=2K=3 K = 2 或 K = 3 ).

这里写图片描述

ResNets 的关键是,拟合关于 h(xl) h ( x l ) 的残差函数 F F ( F=yh(x) F = y − h ( x ) )时,最佳选择是 h(x)=x h ( x ) = x . 即:通过单位跳跃链接(identity skip connection,shortcut)来实现.

本文所分析的是,创建信息传递的直接路径的深度残差网络,不仅仅是一个残差单元,还包括整个网络.

得出的结论是,如果 h(x) h ( x ) f(yl) f ( y l ) 都是恒等映射(identity mappings),信号在前向和后向传递时都可以从一个神经元和其它任何神经元直接传递.

对于跳跃链接的作用的理解,这里对多种类型的 h(xl) h ( x l ) 分析对比发现,

### 深度残差网络中的恒等映射 深度残差网络(Deep Residual Networks, ResNets)的核心思想在于引入残差学习机制,使得神经网络能够更有效地训练深层结构。其中的关键组件之一是 **恒等映射**(Identity Mapping),也被称为 shortcut connection 或 skip connection。 #### 恒等映射的概念 在传统的前馈神经网络中,随着层数增加,梯度消失或爆炸问题可能导致模型难以收敛。ResNet 提出了通过构建残差块来缓解这一问题。在一个典型的残差块中,输入 \( x \) 经过若干卷积操作后得到输出 \( F(x) \),最终的输出表示为: \[ y = F(x) + x \] 这里的 \( x \) 即为恒等映射部分[^1]。这种设计允许网络直接学习输入与目标之间的差异(即残差),从而简化优化过程并提高模型性能。 #### 实现方法 为了实现上述功能,在实际编码过程中可以采用如下方式定义一个简单的残差块: ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_channels, out_channels, stride=1, downsample=None): 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, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels * self.expansion) # 如果维度不匹配,则需要调整shortcut路径 self.downsample = downsample def forward(self, x): identity = x # 存储原始输入作为identity mapping 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: identity = self.downsample(x) # 对齐维度 out += identity # 添加恒等映射 out = self.relu(out) return out ``` 在这个例子中,`out += identity` 表达了核心的恒等映射逻辑。当 `downsample` 不为空时,意味着当前层可能涉及特征图尺寸的变化或者通道数的不同,因此需要额外的操作使两者形状一致后再相加[^2]。 #### 数学解释 假设某一层的目标函数为 \( H(x) \),那么传统的方法试图让每一层逼近这个复杂函数;而利用残差连接之后,我们转而尝试拟合另一个相对简单得多的新函数——残差项 \( F(x)=H(x)-x \)[^3]。这样一来不仅降低了难度还促进了信息流动的有效性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值