2021.10.07 学习周报

深度残差网络ResNet

2021.10.07 学习周报_第1张图片

 

解决的问题:深度网络的退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。即深层网络存在着梯度消失或梯度爆炸的问题。导致很深的网络无法训练。

解决方法:对输入数据和中间层的数据进行归一化操作,这种方法可以保证网络在反向传播中采用随机梯度下降(SGD),从而让网络达到收敛。但这种方法只对几十层的网络有用,为了让更深的网络也达到训练效果,采用了ResNet.

主要思想:在网络中增加了直连通道,即Highway Network。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出,允许原始输入信息直接传到后面的层中,如上图所示。

创新点:提出残差学习的思想。通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。VGGNet和ResNet的对比如下图所示。ResNet最大的区别在于有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut或者skip connections。

在不知道多深的网络合适的情况下,增加深度对于模型学习是有帮助的,理论上讲,越复杂的特征有越强的表征能力,越深的网络输出表示能力越强的特征,所以,网络的深度对于学习表达能力更强的特征至关重要。所以需要加深,但是太深就会有退化。解决办法是让多余的层变为恒等映射。直接让一些层去拟合一个恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x。因此,可以说是在学习残差。在进行恒等映射的回收时,学习残差比学习原来的映射函数要简单。

网络结构:

2021.10.07 学习周报_第2张图片

 

对每层的输入做reference, 学习形成残差函数,这种残差函数更容易优化,能使网络层数大大加深。

ResNet网络是参考了VGG19网络,在其基础上进行了修改,并通过短路机制加入了残差单元。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。ResNet的一个重要设计原则是:当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示feature map数量发生了改变。18-layer和34-layer的ResNet进行两层间的残差学习,当网络更深时,进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1。隐含层的feature map数量比较小,并且是输出feature map数量的1/4。

ResNet由残差块(Residual block)构建。

残差块的结构有二层:

1.(σ代表非线性函数ReLU)

 

2.通过一个shortcut,和第2个ReLU,获得输出y

 

当需要对输入和输出维数进行变化时(如改变通道数目),可以在shortcut时对x做线性变换Ws。

残差块往往需要两层以上。

 

如图是一个两层普通神经网络,在l层进行激活,得到a[l+1],再次进行激活,两层之后得到a[l+2]。计算过程从a[l]开始,首先进行线性激活,根据公式:Z[l+1]=W[l+1]a[l]+b[l+1],通过a[l]算出Z[l+1],即a[l]乘以权重矩阵,再加上偏差因子。然后通过ReLU函数得到a[l+1],接着再次进行线性激活,依据等式Z[l+2]=W[l+2]a[l+1]+b[l+2],根据这个等式再次进行ReLu激活,即a[l+2]=g(z[l+2]),这里的g是指ReLU非线性函数,得到的结果就是a[l+2]。信息流从a[l]到a[l+2]需要经过以上所有步骤,即这组网络层的主路径。

在残差网络中,将a[l]直接向后拷贝到神经网络的深层,在ReLU激活函数前加上a[l],这是一条捷径,a[l]的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着等式a[l+2]=g(z[l+2])去掉了,取而代之的是另一个ReLU函数,仍然对z[l+2]进行g函数处理,但这次要加上a[l],即:a[l+2]=g(z[l+2]+a[l]) ,也就是加上的这个a[l]产生了一个残差块。

在图中可以走一条捷径,直达第二层。这条捷径是在进行ReLU函数之前加上的,而这里的每一个节点都执行了线性函数和ReLU函数。所以a[l]插入的时机是在线性激活之后,ReLU激活之前。

2021.10.07 学习周报_第3张图片

跳跃连接:指a[l]跳过一层或好几层,从而将信息传递到神经网络的更深层。

普通网络(Plain network)

普通网络变成ResNet的方法:加上所有跳跃连接,每两层增加一个捷径,构成一个残差块。如图所示,5个残差块连接在一起构成一个残差网络。

2021.10.07 学习周报_第4张图片

 

残差块的两种结构:

2021.10.07 学习周报_第5张图片

 

一种是以两个3*3的卷积网络串接在一起作为一个残差模块,另外一种是1*1、3*3、1*1的3个卷积网络串接在一起作为一个残差模块。

这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图)。ResNet50/101/152是由上述的残差模块堆叠在一起实现的。

称整个结构为一个building block。右图称为bottleneck design,这种结构的目的是降低参数数目,第一个1x1的卷积把256维降到64维,在最后通过1x1卷积恢复。整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632。

对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的网络中,目的是减少计算和参数量。

两种Shortcut Connection方式:

2021.10.07 学习周报_第6张图片

 

实线的Connection部分(第一个粉色矩形和第三个粉色矩形)都是执行3x3x64的卷积,他们的channel个数一致,所以采用公式:

y=F(x)+x

虚线的Connection部分(第一个绿色矩形和第三个绿色矩形)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用公式:

y=F(x)+Wx

其中W是卷积操作,用来调整x的维度

Resnet提供了两种选择方式:identity mapping(恒等映射)和residual mapping(残差映射)。如果网络已经到达最优,继续加深网络,residual mapping将被push为0,只剩下恒等映射,理论上网络就会一直处于最优状态,网络的性能也就不会随着深度增加而降低了。

连接方式:shortcut connection,即抄近道。

恒等映射:为了建立深层网络而在浅层网络上堆积的新层。这些新层不学习新的内容,只是复制浅层网络的特征。即F(x)=0。

对于一个堆积层结构(几层堆积而成)当输入为x时其学习到的特征记为H(x),现在我们希望其可以学习到残差F(x) = H(x)-x,这样其实原始的学习特征是 F(x)+x。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如图4所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。

要求解的映射为:H(x).现在将这个问题转换为求解网络的残差映射函数,也就是F(x),其中F(x) = H(x)-x。求解的问题变成了H(x) = F(x)+x

残差:观测值与估计值之间的差。

H(x):观测值。

X:估计值(上一层ResNet输出的特征映射)。

一般称x为identity Function,跳跃连接。称F(x)为ResNet Function。

如果采用一般的卷积神经网络,原先要求解H(x) = F(x),现在假设网络达到某一个深度的时候,已经是最优状态,此时错误率是最低的,再加深网络就会出现退化问题(增加网络层数却导致更大的误差)。

采用残差网络就能很好的解决这个问题。假设当前网络的深度能够使得错误率最低,如果继续增加ResNet,为了保证下一层的网络状态仍然是最优状态,只需要令F(x)=0。

因为x是当前输出的最优解,为了让它成为下一层的最优解,也就是让H(x)=x的话,求解H(x) = F(x)+x,F(x)=0。

真实测试时x很难达到最优,只能尽量接近最优解。采用ResNet,只需要更新F(x)的部分权重值。

公式(以二层为例):a[l+2]=Relu(W[l+2](Relu(W[l+1]a[l]+b[l+1])+b[l+2]+a[l])

注意:如果残差映射F(x)的结果的维度与跳跃连接x的维度不同,是无法相加的,必须对x升维,维度相同时才能计算。以上为维度相同的计算方式。维度不同时,公式为H(x)=F(x)+Wx。其中W为卷积操作,调整x的维度。

升维的方法有两种:

1.全0填充;

2.采用1*1卷积。

实验结果表明,ResNet在上百层都有很好的表现,但是当达到上千层了之后仍然会出现退化现象。

Resnet的不同结构:

2021.10.07 学习周报_第7张图片

 

上表一共提出了5种深度的ResNet,分别是18,34,50,101和152。其中ResNet50和ResNet101使用率很高。

所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x。

以101-layer列为例,从上往下看,首先是输入7x7x64的卷积,然后经3+4+23+3=33个building block,每个block为3层,所以有33x3=99层,最后有个全连接层用于分类,所以1 + 99 + 1 = 101层,有101层网络。 

注:101层网络仅仅指卷积或者全连接层,而激活层或者Pooling层并没有计算在内。

关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,两者之间差了17个block,也就是17 x 3 = 51层。

基于ResNet101的Faster RCNN:

2021.10.07 学习周报_第8张图片

 

  蓝色部分为ResNet101。conv4_x最后的输出为RPN(区域候选网络)和RoI Pooling(兴趣区域池化)共享的部分,而conv5_x作用于RoI Pooling之后的特征图(14 x 14 x 1024)。最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。

ResNet通过残差学习解决了深度网络的退化问题,让我们可以训练出更深的网络。

Q:

  1. RPN?RoI Pooling?
  2. 残差块结构公式不太理解
  3. 网络在训练的过程中怎样判断是否已经达到最优?既然最优了,那继续加深网络的目的是什么呢
  4. Output size那列应该是feature map的大小,resnet是将所有大小的图片都这么提取吗?输入图片的大小必须是固定值吗
  5. 最后一步average pooling怎么得到2048维的()
  6. 既然最终拟合的是一个恒等映射 h(x)=x,为什么还要去拟合,不能直接沿用x?

ReLu函数:修正线性单元(Rectified linear unit),神经元的激活函数。

2021.10.07 学习周报_第9张图片

 

ReLU函数是分段线性函数,当输入小于等于0时,函数值为0,而正值不变,这种操作叫做单侧抑制。单侧抑制使神经网络中的神经元具有了稀疏激活性。

在深度神经网络模型(如CNN)中作用明显,当模型增加N层,ReLU神经元的激活率将降低2的N次方倍。

Q:ReLU函数为什么这样规定?

A;查询资料得知,不一样只有这一种形式,只要能起到单侧抑制的作用,函数图像还可以镜面翻转、180度翻转,最终神经元的输出相当于加上了一个常数项系数,并不影响模型的训练结果。

稀疏性的作用:训练一个深度分类模型的时候,和目标相关的特征只有特定几个。所以运算时,可以让一部分需要的神经元激活,不需要的神经元抑制。通过ReLU函数稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。

相比于其它激活函数来说,ReLU的优势:对于线性函数,ReLU的表达能力更强,尤其体现在深度网络中;对于非线性函数,ReLU非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态。

梯度消失问题:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次,如果在深层模型中使用sigmoid作为激活函数,这种现象尤为明显,将导致模型收敛停滞不前。

构建滑动窗口的卷积应用

首先要知道如何把神经网络的全连接层转化成卷积层

你可能感兴趣的:(深度学习,神经网络)