ResNet 小总结

因为疫情原因,我向学校申请了休学一年并在成都继续生活。当然,这一年也不能闲着;于是我找了一个和机器学习有关的实习工作。这篇文章是在工作时写的,为了公司老板的论文写的关于 ResNet 发展的小简介。略微修改了一点点格式。因为自己能力有限,还在学习深度学习的过程当中,所以可能会有理解错误的地方,请大家勘误。这篇文章的商务气息很重吧,呜呜呜。

ResNet

在深度学习高速发展的现在,深度学习神经网络有两个主要发展方向:不断的加深加宽神经网络的大小以及设计并优化神经网络的架构。在以前的研究中,单纯的将普通的神经网络继续堆叠加深无法优化模型的训练结果:研究结果和预计恰恰相反,更深的神经网络使得模型的判断准确度下降了。

造成这种现象的主要原因为由于网络变得更大,训练模型时,其收敛速度变低了,从而造成了模型准确度的降低。其中涉及到的两个主要现象为 Vanishing Gradient 和 Exploding Gradient。针对这个问题,前人提出了不同的方法,如GoogLeNet的研究人员提出了 Auxilliary Loss 的方法来解决这个问题。然而,这些方法均不能完全解决这两个问题。

ResNet的核心思想则是在网络中每两层之间加入 Identity Shortcut Connection/Skip Connection 使得数据可以跳过某些层。这个思想利用了ReLU函数中,当 z0z\geq0 时,g(z)=zg(z)=z 的性质。在一个网络的第 ll 层有如下性质:

a0\because a\geq0

a[l+2]=g(z[l+2]+a[l])a^{[l+2]}=g(z^{[l+2]}+a^{[l]})

a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l])a^{[l+2]}=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})

在网络中加入 L2 Regularization 后,W[l+2]W^{[l+2]}b[l+2]b^{[l+2]} 的值会变小

If W[l+2]=0,b[l+2]=0\text{If }W^{[l+2]}=0, b^{[l+2]}=0

Then a[l+2]=g(a[l])\text{Then }a^{[l+2]}=g(a^{[l]})

a[l+2]=a[l]a^{[l+2]}=a^{[l]}

由此我们可以证明,残差块可以很容易地通过 Identity Function 进行学习。通过运用这个思想,将每两层网络以及一个捷径连接拼接成为一个 Residual Block —— ResNet的基本单位——就可以组成 ResNet。恒等函数的计算非常简单,在神经网络中加入此种类型的块也不会影响其性能。ResNet从传统神经网络中提取出了冗余的部分,并利用捷径连接进行 Skip。残差的思想即是将信息进行提取/过滤。

ResNeXt

随着深度学习的发展,视觉识别的研究方向从 Feature Engineering 逐渐转变成了 Network Engineering。然而随着网络结构逐渐变深,其自身所需要的 Hyperparameters 也逐渐变多。 ResNet 等网络的成功证明了堆叠相同形状的块可以在减少超参数的同时提升模型性能;同时 GoogLeNet/GoogLeNet-v2/Inception 等网络的实践也逐渐证明运用 split-transform-merge 的策略进行精细的网络设计也可以有效地改善模型性能。ResNeXt 则是将这两个想法同时运用:通过重新设计块,并重复堆叠,ResNeXt 的性能在 ResNet 上出现了提升。

SE_ResNext

SE_ResNeXt 为 ResNet 的两次更迭的结果。从 2017 年开始,Google 提出了 Attention Model 的重要性。SE_ResNeXt 则是在 ResNeXt 基础上加入了额外的一条 Branch 来实现 Channel-wise Scale 来为模型加入特性。最终的实践效果表明,SE_ResNeXt 在收敛速度和准确度上都有提高。

文章作者: Kiyoshi
文章链接: https://blog.k1yoshi.com/article/resnet-summary/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kiyoshi's Blog