丢弃法(dropout)

本文介绍了丢弃法在神经网络中的应用,通过随机丢弃隐藏层神经元来防止过拟合,降低神经元间的共适应性,提高模型的泛化能力。同时,讨论了丢弃法与权重衰减的不同,并提供了手动实现丢弃法的代码步骤。丢弃法只在训练阶段使用,是避免过拟合的有效工具。

1 对于丢弃法的一点小思考

(1) 对于模型设计我们可以把隐藏层设计的稍微大一点然后用drop out控制隐藏层大小这样的设计可能比隐藏层设计的小一点的效果更好,防止过拟合,drop out 其实就是一个正则项。

(2) drop out 就是随机丢弃隐藏层神经元的个数从而防止参数过分依赖训练数据,增加参数对数据集的泛化能力

(3) Drop out可以减少神经元之间复杂的共适应关系,因为Dropout使得某两个神经元不一定每次都在一个子网络结构中出现。基于此权值的更新不在依赖于固定关系的隐含节点的共同作用,使得了在丢失某些特定信息的情况下依然可以从其它信息中学到一些模式(鲁棒性),迫使网络去学习更加鲁棒的特征(更加具有通适性)。

(4) drop out作用在隐藏层的输出可以再激活函数之前也可以在激活函数之后。drop out作用在全连接层而不是卷积层,丢弃前一层的输出丢弃后一层的输出。drop out 比起权重衰退(L2正则化来说)更容易调参

(5) 随机性高稳定性就会增加这怎么理解呢? 我理解的是随机性高了会弱化一些偶然事件的影响考虑的方面会增多防止过拟合。

(6) 丢弃法是在训练的时候丢弃一些神经元,在预测的时候没有丢弃神经元。

在这里插入图片描述

2 代码实现(手动)

(1) 生成dropout函数

import torch
from torch import nn
from d2l import torch as d2l


def dropout_layer(X, dropout):
    assert 0 <= dropout <= 1 #ssert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.也就是说dropout值必须在0-1之间
    # 在本情况中,所有元素都被丢弃。
    if dropout == 1:
        return torch.zeros_like(X)
        # 在本情况中,所有元素都被保留。
    if dropout == 
丢弃法深度学习模型中用于应对过拟合问题的一种方法,特指倒置丢弃法 [^1]。 在使用丢弃法时,以隐藏层为例,设输入为 \(x_1, \ldots, x_4\),隐藏单元 \(i\) 的权重参数为 \(w_{1i}, \ldots, w_{4i}\),偏差参数为 \(b_i\),激活函数为 \(\phi\)。当对该隐藏层使用丢弃法,该层的隐藏单元有一定概率被丢弃。设丢弃概率为 \(p\),随机变量 \(\xi_i\) 为 0 和 1 的概率分别为 \(p\) 和 \(1 - p\),那么有 \(p\) 的概率 \(h_i\) 会被清零,有 \(1 - p\) 的概率 \(h_i\) 会除以 \(1 - p\) 做拉伸,从而计算新的隐藏单元 \(h_i'\) [^2]。丢弃概率是丢弃法的超参数 [^2]。 在推理过程中,丢弃法直接返回输入 \(h = \text{dropout}(h)\),这样能保证确定性的输出。丢弃法常作用在多层感知机的隐藏层输出上,通过将一些输出项随机置为 0 来控制模型复杂度 [^3]。 ### 代码示例 ```python import torch import torch.nn as nn # 定义一个简单的多层感知机,包含丢弃层 class MLP(nn.Module): def __init__(self, input_size, hidden_size, output_size, dropout_prob): super(MLP, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.dropout = nn.Dropout(dropout_prob) self.fc2 = nn.Linear(hidden_size, output_size) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.fc1(x)) x = self.dropout(x) x = self.fc2(x) return x # 示例使用 input_size = 10 hidden_size = 20 output_size = 2 dropout_prob = 0.5 model = MLP(input_size, hidden_size, output_size, dropout_prob) input_tensor = torch.randn(1, input_size) output = model(input_tensor) print(output) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值