深度学习模型之——Stochastic depth(随机深度)

随机深度网络(Stochastic Depth Networks)是一种改进ResNet的方法,通过在训练过程中随机丢弃某些层来减少训练时间并提高网络的泛化能力。该方法不仅缩短了训练周期,还在多个数据集上取得了优于原ResNet的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

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

背景:


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

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

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

网络基本思想:

基本架构使用ResNet-110或152. 

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

H_{l}是第l个残差块的输出结果,f_{l}是由l第l个残差块的权重映射所决定的映射,b_{l}是一个随机变量(此变量的值只有1或0,反映出一个block是否是被激活的)),为每个残差模块的转换部分设置一个通过与不通过的概率P ,每一个残差块都有P可能性被dropout掉,即b_{l}为0。若保留,则b_{l}为1。
1

b_{l}=1时,这个block就是一个正常的残差块;当b_{l}=0时,上面的公式就变成了这样:


作者们将一个“线性衰减规律”应用于每一层的生存概率,他们表示,由于较早的层会提取低级特征,而这些低级特征会被后面的层所利用,所以这些层不应该频繁地被丢弃。这样,最终生成的规则就变成了这样: 
2

上面公式中的p_{l}表示的是第l层在训练中的生存概率,L表示block的总数量,因此p_{L}就是最后一个残差块的生存几率,这个几率在整个实验中一直都保持着0.5的水平。一定要注意的是,在这个情境中的输入被视为第一个层(l=0),所以这个第一层永远不会被丢弃。随机深度训练的整体框架如下图所示:

实验表明,同样是训练一个110层的ResNet,以任意深度进行训练的性能,比以固定深度进行训练的性能要好。这就意味着ResNet中的一些层(路径)可能是冗余的。 

优点:

1、这种方法成功地解决了深度网络的训练时间难题。’

2、它大大减少了训练时间,并显着改善了几乎所有数据集的测试错误(CIFAR-10,CIFAR-100,SVHN)

3、可以使得网络更深:随着随机深度,我们可以增加剩余网络的深度,甚至超过1200层,仍然可以在CIFAR-10上产生有意义的测试误差改善(4.91%)

### DropPath 的定义与作用 DropPath 是一种正则化技术,广泛应用于深度学习模型特别是视觉Transformer(ViT)和其他基于注意力机制的架构中。其核心思想是对网络中的某些路径进行随机丢弃,以此减少过拟合的风险并增强模型泛化能力[^4]。这种方法类似于传统的 Dropout 技术,但在操作层面有所区别——Dropout 随机失活的是单个神经元,而 DropPath 则针对整个样本在整个网络路径上的传播过程实施控制。 在训练阶段应用 DropPath 时,对于每一个 mini-batch 数据点,都会有一定概率将其排除在外不让它参与前向传播及反向梯度更新流程;而在测试模式下,则保持所有路径畅通无阻以充分利用已学得的知识完成预测任务[^5]。 ### 中文翻译建议 考虑到术语的专业性和简洁性,“DropPath”可以直接译作“丢弃路径”,这既保留了原意又便于理解记忆。“路径”一词在这里指代的就是数据流经神经网络各层之间的线路组合关系。 另外值得注意的一点是,在实际工程实践中有时也会看到有人把这项技术叫做 Stochastic Depth (随机深度)[^6] ,两者本质上是一样的东西只是叫法不同而已。所以中文环境下也可以视具体情况选用 “随机深度” 这一名字来进行表述。 --- ### 示例代码片段说明如何实现DropPath 下面给出了一段 Python 实现示例,展示了怎样在一个典型的卷积块类 ConvBlock 内部加入 drop_path 功能支持: ```python import torch.nn as nn from timm.models.layers import drop_path class ConvBlock(nn.Module): def __init__(self, dim, drop_prob=0.): super().__init__() self.dwconv = nn.Conv2d(dim, dim, kernel_size=3, padding=1, groups=dim) # depthwise conv self.norm = LayerNorm(dim, eps=1e-6) self.pwconv1 = nn.Linear(dim, 4 * dim) # point-wise/1x1 convolution self.act = nn.GELU() self.pwconv2 = nn.Linear(4 * dim, dim) self.drop_path = DropPath(drop_prob) if drop_prob > 0. else nn.Identity() def forward(self, x: Tensor) -> Tensor: input = x x = self.dwconv(x) x = x.permute(0, 2, 3, 1) # NCHW to NHWC format for linear layers x = self.norm(x) x = self.pwconv1(x) x = self.act(x) x = self.pwconv2(x) x = x.permute(0, 3, 1, 2) # back to NCHW format x = input + self.drop_path(x) return x ``` 在此处可以看到 `drop_path` 方法被用来决定是否要跳过当前 block 输出的结果加上原始输入作为最终输出的一部分运算逻辑。 --- ###
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值