ResNet 系列 残差连接 2021-03-05

残差连接是什么

虽然普遍认为神经网络模型越深,拟合能力越好,但是由于梯度消失/爆炸等问题,在深度到达了一定程度后, 模型的表现会不升反降。
2015年的ResNet是针对模型退化现象提出来的,通过residual connection 残差连接让上百层的模型得以收敛,从而也在分类任务中达到了更高的精度,在2016年的改进版中更是达到了上千层。
其实残差结构非常简单:

左边为普通结构,右边为残差结构, 来自动手学深度学习

所谓残差连接指的就是将浅层的输出和深层的输出求和作为下一阶段的输入,这样做的结果就是本来这一层权重需要学习是一个对 xf(x)的映射。那使用残差链接以后,权重需要学习的映射变成了 从x -> f(x)-x,这样在反向传播的过程中,小损失的梯度更容易抵达浅层的神经元。其实这个和循环神经网络LSTM中控制门的原理也是一样的。

其实残差连接可以看成一种特殊的跳跃连接,15年还有一篇Highway高速公路神经网络使用了类似的结构,但是在旁路中设置了可训练参数,效果没有ResNet好,似乎就验证了保持旁路畅通无阻的重要性。

实现起来也非常简单:

    # Pytorch 官方实现
    # https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py
    identity = x

    out = self.conv1(x)
    out = self.bn1(out)
    out = self.relu(out)

    out = self.conv2(out)
    out = self.bn2(out)
    out = self.relu(out)

    out = self.conv3(out)
    out = self.bn3(out)

    if self.downsample is not None:
        identity = self.downsample(x)

    out += identity  # 与输入求和
    out = self.relu(out)
resnet v1, 虚线位置通道数加倍,特征图减半
ResNetV2改动了BN和激活位置
ResNetV2对不同的短接方式进行了实验

wide Resnet 增加了通道数,使用了dropout技术

而ResNet的整体模型结构借鉴了VGG的模块式搭建,比较重要的区别是使用了Batch Normalization 批量正则化。

残差连接为什么有用

作者原文中提出的假设是当梯度接近零时,比起让参数直接拟合一个恒等映射,将残差函数逼近到0更容易,那么短接的这一路可不可以再给他加些花样(参数)呢? 那其实就是更广泛意义上的跳跃连接, 对此的研究其实由来已久, 被大家用来解决梯度消失,爆炸的问题,有学者起了一个形象的名字高速公路网络, 因为这样的结构使得特定信息可以无损地通过"高速公路"直达目的地。但是Highway 网络的表现并不如ResNet, 似乎说明了保持高速公路的畅通无阻(恒等映射)更加有用。

把残差网络展开, 相当与集成ensemble了多个神经网络, 从另一个角度解释了为什么残差网络有效

关于残差网络高效的原因有另外一篇论文Residual Networks Behave Like Ensembles of Relatively Shallow Networks提出了一种补充观点: 残差网络可以看成多个神经网络地集成, 其实到一定深度的层数是不必要的,因为恒等映射它们并没有做出什么贡献。

从这个实验结果可以看到删除VGG中的任意一层,模型表现下降明显,而残差网络却基本不变。

这个现象似乎说明,其实残差网络其实也不能说是解决了模型深度的问题,他只是因为隐含了集成神经网络的结构,所以即使在某些神经元失效时,仍然可以保证模型的整体效果

残差网络

2015 Deep Residual Learning for Image Recognition
推出了50,101,152层的版本。
2016 Identity Mappings in Deep Residual Networks
推出了1000层的版本。
2017 Aggregated Residual Transformations for Deep Neural Networks
感觉加深已经到尽头了, 开始在对模块进行加宽。

ResNeXt

ResNeXt有101和152,结合ResNet堆叠思想和inception的split、transform、aggregate思想,引入分组卷积。

ResNeXt保留了VGG和ResNet用重复模块构建模型的策略,同一个block共享一组相同的超参数,每当特征图被下采样到1/2时,block的宽度将会乘2.


输入被分成D个维度加权求和,

同时借鉴了Inception系列 split-transform-merge 分离变换再融合的思想,在精度提高的同时,计算量却没有增加。其实ResNet可以看成分成两路的神经网络,其中一路是恒等映射。


ResNet 对比 ResNeXt, 将模块分成了不同的路径

增加 cardinality(势, 表示集合的大小) 可以提高模型的表现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容