ResNet (Residual Neural Network)由何凯明等在15年提出,这里做个笔记,参考了TensorFlow 实战的6.4节。ResNet的结构能加速超深神经网络的训练,能有效避免过拟合,而且推广性非常好。

深度神经网络存在Degradation的问题,即随着网络层数的增加,其准确率会从逐渐提升到饱和,进而下降。这一问题在我们近期的工作也出现了,我们在增加了一层全连接后,网络的准确率反而下降了。为了解决这一问题,ResNet提出了一种新的网络思路,即允许原始输入信息直接传输到后面的层中。假定某段网络的输入是,期望输出是,如果直接将传到输出作为初始结果,那么目标函数变为

如下图所示为一个ResNet的残差学习单元,即将学习目标从改为期望与输入的残差。这种结构也被称为shortcutskip connections.

考虑到神经网络相当于对原始数据进行了压缩,存在信息损失的问题,而ResNet结构将部分输入信息直接传递到输出端,可以保留部分的信息。并且ResNet的训练误差会随着层数增加而逐渐减少,并且在测试集上也有很好的表现。

引自TensorFlow实战,在ResNet的第二篇论文Identity mapping in deep residual networks中,提出了ResNet V2。想对于ResNet V1, 将激活函数ReLU改为了Identity mapping,即y=x。同时,ResNet V2在每一层都使用了Batch Normalization,提升网络的范化能力。

ResNet的block的理解

在ResNet的实现中,包含多个block,每个block又由多个bottleneck组成,称为残差学习单元,ResNet的残差运算即在每个bottleneck内实现。因为要获取输入与block输出的残差,每个bottleneck虽然做了多次卷积和激活运算,但其输出的shape应该保持不变,因此内部的卷积运算的stridepadding都有特殊的设置 (数学推导可以参考此文)。以ResNet-50的第二个block为例,假设该block内包含两个bottleneck单元,则有,

Bottleneck One
Layer Input Kernel Stride Padding Output
Conv1,1 56x56x64 1x1x64 1 SAME 56x56x64
Conv1,2 56x56x64 3x3x64 1 SAME 56x56x64
Conv1,3 56x56x64 1x1x256 1 SAME 56x56x256
Bottleneck Two
Layer Input Kernel Stride Padding Output
Conv2,1 56x56x256 1x1x64 1 SAME 56x56x64
Conv2,2 56x56x64 3x3x64 2 SAME 28x28x64
Conv2,3 28x28x64 1x1x256 1 SAME 28x28x256

注意Bottleneck TwoConv2,3层的stride为2,因此输出的尺度大小相当于做了factor为2的降采样,因此该bottleneck不做残差的运算,其输出直接作为下一个block的输入。

ResNet-V2相对于ResNet-V1增加了Batch NormalizationL2正则,如何在block中体现? 且听下回分解。