之前比赛的时候用的backbone是ResNet,就是把预训练好的模型直接拿过来用,也没有加以深刻的理解,现在重读一遍论文,顺便做一个笔记,方便之后的查看。
我们知道深度是神经网络必须要考虑的一个因素,是不是简单地堆叠更多的层,就会学到更好的网络呢?答案是未必如此。很直观的我们可以想到的就是梯度消失/爆炸的问题,这会从一开始就影响收敛。这个问题很大程度上可以通过正则初始化和中间的正则层进行解决。
但是当更深的网络开始收敛的时候,就会有一个退化的问题暴露出来。随着网络深度的增加,准确率就会达到饱和然后开始下降。然而这种退化问题并不是由过拟合导致的,增加更多的层只会导致更高的训练误差。
于是就有一个设想,我们有一个比较浅的网络,我们用这个浅的网络来构造一个深的网络,这个深的网络增加的层重建的如果是一个identity mappIng,其余层直接从那个浅的网络那里copy过来的。那么按照预期,这个深的网络得到的训练损失应该不会超过那个浅的网络。但是实验却表明我们当前的sovler是不能够去通过多个非线性层去近似这个identity mapping的。
为了解决这个问题,何凯明等人就提出了deep residual learning framework.主要的idea就是说不是通过直接地堆叠几层来得到一个符合预设的underlying mapping,而是让这些层来得到一个residual mapping.
我们把underlying mapping记作H(x),让堆叠的非线性层去学到另一个mapping
那个原始的mapping就是
具体结构如下所示,shortcut connections就是起到一个简单的identity mapping的作用,然后与堆叠层的结构相加。之所以被称作ResNet,就是因为核心的模块学的就是一个residual,也就是