ResNet
假设多层非线性网络可以近似一个函数 H ( x ) H(x) H(x),等价而言 应当也可以近似残差 F ( x ) : = H ( x ) − x F(x) := H(x)-x F(x):=H(x)−x。不管是原函数或残差函数,都可以用来获得原函数。
但,优化得到两者的难度不同。
对比实验:增加网络到一定程度后,training error反而上涨。
但是:如果增加的层数能构建出一个identity映射,增加identity映射不应该使training error上涨(因为增加的不会改变输出,也就不改变error)。
因此:说明多层非线性网络,可能很难通过优化,使增加的这些层趋近于identity映射。
反而:如果是估计残差函数,优化器只需要优化到使得所有weights都为零,就是一个identity映射。(直观而言,这要简单一些)
our reformulation may help to precondition the problem??
Identity Mapping的构建方式。
注意:
第一个用于比较的网络基于VGG-19,改为34层,变成plain网络。残差网络在此基础上每两层增加一个shortcuts。
在feature map大小减半/filter数量翻倍时,有两种方式shortcut:
基本参考AlexNet、VGG、BN的做法,要点如下
Training
Testing
用34层和18层网络,对比出现了退化现象:validation error 34-layer > 18-layer。作者认为这不是来自于梯度消失(vanishing gradients),因为:
猜测:更深的plain network,指数级地更难收敛,导致了更难降低训练误差。
同样用34和18层网络,有3个主要的现象:
对比identity和projection两种shortcuts。
从结果来看,3)>2)>=1),都只有很轻微的提升。这个区别,更可能来源于projection带来的更多学习参数,没有本质上的提升,所以之后都不用projection。Identity不提升复杂度,对于接下来的bottleneck架构更重要。
一个bottleneck,是1x1 + 3x3 + 1x1,分别用来降维、卷积、升维。对于这种设计,identity更有效。
把34层网络里的2层,换成3层bottleneck,就是50层。用B)来升维,也就是正常都用identity,升维用projection。
增加更多3层block,可以构造101/152层ResNet。
50-layer ResNet: 3.8B FLOPS
101-layer ResNet: x
152-layer ResNet: 11.3B FLOPS
VGG-16: 15.3B FLOPS
VGG-19: 19.6B FLOPS
残差网络的response相比plain网络更小。残差函数通常更接近0。
更深的残差网络,response更小,每层对signal的修改更少。
1000层的网络,很可能overfit。但却能在train时收敛。
TODO: 先看了BN、RCNN、FPN基础知识后再补充。