本文主要是针对ResNet中之前混淆的概念:
- Resnet 到底解决了什么问题?
- 为什么网络层数变深了效果反而更差了?
为什么不能简单地增加网络层数?
对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。
对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。
虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。
退化问题说明了深度网络不能很简单地被很好地优化。
作者通过实验:通过浅层网络x + f(x) =h(x) 这样的等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。
什么是Resnet?
resnet最初的想法是在训练集上,深层网络不应该比浅层网络差,为此,只需要将深层网络多的那些层做恒等映射就简化为了浅层网络。所以,从学习恒等映射这点出发,考虑到网络要学习一个F(x)=x的映射比学习F(x)=0的映射更难,所以,可以把网络结构设计成H(x) = F(x) + x,这样就即完成了恒等映射的学习,又降低了学习难度。这里的x是残差结构的输入,F是该层网络学习的映射,H是整个残差结构的输出。
深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) =x. 而且,拟合残差肯定更加容易。
通俗的理解:理论上深层的神经网络一定比浅层的要好,比如深层网络A,浅层网络B,A的前几层完全复制B,A的后几层都不再改变B的输出,那么效果应该是和B是一样的。也就是说,A的前几层就是B,后几层是线性层。但是实验发现,超过一定界限之后,深层网络的效果比浅层的还差。一个可能的解释是:理论上,我们可以让A的后几层输入等于输出,但实际训练网络时,这个线性关系很难学到。既然如此,我们把这个线性关系直接加到网络的结构当中去,那么效果至少不比浅层网络差。也就是说,Resnet让深层神经网络更容易被训练了。
Resnet到底解决了什么问题?
一方面: ResNet解决的不是梯度弥散或爆炸问题,kaiming的论文中也说了:臭名昭著的梯度弥散/爆炸问题已经很大程度上被normalized initialization and intermediate normalization layers解决了。
另一方面: 由于直接增加网络深度的(plain)网络在训练集上会有更高的错误率,所以更深的网络并没有过拟合,也就是说更深的网络效果不好,是因为网络没有被训练好。也就说,Resnet解决的是在深层神经网络上对恒等函数的拟合问题,从而使得网络更加容易被训练了。
同时,原文中也提到,图像是具有局部相关性的,因此认为梯度也应该具备相关性,但是在梯度更新期间,梯度的相关性会随着层数的变深呈指数性衰减,导致梯度趋近于白噪声,而skip-connections 可以减缓衰减速度,使相关性和之前比起来变大。
链接:https://www.jianshu.com/p/d19ae916fc8a
本文暂时没有评论,来添加一个吧(●'◡'●)