首页 > 其他分享 >【机器学习】正则化-Dropout/DropPath

【机器学习】正则化-Dropout/DropPath

时间:2024-09-12 21:50:03浏览次数:8  
标签:DropPath 丢弃 Dropout 路径 网络 正则 随机 神经元

1. Dropout

Dropout 是一种正则化技术,通过在训练过程中随机移除部分神经元及其连接,从而减少神经网络对特定神经元的依赖,提升模型的泛化能力。具体而言,Dropout 相当于在训练过程中从原始网络中随机采样出“更薄的”子网络,每个子网络的神经元数量较少。在前向传播和反向传播过程中,模型基于多个稀疏子网络进行训练,这可以视为一种模型平均化的形式。

请添加图片描述

Dropout 的动机

在使用 Dropout 训练的神经网络中,每个隐藏单元都需要与随机选择的其他单元一起工作,因此每个单元变得更加健壮,不再依赖于特定的其他神经元。通过随机丢弃神经元,Dropout 阻止了神经元共适应性的发生,即某些神经元仅在特定神经元存在时有效。由于每次训练的神经元子集是随机的,网络被迫学习更鲁棒的特征,这些特征在不同的神经元组合中依然存在和有效。

Dropout 通过迫使每个神经元独立学习有用的特征,避免了模型对某些固定特征组合的依赖,从而提高了模型的泛化能力,减少过拟合

以下是基于所述的 Dropout 实现流程的总结:

Dropout 实现流程:

  1. 初始化阶段:在神经网络的每一层中,设置一个 dropout rate(通常为 0.5),表示训练时每次迭代随机丢弃神经元的比例。输入层和输出层的神经元不会被丢弃,只有隐藏层的神经元会被随机选择。

  2. 前向传播:在每次迭代的前向传播阶段,随机选择隐藏层中的一部分神经元,并将其临时丢弃(设其输出为 0)。通常,丢弃的比例等于 dropout rate。例如,当 dropout rate 为 0.5 时,随机丢弃 50% 的隐藏层神经元。

  3. 参数更新:将输入数据通过修改后的网络进行前向传播,计算得到的损失。 通过修改后的网络进行反向传播,根据损失对未被丢弃的神经元进行梯度更新(如随机梯度下降法)。被丢弃的神经元的参数不会更新,保持原样

  4. 循环过程

    • 恢复被丢弃的神经元:恢复之前被临时丢弃的神经元,使其在下一次迭代中重新参与训练。
    • 重新随机丢弃神经元:在下一次迭代中,重新随机选择隐藏层中的部分神经元进行丢弃。每次 mini-batch 训练时,都会随机选择不同的神经元进行丢弃,确保模型每次训练的子网络都不同。
    • 重复上述的前向传播、参数更新、恢复和重新丢弃神经元的过程,直到训练完成。
  5. 测试阶段:在测试阶段,Dropout 不再丢弃任何神经元。为了保持训练和测试时的数值一致性,模型会将所有隐藏层神经元的输出按丢弃比例缩放(例如,如果 dropout rate 是 0.5,则乘以 0.5),以确保训练和推断时的激活值保持一致。

Dropout 流程的关键点
  • 随机丢弃神经元:每次训练随机选择一部分神经元,并将它们临时丢弃,以防止模型过度依赖某些特定神经元,从而提高泛化能力。
  • 参数更新:只有未被丢弃的神经元参与梯度更新,丢弃的神经元在当前 mini-batch 迭代中保持不变。
  • 恢复丢弃神经元:每次训练结束后恢复所有神经元,保证每一轮训练时使用的神经元组合不同。
  • 测试阶段不丢弃:测试时,模型使用所有神经元,但会缩放输出以保持与训练时的数值一致性。

2. DropPath

DropPath(也称为 Stochastic Depth)是一种用于深度神经网络的正则化方法。与 Dropout 随机丢弃神经元不同,DropPath 随机丢弃整个网络中的路径,也就是整条计算分支。它特别适用于带有残差连接(Residual Connections)的神经网络,如 ResNet 这样的结构。

在网络的前向传播过程中,DropPath 会随机丢弃某些网络路径(或残差块),让网络在这些路径缺失的情况下依然能够进行训练,从而提高模型的鲁棒性泛化能力。这种技术避免了网络依赖某些特定的路径来拟合数据,有效防止过拟合。

请添加图片描述

  1. Iteration #1Iteration #3(Local):网络在局部范围内选择路径进行计算,部分卷积层被激活,而部分路径则被丢弃,主要参与的模块是卷积(粉红色)和连接(绿色)。

  2. Iteration #2Iteration #4(Global):网络在全局范围内选择路径,更多的模块(卷积、连接、池化等)参与计算,模型尝试在更广泛的网络结构上进行学习和优化。

DropPath 和 Dropout 的主要区别

对比维度DropoutDropPath
层次随机丢弃网络中的个别神经元,作用在网络的单个神经元级别随机丢弃网络中的整个路径或分支,作用在网络的路径级别残差块级别
适用场景适用于任意网络层(如全连接层、卷积层),主要在神经元级别上起作用特别适用于带有跳跃连接或残差连接的深度网络(如 ResNet),可随机丢弃残差路径

DropPath 的工作原理

残差网络中的 DropPath

请添加图片描述

在残差网络(如 ResNet)中,模型包含多个残差块,每个块由一条主路径和一条跳跃连接 (shortcut connection) 组成(上图是残差网络中的一个残差块(Residual Block) 的结构),结构如下:
y = x + f ( x ) y = x + f(x) y=x+f(x)
其中 x x x 是输入, f ( x ) f(x) f(x) 是主路径中的卷积层、激活函数等的组合。

详细介绍:在训练过程中,DropPath 会按一定的概率随机丢弃主路径 f ( x ) f(x) f(x),让网络仅使用跳跃连接 x x x。这样,残差块的输出变为:
y = x (当主路径被丢弃时) y = x \quad \text{(当主路径被丢弃时)} y=x(当主路径被丢弃时)
当 DropPath 没有丢弃主路径时,网络按照正常方式计算输出:
y = x + f ( x ) (当主路径未被丢弃时) y = x + f(x) \quad \text{(当主路径未被丢弃时)} y=x+f(x)(当主路径未被丢弃时)

通过在训练过程中随机丢弃路径,DropPath 强迫模型在不同的路径组合下工作,这减少了模型对某些固定路径的依赖,增强了网络的泛化能力。

DropPath 的具体流程
  1. 前向传播:在每次前向传播时,DropPath 会根据设定的丢弃概率(如 0.2 或 0.5),随机决定是否丢弃某个残差块的主路径。如果该路径被丢弃,则该块的输出仅为输入 x x x。 每个批次中,DropPath 只会对部分路径进行丢弃,因此不同批次会训练不同的网络子结构。

  2. 梯度更新:DropPath 会正常计算梯度并更新未被丢弃的路径中的参数。被丢弃的路径不会参与梯度更新。

  3. 测试阶段:在测试阶段,DropPath 不会丢弃任何路径。所有路径都会被使用,以保证模型在推理时的稳定性。

DropPath 的优势

  1. 减少过拟合:与 Dropout 类似,DropPath 可以通过随机丢弃路径避免模型过度依赖某些固定路径,从而防止过拟合。

  2. 提升模型的鲁棒性:通过迫使网络在不同路径组合下工作,DropPath 使得模型能够更好地适应不同的数据分布,增加了模型的泛化能力。

  3. 特别适合深度网络:对于 ResNet 等深度网络,DropPath 可以有效减轻梯度消失问题,因为即使某些主路径被丢弃,梯度仍然能够通过跳跃连接有效传播。这有助于训练更深层次的网络。

标签:DropPath,丢弃,Dropout,路径,网络,正则,随机,神经元
From: https://blog.csdn.net/fzy2003/article/details/142184493

相关文章

  • 【机器学习】过拟合/欠拟合+正则化
    正则化1.过拟合/欠拟合正则化通过在损失函数中添加约束,防止模型参数在迭代过程中无限制增长,进而提高模型的泛化能力。在模型训练过程中,参数的优化实际上是不断迭代,以找到一个方程H......
  • 【04】深度学习——训练的常见问题 | 过拟合欠拟合应对策略 | 过拟合欠拟合示例 | 正
    深度学习1.常见的分类问题1.1模型架构设计1.2万能近似定理1.3宽度or深度1.4过拟合问题1.5欠拟合问题1.6相互关系2.过拟合欠拟合应对策略2.1问题的本源2.2数据集大小的选择2.3数据增广2.4使用验证集2.5模型选择2.6K折交叉验证2.7提前终止3.过拟合欠拟合示例3.1导入库3.2......
  • Python 之正则表达式(Regular Expressions in Python)
    ......
  • C语言的正则表达式
    C标准库不支持正则表达式,但大部分Linux发行版本都带有第三方的正则表达式函数库。以常见的<regex.h>为例:/*regcomp将正则表达式编译成适合后续regexec函数搜索的形式preg指向模式缓冲区,传出参数regex字符串,传入参数cflag决定编译类型,可位或:-REG_EXTENDED扩展正则表达式......
  • Ts+正则表达式格式化时间
     1.padStart:padStart(targetLength,padString):用另一个字符串填充当前字符串(如果需要会重复填充),直到达到给定的长度。填充是从当前字符串的开头开始的。最后返回一个新的字符串。targetLength:当前str填充后的长度。如果该值小于或等于str.length,则会直接返回当前str。pa......
  • 通过特征幅度正则化,增强少数据情况下的细粒度识别精度
    原论文《EnhancingFine-GrainedVisualRecognitionintheLow-DataRegimeThroughFeatureMagnitudeRegularization》一.研究背景1.研究问题:这篇文章要解决的问题是细粒度图像识别(FGVR)在数据有限的情况下如何进行训练。由于类别之间的细微差异可能难以区分,尤其是在存......
  • redis 正则匹配符合条件的key 进行删除
    //根据名字的key,如果key数量超过100,就进行一次删除publicintclearRedis(@PathVariable("prefix")Stringprefix)throwsIOException{ScanOptionsoptions=ScanOptions.scanOptions().match(prefix+"*").count(1000).build();Cursorcursor=r......
  • 四剑客_正则
    1四剑客1.1概述1.2find命令基本用法1.2.1找出/etc/目录下面以.conf结尾的文件⭐⭐⭐⭐⭐[root@Kylin-V10-sp3~/test]#find/etc/-typef-name*.conf|head-5/etc/resolv.conf/etc/dnf/protected.d/systemd.conf/etc/dnf/protected.d/sudo.conf/etc/dnf/protect......
  • 正则表达式
    正则表达式是一种文本模式匹配。它是一个三方产品。常见的shell中有grepsedawk命令支持。通过提供特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出想要的数据。1.特殊字符^锚定开头^a以a开头,默认锚定一个字符¥锚定结尾a$以a结尾,默认锚定一个字符......
  • 深入掌握Go语言中的正则表达式与字符串处理
    Go语言中的正则表达式与模式匹配在编程中,字符串处理是常见的需求之一,而正则表达式则是一个强大的工具,能够帮助我们实现复杂的字符串匹配、提取和替换功能。Go语言内置了对正则表达式的支持,通过regexp包,我们可以轻松实现模式匹配的各种操作。本文将详细介绍正则表达式在Go语......