Face-ResNet与Common-ResNet的区别与分析

最近在纠结网络结构对识别性能的影响。

纠结的主要原因是我发现有一种变体ResNet从Center Loss和SphereFace开始被广泛使用于人脸识别领域,包括后来的AMSoftmax、CosineFace、InsightFace都使用了同样的网络结构。当然InsightFace的Project里实现了很多种不同的Backbone网络结构。

我暂时叫这种变体为Face-ResNet,He Kaiming原文中的Resnet我称为Common-Resnet

那么这么一种变体ResNet为什么会让我纠结呢?

首先,Wen Yandong和Liu Weiyang两位大神在Center Loss和SphereFace的paper中并没有提到采用这种网络结构的原因。然而作为他们这种水平的研究者,不可能随随便便使用一个网络结构而不采用更加常见的ResNet,这更加勾起了我的好奇心。

然后,这种网络结构的效果又确实非常不错。我以人脸识别为任务比较了同样50层的结构,性能比Common-Resnet明显好,而且在训练过程中不容易产生网络崩溃或者说退化的情况。

再次,仔细观察Face-ResNet之后会发现其网络设计有一些奇特的地方。比如并没有使用BN层。大家都知道,做分类BN是一种能简单好用的提高性能的正则化手段。可是这个Face-ResNet并没有使用任何BN层。这里只是举一个例子,下面我用一个表格来列出Face-ResNet相比较Common-ResNet的不同之处,以及产生的影响或者原因。


序号 Face-ResNet相对于Common-ResNet的不同之处 原因分析
1 所有残差结合处的 Eltwise 层后没有 ReLU 激活层 只有最后的全连接层后的 ReLU 层会导致输出只分布在正数空间中,因此网络中间部分的 ReLU 应该不会对性能造成太大影响
2 每一层残差分支内部的激活层使用 PReLU 而不是 ReLU PReLU 可以取得比 ReLU 更好的效果
3 除了全连接层和每一个 Stage 的第一个卷积层初始化使用 Xavier 之外,其他所有残差 Block 中卷积层的 weight 初始化都使用了 gaussian(std=0.01) 应该影响不大
4 没有 BN 层 BN可以加速收敛,如果网络难以收敛则BN会起到很大作用,但如果已经可以正确收敛,则并不是必须的。但有人在4层和6层的SphereFaceNet上进行试验,加入BN可以取得更好的效果。BN不应该是 Common Resnet 性能不佳的原因
5 没有 Pooling 层
6 残差分支内部没有 Bottleneck 结构,即 channel 数没有变小再增大的过程,而是一直保持不变 猜测:特别针对人脸识别,为了保持更多的信息,并不进行降维特征提取;另外 Face-ResNet 的每个 Residual Block 只有2个卷积层。Common-Resnet 设计 Bottleneck 的主要目的是为了降低参数量,加快训练速度
7 每个 stage 中卷积层的 channel 数不同 Face-ResNet 是[64, 64, 128, 256, 512]; Common-Resnet 是[64, 256, 512, 1024, 2048]

这样大家应该能看出来这两种网络结构的区别了,至于为什么Face-ResNet更work,那就得再分析了。

btw,我之前曾经搜到一篇paper,讲的就是这种专为人脸识别设计的Resnet结构,其中提出的结构和上述类似,然而这篇paper我已经找不到了……