提出背景
深度学习发展至今,越来越多的人使用非常深的网络来提取图像特征。虽然越深的网络提取图像特征的能力越好,但是也常常会遇到一个问题:“当层数加深时,网络的表现越来越差。”
上图中明显可以看出56层的网络比20层网络的训练效果要差,许多人第一反应就是过拟合,但事实并不如此,因为过拟合现象的训练集准确度会很高,但是从图中可以看出56层网络的训练集准确度同样很低。很显然可知的是,随着层度加深,会出现梯度消失或梯度爆炸的问题,使得深度模型很难训练,但是已经存在BatchNorm等手段缓解这一问题,因此如何解决深度网络的退化问题是神经网络发展的下一个方向。
那么该如何解决深度网络的退化问题呢?何凯明大神想出了一个“残差网络”,残差神经网络的一大优势就是恒等映射,使得梯度更容易地流动到浅层的网络当中去,而且这种“skip connection”能带来更多的好处。
解决网络退化问题的方法
GoogleNet采用稀疏结构来一定量减缓这一影响
卷积分解(Factorizing Convolutions)
大尺寸的卷积核可以带来更大的感受野,但也意味着会产生更多的参数,比如5x5卷积核的参数有25个,3x3卷积核的参数有9个,前者是后者的25/9=2.78倍。因此,GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量
ResNet是通过引入残差来缓解梯度消失/爆炸的现象,但是只能说是缓解,本质上还是存在的。只是由于从loss到输入的有效路径变短了,而求导的时候可以直接加上shortcut的终点层的delta。
ResNet
残差块(Residual Building Block)截图如下:
提出了两种映射:identity mapping(恒等映射),residual mapping(残差映射)。
identity mapping(恒等映射)指的是右侧标有x的曲线;
residual mapping(残差映射),残差指的是F(x)部分。最后的输出是F(x)+x。
F(x)+x的实现可通过具有”shortcut connections”的前馈神经网络来实现。shortcut connections是跳过一层或多层的连接。图中的”weight layer”指卷积操作。如果网络已经达到最优,继续加深网络,residual mapping将变为0,只剩下identity mapping,这样理论上网络会一直处于最优状态,网络的性能也就不会随着深度增加而降低。
残差块有两种设计方式,如下图所示:左图针对较浅的网络,如ResNet-18/34;右图针对较深的网络,又称为”bottleneck” building block,如ResNet-50/101/152,使用此方式的目的就是为了降低参数数目。
文中给出了5种不同层数的ResNet,论文截图如下所示:可见,ResNet-18/34是进行两层卷积的残差,ResNet-50/101/152是进行三层卷积的残差,分别对应于上图中的残差块的两种设计方式。ResNet-18/34对应的每个残差块的卷积kernel大小依次是3*3、3*3,ResNet-50/101/152对应的每个残差块的卷积kernel大小依次是1*1、3*3、1*1。
关于34、50这些层数是怎么计算的?
34、50层等数字是如何计算出来的:以34层为例,1个卷积(conv1)+3残差块*2个卷积(conv2_x)+4个残差块*2个卷积(conv3_x)+6个残差块*2个卷积(conv4_x)+3个残差块*2个卷积(conv5_x)+最后的1个全连接层=34。这里的层仅指卷积层和全连接层,其它类型的层并没有计算在内。
以上就是残差网络的一个思想。