1. Dropout
Dropout 是一种正则化技术,通过在训练过程中随机移除部分神经元及其连接,从而减少神经网络对特定神经元的依赖,提升模型的泛化能力。具体而言,Dropout 相当于在训练过程中从原始网络中随机采样出“更薄的”子网络,每个子网络的神经元数量较少。在前向传播和反向传播过程中,模型基于多个稀疏子网络进行训练,这可以视为一种模型平均化的形式。
Dropout 的动机
在使用 Dropout 训练的神经网络中,每个隐藏单元都需要与随机选择的其他单元一起工作,因此每个单元变得更加健壮,不再依赖于特定的其他神经元。通过随机丢弃神经元,Dropout 阻止了神经元共适应性的发生,即某些神经元仅在特定神经元存在时有效。由于每次训练的神经元子集是随机的,网络被迫学习更鲁棒的特征,这些特征在不同的神经元组合中依然存在和有效。
Dropout 通过迫使每个神经元独立学习有用的特征,避免了模型对某些固定特征组合的依赖,从而提高了模型的泛化能力,减少过拟合。
以下是基于所述的 Dropout 实现流程的总结:
Dropout 实现流程:
-
初始化阶段:在神经网络的每一层中,设置一个 dropout rate(通常为 0.5),表示训练时每次迭代随机丢弃神经元的比例。输入层和输出层的神经元不会被丢弃,只有隐藏层的神经元会被随机选择。
-
前向传播:在每次迭代的前向传播阶段,随机选择隐藏层中的一部分神经元,并将其临时丢弃(设其输出为 0)。通常,丢弃的比例等于 dropout rate。例如,当 dropout rate 为 0.5 时,随机丢弃 50% 的隐藏层神经元。
-
参数更新:将输入数据通过修改后的网络进行前向传播,计算得到的损失。 通过修改后的网络进行反向传播,根据损失对未被丢弃的神经元进行梯度更新(如随机梯度下降法)。被丢弃的神经元的参数不会更新,保持原样。
-
循环过程:
- 恢复被丢弃的神经元:恢复之前被临时丢弃的神经元,使其在下一次迭代中重新参与训练。
- 重新随机丢弃神经元:在下一次迭代中,重新随机选择隐藏层中的部分神经元进行丢弃。每次 mini-batch 训练时,都会随机选择不同的神经元进行丢弃,确保模型每次训练的子网络都不同。
- 重复上述的前向传播、参数更新、恢复和重新丢弃神经元的过程,直到训练完成。
-
测试阶段:在测试阶段,Dropout 不再丢弃任何神经元。为了保持训练和测试时的数值一致性,模型会将所有隐藏层神经元的输出按丢弃比例缩放(例如,如果 dropout rate 是 0.5,则乘以 0.5),以确保训练和推断时的激活值保持一致。
Dropout 流程的关键点
- 随机丢弃神经元:每次训练随机选择一部分神经元,并将它们临时丢弃,以防止模型过度依赖某些特定神经元,从而提高泛化能力。
- 参数更新:只有未被丢弃的神经元参与梯度更新,丢弃的神经元在当前 mini-batch 迭代中保持不变。
- 恢复丢弃神经元:每次训练结束后恢复所有神经元,保证每一轮训练时使用的神经元组合不同。
- 测试阶段不丢弃:测试时,模型使用所有神经元,但会缩放输出以保持与训练时的数值一致性。
2. DropPath
DropPath(也称为 Stochastic Depth)是一种用于深度神经网络的正则化方法。与 Dropout 随机丢弃神经元不同,DropPath 随机丢弃整个网络中的路径,也就是整条计算分支。它特别适用于带有残差连接(Residual Connections)的神经网络,如 ResNet 这样的结构。
在网络的前向传播过程中,DropPath 会随机丢弃某些网络路径(或残差块),让网络在这些路径缺失的情况下依然能够进行训练,从而提高模型的鲁棒性和泛化能力。这种技术避免了网络依赖某些特定的路径来拟合数据,有效防止过拟合。
-
Iteration #1 和 Iteration #3(Local):网络在局部范围内选择路径进行计算,部分卷积层被激活,而部分路径则被丢弃,主要参与的模块是卷积(粉红色)和连接(绿色)。
-
Iteration #2 和 Iteration #4(Global):网络在全局范围内选择路径,更多的模块(卷积、连接、池化等)参与计算,模型尝试在更广泛的网络结构上进行学习和优化。
DropPath 和 Dropout 的主要区别
对比维度 | Dropout | DropPath |
---|---|---|
层次 | 随机丢弃网络中的个别神经元,作用在网络的单个神经元级别 | 随机丢弃网络中的整个路径或分支,作用在网络的路径级别或残差块级别 |
适用场景 | 适用于任意网络层(如全连接层、卷积层),主要在神经元级别上起作用 | 特别适用于带有跳跃连接或残差连接的深度网络(如 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 的具体流程
-
前向传播:在每次前向传播时,DropPath 会根据设定的丢弃概率(如 0.2 或 0.5),随机决定是否丢弃某个残差块的主路径。如果该路径被丢弃,则该块的输出仅为输入 x x x。 每个批次中,DropPath 只会对部分路径进行丢弃,因此不同批次会训练不同的网络子结构。
-
梯度更新:DropPath 会正常计算梯度并更新未被丢弃的路径中的参数。被丢弃的路径不会参与梯度更新。
-
测试阶段:在测试阶段,DropPath 不会丢弃任何路径。所有路径都会被使用,以保证模型在推理时的稳定性。
DropPath 的优势
-
减少过拟合:与 Dropout 类似,DropPath 可以通过随机丢弃路径避免模型过度依赖某些固定路径,从而防止过拟合。
-
提升模型的鲁棒性:通过迫使网络在不同路径组合下工作,DropPath 使得模型能够更好地适应不同的数据分布,增加了模型的泛化能力。
-
特别适合深度网络:对于 ResNet 等深度网络,DropPath 可以有效减轻梯度消失问题,因为即使某些主路径被丢弃,梯度仍然能够通过跳跃连接有效传播。这有助于训练更深层次的网络。