一、思考题
1. 问题:在一个神经网络中加深更多的层,总是改进精度吗?
2. 答:不一定。
如下面这幅图所示,蓝色五角星表示最优值,标有 F i F_i Fi 的闭合区域表示函数,闭合区域的面积代表函数的复杂程度,面积越大,学到的知识就越多。在这个区域中能够找到一个最优的解。(可以用区域中的一个点来表示,该点到最优值的距离可以用来衡量模型的好坏)
从上图中可以看出,随着函数的复杂度的不断增加,虽然函数的区域面积增大了,但是在该区域中所能找到的最优解(该区域内的某一点)离最优值的距离可能会越来越远。(也就是最优解所在的区域随着函数复杂度的增加,逐渐偏离了原来的区域,离最优值越来越远,即:非嵌套函数(non-nested function))
3. 解决上述问题(模型走偏)的方法:每一次增加函数复杂度之后的函数所覆盖的区域会包含原来函数所在的区域(嵌套函数(nested function)),只有当较复杂的函数包含复杂度较小的函数时,才能确保提高它的性能,如下图所示。
二、残差块
1. ResNet(Residual Network)是一种深度神经网络结构,被广泛应用于图像分类、目标检测和语义分割等计算机视觉任务中。它是由微软亚洲研究院的何凯明等人于2015年提出的,通过引入残差连接(Residual connection)解决了深层网络训练过程中的梯度消失和梯度爆炸问题,有效地加深了网络的深度。
2. 残差网络的核心思想是:每个附加层都应该更容易地包含原始函数作为其元素之一。由此,残差块(Residual block)诞生了。
3. 残差块的结构如下图所示。一个残差块可以用公式表示为: X i + 1 = X i + F ( x ) X_{i+1}=X_i+F(x) Xi+1=Xi+F(x)。残差块分为两部分:直接映射部分(或称恒等映射)和残差部分。通过这种操作,使得网络在最差的情况下也能获得和输入一样的输出,即增加的层什么也不学习,仅仅复制输入的特征,至少使得网络不会出现退化的问题。
有两种不同的残差结构,左针对网络层较少的使用,右针对网络层较多的使用。
4. 残差块有两种实现:左边是ResNet的第一种实现(不包含1 * 1卷积层的残差块)它直接将输入加在了叠加层的输出上面;右边是ResNet的第二种实现(包含1 * 1卷积层的残差块),它先对输入进行了1 * 1的卷积变换通道(改变范围),再加入到叠加层的输出上面。
5. ResNet后面跟的数字,如ResNet18、ResNet50、ResNet101等,代表的是该网络结构中特定层的总数,具体来说,这个数字通常指的是卷积层与全连接层的和,而不包括池化层、批量归一化(BN)层等其他类型的层。这些数字反映了网络的深度,即网络的复杂度。
以ResNet50为例,其名称中的 “50” 表示该网络由50个这样的层组成。这50层包括初始的卷积层(conv1,通常算作一层)、多个残差块(每个残差块内部包含多个卷积层,这些卷积层的数量根据网络设计而定),以及最终的全连接层(fc,也通常算作一层)。因此,ResNet50的总层数是通过将这些组成部分的层数相加得到的。
三、网络结构
ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元,如下图所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。
ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。从下图中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变,即使用了虚线残差结构,通过1*1卷积来改变维度。下图展示的34-layer的ResNet,还可以构建更深的网络如下表所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1。