当前位置:   article > 正文

residual block、bottleneck、skip connection……都是些什么?_bottleneck residual block

bottleneck residual block

  最近在看论文的时候,总是时不时会看到residual block、bottleneck、skip connection等术语,于是花了点时间找了几篇高质量的问答贴看了一下(链接附在本文末尾),并将一些比较重要的点在此记录一下。它们其实都和一篇卷积神经网络经典论文有关:Deep Residual Learning for Image Recognition,也就是大名鼎鼎的ResNet
  residual block直译为残差块。在ResNet论文中,residual block有两种形式,一种叫BasicBlock,一种叫Bottleneck,如下图所示:
在这里插入图片描述
  其中,左图是BasicBlock,右图是Bottleneck。图中的⊕表示逐元素的加法,这就要求相加的两个张量维度必须完全一致。比如一个tensor A56×56×64与一个tensor B56×56×64相加,有A⊕B=C,得到的tensor C维度也是56×56×64。BasicBlock的输入和输出的维度是一样的,而Bottleneck结构通过1×1的卷积来进行升维/降维,其输出维度是输入维度的4倍。
  residual block与普通的Plain Net的区别就在于它多了一个skip connection(跳连接)的操作,也就是上图中主路右侧的弧线。使用skip connection可以有效减少梯度弥散(Gradient Vanishing)和网络模型退化的问题。因此,这种结构可以用来构建非常深的网络(关于skip connection的详细描述,可以参考这篇文章)。当去掉了这些skip connection之后,ResNet就与经典VGG网络的设计思路一样了,都是在间隔一定的层数之后,空间上/2(下采样)但深度翻倍。需要注意的是,深度上和空间上维度的升降是分开进行的。
  说到梯度弥散/消失,Batch Normalization(批标准化)就是一种常用的解决方法(关于Batch Normalization,可以参考Batch Normalization的通俗解释什么是批标准化 (Batch Normalization)谈一谈Skip Connection和Normalization)。那么,既然Batch Normalization也可以解决梯度消失问题,那为什么还要skip connection呢?这是因为,即使Batch Normalization过后梯度的模稳定在了正常范围内,但梯度的相关性实际上是随着层数增加持续衰减的。而经过证明,ResNet可以有效减少这种相关性的衰减。对于拥有L层的网络来说,没有残差表示的Plain Net梯度相关性的衰减系数为1/2L,而ResNet的衰减却只有1/√L。
  关于skip connection,还有一张更为形象生动的说明图,如下图所示。正常来说,梯度需要一层一层地往前传递,而由于前向传播过程中使用的激活函数使传递的信息带有损失,所以在回传过程中梯度也是会逐渐减小的(也就可能导致梯度消失)。而skip connection就像是直接又开了一个快车道,它可以直接把梯度回传到某个位置,这样回传梯度的损失也就减小了。
在这里插入图片描述
  除了上面对于skip connection的直观理解,这篇问答还提到了另外两种更为有说服力的看法:

  1. Feature Pyramid Network论文所述,跳连接相加可以实现不同分辨率特征的组合,因为浅层容易有高分辨率但是低级语义的特征,而深层的特征有高级语义,但分辨率就很低了。
  2. 引入跳接实际上让模型自身有了更加“灵活”的结构,即在训练过程本身,模型可以选择在每一个部分是“更多进行卷积与非线性变换”还是“更多倾向于什么都不做”,抑或是将两者结合。模型在训练便可以自适应本身的结构,这听起来是多么酷的一件事啊!

  skip connection的用法有很多,不仅仅局限于ResNet中在某个残差块内的连接,它还可以在不同的块之间,连接的间隔也可以是很多层,比如DenseNet。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/195903
推荐阅读
相关标签
  

闽ICP备14008679号