随着网络的层数变深,作者发现网络出现退化现象,训练集的准确率不增反降。退化现象简单的说就是浅层网络的表现要优于深层网络,因此,如果我们可以把浅层网络的特征传递到深层网络,那么深层网络应该也会有较好的表现。根据这个思想,作者提出了一个概念Identity Mapping,这实际上是构建一条映射关系(后面会详细讲)这也是残差网络的最关键之处。
下图是作者在论文中的残差块示例图,首先明确几个概念,
X
l
X_l
Xl表示第l层的输入,
F
(
x
)
F(x)
F(x)表示残差部分,曲线箭头表示利用shortcut connections表示identity mapping。
X
l
=
F
(
X
l
−
1
)
+
X
l
−
1
X_{l} = F(X_{l-1}) + X_{l-1}
Xl=F(Xl−1)+Xl−1,
F
F
F表示残差部分,一般由若干卷积层,池化层和激活函数构成。残差部分与上一层的输出相加就构成了下一层的输入,这整体结构也就被称为残差块(Residual Block)。
下图是三种网络结构的比较,分别是VGG-19,34层的卷积神经网络,以及34层插入了shortcut connection的残差网络。
前面两个网络不多赘述,重点观察最后的残差网络,首先实黑色箭头表示输入与输出维度一致的残差块,点黑色箭头表示一个维度增加的残差块。
那么如何能保证输入和输出的大小一致但通道数增加或不变呢?这就要用到一个1 * 1
的卷积,假设我们上一层的输出是3 * 3 * 256
大小,现在我们想把变成3 * 3 * 512
的输出,我们可以使用512个1 * 1 * 256
的卷积核,按照之前卷积神经网络文章中的计算公式,output_size = (3 + 2*0 - 1) / 1 + 1 = 3
,因此每个卷积核卷积后的大小是3 * 3
,使用512个卷积核后,那么最终的大小也就是3 * 3 * 512
,因此这就实现了,在不改变输出大小的情况下增加通道数的方法,保持或减少通道数的方法也是一样。
对于训练深层的神经网络,高速神经网络和残差网络实际上都是用了shortcut connect只不过shortcut connection在高速神经网络中的实现是使用门机制,即transform gate和carry gate。而残差网络中的实现是使用残差块。