ResNet (Residual Neural Network,残差网络)由微软研究院何凯明等人提出的,通过在深度神经网络中加入残差单元(Residual Unit)使得训练深度比以前更加高效。ResNet在2015年的ILSVRC比赛中夺得冠军,ResNet的结构可以极快的加速超深神经网络的训练,模型准确率也有非常大的提升。
ResNet V1
在ResNet之前,瑞士教授Schimidhuber提出了Highway Network,其原理与ResNet非常相似。通常认为神经网络的深度对其性能非常重要,但是网络越深训练越困难,Highway Network的目标就是解决极深的神经网络难以训练的问题。
Highway Network相当于修改了每一层激活函数,此前激活函数只是对输入做一次非线性变换y=H(x, Wh), 而Highway Network则允许保留一部分比例的原始输入x,即y=H(x, Wh)* T(x , Wt)+x*C(x, Wc),其中T为变换系数,C为保留系数,论文中令C=1-T。这样前面一层的信息,有一定比例可以不经过矩阵乘法和非线性变换,直接传输到下一层,仿佛一条信息高速公路,因此得名Highway Network。
ResNet和Highway Network非常相似,也是允许原始输入信息直接输出到后面的层中。ResNet最初的灵感出自这样一个问题:在不断加深的网络中,会出现一个Degradation的问题,即准确率会先升然后达到饱和,在持续加深网络反而会导致网络准确率下降。而且这并非是由于过拟合导致的,因为其不仅在测试集上误差增大,训练集本身误差也会增大。假设有一个比较浅的网络达到了饱和的准确率,在后面加上几个y=x的全等映射层,起码误差不会增加,即更深的网络不应该带来训练集上的误差上升,而这里提到的使用全等映射直接将前一层输出传到后面的思想,就是ResNet的灵感来源。假定某神经网络的输入是x,期望输出是H(x),如果我们直接把输入x传到输出作为初始结果,那么此时我们需要学习的目标就是F(x) = H(x) - x。一个残差学习单元(Residual Unit)如下图所示,ResNet相当于将学习目标改变了,不再是学习一个完整的输出H(x),只是输出和输入的差别H(x) - x,即残差。下面我们再看一下VGG19,一个34层深的普通卷积网络和34层深的ResNet网络的对比图。可以看到普通直连的卷积网络和ResNet的最大区别在于,ResNet有很多旁路的支线将输入直接连到后面的层,使得后面的层可以直接学习残差,这种结构也被称为shortcut或skip connections。
传统的卷积层或全连接层在传递信息时,或多或少会存在信息丢失、损耗等问题。ResNet在某种程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。 残差学习单元可以有不同的层数,如下图所示。两层残差单元中包含两个相同输出通道数(因为残差等于目标输出减去输入,因此输入输出维度需保持一致)的3*3卷积;而3层的残差网络则使用了1*1卷积,并且是在中间3*3的前后都使用了1*1卷积,有先降维在升维的操作。
此外,ResNet论文中还提到了针对输出和输入维度不同时的做法。当输入输出相同时使用的是恒等快捷连接(Identity shortcuts),当输入输出维度不同时使用的是投影快捷连接(下图2)和填充零。
如上所示,投影快捷连接相当于对原始输入做了一个线性映射变换维度使得其维度与F(x, W)维度相同。 ResNet论文中作者尝试了3种不同的残差单元快捷连接方式:(A)零填充快捷连接用来增加维度,这时所有的快捷连接仍然都是没有参数的;(B)投影快捷连接用来增加维度,其他的快捷连接是恒等的;(C)所有的快捷连接都是投影连接。比较结果见下图。
结果显示,B比A略好,这是因为A中的零填充确实没有残差学习。而C比B稍好,这是由于投影快捷连接引入了额外参数。但A、B、C之间的细微差异表明投影连接对于解决退化问题不是至关重要的,而不/少使用投影连接可以减少内存/时间复杂性和模型大小。而且无参数恒等快捷连接对于瓶颈架构(3层残差学习单元)尤为重要,因为瓶颈架构中层具有较小的输入输出,快捷连接是连接到两个高维端,此时恒等快捷连接无需参数,而使用投影的话则会显示时间和模型复杂度加倍。因此,恒等快捷连接可以为瓶颈设计得到更有效的模型。
最后,作者尝试了更深的1000层以上的神经网络,发现神经网络仍然能够较好的学习,但是其测试误差比100多层的残差网络要差,而训练误差则与100多层的残差网络相似,作者认为这可能是由于过拟合导致的,可通过加大正则化来解决这一问题。
ResNet V2
在ResNet V1中,作者研究通过加入残差单元使得训练深度达到上百层的神经网络成为可能,解决了梯度消失/爆炸的问题。而在ResNet V2中作者进一步证明了恒等映射(Identity mapping)的重要性。同时作者还提出了一种新的残差单元(采用了预激活)使得训练变得更简单,同时还提高了模型的泛化能力。
在ResNet V2中,作者提出了不止在残差单元内部,而是在整个神经网络中都创建了‘直接’的计算传播路径。在ResNet V1中,残差学习单元的
其中h(x) = x。而通过递归,对于任意深的单元L和任意浅的单元l,可以得到:
上式同样表明了在一个mini-batch中不可能出现梯度消失的现象,因为上式求导的第二部分对于一个mini-batch来说,不可能所有样本其导数都为-1,因此,可能会出现权重很小的情况,但是不会出现梯度消失的情况。
作者研究了使用不同函数来代替残差单元中的恒等映射:通过研究这些不同的快捷连接,作者发现大部分快捷连接方式无法很好地收敛,其中很大部分是由于使用这些快捷连接后或多或少会出现梯度消失或者梯度爆炸的现象,最后结果显示恒等映射效果最好。
虽然恒等映射在这些方法中表写结果最好,仍需引起注意的是1×1的卷积捷径连接引入了更多的参数,本应该比恒等捷径连接具有更加强大的表达能力。事实上,shortcut-only gating 和1×1的卷积涵盖了恒等捷径连接的解空间(即,他们能够以恒等捷径连接的形式进行优化)。然而,它们的训练误差比恒等捷径连接的训练误差要高得多,这表明了这些模型退化问题的原因是优化问题,而不是表达能力的问题。
同时作者还研究了在残差单元中不同位置使用激活函数的效果,如激活是在BN之前还是在BN之后等,如下图所示:在上图b中,采用先加后BN再激活的方法,此时f(x)就包含了BN和ReLU。这样的结果比原始a要差。这主要是因为BN层改变了流经快捷连接的信号,阻碍了信息的传递。
在c中,ReLU在相加之前,此时f(x)=x,为恒等映射。此时残差单元中的F(x)输出经由ReLU后变为非负,然而一个“残差”函数的输出应该是(−∞,+∞) 的。造成的结果就是,前向传递的信号是单调递增的。这会影响表达能力,结果也变得更差了。
在d、e中分别使用了ReLU的预激活和全激活(其BN和ReLU都放在权重层前面)。而且在这两种方式中,激活函数对于任意的l,仅对F路径造成影响:结果显示,只使用ReLU预激活(d)的结果与原始ResNet结果很接近,这个与ReLU层不与BN层连接使用,因此无法获得BN所带来的好处。而当BN和ReLU都使用在预激活上时(e),结果得到了可观的提升。
预激活的影响有两个方面:第一,由于f(x)也是恒等映射,相比于V1优化变得更加简单;第二,在预激活中使用BN能提高模型的正则化。
对于f(x)为恒等映射的好处:一方面若使用f= ReLU,如果信号是负的时候会造成一定的影响,无法传递有用的负信号,而当残差单元很多时,这个影响将会变得尤为突出;另一方面当f是一个恒等映射时,信号在两个单元间能够很直接的传递。
ResNext
在ResNet V1中作者提出了残差学习单元,并从理论和实验上证明使用直连的shortcuts有助于解决深度达到上百层的神经网络的训练问题。而在ResNet V2中作者证明了在shortcuts中使用直接映射(即H(x) = h(x) + F(x)中h(x) = x)得到的效果最好。在ResNext中作者将bottleneck拆分成多个分支,提出了神经网络中的第三个维度(另外两个维度分别为depth,神经网络层数深度,width,宽度,channel数),命名为Cardinality
,并在多个数据集中证明了将bottleneck拆分能够降低训练错误率和提高准确率。
ResNext的灵感来源于VGG/ResNet和Inception:(1)在VGG、ResNet中,作者使用了相同结构的卷积层进行了堆叠,构建了层数很深但是结构简单的神经网络;(2)而在Inception中,提出了一种叫做split-transform-merge
的策略,将输入(采用1x1 卷积核)分裂为几个低维 embedding,再经过一系列特定卷积层的变换,最后连接在一起。
而在ResNet中,作者将原ResNet bottleneck中的一条path拆分为多个分支(multi branch),以此分支数量提出神经网络中的第三个重要维度——Cardinality。这一想法结合了VGG中的相同结构堆叠和Inception中的split-transform-merge策略,即如上图所示,每个bottleneck 拆分为多个分支进行堆叠,这些分支的结构相同(这里借鉴了VGG的思想),而具体到分支的结构时又采用了Inception的split-transform-merge策略。与Inception不同的是Inception的每个分支结构都是需要认为的设计,而在ResNext中每个分支结构都相同。最终每个bottleneck的输出就变成了:
这些所有的bottlenecks结构都遵循两个原则:
- (i) if producing spatial maps of the same size, the blocks share the same hyper-parameters (width and filter sizes). 如果生成的相同的feature map,则此block应有相同的结构(channel数量和卷积核大小);
- (ii) each time when the spatial map is downsampled by a factor of 2, the width of the blocks is multiplied by a factor of 2. 每次当feature map进行1/2下采样时,blocks的宽度都要增加两倍,即channel变为两倍。这一条保证了所有blocks的计算量相同。
作者提出了 三种效果相同的ResNext的表示方法,如下图所示:
其中a,b 结构相似,只是在merge这一步的地方不同,而c则借鉴了AlexNet中分组卷积的思想,将输入和输出都分为多个组。
作者首先评估权衡了cardinality和width的关系。
在保证相同模型复杂度(参数)和计算量的前提下,作者评测了cardinality和width的重要度。接着,作者又评估了使用增加cardinality和depth/width来增加模型复杂度后的效果:
- (i) Going deeper to 200 layers. We adopt the ResNet-200,增加深度;
- (ii) Going wider by increasing the bottleneck width,增加宽度(channel);
- (iii) Increasing cardinality by doubling C,增加cardinality(path数量).
最后,作者还研究了shortcuts对于ResNext的重要性,在ResNet-50中,不使用shortcuts准确率下降了7%,而在ResNext-50中准确率也下降了4%,说明shortcuts对于残差网络来说确实是非常重要的。
简言之,增加cardinality比增加depth和width效果要好,同时,shortcuts对于模型的准确率也是至关重要的。
参考:
Deep Residual Learning for Image Recognition.
Aggregated Residual Transformations for Deep Neural Networks.
Identity Mappings in Deep Residual Networks.
ResNet论文翻译——中文版
Identity Mappings in Deep Residual Networks(译)
TensorFlow实现经典卷积网络. 黄文坚,唐源