ResNet残差网络及变体详解(符代码实现)

本文通过分析深度网络模型的缺点引出ResNet残差网络,并介绍了几种变体,最后用代码实现ResNet18。

前言

ResNet(Residual Network, ResNet)是微软团队开发的网络,它的特征在于具有比以前的网络更深的结构,在2015年的ILSVRC大赛中获得分类任务的第1名。

网络的深度对于学习表达能力更强的特征至关重要的。网络的层数越多,意味着能够提取的特征越丰富,表示能力就越强。(越深的网络提取的特征越抽象,越具有语义信息,特征的表示能力就越强)。

但是,随着网络深度的增加,所带来的的问题也是显而易见的,主要有以下几个方面:

  1. 增加深度带来的首个问题就是梯度爆炸/消散的问题,这是由于随着层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定,变得特别大或者特别小。这其中经常出现的是梯度消散的问题。
  2. 为了克服梯度消散也想出了许多的解决办法,如使用BatchNorm,将激活函数换为ReLu等,但是改善问题的能力有限。
  3. 增加深度的另一个问题就是网络的degradation(退化)问题,即随着深度的增加,网络的性能会越来越差。如下所示:在这里插入图片描述

为了让更深的网络也能训练出好的效果,何凯明大神提出了一个新的网络结构——ResNet(Residual Network,残差网络)。通过使用残差网络结构,深层次的卷积神经网络模型不仅避免了出现模型性能退化的问题,并取得了更好的性能。

需要注意的是,Residual Network不是为了解决过拟合的问题,因为过拟合只是在测试集上错误率很高,而在训练集上错误率很低,通过上图可以出,随着深度的加深而引起的 model degradation(模型退化)不仅在训练集上错误率高,在测试集上错误率也很高。所以说 Residual Network 主要是为了解决因网络加深而导致的模型退化问题(也有效避免了梯度消散问题,下面会讲)。

模型退化

通常,当我们堆叠一个模型时,会认为效果会越堆越好。因为,网络的层数越多,意味着能够提取到的特征越丰富,特征的表示能力就越强,假设一个比较浅的网络已经可以达到不错的效果,那么再进行叠加的网络如果什么也不做,效果不会变差。

事实上,这是问题所在,因为“什么都不做”是之前神经网络最难做到的事情之一。这时因为由于非线性激活函数(Relu)的存在,每次输入到输出的过程都几乎是不可逆的(信息损失),所以很难从输出反推回完整的输入。所以随着深度的加深而引起的 model degradation(模型退化)仅通过普通网络模型是无法避免的。

Residual Learning(残差学习)设计的本质,是让模型的内部结构具有恒等映射的能力,至少让深度网络实现和浅层网络一样的性能,即让深度网络后面的层至少实现恒等映射的作用,这样在堆叠网络的过程中,不会因为继续堆叠而产生退化。

在mobileNetV2论文中,作者说明了使用ReLU的问题,即当使用ReLU等激活函数时,会导致信息丢失,如下所示:
在这里插入图片描述

低维(2维)的信息嵌入到n维的空间中(即Input的特征经过高维空间进行变换),并通过随机矩阵 T T T对特征进行变换,之后再加上ReLU激活函数,之后在通过 T − 1 T^{−1} T1 (T的逆矩阵)进行反变换。当n=2,3时,会导致比较严重的信息丢失,部分特征重叠到一起了;当n=15到30时,信息丢失程度降低。

残差结构

在这里插入图片描述

在上图中,我们可以使用一个非线性变化函数来描述一个网络的输入输出,即深层的输入为X(X也为浅层的输出),深层的输出为F(x)+x,F通常包括了卷积,激活等操作。

这里需要注意附加的恒等映射关系具有两种不同的使用情况:残差结构的输入数据若和输出结果的维度一致,则直接相加;若维度不一致,必须对x进行升维操作,让它俩的维度相同时才能计算。升维的方法有两种:

  • 直接通过zero padding 来增加维度(channel);
  • 用1x1卷积实现,直接改变1x1卷积的filters数目,这种会增加参数。

令H(x)=F(x)+x,即H(x)为深层的输出,则 F(x)=H(x)−x。此时残差结构如下图所示,虚线框中的部分就是F(x),即H(x)−x。
在这里插入图片描述

当浅层的x代表的特征已经足够成熟(即浅层网络输出的特征x已经达到了最优),再经过任何深层的变换改变特征x都会让loss变大的话,F(x)会自动趋向于学习成为0,x则从恒等映射的路径继续传递。这样就在不增加计算成本的情况下实现了目的:在前向过程中,当浅层的输出已经足够成熟,让深层网络后面的层能够实现恒等映射的作用(即让后面的层从恒等映射的路径继续传递),这样就解决了由于网络过深而导致的模型退化的问题。

从另一方面讲,残差结构可以让网络反向传播时信号可以更好的地传递,以一个例子来解释。

假设非残差网络输出为G(x),残差网络输出为H(x),其中H=F(x)+x,输入的样本特征 x=1。(注意:这里G和H中的F是一样的,为了区分,用不同的符号)

(1)在某一时刻:

非残差网络G(1)=1.1, 把G简化为线性运算 G ( x ) = W g ∗ x G(x)=W_g*x G(x)=Wgx,可以明显看出 W g = 1.1 W_g=1.1 Wg=1.1
残差网络H(1)=1.1, H(1)=F(1)+1, F(1)=0.1,把F简化为线性运算 F ( x ) = W f ∗ x F(x)=W_f*x F(x)=Wfx W f = 0.1 W_f=0.1

  • 19
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷恩Layne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值