计算机系统应用教程网站

网站首页 > 技术文章 正文

深度学习之重读经典(五)ResNet

btikc 2024-09-09 01:42:08 技术文章 15 ℃ 0 评论

简 介

通过阅读宝略科技公众号往期介绍的VGGNet、GoogLeNet等文章,不难发现,增加深度可以显著提高网络的学习表达能力,然而实验表明,采用简单的卷积堆叠,到了一定的层数后,优化效果不升反降,这是由于网络加深导致梯度消失/梯度爆炸以及退化现象出现。ResNet引入批归一化(Batch Normalization)和残差块(Residual Block)改善了上述问题,获得2015年ILSVRC比赛的冠军,使训练1000层以上的网络成为可能。


01 特殊技巧

批归一化(Batch Normalization)

批归一化思想源自2015年的一篇论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,通常用于卷积/全连接层后,激活函数前。旨在解决深层神经网络训练过程中底部层梯度小、训练慢以及顶部层输入分布变化频繁、难收敛等问题。批归一化公式如下:

其中μB和σB分别为在一个小批量样本上求得的均值和标准差,γ和β为可学习的参数。


残差块(Residual Block)

除了梯度消失和梯度爆炸,深层网络训练中还存在退化问题。理论上讲,网络训练到某个深度达到最优状态,接下来的层只要维持现状(即做恒等映射),即可达到浅层网络同等或者更佳的精度,但是实验结果(图1)显示,深层的网络反而带来更大的误差,这说明了深层网络中恒等映射函数并不容易拟合。

于是,作者考虑在输入和输出之间加入“跳接”(shortcut connection),如图2中所示弧线部分。此时H(x)=F(x)+x,其中F(x)为残差函数。那么只要拟合F(x)=0,就得到了H(x)=F(x)+x的恒等映射。拟合残差函数相对恒等函数来说更加容易。

残差块的内部结构是可变的,文中就给出了两种形式(如图3所示),左图用于ResNet18/34,右图用于ResNet50/101/152。左图采用两个3×3卷积,每个卷积后跟一个BN层(图中未标明)以及relu激活函数,计算结果与输入相加后输出。右图采用两个1×1卷积代替其中一个3×3卷积,目的是减少参数量、降低计算复杂度(参数计算法方式详见深度学习之重读经典(一)附录)。


02 网络结构

ResNet的整体架构与VGG、GoogLeNet较为类似,只是主体部分替换为残差块。网络先进入7×7的卷积层以及3×3的池化层,接着是若干个残差块,最后通过全局平均池化层以及softmax输出类别。通过堆叠不同数量和形式的残差块,可以得到不同层级的Resnet,如表1所示。


图4为网络结构对比图。左侧为VGG-19的网络结构,中间为基于VGG-19扩展到34层的普通网络,右侧为加入跳接后的残差网络。



03 代码实现

这里分别给出两层和三层结构残差块的pytorch实现方式:


完整ResNet结构以及不同层级网络架构实现见:

https://github.com/PopSmartTech/deeplearning


04 总结

ResNet融合VALD(Vector of Locally Aggregated Descriptors,残差思想来源)和Highway Network(跳跃连接思想来源)等思想,通过堆叠子网络构建深层的卷积神经网络,在提升精度的同时加速训练进程,改进后的ResNet可以优化1000层以上的神经网络。基于这种思想后续产生一系列拓展研究,例如ResNeXt、DenseNet、ShuffleNet等变体,均表现出更佳的性能。


参考资料:

[1] He K , Zhang X , Ren S , et al. Deep Residual Learning for Image Recognition[J]. IEEE, 2016.

[2] alanma. 残差网络ResNet笔记

https://www.cnblogs.com/alanma/p/6877166.html


本文所有文字版权均属“宝略科技”,更多内容请搜索关注【宝略科技】微信公众号~

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表