Dropout的深入理解(基础介绍、模型描述、原理深入、代码实现以及变种) | 您所在的位置:网站首页 › 论文图解是什么 › Dropout的深入理解(基础介绍、模型描述、原理深入、代码实现以及变种) |
目录
前言一、DropOut简介1-1、DropOut论文图解1-2、DropOut介绍1-3、DropOut产生动机1-4、DropOut流程简介
二、模型描述2-1、公式描述2-2、神经网络图描述2-3、一些需要注意的问题!
三、Dropout代码实现以及相关变种(部分有实现)3-1、Dropout实现(Torch实现)3-2、Dropout实现(Numpy实现,训练集乘以1/(1-p),测试集不做变化)3-3、Dropout实现(Numpy实现,测试集变化)3-4、Dropout实现(复写一个类似于Pytorch中的Dropout)3-5、高斯Dropout3-6、DropConnect3-7、Standout
附录1、nn.Linear()详解总结
前言
深度神经网络包含多个非线性隐藏层,这使得它们有强大的表现力,可以学习输入和输出之间非常复杂的关系。但是在训练数据有限的情况下,深度神经网络很容易过度学习造成过拟合,过拟合是深度神经网络的一个非常严重的问题,此外,神经网络越大,训练速度越慢,Dropout可以通过在训练神经网络期间随机丢弃单元来防止过拟合,实验证明Dropout有很好的效果。 一、DropOut简介 1-1、DropOut论文图解左图:拥有两层隐藏层的正常神经网络。 右图:应用Dropout后的神经网络。(来源于官方论文) DropOut:正常神经网络需要对每一个节点进行学习,而添加了DropOut的神经网络通过删除部分单元(随机),即暂时将其从网络中移除,以及它的所有传入和传出连接。将DropOut应用于神经网络相当于从神经网络中采样了一个“更薄的”网络,即单元个数较少。(如上图所示,DropOut是从左图采样了一个更薄的网络,如图右)在正反向传播的过程中,采样了多个稀薄网络,即Dropout可以解释为模型平均的一种形式。 1-3、DropOut产生动机产生DropOut的动机:使用DropOut训练的神经网络中的每个隐藏单元必须学会与随机选择的其他单元样本一起工作,这样会使得每个隐藏单元更加的健壮,并使得他们尽量自己可以创造有用的功能,而不是依赖其他隐藏单元。即按照论文的话来说:减少神经元之间复杂的共适应关系。 官方论文例子: 50个人,分十个组,每五个人完成一个小阴谋,可能比50个人正确扮演各自角色完成一个大的阴谋更容易,当然,在时间足够,各种条件没有改变的情况下,那么完成一个大阴谋是更适合的,但生活总是充满变数,大阴谋往往不太容易实现,这样小的阴谋发挥作用的机会就会更大。同样的,在训练集上,各个隐藏单元可以协同发挥作用,即可以在训练集上可以训练的很好,但是这并不是我们需要的,我们需要他们在新的测试集上可以很好的合作,这时候DropOut体现出了它的价值! 本质上看: DropOut通过使其它隐藏层神经网络单元不可靠从而阻止了共适应的发生。因此,一个隐藏层神经元不能依赖其它特定神经元去纠正其错误。因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。 1-4、DropOut流程简介简介: 在神经网络的训练过程中,对于一次迭代中的某一层神经网络,先随机选择其中的一些神经元并将其临时丢弃,然后再进行本次的训练和优化。在下一次迭代中,继续随机隐藏一些神经元,直至训练结束。由于是随机丢弃,故而每一个批次都在训练不同的网络。 详细流程: 首先随机(临时)删掉网络中一半的隐藏神经元(以dropout rate为0.5为例),输入输出神经元保持不变。![]() 前提:带有L层隐藏层的神经网络。 l:第几层。 z: 代表输入向量 y: 代表输出向量 W:代表权重 b:偏差 f: 激活函数 没有DropOut的神经网络前向传播计算公式可以被描述为:l+1层的输入向量是l+1的权重乘以l层的输出向量加l+1层的偏差。l+1层的输出向量为经过激活函数的l+1层的输入向量。 神经网络图示如下所示:左图为标准的神经网络,右图为添加了Dropout的神经网络,相比于标准的神经网络,添加了Dropout的神经网络相当于为前一层的输出向量添加了一道概率流程,即是否经过筛选。 注意: 在测试中,权重参数w被缩放 W l = p W l W^l=pW^l Wl=pWl训练的过程中,会停止训练一些神经元,但是在测试的时候,整个模型是完整的,为了解决这个问题,我们会对没有被dropout的神经元权值做一个rescale,举个栗子:dropout rate为0.5,经过该算式之后rescale rate比例为2,即翻倍,这在一定程度上弥补了删掉一些神经元带来的误差。 r e s c a l e r a t e = 1 / ( 1 − d r o p o u t r a t e ) rescale rate=1 / (1 - dropout rate) rescalerate=1/(1−dropoutrate)拓展延伸:如果不想测试阶段缩放权重,可以选择在训练阶段缩放激活函数,即反向Dropout,这样的话在测试阶段可以保持网络不变。所以我们换一个思路,在训练时候将剩余权重乘以1/(1-p),在测试时,就不需要做什么了。 三、Dropout代码实现以及相关变种(部分有实现) 3-1、Dropout实现(Torch实现) import torch # 定义dropout def dropout_test(x, dropout): """ :param x: input tensor :param dropout: probability for dropout :return: a tensor with masked by dropout """ # dropout must be between 0 and 1 # 判断dropout是不是在0到1之间,如果不是的话直接抛出异常。 assert 0 |
CopyRight 2018-2019 实验室设备网 版权所有 |