论文笔记(一). Identity mapping in Deep Residual Networks

本文深入探讨了ResNet网络中恒等映射的重要性及其对梯度传播的影响,通过理论分析和实验验证了恒等映射的有效性,并提出了一种新的残差单元结构,进一步提升了网络性能。

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

论文笔记(一). Identity mapping in Deep Residual Networks

作者:Kaiming He,Xiaoyu Zhang,Shaoqing Ren ,and Jian Sun

Abstract

这篇文章是作者就上一篇论文:Deep Residual Learning for Image Recognition 的深入探讨和研究。此篇文章从理论和实验上论述了ResNet的有效性,分析了 ResNet 中加入的 Identity mapping 为什么比较好,为什么它能让梯度在网络中顺畅的传递而不会爆炸或消失。同时就ResNet1202出现的降质问题,提出了一个新的残差单元,进一步提高了残差网络的性能。(cifar10: 4.62%)
code:

Introduction

ResNet结构:H(x)=x+F(x)
这里写图片描述

作者提出了一个更通用的表达式:
这里写图片描述
原始的ResNet由于shortcut是恒等映射,所以h(x)=x
作者认为ResNet的性能很好主要是因为identity mapping的存在,为进一步提高网络的性能,应该关注”direct“ 路径,更多的引入identity mapping,同时保障信息在前向传播和反向传播过程的顺畅性。
核心思想是保证信息传播路径的“clean”来缓解优化问题。

本文提出了一种恒等映射:f(y)=y,及去掉原来的relu函数,是信息直接流向下一个残差block。
这里写图片描述
(虚线:训练 实现:测试)
实验证明了该结构进一步提升了网络的性能。

Analysis

如果addition操作之后是恒等映射,则Residual network的数学表达变成:
这里写图片描述
这里写图片描述
L:任何深度 l:浅层深度

后向传播公式
这里写图片描述
公式表现为两个项之和,第一项直接通道,可以把深层的梯度传递到任意浅层,可以看出浅层的梯度很难为0,第二项为卷积通道,不可能一直为 -1,所以不管参数多小,梯度也不会消失。

恒等跨越连接的重要性

作者把原来的identity mapping改成线性映射,并分析其影响(h(x)=kx )
这里写图片描述
这里写图片描述
这里写图片描述
此网络的后向传播过程受λ控制,若λ>1,则第一项会非常大,因而会导致梯度爆炸;若λ<1,则第一项会非常小,甚至消失。反向传播的信号只能从第二项传递,但是其优化难度更大。综上,这个结构妨碍了信息的传播,恒等映射更好。

Experiment on Skip connection

在shortcut上添加各种结构,进行对比试验,试验结果证明了恒等映射最好。
这里写图片描述
这里写图片描述

On the Usage of Activation Functions

之前的网络结构都是假设f是恒等映射,这一部分研究relu激活函数的影响,并提出了一个“pre-activation”结构,能进一步提高了网络的性能。
对比实验:
这里写图片描述
网络的变化过程
这里写图片描述

Analysis

这种结构有双重效果:
1.缓解了优化难度。此结构中合并之后是恒等过渡,使得梯度的传播更加顺畅。其次减少了信息的流失,使得下一个block保存更多的信息。
2.减少过拟合。新结构多加了一个BN层,使得信息更加规范化。

Result

这里写图片描述
这里写图片描述

### 深度残差网络中的恒等映射 深度残差网络(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、付费专栏及课程。

余额充值