目录
- 前言
- 一、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、高斯Dropout
- 3-6、DropConnect
- 3-7、Standout
- 附录1、nn.Linear()详解
- 总结
一、DropOut简介
1-1、DropOut论文图解
左图:拥有两层隐藏层的正常神经网络。
右图:应用Dropout后的神经网络。(来源于官方论文)
1-2、DropOut介绍
DropOut:正常神经网络需要对每一个节点进行学习,而添加了DropOut的神经网络通过删除部分单元(随机),即暂时将其从网络中移除,以及它的所有传入和传出连接。将DropOut应用于神经网络相当于从神经网络中采样了一个“更薄的”网络,即单元个数较少。(如上图所示,DropOut是从左图采样了一个更薄的网络,如图右)在正反向传播的过程中,采样了多个稀薄网络,即Dropout可以解释为模型平均的一种形式。
1-3、DropOut产生动机
产生DropOut的动机:使用DropOut训练的神经网络中的每个隐藏单元必须学会与随机选择的其他单元样本一起工作,这样会使得每个隐藏单元更加的健壮,并使得他们尽量自己可以创造有用的功能,而不是依赖其他隐藏单元。即按照论文的话来说:减少神经元之间复杂的共适应关系。
官方论文例子: 50个人,分十个组,每五个人完成一个小阴谋,可能比50个人正确扮演各自角色完成一个大的阴谋更容易,当然,在时间足够,各种条件没有改变的情况下,那么完成一个大阴谋是更适合的,但生活总是充满变数,大阴谋往往不太容易实现,这样小的阴谋发挥作用的机会就会更大。同样的,在训练集上,各个隐藏单元可以协同发挥作用,即可以在训练集上可以训练的很好,但是这并不是我们需要的,我们需要他们在新的测试集上可以很好的合作,这时候DropOut体现出了它的价值!
本质上看: DropOut通过使其它隐藏层神经网络单元不可靠从而阻止了共适应的发生。因此,一个隐藏层神经元不能依赖其它特定神经元去纠正其错误。因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。
1-4、DropOut流程简介
简介: 在神经网络的训练过程中,对于一次迭代中的某一层神经网络,先随机选择其中的一些神经元并将其临时丢弃,然后再进行本次的训练和优化。在下一次迭代中,继续随机隐藏一些神经元,直至训练结束。由于是随机丢弃,故而每一个批次都在训练不同的网络。
详细流程:
- 首先随机(临时)删掉网络中一半的隐藏神经元(以dropout rate为0.5为例),输入输出神经元保持不变。
- 然后把输入x 通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批(这里的批次batch_size由自己设定)训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)
- 重复以下过程:
1、恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新),因此每一个mini- batch都在训练不同的网络。
2、从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
3、对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
二、模型描述
2-1、公式描述
前提:带有L层隐藏层的神经网络。
l:第几层。
z: 代表输入向量
y: 代表输出向量
W:代表权重
b:偏差
f: 激活函数
没有DropOut的神经网络前向传播计算公式可以被描述为:l+1层的输入向量是l+1的权重乘以l层的输出向量加l+1层的偏差。l+1层的输出向量为经过激活函数的l+1层的输入向量。
添加DropOut的神经网络前向传播计算公式可以被描述为:相比于之前输出向量经过了伯努利分布,类似于经过一个门筛选了一下。*代表的是点积。
2-2、神经网络图描述
神经网络图示如下所示:左图为标准的神经网络,右图为添加了Dropout的神经网络,相比于标准的神经网络,添加了Dropout的神经网络相当于为前一层的输出向量添加了一道概率流程,即是否经过筛选。
2-3、一些需要注意的问题!
注意:
- 在测试中,权重参数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
- 首先随机(临时)删掉网络中一半的隐藏神经元(以dropout rate为0.5为例),输入输出神经元保持不变。
还没有评论,来说两句吧...