残差网络Residual Network

背景

梯度消失问题

我们发现很多很深的网络层,由于参数初始化一般更接近于0,在这样训练网络过程中,更新浅层网络参数时,很容易随着网络的深度而导致梯度消失,浅层参数无法更新是。

可以看到,假设现在需要更新 b 1 , w 2 , w 3 , w 4 b_1,w_2,w_3,w_4 b1,w2,w3,w4参数由于随机初始化偏向于0,通过链式求导,我们会发现, w 1 , w 2 , w 3 w_1,w_2,w_3 w1,w2,w3 相乘会得到更加接近于0的数,那么所求的 b 1 b_1 b1梯度就接近于0,也就产生了梯度消失的现象。

网络退化问题

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

ResNets残差网络

ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。

可以看到 x x x是这一层残差块的输入,也称作 F ( x ) F(x) F(x) 为残差, x x x为输入值, F ( x ) F(x) F(x)是经过第一层线性变换并激活后的输出,该图表示在残差网络中,第二层进行线性变化之后激活之前。 f ( X ) f(X) f(X)加入了这一层输入值 X X X,然后在进行激活后的输出,在第二层输出值激活前加入 X X X,这条路径称作shortcut连接。

网络架构

普通网络

残差网咯

把其变成ResNet网络的方法是加上所有跳跃连接,每两层增加一个捷径,构成一个残差快,如图所示:五个残差快连接在一起构成一个残差网络。

对比分析

如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接**,凭经验你会发现随着网络深度的加深**,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说**,理论上网络深度越深越好**。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多
  但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。有人甚至在1000多层的神经网络中做过实验,这样就让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看**,随着网络越深,网络连接会变得臃肿**,但是ResNet确实在训练深度网络方面非常有效

解决问题

为什么可以解决梯度消失?

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

为什么可以解决网络退化问题

我们发现,假设该层是冗余的,在引入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 F(x) = 0 F(x)=0等于0,来让该层网络恒等映射上一层的输入,使得有了这些冗余层网络效果与没有这些冗余层网络效果相同,这样很大程度解决了网络退化问题。

学习心得

会自己复现代码,把残差网络添加到各种模型中去,然后会自己训练各种网络架构,全部将其完成都行啦的样子与打算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

big_matster

您的鼓励,是给予我最大的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值