隐藏在ResNet背后的原理

2015年,何凯明等人提出了一种新的神经网络结构Residual Networks(简称ResNet),在当年的ImageNet比赛中,在classification、detection、localization以及COCO的detection和segmentation任务上均获得第一名。同时,凯明大神发表的ResNet文章斩获了CVPR2016年的best paper,真tql。

论文链接:Deep Residual Learning for Image Recognition

代码链接:https://github.com/KaimingHe/deep-residual-networks

我们知道,网络的深度直接决定了网络的性能,往往更深的网络具有更强的表达能力。近年来随着GPU算力的大幅度提高,使得拥有大量参数的黑盒模型(深度学习)快速发展,从最初的LeNet->AlexNet->Vgg16…,似乎网络越来越深,精度也越来越好。但一些实验数据显示:当网络进一步加深,层数达到20层甚至100层时,更深的网络却表现出更高的误差,如下图所示:
在这里插入图片描述
可以看出,在迭代次数足够多的情况下,56层的网络比20层的网络具有更高的训练误差和测试误差,这似乎与我们先前的认知不符,照理说20层的网络是56层网络的子网络,也就是说56层网络的解空间包含了20层网络,性能应该是≥20层网络的,但事实却相反,这就是常说的网络的"退化"问题,而ResNet提出最根本的动机就是解决或者缓解退化问题。
退化问题产生的主要原因是随着网络深度的增加,待学习的曲线变得更加复杂(严重非凸),SGD等算法对网络的权值优化变得更加困难,在可行的时间内无法找到模型的较优解,进而表现出退化现象。
针对此问题,作者提出了Residual(残差)结构:
在这里插入图片描述
从上图中可以看出,残差块相比于普通的结构,它在输入x和输出H(x)之间加了一个额外的连接,作者称之它为identity mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)+x,而作者认为这两种表达的效果相同,但是优化的难度却并不相同,作者假设学习F(x)会比H(x)简单的多。这一想法也是源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。这个Residual block(残差块)通过shortcut connection(短连接)实现,通过shortcut将这个block的输入直接叠加到输出层,这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。

上面一段话我个人感觉是论文中最核心的部分,很好的解释了Residual Block(残差块)的作用,但是看完后我总感觉少了点什么,我一直不理解为什么F(x)就比H(x)更容易学习,隐藏在残差块背后的原理是什么?作者在论文中好像也没有解释的很透彻,最初可能先尝试实验发现效果好,然后再试着去解释。
为了解决自己的疑惑,最近在网上搜集了大量的文章,再加上自己的一点思考,总结如下:

1:考虑一种极端的情况:当F(x)=0时,那么H(x)=x,也就是说学习到的是恒等变换,输入为x,输出也为x,这时候至少可以保证层数增加时网络的性能不会下降,并且F(x)=0很容易学习(只需要将对应的W和b均置0即可)。或许有小伙伴会问,既然是恒等变换,那为什么还要加这一层呢,不加这层直接输出不就好了吗?因为实际上学习到的残差不一定为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。

2:过于深的网络在反传时容易发生梯度弥散,一旦某一步开始导数小于1,此后继续反传,传到前面时,用float32位数字已经无法表示梯度的变化了,相当于梯度没有改变,也就是浅层的网络学不到东西了,这也是网络太深反而效果下降的原因之一。加入ResNet中的shortcut结构之后,在反传时,每两个block之间不仅传递了梯度,还加上了求导之前的梯度,这相当于把每一个block中向前传递的梯度人为加大了,也就会减小梯度弥散的可能性。下面从数学的角度分析:
在这里插入图片描述
其中,X和XL+1分别表示第L个残差单元的输入和输出,注意每个残差单元一般包含多层结构。F是残差函数,表示学习到的残差,而h(XL) = XL表示恒等映射,f 是ReLu激活函数。基于上式,我们求得从浅层 l 到深层 L 的学习特征。
在这里插入图片描述
我们可以知道,对于传统的CNN,直接堆叠的网络相当于一层层地做——仿射变换-非线性变换,而仿射变换这一步主要是矩阵乘法。所以总体来说直接堆叠的网络相当于是乘法性质的计算。而在ResNet中,相对于直接堆叠的网络,因为shortcut的出现,计算的性质从乘法变成了加法。计算变的更加稳定。当然这些是从前向计算的角度,从后向传播的角度,如果代价函数用Loss表示,则有
在这里插入图片描述
也就是说,无论是哪层,更高层的梯度成分都可以直接传过去。小括号中的1表明短路机制(shortcut)可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。这样一来梯度的衰减得到进一步抑制,并且加法的计算让训练的稳定性和容易性也得到了提高。所以可训练的网络的层数也大大增加了。

3:信息融合:在正向卷积时,对每一层做卷积其实只提取了图像的一部分信息,这样一来,越到深层,原始图像信息的丢失越严重,而仅仅是对原始图像中的一小部分特征做提取。这显然会发生类似欠拟合的现象。加入shortcut结构,相当于在每个block中又加入了上一层图像的全部信息,一定程度上保留了更多的原始信息。

4:从网络训练的角度看:残差网络对数据波动更敏感。我们回到设计 ResNet 的初衷: 为了解决深度网络的退化问题 。该问题的直接表现形式为: 深度网络在的训练误差比浅层网络高,无法做到使深层网络在训练数据集上“ 过拟合 ”。那么如何做到“过拟合”呢? 答案就是我们需要使网络对数据波动更敏感,尽可能地去准确描述数据。而残差网络就是这样的一种网络结构。

假设某几层 layer 要学习的函数 H(x) 如紫线所示,红色点表示采样点,对应一个数据样本。
在这里插入图片描述
对于数据点(5,5.1),即我们的 input 为5, 期望输出为5.1,假设为 plain network, 我们在 x =5 的附近,学习到的线性参数值为 w = 5.1/5 , 若数据点变成(5,5.2),我们仍可以用 w= 5.1/5 的线性网络近似,因为此时网络输出 5.1 与理想值 5.2 只相差 2% 而已. 所以在 plain net 中,网络对数据不敏感
数据的波动指的是相对对角线 y= x 的波动, 残差网络的思想是:我们用 y= x 先去粗略拟合数据, “波动”也即“拟合残差”就交给 weight layer 去拟合。数据点(5,5.1)对应的残差为(5,0.1),此时假设学习到的参数为 w=0.1/5 。同样地,若数据点变成(5,5.2),对应的残差为(5,0.2)。显然地,我们不可以用 0.1/5 近似了,因为若用0.1/5 近似,网络输出 0.1 和 0.2 相差了100%。网络需要调整 w 的值,以尽可能精确地描述残差。所以综上所述,残差网络对数据变得敏感,也即对 “数据波动更敏感”,更容易做到“过拟合”
残差的思想都是去掉相同的主体部分,从而突出微小的变化,有点像差分放大器…

5:特征层次及物理角度:这里我们参考知乎上的回答
在这里插入图片描述
6:从函数曲面的角度看:对于非常深的网络,其损失函数的图像是严重非凸的,很难找到一个较好的最优点。加入shortcut结构,使得损失函数的图像变得很接近凸函数,更容易(更快)找到较好最优点。