1. 初见dropout
Dropout是2012年深度学习视觉领域的开山之作paper:《ImageNet Classification with Deep Convolutional》所提到的算法,用于防止过拟合。
基本思想:
dropout是指在深度学习网络训练的过程中,对于神经网络单元,按照一定的概率将其==暂时==从网络中丢弃,对于随机梯度下降算法来说,由于是随机丢弃,所以每个mini-batch都在训练不同的网络。
大规模神经网络的缺点:
- 训练费时间
- 容易产生过拟合
过拟合是很多机器学习的通病,为了解决过拟合问题,我们可能会想到L2正则化、或者减小网络规模。dropout很好的解决了这个问题。
因而对于一个有N个节点的神经网络,有了dropout后,==就可以看做是2^n个模型的集合了==,但是需要训练的参数数目依然不变,这就解脱了费时的问题。
2. 深入了解dropout
2.1 dropout是怎么工作的?
dropout就是我们让它在前向传播的时候,让某个神经元的激活值以一定的概率P,让他停止工作。
==以前我们网络的计算公式==是:
采用==dropout后==变成如下公式:
==再详细点的解释就是==:我们要让某个神经元以概率P停止工作(也就是将这个神经元的激活值变为0), 那么这个概率怎么产生呢?答案就是伯努利分布,我们用伯努利函数,以概率P随机生成一个0、1的向量, 也就是上述公式中的r。
源码实现如下
#dropout函数的实现
def dropout(x, level):
if level < 0. or level >= 1:#level是概率值,必须在0~1之间
raise Exception('Dropout level must be in interval [0, 1[.')
retain_prob = 1. - level
#我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
#硬币 正面的概率为p,n表示每个神经元试验的次数
#因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
print sample
x *=sample#0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0
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)</span>
函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。
2.2 rescale
经过上面的屏蔽,使部分激活值变为0以后,我们还需要对向量进行rescale,也就是乘以 1/(1-p).
我们前面说过,其实Dropout是类似于平均网络模型。我们可以这么理解,我们在训练阶段训练了1000个网络,每个网络生成的概率为Pi,然后我们在测试阶段的时候,我们肯定要把这1000个网络的输出结果都计算一遍,然后用这1000个输出,乘以各自网络的概率Pi,求得的期望值就是我们最后的平均结果。
参考文献
1、http://blog.youkuaiyun.com/hjimce/article/details/50413257
2、http://blog.youkuaiyun.com/stdcoutzyx/article/details/49022443
3、《ImageNet Classification with Deep Convolutional》
4、《Improving neural networks by preventing co-adaptation of feature detectors》
其它平台只是信息转发(留言可能看不到),欢迎同学们到个人blog交流:https://faiculty.com/