dropout 订阅
dropout是一个英语单词,名词,作名词时意为“中途退学;辍学学生”。 展开全文
dropout是一个英语单词,名词,作名词时意为“中途退学;辍学学生”。
信息
外文名
dropout
词    性
名词
dropout单词发音
英[ˈdrɒpaʊt]美[ˈdrɑːpaʊt] [1] 
收起全文
精华内容
下载资源
问答
  • 主要介绍了Tensorflow中的dropout的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Dropout

    2020-07-05 22:50:14
    Dropout: A Simple Way to Prevent Neural Networks from Over tting 1. Introduction 深层神经网络包含多个非线性隐藏层,这使得它们具有很强的表达能力,能够学习输入和输出之间非常复杂的关系。然而,在有限的...

    Dropout: A Simple Way to Prevent Neural Networks from Over tting

    1. Introduction

    深层神经网络包含多个非线性隐藏层,这使得它们具有很强的表达能力,能够学习输入和输出之间非常复杂的关系然而,在训练数据有限的情况下,这些复杂的关系很多都会是抽样噪声的结果,所以它们会存在于训练集中,但在真实的测试数据中却不存在,即使它是从同一个分布中抽取的。这导致了过拟合,许多方法已经被发明出来减少过拟合的影响。这些措施包括在验证集的性能开始恶化时立即停止训练,引入各种类型的权重惩罚,如L1和L2正则化和soft weight sharing(Nowlan和Hinton,1992)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVFRNDYK-1593960270394)(001.jpg)]

    模型组合总是能提高机器学习方法的性能。然而,对于大型神经网络,对许多单独训练的网络的输出进行平均的想法明显是非常昂贵的。当单个模型彼此不同时,组合多个模型是最有帮助的,为了使神经网络模型不同,它们要么具有不同的体系结构,要么接受不同数据的训练。 训练许多不同的体系结构是很困难的,因为为每个体系结构找到最优的超参数是一项艰巨的任务,训练每个大型网络需要大量的计算。此外,大型网络通常需要大量的训练数据,而且可能没有足够的数据可用来训练不同网络上不同子集的数据。即使能够训练许多不同的大型网络,在需要快速响应的应用程序中,在测试时使用它们也是不可行的。

    Dropout是一种解决这两个问题的技术。它防止了过拟合,并提供了一种有效地近似指数组合多种不同神经网络结构的方法。术语“dropout”是指丢弃一个神经网络中(隐藏和可见)的神经元。通过dropping一个单元,我们的意思是暂时将它以及它的所有输入和输出连接从网络中删除,如图1所示。选择要删除的单元是随机的。在最简单的情况下,每一个单元都以固定的概率p保留,其中p可以使用验证集来选择,也可以简单地设置为0.5,这对于广泛的网络和任务来说似乎接近最优。然而,对于输入单位,最优保留概率通常接近1而不是0.5。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Xgcl4MI-1593960270397)(002.jpg)]

    图2:左:训练时的一个单位,它以概率p表示,并用权重w连接到下一层的单位。右:在测试时,该单位始终存在,权重乘以p。测试时的输出与训练时的预期输出相同。

    将dropout应用于神经网络相当于从中抽取一个“细化”的网络。细化后的网络由所有从dropout中幸存下来的单元组成(图1b)。一个具有n个单位的神经网络,可以看作是 2 n 2^n 2n个可能的稀疏神经网络的集合。

    这些网络都共享权重,因此参数总数仍然是 O ( n 2 ) O(n^2) O(n2)。因此,训练一个dropout的神经网络可以看作是训练一组 2 n 2^n 2n个具有广泛权重共享的细化网络。

    在测试时,不可能显式地平均来自指数级的许多细化模型的预测。然而,一个非常简单的近似平均方法在实践中效果良好。这个想法是在测试时使用一个单一的没有dropout的神经网络。如果在训练期间以概率p保留一个单元,则该单元的输出权重在测试时乘以p,如图2所示。通过这种缩放, 2 n 2^n 2n个具有共享权重的网络可以组合成一个单独的神经网络,在测试时使用。我们发现,与其他正则化方法相比,训练一个有dropout的网络,并在测试时使用这种近似平均方法,可以显著降低在各种分类问题上的泛化误差。

    dropout并不局限于前馈神经网络。它可以更广泛地应用于图形模型,如Boltzmann机器。本文介绍了dropout受限Boltzmann机器模型,并将其与标准受限Boltzmann机器(RBM)进行了比较。实验结果表明,退学红细胞在某些方面优于标准RBMs。

    2. Motivation

    dropout的动机来自性别在进化中的作用理论(Livnat等人,2010)。有性生殖是指将父母一方的一半基因和另一方的一半基因,加上极少量的随机突变,并结合起来产生后代。无性繁殖的另一种选择是用父母基因的稍有变异的拷贝创造后代。无性繁殖应该是优化个体适应度的更好方法,这似乎是合理的,因为一组良好的基因可以直接遗传给后代。另一方面,有性生殖可能会破坏这些共同适应的基因集,特别是如果这些基因集很大,直觉上,这会降低已经进化出复杂共同适应的有机体的适应度。然而,有性生殖是最先进的有机体进化的方式。

    对有性生殖优越性的一种可能解释是,从长期来看,自然选择的标准可能不是个体适应,而是基因的混合能力。一组基因能够与另一组随机基因很好地协同工作,这使得它们更加健壮。因为一个基因不能依赖于一大群伴侣的存在,所以它必须学会自己做一些有用的事情,或者与少数其他基因合作。根据这一理论,有性生殖的作用不仅是允许有用的新基因在整个种群中传播,而且还通过减少复杂的共适应来促进这一过程,这种共适应会减少新基因改善个体适应能力的机会。类似地,神经网络中的每个隐藏单元都必须学习如何处理随机选择的其他单元样本。这将使每个隐藏单元更加健壮,并促使它自己创建有用的特性,而不依赖其他隐藏单元来纠正错误。然而,一个层中隐藏的单元仍然会学会做不同的事情。

    3. Related Work

    Dropout可以解释为一种通过在神经网络的隐藏单元中加入噪声来调整神经网络的方法。Vincent等人(2008,2010)在自动编码器的输入单元中添加噪声,并训练网络以重构无噪声输入。 我们的工作扩展了这一概念,表明Dropout可以有效地应用于隐藏层,也可以解释为一种形式的模型平均。我们还证明了加噪不仅对无监督特征学习有用,而且可以推广到有监督学习问题。实际上,我们的方法可以应用到其他基于神经元的体系结构中,例如Boltzmann机。虽然5%的噪声通常对DAE最有效,但我们发现,在测试时应用的权重缩放过程使我们能够使用更高的噪声级别。剔除20%的输入单元和50%的隐藏单元通常被认为是最优的

    4. Model Description

    本节介绍了Dropout神经网络模型。考虑一个具有L个隐藏层的神经网络。让 l ∈ { 1 , . . . , L } l\in\{1,...,L\} l{1,...,L}为网络隐藏层的索引。让 z ( l ) z^{(l)} z(l)代表第 l 层的输入向量。 y ( l ) y^{(l)} y(l)为第 l 层的输出向量( y ( 0 ) = x y^{(0)}=x y(0)=x为输入)。 W ( l ) , b ( l ) W^{(l)},b^{(l)} W(l),b(l) 是第 l 层的权重和偏置值。一个标准神经网络的前馈操作(图3a)可以描述为(for l ∈ { 0 , . . . , L − 1 } l\in\{0,...,L-1\} l{0,...,L1})。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zM5P28gx-1593960270398)(004.jpg)]

    f f f 代表任意激活函数,例如, f ( x ) = 1 / 1 ( 1 + e x p ( − x ) ) . f(x)=1/1(1+exp(-x)). f(x)=1/1(1+exp(x)).

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqqolAmA-1593960270399)(003.jpg)]

    有了dropout,前馈操作就变成了(图3b)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Df61Zq7S-1593960270400)(005.jpg)]

    这里*代表element-wise product。对任意层 l l l r ( l ) r^{(l)} r(l) 是独立Bernoulli分布的随机变量的向量,每个随机变量为1的概率是p

    该向量被采样并与该层的输出 y ( l ) y^{(l)} y(l)相乘,以创建thinned outputs y ~ ( l ) \widetilde{y}^{(l)} y (l)。稀释后的输出被用作下一层的输入。这个过程应用于每一层。这相当于从一个更大的网络中抽样一个子网络。为了学习,损失函数的导数通过子网络反向传播。如图2所示,在测试时,权重按比例缩放 W t e s t ( l ) = p W ( l ) W^{(l)}_{test}=pW^{(l)} Wtest(l)=pW(l)。得到的神经网络没有使用dropout。

    5. Learning Dropout Nets

    5.1 Backpropagation

    dropout神经网络可以用类似于标准神经网络的随机梯度下降来训练。唯一的区别是,对于一个小批量的每个训练样本,我们都通过dropping out单元来抽样一个精简的网络。该训练样本的前向和后向传播仅在该细化网络上完成。许多方法被用来改善随机梯度下降,如动量、退火学习率和L2权值衰减。这些被发现对dropout神经网络也很有用。

    发现有一种特殊的正则化形式对dropout约束特别有用,在每个隐藏单元处传入的权重向量的范数的上界被固定为常数c。换句话说,如果w表示任何隐藏单元上的权向量,则在约束条件
    ∥ w ∥ 2 ≤ c \parallel w\parallel_2\le c w2c 下对神经网络进行优化。这个约束是在优化过程中通过将w投影到一个半径为c的球的表面。这也被称为最大范数正则化,因为它意味着任何权重的范数可以取的最大值是c。常数c是一个可调超参数,它是使用验证集确定的。最大范数正则化以前曾用于协同过滤(Srebro和Shraibman,2005)。即使在不使用dropout的情况下,它也能显著地提高深神经网络的随机梯度下降训练性能。

    尽管dropout本身带来了显著的改善,但与最大范数正则化、大衰减学习率和高动量比一起使用比单独使用dropout提供了更显著的推动。一个可能的理由是,将权重向量限制在一个固定半径的球内,使得使用一个巨大的学习率成为可能,而不会出现权重爆炸的情况。然后,dropout提供的噪声允许优化过程探索权重空间中原本很难到达的不同区域。随着学习率的下降,优化的步骤越来越短,因此所做的探索也越来越少,并最终达到最小值。

    6.5 Comparison with Standard Regularizers

    为了防止神经网络的过度拟合,提出了几种正则化方法。其中包括L2权重衰减(更普遍的是Tikhonov正则化(Tikhonov,1943))、lasso(Tibshirani,1996)、KL稀疏性和最大范数正则化。dropout可以看作是神经网络正规化的另一种方式。在本节中,我们将使用MNIST数据集将dropout与这些正则化方法中的一些进行比较。

    用随机梯度下降法训练具有ReLUs的同一网络结构(784-1024-1024-2048-10)。结果如表9所示。利用验证集得到了与各种正则化相关的不同超参数(衰减常数、目标稀疏性、退出率、最大范数上界)的值。我们发现,与最大范数正则化相结合的dropout给出了最小的泛化误差。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwu5B8GH-1593960270401)(006.jpg)]

    7. Salient Features

    7.1 Effect on Features

    在一个标准的神经网络中,每一个参数所接收到的导数告诉它应该如何变化,以便在所有其他单元都在做的情况下减少最终损失函数。因此,单元的变化可能会修正其他单元的错误。这可能导致复杂的协同适应。 这反过来又会导致过度拟合,因为这些共同适应并没有泛化到看不见的数据。我们假设,对于每个隐藏单元,dropout通过使其他隐藏单元的存在不可靠来防止协同适应,因此,隐藏单元不能依赖其他特定单元来纠正错误。它必须在其他隐藏单元提供的各种不同上下文中表现良好。为了直接观察这一效果,我们研究了一级特征,这些特征是由在有或没有dropout的视觉任务上训练的神经网络学习的。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIQ0iv95-1593960270402)(007.jpg)]

    图7a显示了由MNIST上的自动编码器学习到的特性,该编码器具有256个校正线性单元的单个隐藏层,且没有丢失。图7b显示了由相同的自动编码器学习的特性,该编码器使用p=0.5的隐藏层中的dropout

    两个自动编码器都有相似的测试重建错误。然而,很明显,图7a中所示的特征已经共同适应以产生良好的重构。每一个隐藏的单元本身似乎并没有检测到有意义的特征。另一方面,在图7b中,隐藏单元似乎在图像的不同部分检测边缘、笔划和斑点。这表明辍学确实会破坏共适应,这可能是它导致较低的泛化误差的主要原因。

    7.2 Effect on Sparsity

    **我们发现作为dropout的副作用,隐藏单元的激活变得稀疏,即使不存在诱导稀疏的正则化。因此,dropout自动导致稀疏表示。**为了观察这一效果,我们选取在前一节中训练过的自动编码器,观察从测试集中随机抽取的小批量上隐藏单元激活的稀疏性。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L797FFyY-1593960270403)(008.jpg)]

    图8:dropout对稀疏性的影响。两个模型都使用了ReLUs。左:平均激活直方图显示,大多数单位的平均激活率约为2.0。激活的柱状图显示了一个远离零的巨大模式。很明显,有很大一部分单元具有高活性。右图:平均激活率直方图显示,大多数单位的平均激活率较小,约为0.7。激活的直方图显示在0处有一个尖锐的峰值。很少有单位有高激活率。

    我们发现作为dropout的副作用,隐藏单元的激活变得稀疏,即使不存在诱导稀疏的正则化。因此,dropout自动导致稀疏表示。为了观察这一效果,我们选取在前一节中训练过的自动编码器,观察从测试集中随机抽取的小批量上隐藏单元激活的稀疏性。图8a和图8b比较了两种模型的稀疏性。在一个好的稀疏模型中,对于任何数据情况,应该只有几个高度激活的单元。此外,数据案例中任何单元的平均激活率都应该很低。为了评估这两个特性,我们为每个模型绘制了两个直方图。对于每个模型,左边的直方图显示了整个小批量中隐藏单元的平均激活率分布。右边的直方图显示了隐藏单元激活的分布。

    通过比较激活的直方图,我们可以看到,与图8a相比,图8b中具有高激活的隐藏单元更少,这可以从不使用dropout的网络远离零的显著质量中看出。dropout网络的平均激活率也较小。对于自动编码器而言,在没有dropout时,隐藏单元的总体平均激活率接近2.0,但使用dropout时,则降至0.7左右。

    7.4 Effect of Data Set Size

    对一个好的正则化器的一个测试是,它应该使在小数据集上训练大量参数的模型能够获得好的泛化误差。本节探讨在前馈网络中使用dropout时更改数据集大小的效果。用标准方法训练的大型神经网络在小数据集上过拟合。为了看dropout是否有帮助,我们在MNIST上进行分类实验,并改变网络的数据量。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBjrH1sw-1593960270404)(009.jpg)]

    这些实验的结果如图10所示。从MNIST训练集中随机选择100、500、1K、5K、10K和50K大小的数据集。所有数据集使用相同的网络体系结构(784-1024-1024-2048-10)。在所有隐藏层执行p=0.5的dropout,在输入层执行p=0.8的dropout。可以观察到,对于非常小的数据集(100500),该模型并没有任何改进,它有足够的参数可以对训练数据进行过度拟合,即使所有的噪声都来自于dropout。随着数据集大小的增加,从dropout中获得的收益增加到一个点,然后下降。这表明,对于任何给定的体系结构和dropout率,都有一个“最佳点”,对应于一些数据量,尽管存在噪音,但这些数据量足够大,无法记忆,但不会太大,因此无论如何,过度拟合都不是问题。

    预计dropping单元将降低神经网络的容量。如果n是任何层中隐藏单元的数目,p是保留一个单元的概率,那么在期望的情况下,在dropout后,将只出现pn个单元,而不是n个隐藏单元,而且这组pn单元每次都不同,并且不允许单元自由地建立协适应(build co-adaptations freely)。因此,如果一个n大小的层对于一个标准的神经网络在任何给定的任务上都是最优的,那么一个好的退出网络应该至少有n/p单位。我们发现这对于在卷积网络和全连接网络中设置隐藏单元的数量是一个有用的启发。

    A.2 Learning Rate and Momentum

    与标准随机梯度下降相比,dropout在梯度中引入了大量噪声。因此,许多梯度往往相互抵消。为了弥补这一点,dropout网络通常应该使用标准神经网络最佳学习率的10-100倍。另一种降低噪声影响的方法是使用高动量。虽然动量值为0.9对于标准网络来说是很常见的,但是我们发现0.95到0.99之间的值工作得更好。使用高学习率和/或动力显著加快学习速度。

    A.3 Max-norm Regularization

    虽然大动量和学习速率加快了学习速度,但它们有时会导致网络权值变得非常大。为了防止这种情况,我们可以使用最大范数正则化,这将每个隐藏单元的传入权重向量的范数约束为常数c。c的典型值范围为3到4。

    A.4 Dropout Rate

    ularization

    虽然大动量和学习速率加快了学习速度,但它们有时会导致网络权值变得非常大。为了防止这种情况,我们可以使用最大范数正则化,这将每个隐藏单元的传入权重向量的范数约束为常数c。c的典型值范围为3到4。

    A.4 Dropout Rate

    dropout引入了一个额外的超参数,即保持单位p的概率。这个超参数控制dropout的强度。p=1,表示无dropout,p值低表示dropout较多。隐藏单元的典型p值在0.5到0.8之间。对于输入层,选择取决于输入类型。对于实值输入(图像块或语音帧),典型值为0.8。对于隐藏层,p的选择与隐藏单元数n的选择相结合。较小的p需要较大的n,这会减慢训练速度并导致欠拟合。大p可能不会产生足够的dropout以防止过拟合。

    展开全文
  • 其中Dropout这个坑,我记忆犹新。 一开始,我以为预测时要保持和训练时完全一样的网络结构,也就是预测时用的网络也是有丢弃的网络节点,但是这样想就掉进了一个大坑!因为无法通过已经训练好的模型,来获取其训练时...
  • 引入的“ BPE-Dropout”算法的正式实现 介绍 该存储库包含原始论文中使用的BPE-Dropout算法的参考实现。 该存储库不包含用于构建BPE合并表的代码,为简单起见,它依赖于外部BPE合并表。 请注意,在执行子词分段的几...
  •  随着电池供电设备和手持设备的发展,Low-Dropout(LDO)调节器得到了广泛应用, 其具有很多优点:  1. 应用方便,外部器件只需要两个电容;  2. PNP型和P-MOSFET型主功率管能使输入电压与输出电压之间的压差很...
  • 三种类型的层: - C:卷积层(矩阵图) - MP:最大池化层(矩阵图) - F:全连接层(向量图) - O:输出层 卷积层: - 比例:比例(补丁大小) - 输出地图数量:outputMap - 共享权重:k - 偏差:b ...
  • MLlib - 带有 Dropout 的逻辑回归 这是 Spark MLlib 的扩展,使用 dropout 正则化实现逻辑回归。 Dropout 正则化通常比 L2 正则化效果更好,因为它强调在分类过程中很少出现但具有判别力的特征的贡献 [2]。 这使得...
  • dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃,本代码在minist数据集实现。
  • 数据集fashion_mnist import matplotlib.pyplot as plt from tensorflow import keras import tensorflow as tf import matplotlib as mpl import pandas as pd import numpy as np import sklearn ...
  • Dropout动态图

    2020-10-29 11:10:33
    利用动态图更好的理解Dropout动态图
  • dropout

    2020-03-08 15:48:42
    dropout L1,L2正则化 earlystop 提早结束 使用BatchNormalization 一、dropout 1、定义 在每个训练批次中,随机丢弃一些神经元(注意是暂时丢弃),使其在前向传播的时候不起作用,在反向传播时不更新参数。再下一...

    有效防止过拟合的方法:

    1. dropout
    2. L1,L2正则化
    3. earlystop 提早结束
    4. 使用BatchNormalization

    一、dropout

    1、定义
    在每个训练批次中,随机丢弃一些神经元(注意是暂时丢弃),使其在前向传播的时候不起作用,在反向传播时不更新参数。再下一个训练批次中,恢复这些神经元,重复此过程。
    2、使用位置
    一般用在全连接层,卷积层是稀疏连接,一般参数比较少一些,但是也有人用在卷积层,一般取0.3~0.5
    3、为什么可以防止过拟合
    (1)减弱了神经元之间的依赖性
    (2)相当于每次训练了一个新的模型,有bagging集成的思想,相当于将训练的几个模型取平均。

    注意:
    dropout会使模型的训练时间变长,因为相当于训练多个模型
    详细解读

    二、L1,L2正则

    正则化在机器学习中用来减小模型复杂度,防止过拟合
    最基本的正则化方式是在损失函数中加入惩罚项,对复杂度高的。模型进行惩罚。
    (一)L1,L2解决过拟合的思路:
    (1)实现参数的稀疏性(L1)
    一个好处是可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据就很差。另一个好处是参数变少可以使整个模型获得更好的可解释性
    (2)减少参数的大小(L2)
    参数越小说明模型越简单。因为:越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大
    在这里插入图片描述
    (2)L1正则化
    L1又叫稀疏算子,L1正则化是在损失函数后加上所有参数绝对值的和,之所以可以防止过拟合。模型复杂,参数过多,参数比较大,导致过拟合。
    参数值大小和模型复杂度是成正比的。因此复杂的模型,其L1范数就大,最终导致损失函数就大,说明这个模型就不够好。loss比较低,就意味着模型比较简单。
    (3)L2正则化
    L2又叫权重衰减,L2范数是各参数的平方和再求平方根,我们让L2范数的正则项最小,可以使W的每个元素都很小,都接近于0。但与L1范数不一样的是,它不会是每个元素为0,而只是接近于0。越小的参数说明模型越简单,越简单的模型越不容易产生过拟合现象。
    (4) 区别
    L1正则化是实现网络的稀疏,简化网络模型,提高可解释性,使参数绝对值之和最小。
    L2 正则化是权重衰减,简化模型,防止过拟合,使参数平和和最小。
    总结一下L1与L2范数:
    L1范数:L1范数在正则化的过程中会趋向于产生少量的特征,而其他的特征都是0(L1会使得参数矩阵变得稀疏)。因此L1不仅可以起到正则化的作用,还可以起到特征选择的作用。
    L2范数:L2范数是通过使权重衰减,进而使得特征对于总体的影响减小而起到防止过拟合的作用的。L2的优点在于(1)求解快速,下降比较快;(2)对大的异常值比较敏感,比较稳定
    L2的优点在于(1)求解快速,下降比较快;(2)对大的异常值比较敏

    三、earlystop

    比如在keras中,通过监测val_loss不再下降,通过回调函数callback提前结束训练

    keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
    

    参数
    monitor:需要监视的量

    patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。

    verbose:信息展示模式

    mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。

    展开全文
  • 针对机器学习中训练样本和测试样本概率分布不一致的问题,提出了一种基于dropout正则化的半监督域自适应方法来实现将神经网络的特征表示从标签丰富的源域转移到无标签的目标域。此方法从半监督学习的角度出发,在源...
  • PyTorch 中的 dropout Dropout2d Dropout3d

    千次阅读 2021-04-27 16:44:19
    文章目录PyTorch 中的 dropout1. [Pytoch 说明文档官网 PyTorch documentation 链接](https://pytorch.org/docs/stable/index.html)1.1. `torch.nn` 中的 `dropout`1.1. `torch.nn` 和 `torch.nn.functional` 中的 `...

    PyTorch 中的 dropout

    1. Pytoch 说明文档官网 PyTorch documentation 链接

    1.1. torch.nn 中的 dropout

    1.1.1. torch.nn.Dropout (Python class, in Dropout)

    将输入的每个数值按(伯努利分布)概率赋值为0。即部分数值赋值为0。

    import torch 
    import torch.nn as nn
    import torch.nn.functional as F
    
    def run1nn():
    	input_ = torch.randn(4, 2)
    	m = nn.Dropout(p=0.5)
    	# m = nn.AlphaDropout(p=0.5)
    	output = m(input_)
    	print("input_ = \n", input_)
    	print("output = \n", output)
    

    输出如下(部分数值赋值为0):

    input_ = 
     tensor([[-1.1293, -1.2553],
            [-0.7586,  0.3034],
            [ 1.6672, -0.6755],
            [-1.8980,  1.1677]])
    output =  # 部分数值赋值为0。 
     tensor([[-0.0000, -0.0000],
            [-1.5172,  0.6068],
            [ 0.0000, -0.0000], 
            [-3.7961,  0.0000]])
    

    1.1.2. torch.nn.AlphaDropout (Python class, in AlphaDropout)

    当输入数据满足均值为 0 的正太分布时,在将部分数值按(伯努利分布)概率赋值为0的同时,保持输出数据的概率分布与输入数据的概率分一致。即先将部分数值赋值为0,再调整所有数值的值来保证分布不变。

    def run1nn():
    	input_ = torch.randn(4, 2)
    	# m = nn.Dropout(p=0.5)
    	m = nn.AlphaDropout(p=0.5)
    	output = m(input_)
    	print("input_ = \n", input_)
    	print("output = \n", output)
    

    输出如下(先将部分数值赋值为0,再调整所有数值的值来保证分布不变):

    input_ = 
     tensor([[-3.1806,  0.2888],
            [ 0.1620, -0.0531],
            [ 0.2369,  1.2116],
            [-0.7322,  0.5835]])
    output =  # 先将部分数值赋值为0,再调整所有数值的值来保证分布不变。
     tensor([[-0.7792,  1.0352],  
            [ 0.9227, -0.7792],
            [-0.7792, -0.7792],
            [-0.7792, -0.7792]])
    

    1.1.3. torch.nn.Dropout2d (Python class, in Dropout2d)

    Dropout2d 的赋值对象是彩色的图像数据(batch N,通道 C,高度 H,宽 W)的一个通道里的每一个数据,即输入为 Input: (N, C, H, W) 时,对每一个通道维度 C 按概率赋值为 0。

    def run_2d():
    	input_ = torch.randn(2, 3, 2, 4)
    	m = nn.Dropout2d(p=0.5, inplace=False)
    	output = m(input_)
    	print("input_ = \n", input_)
    	print("output = \n", output)
    

    输出结果如下(对每一个通道维度 C 按概率赋值为 0。):

    input_ = 
     tensor([[[[ 0.4218, -0.6617,  1.0745,  1.2412],
              [ 0.2484,  0.6037,  0.3462, -0.4551]],
    
             [[-0.9153,  0.8769, -0.7610, -0.7405],
              [ 0.1170, -0.8503, -1.0089, -0.5192]],
    
             [[-0.6971, -0.9892,  0.1342,  0.1211],
              [-0.3756,  1.9225, -1.0594,  0.1419]]],
    
    
            [[[-1.2856, -0.3241,  0.2331, -1.5565],
              [ 0.6961,  1.0746, -0.9719,  0.5585]],
    
             [[-0.1059, -0.7259, -0.4028,  0.1968],
              [ 0.8201, -0.0833, -1.2811,  0.1915]],
    
             [[-0.2207,  0.3850,  1.4132,  0.8216],
              [-0.1313,  0.2915,  0.1996,  0.0021]]]])
    output = 
     tensor([[[[ 0.8436, -1.3234,  2.1489,  2.4825],
              [ 0.4968,  1.2073,  0.6924, -0.9101]],
    
             [[-1.8305,  1.7537, -1.5219, -1.4810],
              [ 0.2340, -1.7006, -2.0178, -1.0385]],
    
             [[-0.0000, -0.0000,  0.0000,  0.0000],
              [-0.0000,  0.0000, -0.0000,  0.0000]]],
    
    
            [[[-0.0000, -0.0000,  0.0000, -0.0000],
              [ 0.0000,  0.0000, -0.0000,  0.0000]],
    
             [[-0.2118, -1.4518, -0.8056,  0.3935],
              [ 1.6401, -0.1667, -2.5622,  0.3830]],
    
             [[-0.0000,  0.0000,  0.0000,  0.0000],
              [-0.0000,  0.0000,  0.0000,  0.0000]]]])
    

    1.1.4. torch.nn.Dropout3d (Python class, in Dropout3d)

    Dropout2d 的赋值对象是彩色的点云数据(batch N,通道 C,深度 D,高度 H,宽 W)的一个通道里的每一个数据,即输入为 Input: (N, C, D, H, W) 时,对每一个通道维度 C 按概率赋值为 0。。

    Dropout3dDropout2d 的效果相似,都是对通道维度上按概率将整个通道中的所有数值赋值为 0。

    def run_3d():
    	input_ = torch.randn(2, 2, 2, 4)
    	m = nn.Dropout3d(p=0.1, inplace=False)
    	output = m(input_)
    	# print("input_ = \n", input_)
    	print("output = \n", output)
    

    输出结果如下:

    output = 
     tensor([[[[ 1.1761,  1.1794,  0.1044, -2.9451],
              [-1.0795,  0.1167,  0.8323,  0.0750]],
    
             [[ 0.0000, -0.0000,  0.0000, -0.0000],
              [-0.0000,  0.0000,  0.0000, -0.0000]]],
    
    
            [[[-1.8938, -1.9509,  2.2817,  2.7738],
              [-0.0378,  3.2422, -1.0612, -0.7103]],
    
             [[ 0.0319, -1.9631, -0.5589, -0.5544],
              [ 0.0643,  0.5834,  1.8123,  0.2383]]]])
    

    1.2. torch.nntorch.nn.functional 中的 dropout 功能相同。

    1. torch.nn.functional.dropout (Python function, in torch.nn.functional)
    2. torch.nn.functional.alpha_dropout (Python function, in torch.nn.functional)
    3. torch.nn.functional.dropout2d (Python function, in torch.nn.functional)
    4. torch.nn.functional.dropout3d (Python function, in torch.nn.functional)
    5. torch.nn.functional.feature_alpha_dropout (Python function, in torch.nn.functional)

    2. [知乎:PyTorch 中,nn 与 nn.functional 有什么区别?] (https://www.zhihu.com/question/66782101)

    详细区别见上面的知乎链接,这里用一个简单的例子说明:

    • nn 里的 nn.dropout() 是类(先传参实例化,后传入数据使用),
    • nn.functional 里的 nn.functional.dropout() 是函数(直接传入数据使用)。

    下面是两种 dropout 的使用方法,具体使用区别见知乎:https://www.zhihu.com/question/66782101

    import torch 
    import torch.nn as nn
    import torch.nn.functional as F
    
    def run1nn():
    	input_ = torch.randn(2, 3)
    	m = nn.Dropout(p=0.5)
    	output = m(input_)
    	print("input_ = \n", input_)
    	print("output = \n", output)
    
    def run2F():
    	input_ = torch.randn(2, 3)
    	output = F.dropout(input_, p=0.5)
    	print("input_ = \n", input_)
    	print("output = \n", output)
    
    if __name__ == "__main__":
    	run1nn()
    	run2F()
    

    3. 完结,以下为空白或无用内容。

    展开全文
  • Dropout:A Simple Way to Prevent Neural Networks from Overfitting.zip
  • python main.py --lr=.1 --lr_dropout_rate=0.5 原始代码来自回购。 它使用记录指标。 此实现不添加标准辍学。 初步结果 香草方法来自pytorch-cifar :SGD的lr=.1, momentum=.9, weight_decay=5e-4, batch_size=128...
  • 基于matlab的神经网络dropout层基于matlab的神经网络dropout
  • 深度学习中Dropout原理解析

    万次阅读 多人点赞 2018-06-19 19:12:24
    1. Dropout简介1.1 Dropout出现的原因在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在...

    “微信公众号”

    1. Dropout简介

    1.1 Dropout出现的原因

    在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。

    过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。此时,训练模型费时就成为一个很大的问题,不仅训练多个模型费时,测试多个模型也是很费时。

    综上所述,训练深度神经网络的时候,总是会遇到两大缺点:

    (1)容易过拟合

    (2)费时

    Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

    1.2 什么是Dropout

    在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

    在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合。并且,这篇论文提到的AlexNet网络模型引爆了神经网络应用热潮,并赢得了2012年图像识别大赛冠军,使得CNN成为图像分类上的核心算法模型。

    随后,又有一些关于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。

    从上面的论文中,我们能感受到Dropout在深度学习中的重要性。那么,到底什么是Dropout呢?

    Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

    Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如图1所示。


    图1:使用Dropout的神经网络模型

    2. Dropout工作流程及使用

    2.1 Dropout具体工作流程

    假设我们要训练这样一个神经网络,如图2所示。

    图2:标准的神经网络

    输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:

    (1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元)

                                                                                       图3:部分临时被删除的神经元

    (2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。

    (3)然后继续重复这一过程:

    • . 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
    • . 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
    • . 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。

    不断重复这一过程。

    2.2 Dropout在神经网络中的使用

    Dropout的具体工作流程上面已经详细的介绍过了,但是具体怎么让某些神经元以一定的概率停止工作(就是被删除掉)?代码层面如何实现呢?

    下面,我们具体讲解一下Dropout代码层面的一些公式推导及代码实现思路。

    (1)在训练模型阶段

    无可避免的,在训练网络的每个单元都要添加一道概率流程。

    图4:标准网络和带有Dropout网络的比较

    对应的公式变化如下:

    •  . 没有Dropout的网络计算公式:
    •            
    • . 采用Dropout的网络计算公式:

    • 上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量。

      代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、......、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。

      注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。

      (2)在测试模型阶段

      预测模型的时候,每一个神经单元的权重参数要乘以概率p。

    • 图5:预测模型时Dropout的操作
    • 测试阶段Dropout公式:

    3. 为什么说Dropout可以解决过拟合?

    (1)取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

    (2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

    (3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

    4. Dropout在Keras中的源码分析

    下面,我们来分析Keras中Dropout实现源码。

    Keras开源项目GitHub地址为:

    https://github.com/fchollet/keras/tree/master/keras

    其中Dropout函数代码实现所在的文件地址:

    https://github.com/fchollet/keras/blob/master/keras/backend/theano_backend.py

    Dropout实现函数如下:

    图6:Keras中实现Dropout功能

    我们对keras中Dropout实现函数做一些修改,让dropout函数可以单独运行。

    # coding:utf-8
    import numpy as np
    
    # dropout函数的实现
    def dropout(x, level):
        if level < 0. or level >= 1: #level是概率值,必须在0~1之间
            raise ValueError('Dropout level must be in interval [0, 1[.')
        retain_prob = 1. - level
    
        # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
        # 硬币 正面的概率为p,n表示每个神经元试验的次数
        # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
        random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
        print(random_tensor)
    
        x *= random_tensor
        print(x)
        x /= retain_prob
    
        return x
    
    #对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果  
    x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
    dropout(x,0.4)

    函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。

    注意: Keras中Dropout的实现,是屏蔽掉某些神经元,使其激活值为0以后,对激活值向量x1……x1000进行放大,也就是乘以1/(1-p)。

    思考:上面我们介绍了两种方法进行Dropout的缩放,那么Dropout为什么需要进行缩放呢?

    因为我们训练的时候会随机的丢弃一些神经元,但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个p,这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有p的概率参与训练,(1-p)的概率丢弃,那么它输出的期望是px+(1-p)0=px。因此测试的时候把这个神经元的权重乘以p可以得到同样的期望。

    总结:

    当前Dropout被大量利用于全连接网络,而且一般认为设置为0.5或者0.3,而在卷积网络隐藏层中由于卷积自身的稀疏化以及稀疏化的ReLu函数的大量使用等原因,Dropout策略在卷积网络隐藏层中使用较少。总体而言,Dropout是一个超参,需要根据具体的网络、具体的应用领域进行尝试。


    Reference:


    1. Hinton G E, Srivastava N, Krizhevsky A, et al. Improving neural networks by preventing co-adaptation of feature detectors[J]. arXiv preprint arXiv:1207.0580, 2012.

    2. Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

    3. Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfitting[J]. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958.

    4. Srivastava N. Improving neural networks with dropout[J]. University of Toronto, 2013, 182.

    5. Bouthillier X, Konda K, Vincent P, et al. Dropout as data augmentation[J]. arXiv preprint arXiv:1506.08700, 2015.

    6. 深度学习(二十二)Dropout浅层理解与实现,地址:https://blog.csdn.net/hjimce/article/details/50413257

    7. 理解dropout,地址:https://blog.csdn.net/stdcoutzyx/article/details/49022443

    8. Dropout解决过拟合问题 - 晓雷的文章 - 知乎,地址:https://zhuanlan.zhihu.com/p/23178423

    9. 李理:卷积神经网络之Dropout,地址:https://blog.csdn.net/qunnie_yi/article/details/80128463

    10. Dropout原理,代码浅析,地址:https://blog.csdn.net/whiteinblue/article/details/37808623

    11. Deep learning:四十一(Dropout简单理解),地址:https://www.cnblogs.com/tornadomeet/p/3258122.html?_t_t_t=0.09445037946091872

    展开全文
  • matlab代码,不使用库函数。基于Dropout的手写体数字识别。
  • 贝叶斯神经网络 以下近似推理方法的Pytorch实现: 我们还提供以下代码: 先决条件 火炬 脾气暴躁的 Matplotlib 该项目是用python 2.7和Pytorch 1.0.1编写的。 如果CUDA可用,它将自动使用。 这些模型也不会太大,...
  • dropout2_kiank.mp4

    2020-10-29 11:12:05
    通过动态图更好的理解Dropout正则化

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,417
精华内容 31,366
关键字:

dropout