高速路神经网络(Highway Networks)与深度残差网络(ResNet)的原理和区别

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/83690923

高速路神经网络(Highway Networks):

我们知道,神经网络的深度是其成功的关键因素。然而,随着深度的增加,网络训练变得更加困难,并且容易出现梯度爆炸或梯度消失的问题。高速路神经网络(Highway Networks)就是为了解决深层网络训练困难的问题而提出的。

在一般的神经网络中,我们会在每一层中卷积、池化后使用激活函数进行非线性变换,比如使用sigmoid函数:

进行非线性变换。sigmoid的函数有一个特点,就是导数最大值总是小于1。

目前的神经网络普遍采用反向传播(BP算法)方法来计算梯度并更新w和b参数(其实就是导数的链式法则,就是有很多乘法会连接在一起),由于深层网络中层数很多,如果每层都使用类似sigmoid这样的函数,它们的导数都小于1,这样在反向传播中可能会导致最初几层的w和b参数更新的幅度非常小或者几乎不更新,也就是我们所说的梯度消失现象。

关于反向传播算法可以看这篇博客:https://blog.csdn.net/zgcr654321/article/details/83444120

目前的神经网络改用relu作为激活函数就是为了减轻梯度消失的现象,因为relu函数求导后导数为1。

更好的办法就是高速路神经网络(Highway Networks)。

它主要解决网络深度加深、梯度信息回流受阻,造成网络训练困难的问题。

假设在一个传统的卷积神经网络中有L个层,用激活函数H将输入x,转换为输出y,忽略下标和偏置bias:

 H为激活函数,W为权重,x为输入,y为输出。注意这里x和WH的乘法是element-wise multiplication,即两个矩阵相同位置上的元素相乘。

现在我们来定义高速路神经网络(Highway Networks):

对于highway network,我们在上式的基础上添加了两个非线性转换:

我们将T表示为变换门(transform gate),C表示进位门(carry gate),因为它们分别表示通过变换输入并携带输入产生多少输出。H和T变换都使用权重共享和本地接受域。

为了简单起见,在本文中我们设定C = 1-T,给出

上式的x,y,H(x,WH)和T(x,WT)的维度必须相同。

为了便于理解,我们观察到,对于特殊的门值T时,有

即当T门为1的时候,全部输出原x,不用激活。

对于层变换的雅可比行列式:

因此,根据变换门T的值是0还是1,高速路层可以平滑地改变它在平坦层和简单地通过其输入的层之间的行为。

假设所有的门T的均值为0.5的话,就是把所有的原始信息一半激活,一半不变直接输入下一层,保留了很多信息。反向传播的时候,可以让更多的(梯度)信息直接回流到输入,而不需要经过一个非线性转化。

这样一部分数据进行处理,一部分直接通过。最后的输出公式就是

注意:

有研究资料表明,当深度为10的时候,Highway Networks的结果并不理想,但20层以及以后,结果显而易见,远远好于一般的网络。

构造和训练高速路神经网络(Highway Networks):

上面的公式要求x,y,H(x,WH)和T(x,WT)的维度相同。

如果需要改变图像的尺寸,有两种方法:

1、对x进行下采样或者零填充;

2、使用plain layer(without highways)来改变维度,然后后面跟上堆叠的highway layers。

我们定义变换门T(transform gate)如下:

其中W是权重矩阵, b是 bias 向量。

初始化时可以给b初始化一个负值,相当于网络在开始的时候侧重于搬运行为(carry behavior),就是什么处理都不做。

又有:

注意σ(x)∈(0,1),∀x∈R,所以方程

中的条件永远不可能是完全正确的。

训练高速路神经网络(Highway Networks)时我们使用交叉熵函数作为loss函数,可以使用简单的SGD来训练层数极深的网络

虽然传统的简单神经网络架构越来越难以随着网络深度的增加进行训练(即使使用方差保持初始化),但有实验表明,即使网络深度增加到一百层,高速路神经网络(Highway Networks)的优化也不会受到阻碍。

深度残差网络(ResNet):

我们先来看看常规的平原网络(plain network):

将平原网络直接堆叠很多层次,经对图像识别结果进行检验,训练集、测试集的误差结果如下图:

从上面两个图可以看出,使用平原网络直接堆叠层时,在网络变深时(56层相比20层),模型效果却越来越差了(误差率越高)。

上面的实验说明,对于传统的平原网络,随着网络层级的不断增加,模型精度不断得到提升,但当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络深到一定程度以后,网络就变得难以训练了。

主要原因就是网络权重的更新采用反向传播算法,而反向传播算法需要根据链式法则更新梯度,再用梯度来更新权重。而传统的平原网络往往使用类似sigmoid的非线性激活函数,这些函数是求梯度时的链式中的一部分,而sigmoid函数的导数总是小于1,那么如果网络的层数非常深,就相当于很多个小于1的导数连乘,这样最后得到的梯度值就会非常小,这就是我们通常所说的梯度消失现象。这会导致无法对前面网络层的权重进行有效的调整(梯度极小,权重更新时几乎不变化)。

假设:

如果现在有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,但误差至少不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。

深度残差网络(ResNet)结构:

深度残差网络(ResNet)更像是高速路神经网络(Highway Networks)中的一个特例。残差项原本是带权值的,但ResNet用恒等映射代替。深度残差网络(ResNet)是由残差块(Residual block)构建的。

如果某段神经网络的输入是x,期望输出是H(x),即H(x)是期望的复杂潜在映射,如果是要学习这样的模型,则训练难度会比较大;在我们的模型训练时如果已经学习到较饱和的准确率(准确率从达到的最大值后开始降低时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。

在下面的残差块结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。

Shortcut原意指捷径,在这里就表示越层连接,即设置了一条从 x 直接到 y 的通路,如果是在高速路神经网络(Highway Networks)中,那么以以 T(x, Wt) 作为 gate 来把握两者之间的权重;如果是在深度残差网络(ResNet)中,则shortcut没有权值,而是完整地传递x到y中,每个模块只学习残差F(x) := H(x)-x。这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入。

深度残差网络(ResNet)网络稳定易于学习,且随着网络深度的增加,性能将逐渐变好。当网络层数够深时,优化 Residual Function:F(x)=H(x)−x,易于优化一个复杂的非线性映射 H(x)。

残差块(Residual block)结构图:

我们可以将其表现为以下形式: 

其中h(xl)为一个恒等映射,f(yl)代表ReLU激活函数。

如果h(x)和f(y)都是恒等映射,即h(xl)=xl、f(yl)=yl,那么在训练的前向和反向传播阶段,信号可以直接从一个单元传递到另外一个单元,是训练变得更加简单。 

上面的公式可以表达为: 

通过递归,可以得到任意深层单元L特征的表达: 

即对于任意深的单元L的特征 xL 可以表达为浅层单元l的特征xl加上一个形如的残差函数,这表明了任意单元L和l之间都具有残差特性。 

对于任意深的单元L,它的特征,即为之前所有残差函数输出的总和再加上x0。对比平原网络(plain network),其特征xL是一系列矩阵向量的乘积,也就是,而求和的计算量远远小于求积的计算量。

对于反向传播,假设损失函数为E,根据反向传播的链式法则可以得到: 

我们可以发现这个导数可以被分为两部分:

不通过权重层的传递和和通过权重层的传递。前者保证了信号能够直接传回到任意的浅层xl,同时这个公式也保证了不会出现梯度消失的现象,因为不可能为-1。

VGG-19、34层的平原网络、34层的深度残差网络结构对比:

从上图中我们可以看出普通的平原网络与深度残差网络的最大区别在于,深度残差网络有很多旁路的支线将输入直接连到后面的层,使得后面的层可以直接学习残差,这些支路就叫做shortcut。传统的卷积层或全连接层在信息传递时,或多或少会存在信息丢失、损耗等问题。ResNet 在某种程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络则只需要学习输入、输出差别的那一部分,简化学习目标和难度。

同时34层的residual network取消了最后几层FC,通过avg pool直接接输出通道为1000的Softmax,使得 ResNet 比16-19层 VGG 的计算量还低。

shortcut的实线和虚线的区别:

经过“shortcut connections(捷径连接)”后,H(x)=F(x)+x,如果F(x)和x的通道相同,则可直接相加,如果通道不同,需要调整维度后再相加。上图中的实线、虚线就是为了区分这两种情况的

实线的Connection部分,表示通道相同,如上图的第一个矩形和第三个矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x)+x;
虚线的的Connection部分,表示通道不同,如上图的第四个矩形和第六个矩形,分别是3x3x64和3x3x128的特征图,通道不同,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的。

对于shortcut的方式,论文Deep Residual Learning for Image Recognition的作者提出了三个选项:

A. 使用恒等映射,如果residual block的输入输出维度不一致,对增加的维度用0来填充;

B. 在block输入输出维度一致时使用恒等映射,不一致时使用线性投影以保证维度一致;

C. 对于所有的block均使用线性投影。

作者对这三个选项都进行了实验,发现虽然C的效果好于B的效果好于A的效果,但是差距很小,因此线性投影并不是必需的,而使用0填充时,可以保证模型的复杂度最低,这对于更深的网络是更加有利的。

两层残差学习单元与三层残差学习单元的结构图:

两层的残差学习单元(左图)针对ResNet34,三层的残差学习单元(右图)针对ResNet50/101/152,一般称整个结构为一个”building block“,右图称之为bottleneck design。

在左图中,两个卷积层包含着相同的输出通道数的3x3卷积。

在右图中,第一个1x1的卷积把256维channel降到64维,最后再通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。我们可以看出这样的网络结构大大降低了参数量和计算量。 

对于building block,可以用于34层的ResNet或者层数更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。

经过检验,深度残差网络的确解决了退化问题,如下图所示,左图为18层和34层的平原网络(plain network)误差率更高,右图为18层和34层的残差网络(ResNet)的误差率。我们在plain上观测到明显的退化现象,而且ResNet上不仅没有退化,34层网络的效果反而比18层的更好,而且不仅如此,ResNet的收敛速度比plain的要快得多。

退化:

即指当模型的层次加深时,错误率却提高的现象。

深度残差网络(ResNet)的论文:

Deep Residual Learning for Image Recognition

论文地址:https://arxiv.org/pdf/1512.03385.pdf

ResNet——MSRA何凯明团队的Residual Networks,在2015年ImageNet上大放异彩,在ImageNet的classification、detection、localization以及COCO的detection和segmentation上均斩获了第一名的成绩,而且Deep Residual Learning for Image Recognition也获得了CVPR2016的best paper。

ResNet的作者的第二篇相关论文:

Identity Mappings in Deep Residual Networks

论文地址:https://arxiv.org/pdf/1603.05027.pdf

这篇论文中提出了ResNet V2。ResNet V2 和 ResNet V1 的主要区别在于,作者通过研究 ResNet 残差学习单元的传播公式,发现前馈和反馈信号可以直接传输,因此“shortcut connection”(捷径连接)的非线性激活函数(如ReLU)替换为 Identity Mappings。同时,ResNet V2 在每一层中都使用了 Batch Normalization。这样处理后,新的残差学习单元比以前更容易训练且泛化性更强。

高速路神经网络(Highway Networks)与深度残差网络(ResNet)的区别:

高速路神经网络(Highway Networks)与深度残差网络(ResNet)这两种网络结构都能够让一部分的数据可以跳过某些变换层,而直接到后面的层中去,只不过高速路神经网络(Highway Networks)需要一个权值来控制每次直接通过的数据量,而深度残差网络直接让一部分数据通到了后面。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/83690923