* 1. 思想 <https://blog.csdn.net/Sakura55/article/details/81512132#1-思想>
* 2. 问题来源 <https://blog.csdn.net/Sakura55/article/details/81512132#2-问题来源>
*
*
* 网络的深度为什么重要?
<https://blog.csdn.net/Sakura55/article/details/81512132#网络的深度为什么重要>
* 为什么不能简单地增加网络层数?
<https://blog.csdn.net/Sakura55/article/details/81512132#为什么不能简单地增加网络层数>
* 怎么解决退化问题? <https://blog.csdn.net/Sakura55/article/details/81512132#怎么解决退化问题>
* 其他的参考解释 <https://blog.csdn.net/Sakura55/article/details/81512132#其他的参考解释>
* 3、原理解释 <https://blog.csdn.net/Sakura55/article/details/81512132#3原理解释>


论文地址:https://arxiv.org/pdf/1512.03385v1.pdf
<https://arxiv.org/pdf/1512.03385v1.pdf>

1. 思想

作者根据输入将层表示为学习残差函数。实验表明,残差网络更容易优化,并且能够通过增加相当的深度来提高准确率。
核心是解决了增加深度带来的副作用(退化问题),这样能够通过单纯地增加网络深度,来提高网络性能。

作者在ImageNet上实验了一个152层的残差网络,比VGG深8倍,取得了3.57%的错误率。
作者通过一系列实验证明了表示的深度(即网络的深度)对很多视觉识别任务都至关重要。仅仅由于使用了非常深的网络,作者就在COCO目标检测数据集上获得了28%
的相对提升。

2. 问题来源

网络的深度为什么重要?


因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。

为什么不能简单地增加网络层数?

对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。

对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。

                
虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释overfitting,因为overfit应该表现为在训练集上表现更好才对。
退化问题说明了深度网络不能很简单地被很好地优化。
                作者通过实验:通过浅层网络+ y=x
等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。

怎么解决退化问题?

                深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。
但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) +
x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x.
而且,拟合残差肯定更加容易。

残差块的结构如下图



其他的参考解释

                
F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1,
H(5)=F(5)+5,
F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器…地址
                
至于为何shortcut的输入时X,而不是X/2或是其他形式。kaiming大神的另一篇文章[2]中探讨了这个问题,对以下6种结构的残差结构进行实验比较,shortcut是X/2的就是第二种,结果发现还是第一种效果好啊。

                
这种残差学习结构可以通过前向神经网络+shortcut连接实现,如结构图所示。而且shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。
而且,整个网络可以依旧通过端到端的反向传播训练。

                
ImageNet上的实验证明了作者提出的加深的残差网络能够比简单叠加层生产的深度网络更容易优化,而且,因为深度的增加,结果得到了明显提升。另外在CIFAR-10数据集上相似的结果以及一系列大赛的第一名结果表明ResNet是一个通用的方法。

3、原理解释

首先我们先看一下神经网络流程图

                                                                              

                它对每层的输入做一个reference, 学习形成残差函数,
而不是学习一些没有reference的函数。这种残差函数更容易优化,能使网络层数大大加深。
                
我们知道,在计算机视觉里,特征的“等级”随增网络深度的加深而变高,研究表明,网络的深度是实现好的效果的重要因素。然而梯度弥散/爆炸成为训练深层次的网络的障碍,导致无法收敛。
                
有一些方法可以弥补,如归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。然而,虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差,
如下图。 这种deep plain net收敛率十分低下。


                  过在一个浅层网络基础上叠加y=x的层(称identity mappings,恒等映射),可以让网络随深度增加而不退化
。这反映了多层非线性网络无法逼近恒等映射网络。

                  但是,不退化不是我们的目的,我们希望有更好性能的网络。 resnet学习的是残差函数F(x) = H(x) - x,
这里如果F(x) = 0, 那么就是上面提到的恒等映射。事实上,resnet是“shortcut
connections”的在connections是在恒等映射下的特殊情况,它没有引入额外的参数和计算复杂度。 假如优化目标函数是逼近一个恒等映射,
而不是0映射, 那么学习找到对恒等映射的扰动会比重新学习一个映射函数要容易。从下图可以看出,残差函数一般会有较小的响应波动,表明恒等映射是一个合理的预处理。



残差块的结构如下图



实验证明,这个残差块往往需要两层以上,单单一层的残差块(y=W1x+x)(y=W1x+x)并不能起到提升作用。

残差网络的确解决了退化的问题,在训练集和校验集上,都证明了的更深的网络错误率越小,如下图



              实际中,考虑计算的成本,对残差块做了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1,
如下图。新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。

                                                                      

找到了一篇不错的中文解释:
参考中文解释:http://www.cnblogs.com/vincentqliu/p/7464918.html
<http://www.cnblogs.com/vincentqliu/p/7464918.html>
参考资料                  作者AlanMa: 链接https://www.jianshu.com/p/e58437f39f65
<https://www.jianshu.com/p/e58437f39f65>
                                                
https://blog.csdn.net/mao_feng/article/details/52734438
<https://blog.csdn.net/mao_feng/article/details/52734438>