16-Identity Mappings in Deep Residual Networks

目录

概要

整体架构流程

总结

实践

参考


概要

这篇论文主要讲的是凯明大佬在resent发表之后,对resent中的shortcut的公式理解和结构改进实验。文中通过对残差模块的改建实验得到了残差模块的最优形式,在层数不断增大时,效果得到了极大的提升。

整体架构流程

图a未原始的transformer结构,右图为该文改进后的结构,可以看到在train,test loss上都有很大的提升。

Residual Units:

本文分别对h(x)与F(x)两个部分的内部结构进行改造,最终得到的结论为h(x)为恒等映射的话效果时最好的:

如果是恒等映射的话,那么当层数增加时,H(x)的梯度恒为1,

而如果不是恒等映射,而是增加了其他计算的话:

那么当层数增大时,H(x)的系数为L个\lambda个参数连乘,那么很容易发生系数很小,梯度消失,梯度难以回传到浅层的问题

对h(x)做了不同类型的尝试,最终确实是恒等映射的效果最好:

同时也对残差模块F(x)中激活,BN,addition的组合方式进行了探讨:

最终得到的full-pre-activation模式的组合效果是最好的

总结

  • hf 函数应该使用恒等映射,保证梯度可以直接回传至任意浅层,不容易产生梯度消失或爆炸,相比其它hf函数效果更好
  • h: 使用scale/gating/conv会阻碍传播,产生优化问题
  • f : 使用BN会阻断梯度的传播,不要加在addition之后
  • ReLU不要加在残差模块的最后:希望残差模块的输出是-无穷-正无穷之间
  • pre-activate:
  • 1.保证fh是恒等映射
  • 2.在残差模块中将BNRelu函数提前,效果最好
  • 3.BN放在weight之前:保证每一层残差模型的输入都是归一化的

实践

借鉴这篇论文在transormer中MHA和FFN中的残差模块模拟该文中提到的对比方式:

最终的结论与论文一致;pre-activation的效果是最好的。

参考

 论文:Identity Mappings in Deep Residual Networks

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

余额充值