总结一下Resnet中residual learning module的优点:
1、易于优化。
2、随着深度越深,准确度越高【部分解决了degration问题】
3、可以加很多层,但复杂度依旧很低。
发现问题:随着神经网络的深度加深,会发生梯度消失/爆炸问题,网络不容易收敛。
解决问题:normalized initialization和immediate normalization layers.使几十层的神经网络可以用SGD方法训练并收敛(convergence)。
发现问题:尽管网络可以开始收敛了,但是随着深度加深,网络的表现性能不一定会变好,即网络的degration问题。
分析问题:首先,degration问题不是由overfitting造成的(怎么证明的?参考论文10/41-码住待看)。
解决问题:提出了一个深度残差学习框架。基本形式为F(x)=H(x)-x,即网络真实预测的函数H(x)是网络的输出F(x)与输入值x的和,这里的求和操作即图2中的shortcut路径。shortcut本质上是为了恒等映射。
思路要点:
1、最有趣的地方,为什么神经网络可以这么设计?
POINT: x不仅能看成是输入,也能看成是关于x的一个一次函数y = x
已知 – 1、非线性函数H(x)是关于输入x的函数;2、线性函数g(x)=x也是关于x的函数;3、假设神经网络DNN可以拟合H(x)级别的非线性函数。
由1和2可以得到 – 4、H(x)-g(x)也是关于输入x的非线性函数,并且与H(x)同等级别。
由3和4可以得到 – 5、DNN可以拟合H(x)-g(x),即DNN的输出函数可以是F(x)=H(x)-x
2、为什么要设计这种恒等映射?
a) 为了让高层的解法空间包含低层的解法空间。
3、当输出f(x)的维度和输入x的维度不同时(f(x)的深度是x的2倍,长宽各是x的一半)怎么相加?
一共有三种办法:
a) parameter-free方法:取stride==2,x中对应位置缺失的值填0。这种方法本质上并不是恒等映射,因此表现最差。
b) 需要部分参数:当维度不同时,对输入x进行1x1的卷积,stride==2。论文中采取了这种方式,在精度和计算量之间tradeoff。
c) 都需要参数:不管f(x)和x的维度是否相同,都对输入x进行1x1的卷积,stride==2。这种方式虽然表现比b好一点点,但是消耗的计算量过于庞大。因此舍弃。
4、当深度越来越深,有没有方法可以进一步降低计算量?
有。采用Bottleneck结构后,152层的Resnet比VGG-16/19复杂度更低。
如fig.5右图。第一个1x1卷积层负责降低维度,使第二个3x3的卷积层计算量变小,然后第三个1x1的卷积层再将维度变回去。
采用这种结构后,右图中输入256维的图像经过bottleneck时的计算量与左图的计算量相同,而左图的输入x只有64维。