1. 为什么要加Dropout?因为可以解决过拟合。为什么呐?
- (1)减少神经元之间复杂的共适应关系: 因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。 Ref:https://blog.csdn.net/program_developer/article/details/80737724
- (2)取平均的作用:dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
记忆宝典:随机失活,先失活2个,这样任意2个隐节点不能保证同时出现, 失活0.2之后,就得到一个新的网络,不同网络之间类似取平均。
2. Dropout是怎么实现的? Ref:https://blog.csdn.net/program_developer/article/details/80737724
通过np.random.binomial(n=1, p=retain_prob, size=x.shape) 随机(伯努利)函数生成一个一维 0,1向量,使0对应的使神经元失活,为1的神经元保持活性,并在最后输出的时候 乘以1/(keep_prob)(做rescale进行幅度缩放),作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。输出层每个神经元的输入和的期望会有量级上的差异。
其他问题:
2. dropout 是在模型训练的时候进行失活,而且每批次训练时失活的神经元是随机的。 Ref:https://blog.csdn.net/program_developer/article/details/80737724
keep_prob 越大保留的神经元个数越多,
5. Dropout 如何平衡训练和测试时的差异呢?
Dropout ,在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入,这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
6.BN和Dropout共同使用时会出现的问题:方差偏移 太难了,不懂。
- 第一个方案比较简单,把Dropout放在所有BN层的后面就可以了,这样就不会产生方差偏移的问题,但实则有逃避问题的感觉。
- 第二个方案来自Dropout原文里提到的一种高斯Dropout,是对Dropout形式的一种拓展。作者进一步拓展了高斯Dropout,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。Ref:https://zhuanlan.zhihu.com/p/61725100