zoukankan      html  css  js  c++  java
  • Deep Networks with Stochastic Depth

    随机深度文章是发表于ECCV2016,这篇文章早于DenseNet.,DenseNet也是因为随机深度网络受到启发,才提出来。Deep Network with Stochastic depth,在训练过程中,随机去掉很多层,并没有影响算法的收敛性,说明了ResNet具有很好的冗余性。而且去掉中间几层对最终的结果也没什么影响,说明ResNet每一层学习的特征信息都非常少,也说明了ResNet具有很好的冗余性。所以提出了DenseNet网络,DenseNet网络和stochastic depth都是黄高博士提出的。

    深的网络在现在表现出了十分强大的能力,但是也存在许多问题。即使在现代计算机上,梯度会消散、前向传播中信息的不断衰减、训练时间也会非常缓慢等问题。

    ResNet的强大性能在很多应用中已经得到了证实,尽管如此,ResNet还是有一个不可忽视的缺陷——更深层的网络通常需要进行数周的训练——因此,把它应用在实际场景下的成本非常高。为了解决这个问题,作者们引入了一个“反直觉”的方法,即在我们可以在训练过程中任意地丢弃一些层,并在测试过程中使用完整的网络。

    本文主要是提出随机深度,在训练时使用较浅的深度(随机在resnet的基础上pass掉一些层),在测试时使用较深的深度,较少训练时间,提高训练性能,最终在四个数据集上都超过了resnet原有的性能(cifar-10, cifar-100, SVHN, imageNet)。其训练过程中采用随机dropout一些中间层的方法改进ResNet,发现可以显著提高ResNet的泛化能力。随机深度网络也算是的ResNet变形.

    作者们用了残差块作为他们网络的构件,因此,在训练中,如果一个特定的残差块被启用了,那么它的输入就会同时流经恒等表换shortcut(identity shortcut)和权重层;否则输入就只会流经恒等变换shortcut。在训练的过程中,每一个层都有一个“生存概率”,并且都会被任意丢弃。在测试过程中,所有的block都将保持被激活状态,而且block都将根据其在训练中的生存概率进行调整

    根据 [公式] 用一个bernoulli random variable生成每个block的激活状态 [公式] ,最终把ResNet的bottleneck block,从

    [公式]

    重新定义为

    [公式]

    [公式] ,即block未被激活时,

    [公式]

    (Note:原文是 [公式] ,也做了解释,但是我觉得以上表述更加清晰)

    另外, [公式] 是从 [公式]简单线性递减至 [公式] ,被定义为

    [公式]

    预测时:

    ResNet的block被定义为

    [公式]

    即每个block的概率变成了这个block的残差的权重。

    这种引入随机变量的设计有效的克服了过拟合使模型有了更好的泛化能力。作者的解释是,不激活一部分block事实上实现了一种隐性的模型融合(Implicit model ensemble),由于训练时模型的深度随机,预测时模型的深度确定,事实上是在测试时把不同深度的模型融合了起来。在深度确定时,信息随着网络一层层被提取被过滤,当信息到达网络的高层时已经不是非常informative了,高层网络面对这样的信息难以得到有效的训练。不激活一部分block,使得高层的block能接收到更多来自底层的信息,能得到更加充分的训练,因而模型有了更好的表达能力。在预测时,深度确定并且给各个block加权,也事实上是一种模型融合。

    另外一种解释,这种引入随机变量的设计是把Dropout应用到了整个网络。

  • 相关阅读:
    19面向对象--特殊成员
    18面向对象--成员和组合
    17面向对象--三大特性
    16异常处理
    15(os、random、sys、)(json、pickle )
    14python模块之re
    13正则表达式
    12内置函数补充,递归以及二分法。
    Linux环境ftp搭建及问题总结
    运维之路—linux忘记密码修改(rd.breake 方式)
  • 原文地址:https://www.cnblogs.com/ziwh666/p/12482583.html
Copyright © 2011-2022 走看看