阿里面试题:
1。 resnet相关知识点+作用+为什么会起作用:
(0)问题的提出 与 残差块
网络层数增多一般会伴着下面几个问题
- 计算资源的消耗。 (问题1可以通过GPU集群来解决)
- 模型容易过拟合。 (问题2的过拟合通过采集海量数据,并配合Dropout正则化等方法也可以有效避免)
- 梯度消失/梯度爆炸问题的产生。 (问题3通过正则化初始化和中间的正则化层(Batch Normalization))
貌似我们只要无脑的增加网络的层数,我们就能从此获益,但实验数据给了我们当头一棒。
作者发现,随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当你再增加网络深度的话,训练集loss反而会增大。注意这并不是过拟合,因为在过拟合中训练loss是一直减小的。
残差网络是由一系列残差块组成的(图1)。一个残差块可以用表示为:
残差块分成两部分直接映射部分和残差部分。 是直接映射,反应在图1中是左边的曲线;
是残差部分,一般由两个或者三个卷积操作构成,即图1中右侧包含卷积的部分。
图1:残差块
图1中的Weight在卷积网络中是指卷积操作,addition是指单位加操作。
在卷积网络中, 可能和
的Feature Map的数量不一样,这时候就需要使用
卷积进行升维或者降维(图2)。这时,残差块表示为:
其中 。其中
是
卷积操作,但是实验结果
卷积对模型性能提升有限,所以一般是在升维或者降维时才会使用。
结构:
这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。
(1)”bottleneck design” 减少参数数目。
其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。
ResNet50和ResNet101
这里把ResNet50和ResNet101特别提出,主要因为它们的出镜率很高,所以需要做特别的说明。给出了它们具体的结构:
表2,Resnet不同的结构
首先我们看一下表2,上面一共提出了5中深度的ResNet,分别是18,34,50,101和152,首先看表2最左侧,我们发现所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。
拿101-layer那列,我们先看看101-layer是不是真的是101层网络,首先有个输入7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个building block,每个block为3层,所以有33 x 3 = 99层,最后有个fc层(用于分类),所以1 + 99 + 1 = 101层,确实有101层网络;
注:101层网络仅仅指卷积或者全连接层,而激活层或者Pooling层并没有计算在内;
这里我们关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,差了17个block,也就是17 x 3 = 51层。
(2)残差网络的背后原理——为什么起作用
残差块一个更通用的表示方式是
现在我们先不考虑升维或者降维的情况,那么在[1]中, 是直接映射,
是激活函数,一般使用ReLU。我们首先给出两个假设:
- 假设1:
是直接映射;
- 假设2:
是直接映射。
那么这时候残差块可以表示为:
对于一个更深的层 ,其与
层的关系可以表示为
这个公式反应了残差网络的两个属性:
层可以表示为任意一个比它浅的l层和他们之间的残差部分之和;
,
是各个残差块特征的单位累和,而MLP是特征矩阵的累积。
根据BP中使用的导数的链式法则,损失函数 关于
的梯度可以表示为
上面公式反映了残差网络的两个属性:
- 在整个训练过程中,
不可能一直为
,也就是说在残差网络中不会出现梯度消失的问题。
表示
层的梯度可以直接传递到任何一个比它浅的
层。
通过分析残差网络的正向和反向两个过程,我们发现,当残差块满足上面两个假设时,信息可以非常畅通的在高层和低层之间相互传导,说明这两个假设是让残差网络可以训练深度模型的充分条件。那么这两个假设是必要条件吗?
(3)直接映射是最好的选择
对于假设1,我们采用反证法,假设 ,那么这时候,残差块(图3.b)表示为
对于更深的L层
为了简化问题,我们只考虑公式的左半部分 ,损失函数
对
求偏微分得
上面公式反映了两个属性:
- 当
时,很有可能发生梯度爆炸;
- 当
时,梯度变成0,会阻碍残差网络信息的反向传递,从而影响残差网络的训练。
所以 必须等1。同理,其他常见的激活函数都会产生和上面的例子类似的阻碍信息反向传播的问题。
----
在所有的变异模型中,依旧是直接映射的效果最好。下面我们对图3中的各种变异模型的分析
- Exclusive Gating:在LSTM的门机制中,绝大多数门的值为0或者1,几乎很难落到0.5附近。当
时,残差块变成只有直接映射组成,阻碍卷积部分特征的传播;当
时,直接映射失效,退化为普通的卷积网络;
- Short-cut only gating:
时,此时网络便是[1]提出的直接映射的残差网络;
时,退化为普通卷积网络;
- Dropout:类似于将直接映射乘以
,所以会影响梯度的反向传播;
conv:
卷积比直接映射拥有更强的表示能力,但是实验效果却不如直接映射,说明该问题更可能是优化问题而非模型容量问题。
所以我们可以得出结论:假设1成立,即
(4)激活函数的位置
实验结果也表明将激活函数移动到残差部分可以提高模型的精度。
(5)基于ResNet101的Faster RCNN
实际的基于ResNet101的Faster RCNN的结构图:
上图展示了整个Faster RCNN的架构,其中蓝色的部分为ResNet101,可以发现conv4_x的最后的输出为RPN和RoI Pooling共享的部分,而conv5_x(共9层网络)都作用于RoI Pooling之后的一堆特征图(14 x 14 x 1024),特征图的大小维度也刚好符合原本的ResNet101中conv5_x的输入;
最后大家一定要记得最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。