深度学习dropout相关知识补充

27 篇文章 8 订阅
20 篇文章 1 订阅


1.定义

对mlp的隐藏层增加噪音但不改变期望值,从而提高模型的泛化度,防止过拟合


2.原理

将施加了 dropout 的隐藏层的神经元分成两份,概率分别是第一份 p 和 第二份 1-p,第一份直接置为 0 降低期望,第二份统一除以 1-p 来提高期望,从而达到整体期望值不变的需求
在这里插入图片描述
也就是

E [ x i ′ ] = p ∗ 0 + ( 1 − p ) [ x i / ( 1 − p ) ] E[xi'] = p*0 + (1-p)[xi/(1-p)] E[xi]=p0+(1p)[xi/(1p)]

E [ x i ′ ] = x i E[xi'] = xi E[xi]=xi

约掉之后期望值不变,网络变成这个样子
在这里插入图片描述

3.实现方式

使用Pytorch的现成方法

from torch import nn

net = nn.Sequential(
    nn.Flatten(),
    nn.Linear(784, 256),
    nn.ReLU(),
    nn.Dropout(0.3),        # 丢弃3成
    nn.Linear(256, 128),
    nn.ReLU(),
    nn.Dropout(0.2),        # 丢弃2成
    nn.Linear(128, 10)
)

或者自己实现

import torch


def dropout(X, rate):
    assert 0 <= rate <= 1                           # 丢弃概率不在1-0之间直接抛异常
    if rate == 1:                                   # 丢弃概率为1时全部丢弃,返回与X同维度的全0张量
        return torch.zeros_like(X)
    elif rate == 0:                                 # 丢弃概率为0时全部保留,返回X
        return X
    else:                                           # 0<丢弃概率<1时,根据概率随机丢弃神经元并增加保留神经元的权重
        mask = (torch.rand(X.shape) > rate).float()
        return mask * X / (1.0 - rate)
        

if __name__ == '__main__':
    # 生成张量
    X = torch.rand(size=(3, 5))
    print(X)
    # tensor([[0.9695, 0.5501, 0.8937, 0.7924, 0.6007],
    #         [0.2121, 0.4906, 0.5322, 0.9305, 0.6586],
    #         [0.3558, 0.7379, 0.0585, 0.3683, 0.9134]])

    # 不丢弃神经元
    X_drop = dropout(X, 0)
    print(X_drop)
    # tensor([[0.9695, 0.5501, 0.8937, 0.7924, 0.6007],
    #         [0.2121, 0.4906, 0.5322, 0.9305, 0.6586],
    #         [0.3558, 0.7379, 0.0585, 0.3683, 0.9134]])
    
    # 丢弃6成神经元
    X_drop = dropout(X, 0.6)
    print(X_drop)
    # tensor([[0.0000, 1.3754, 0.0000, 0.0000, 1.5016],
    #         [0.5303, 0.0000, 0.0000, 0.0000, 0.0000],
    #         [0.0000, 1.8447, 0.1462, 0.9206, 0.0000]])

    # 丢弃全部神经元
    X_drop = dropout(X, 1)
    print(X_drop)
    # tensor([[0., 0., 0., 0., 0.],
    #         [0., 0., 0., 0., 0.],
    #         [0., 0., 0., 0., 0.]])

其中

mask = (torch.rand(X.shape) > rate).float()
return mask * X / (1.0 - rate)

这段代码的解释是

  1. 原张量
# tensor([[0.9695, 0.5501, 0.8937, 0.7924, 0.6007],
#         [0.2121, 0.4906, 0.5322, 0.9305, 0.6586],
#         [0.3558, 0.7379, 0.0585, 0.3683, 0.9134]])
  1. 经过 mask_tf = torch.rand(X.shape) > rate
# tensor([[ True, False,  True, False,  True],
#         [False, False, False,  True,  True],
#         [False, False,  True, False, False]])
  1. 再转为浮点 mask = mask_tf.float()
# tensor([[1., 0., 1., 0., 1.],
#         [0., 0., 0., 1., 1.],
#         [0., 0., 1., 0., 0.]])
  1. mask * X 做掩码
# tensor([[0.0000, 0.5501, 0.0000, 0.0000, 0.6007],
#         [0.2121, 0.0000, 0.0000, 0.0000, 0.0000],
#         [0.0000, 0.7379, 0.0585, 0.3683, 0.0000]])
  1. 除以(1.0 - rate) 增加权重
# tensor([[0.0000, 1.3754, 0.0000, 0.0000, 1.5016],
#         [0.5303, 0.0000, 0.0000, 0.0000, 0.0000],
#         [0.0000, 1.8447, 0.1462, 0.9206, 0.0000]])

4.注意事项

  1. dropout 是个正则项,只在训练时生效,在预测时权重不需要发生变化,因此不生效 h = d r o p o u t ( h ) h = dropout(h) h=dropout(h),可以保证预测获得确定性的输出
  2. 丢弃法将一些输出项随机置0来控制模型复杂度
  3. 常用在mlp隐藏层的输出上
  4. 丢弃概率是控制模型复杂度的超参数
  5. dropout 可以提高泛化度防止过拟合

灵魂拷问
Q:那么 dropout 给多少合适呢
A:见过老中医抓药么(狗头)

请添加图片描述

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
深度学习中的Dropout是一种正则化技术,旨在减少过拟合问题。在神经网络训练过程中,Dropout通过临时随机将一些神经元的输出设置为0,从而减少了神经元之间的依赖性,增加了网络的鲁棒性和泛化能力。 Dropout的原理很简单,每个神经元的输出在训练时以概率p被设置为0,以概率1-p被保留(p通常设置为0.5)。由于整个网络的结构会随机改变,每个神经元都要适应不同的子网络,因此网络具备了对神经元丢失的鲁棒性。这样的随机丢失使网络变得不那么过分依赖某个具体的神经元,更有助于学习到更加鲁棒和泛化性能更好的特征。当网络训练完毕后,没有dropout的所有神经元都会被恢复,但每个神经元的输出会乘以(1-p)来保持输出的期望值不变。 Dropout的作用是减轻过拟合。在深度学习中,模型复杂度通常很高,参数众多,很容易导致过拟合。过拟合指的是模型在训练数据上表现良好,但在测试数据上表现较差。通过使用Dropout,可以减少神经元之间的共适应性,并且强制网络学习不同的特征,从而减少过拟合。Dropout相当于在每次训练迭代中训练了一个不同的网络子集,这样可以减少对任何一个特定的特征都有强依赖的情况。 总结来说,Dropout是深度学习中一种有效的正则化技术,通过随机丢失神经元的输出,可以减少神经元之间的依赖性,增加网络的鲁棒性和泛化能力,从而减轻过拟合问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都干的派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值