【深度学习】ResNet

ResNet是为了解决深度网络中的梯度消失和网络退化问题而提出的,通过残差学习单元实现了网络层的恒等映射,简化了参数学习。通过在结构中添加直连通道,ResNet有效地解决了深层网络的训练难题,使得更深的网络也能达到良好的性能。其主要思想是让网络学习残差F(x)=0,而不是学习恒等映射h(x)=x,从而缓解了网络退化问题。此外,ResNet V2的改进进一步增强了模型的训练效果和泛化能力。
摘要由CSDN通过智能技术生成

深层次网络训练瓶颈:梯度消失,网络退化

深度卷积网络自然的整合了低中高不同层次的特征,特征的层次可以靠加深网络的层次来丰富。从而,在构建卷积网络时,网络的深度越高,可抽取的特征层次就越丰富。所以一般我们会倾向于使用更深层次的网络结构,以便取得更高层次的特征。但是在使用深层次的网络结构时我们会遇到两个问题,梯度消失,梯度爆炸问题和网络退化的问题。

但是当使用更深层的网络时,会发生梯度消失、爆炸问题,这个问题很大程度通过标准的初始化和正则化层来基本解决,这样可以确保几十层的网络能够收敛,但是随着网络层数的增加,梯度消失或者爆炸的问题仍然存在。

还有一个问题就是网络的退化,举个例子,假设已经有了一个最优化的网络结构,是18层。当我们设计网络结构的时候,我们并不知道具体多少层次的网络时最优化的网络结构,假设设计了34层网络结构。那么多出来的16层其实是冗余的,我们希望训练网络的过程中,模型能够自己训练这五层为恒等映射,也就是经过这层时的输入与输出完全一样。但是往往模型很难将这16层恒等映射的参数学习正确,那么就一定会不比最优化的18层网络结构性能好,这就是随着网络深度增加,模型会产生退化现象。它不是由过拟合产生的,而是由冗余的网络层学习了不是恒等映射的参数造成的。

ResNet简介

ResNet(Residual Neural Network)在2015年被提出,在ImageNet比赛classification任务上获得第一名。ResNet的深度远远高于VGGNet,但是参数量却比VGGNet要低,效果也更好。

ResNet中最具创新的一点就是残差学习单元(Residual Unit)的引入,而Residual Unit又是参考的Highway Network。Highway Network的出现就是为了解决较深的神经网络难以训练的问题。
ResNet的主要思想是在网络中增加了直连通道。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出。允许原始输入信息直接传到后面的层中。类似LSTM中的门控单元(Gating Units)来学习原始信息保留下来的比例。

ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。将原网络的几层改成一个残差块,残差块的具体构造如下图所示:

ResNet解决深度网络瓶颈的魔力

网络退化问题的解决

我们发现,假设该层是冗余的,在引入ResNet之前,我们想让该层学习到的参数能够满足h(x)=x,即输入是x,经过该冗余层后,输出仍然为x。但是可以看见,要想学习h(x)=x恒等映射时的这层参数时比较困难的。ResNet想到避免去学习该层恒等映射的参数,使用了如上图的结构,让h(x)=F(x)+x;这里的F(x)我们称作残差项,我们发现,要想让该冗余层能够恒等映射,我们只需要学习F(x)=0。学习F(x)=0比学习h(x)=x要简单,因为一般每层网络中的参数初始化偏向于0,这样在相比于更新该网络层的参数来学习h(x)=x,该冗余层学习F(x)=0的更新参数能够更快收敛,如图所示:
在这里插入图片描述
假设该曾网络只经过线性变换,没有bias也没有激活函数。我们发现因为随机初始化权重一般偏向于0,那么经过该网络的输出值为[0.6 0.6],很明显会更接近与[0 0],而不是[2 1],相比与学习h(x)=x,模型要更快到学习F(x)=0。

并且ReLU能够将负数激活为0,过滤了负数的线性变化,也能够更快的使得F(x)=0。这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。

这样当网络自行决定了哪些层为冗余层后,通过学习残差F(x)=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络的退化问题。

梯度消失或梯度爆炸问题的解决

我们发现很深的网络层,由于参数初始化一般更靠近0,这样在训练的过程中更新浅层网络的参数时,很容易随着网络的深入而导致梯度消失,浅层的参数无法更新。
在这里插入图片描述
可以看到,假设现在需要更新b1,w2,w3,w4参数因为随机初始化偏向于0,通过链式求导我们会发现,w1w2w3相乘会得到更加接近于0的数,那么所求的这个b1的梯度就接近于0,也就产生了梯度消失的现象。

ResNet最终更新某一个节点的参数时,由于h(x)=F(x)+x,由于链式求导后的结果如图所示,不管括号内右边部分的求导参数有多小,因为左边的1的存在,并且将原来的链式求导中的连乘变成了连加状态,都能保证该节点参数更新不会发生梯度消失或梯度爆炸现象。
在这里插入图片描述

ResNet使用的小技巧

这里是应用了ResNet的网络图,这里如果遇到了h(x)=F(x)+x中x的维度与F(x)不同的维度时,我们需要对identity加入Ws来保持Ws*x的维度与F(x)的维度一致。

如果F(x)和x的channel个数不同,分成两种情况考虑:
(1)channel个数一致,采用计算方式: y = F ( x ) + x y=F(x)+x y=F(x)+x
(2)channel个数不同(64和128),采用计算方式: y = F ( x ) + W x y=F(x)+Wx y=F(x)+Wx
其中 W W W是卷积操作,用来调整 x x x的channel维度的。

使用1*1卷积减少参数和计算量:

如果用了更深层次的网络时,考虑到计算量,会先用11的卷积将输入的256维降到64维,然后通过11恢复。这样做的目的是减少参数量和计算量。
在这里插入图片描述
左图是ResNet34,右图是ResNet50/101/152。这一个模块称作building block,右图称之为bottleneck design。在面对50,101,152层的深层次网络,意味着有很大的计算量,因此这里使用11卷积先将输入进行降维,然后再经过33卷积后再用11卷积进行升维。使用11卷积的好处是大大降低参数量计算量。

网络结构

在增加网络深度的同时,我们还要考虑到梯度消失的问题。因为梯度反向传播到前层,重复的乘法可能使梯度无穷小。
为了解决梯度消失问题,ResNet引入了全等映射层。假设某一神经网络的输入是 x x x,经过这一段网络的处理之后期望输出为 H ( x ) H(x) H(x),现在将输入 x x x传到输出作为输出的一部分,那么此时我们的学习目标不再是一个完整的输出 H ( x ) H(x) H(x),而是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值