Dropout原理,代码浅析

Dropout是一种防止神经网络过拟合的策略,通过在训练过程中随机忽略一部分神经元来减少特征检测器间的相互作用。在每个训练批次中,Dropout会按一定比例随机关闭隐层节点,而在测试阶段,所有节点都会参与,但其输出会被相应调整,以保持一致性。这种方法可以视为一种模型平均,通过训练大量不同的网络模型来提高泛化能力。代码实现中,Dropout涉及到在网络前向传播时对隐藏层节点的随机忽略,并在反向传播和权重更新时进行相应的调整。

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

Dropout原理介绍

一:引言

因为在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象。在训练bp网络时经常遇到的一个问题,过拟合指的是模型在训练数据上损失函数比较小,预测准确率较高(如果通过画图来表示的话,就是拟合曲线比较尖,不平滑,泛化能力不好),但是在测试数据上损失函数比较大,预测准确率较低。

常用的防治过拟合的方法是在模型的损失函数中,需要对模型的参数进行“惩罚”,这样的话这些参数就不会太大,而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。因此在添加权值惩罚项后,应用梯度下降算法迭代优化计算时,如果参数theta比较大,则此时的正则项数值也比较大,那么在下一次更新参数时,参数削减的也比较大。可以使拟合结果看起来更平滑,不至于过拟合。

Dropout是hintion最近2年提出的;为了防止模型过拟合,Dropout可以作为一种trikc供选择。在hinton的论文摘要中指出,在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

 二  Dropout方法

训练阶段:

1.Dropout是在标准的bp网络的的结构上,使bp网的隐层激活值,以一定的比例v变为0,即按照一定比例v,随机地让一部分隐层节点失效;在后面benchmark实验测试时,部分实验让隐层节点失效的基础上,使输入数据也以一定比例(试验用20%)是部分输入数据失效(这个有点像denoising autoencoder),这样得到了更好的结果。

2.去掉权值惩罚项,取而代之的事,限制权值的范围,给每个权值设置一个上限范围;如果在训练跟新的过程中,权值超过了这个上限,则把权值设置为这个上限的值(这个上限值得设定作者并没有说设置多少最好,后面的试验中作者说这个上限设置为15时,最好;为啥?估计是交叉验证得出的实验结论)。

### PyTorch 中实现 Dropout 层 在 PyTorch 中,`nn.Dropout` 是一种常用的正则化技术,可以防止模型过拟合。下面是一个简单的例子来展示如何在一个全连接神经网络中加入 `nn.Dropout`: ```python import torch from torch import nn, optim class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(784, 500) self.fc2 = nn.Linear(500, 300) self.fc3 = nn.Linear(300, 10) self.dropout = nn.Dropout(p=0.5) def forward(self, x): x = x.view(-1, 784) # Flatten the input image to a vector of size 784. x = torch.relu(self.fc1(x)) x = self.dropout(x) # Apply dropout after activation function. x = torch.relu(self.fc2(x)) x = self.dropout(x) # Apply dropout again before final layer. x = self.fc3(x) return x model = SimpleNet() print(model) ``` 这段代码定义了一个三层的前馈神经网络,并在网络的不同层次之间加入了两个 Dropout 层[^2]。 对于特定维度的数据,比如卷积层后的张量,则应使用相应的 Dropout 实现方式如 `nn.Dropout1d` 或者 `nn.Dropout2d` 来匹配输入数据结构: ```python # Example with Convolutional Neural Network and Dropout2D class CNNWithDropout(nn.Module): def __init__(self): super(CNNWithDropout, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5) self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) # Applying spatial dropout on convolution outputs (spatial dimensions HxW). self.spatial_dropout = nn.Dropout2d(p=0.2) def forward(self, x): batch_size = x.size(0) x = self.pool(torch.relu(self.conv1(x))) x = self.spatial_dropout(x) # Spatial dropout applied here. x = self.pool(torch.relu(self.conv2(x))) x = x.view(batch_size, -1) # Reshape tensor for fully connected layers. x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x ``` 此部分展示了带有空间dropout的应用实例,适用于二维特征映射的情况,例如来自卷积操作的结果。 ### TensorFlow/Keras 中实现 Dropout 层 同样地,在 TensorFlow 和 Keras API 下面也有类似的机制用于添加 dropout 正则项到模型架构之中: ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D def create_model(): model = Sequential([ Conv2D(filters=32, kernel_size=(3, 3), padding='same', activation='relu', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), Dropout(rate=0.25), Flatten(), Dense(units=128, activation='relu'), Dropout(rate=0.5), Dense(units=10, activation='softmax') ]) optimizer = 'adam' loss_function = 'sparse_categorical_crossentropy' model.compile(optimizer=optimizer, loss=loss_function, metrics=['accuracy']) return model tf_model = create_model() tf_model.summary() ``` 上述代码片段构建了一个小型卷积神经网络并包含了两次不同的 dropout 应用——一次是在最大池化之后,另一次是在第一个完全连通层之后。这有助于减少过度拟合的风险,特别是在训练大型复杂的深层网络时[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值