【机器学习】ResNet总结

被问了。。。?

一个block能不能画出来啊!?


  常规的网络的堆叠(plain network)在网络很深的时候,效果却越来越差了。其中原因之一即是网络越深,梯度消失的现象就越来越明显,网络的训练效果也不会很好。 但是现在浅层的网络(shallower network)又无法明显提升网络的识别效果了,所以现在要解决的问题就是怎样在加深网络的情况下又解决梯度消失的问题。

resnet50包含两个block:identity block和convolution block

shortcut路径中的CONV2D层用于将输入x调整为不同的尺寸,以便在添加shortcut残差块的值返回到主路径时需要最后添加的尺寸相匹配(与矩阵Ws的作用相同)。例如,要将激活值维度的高度和宽度缩小2倍,可以使用步长为2的1x1卷积。


  • 残差指的是什么? 

其中ResNet提出了两种mapping:一种是identity mapping,指的就是图1中”弯弯的曲线”,另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y=F(x)+x
identity mapping顾名思义,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y−x,所以残差指的就是F(x)部分。 

  • 为什么ResNet可以解决“随着网络加深,准确率不下降”的问题? 

理论上,对于“随着网络加深,准确率下降”的问题,Resnet提供了两种选择方式,也就是identity mapping和residual mapping,如果网络已经到达最优,继续加深网络,residual mapping将被push为0,只剩下identity mapping,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。

  • ResNet结构

它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思。我们可以看到一个“弯弯的弧线“这个就是所谓的”shortcut connection“,也是文中提到identity mapping,这张图也诠释了ResNet的真谛,当然大家可以放心,真正在使用的ResNet模块并不是这么单一,文章中就提出了两种方式: 

这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。 
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。

  • 如果F(x)和x的channel个数不同怎么办,因为F(x)和x是按照channel维度相加的,channel不同怎么相加呢? 

针对channel个数是否相同,要分成两种情况考虑,如下图:

有”实线“和”虚线“两种连接方式, 实线的的Connection部分(”第一个粉色矩形和第三个粉色矩形“)都是执行3x3x64的卷积,他们的channel个数一致,所以采用计算方式: y=F(x)+x
虚线的的Connection部分(”第一个绿色矩形和第三个绿色矩形“)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式: y=F(x)+Wx
其中W是卷积操作,用来调整x的channel维度的——也就是convolutional block啦 


  • 对于式子的推导不是很理解:(

通过在一个浅层网络基础上叠加 y=x 的层(称identity mappings,恒等映射),可以让网络随深度增加而不退化

这反映了多层非线性网络无法逼近恒等映射网络。但是,不退化不是我们的目的,我们希望有更好性能的网络。

resnet学习的是残差函数F(x) = H(x) - x, 这里如果F(x) = 0, 那么就是上面提到的恒等映射。事实上,

resnet是“shortcut connections”在connections是在恒等映射下的特殊情况,它没有引入额外的参数和计算复杂度。


  • 恒等映射为什么可以防止梯度消失?

什么是残差函数?

我们使用一般网络拟合的是h(x),使得输入x,h(x)能够得到正确的解来帮助我们预测分类
而在ResNet中引入了残差函数 f(x)=h(x)-x(即目标值与输入值的偏差),通过训练拟合f(x),进而由f(x)+x得到h(x)。

使用残差函数的好处有哪些呢?我的理解有以下几点(仅个人理解,如有错误请指出~)

  • 解决了退化问题同时很好的避免(或者只能说是减少?)了梯度爆炸/消失。ResNet的出发点并不是为了解决梯度爆炸/消失问题,达到这种效果纯粹是无意之举,关于原因的话,我阅读了大量的博客和解析,他们用公式的解释方法我并不是很理解。
  • 首先为什么解决了退化问题。当网络达到一定深度,若网络已经最优化,那么当继续增加网络时,f(x)将被push为0,h(x)变为恒等映射,那么对于整个网络来说,深度的增加也并不会对网络的performance带来太大的影响了。那么,我的理解是,梯度爆炸/消失的原因是随着深度增加,梯度的同向变化传递所导致的(如对每个单元选择同样的激活函数,导数同时大于1或小于1,分别对应梯度爆炸和梯度消失,因此最简单的解决方法是使用ReLU激活函数,而ResNet也同样选择了ReLU作为激活函数),在ResNet中随着网络深度的增加,后续的网络由于采用恒等映射,因此并不会继续传递这种变化,从而避免了梯度爆炸/消失。(同样的原因,也有学者diss ResNet并没有真正的增加深度,只是使网络退化为了浅层网络)
  • 进而,由于恒等映射的学习比一般的线性映射要简单的多,所以训练速度也相对同样的深层网络来说使比较快的。
  • 同时,网络在深层如果真正学习到了一些东西,而不是简单的恒等映射,那么将会有更好的performance。
  • 此外,使用残差函数f(x)对映射后的输出更敏感,如由h(x)=f(x)+x=5.1,h1(x)=f(x)+x=5.2, x=5, f(x)=0.1->f(x)=0.2那么变化率由0.1/5放大至0.1/0.1=100%.

完整的resnet50结构看参考1ba~

  • 残差网络为什么可以缓解梯度消失?

xl+1 = xl + F(xl, Wl)
xl+2 = xl+1 + F(xl+1, Wl+1)
依次类推,可以得到第L层的输入为:

设损失函数为则:

从上式可以看出,从第L层到它之前的任意l层有两条传播路径,第一条传播路径不经过任何中间层,这对梯度消失起到了缓解作用。另外,在一个mini-batch中,一般来说,对于所有的样本都是-1的可能性不大。这就意味着即使所有的weights都取很小的值,梯度也不会消失。

 

 参考:

深度学习——残差神经网络ResNet在分别在Keras和tensorflow框架下的应用案例

ResNet解析

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值